[Rt-commit] rt branch, 5.0/support_gpg2, created. rt-5.0.0alpha1-18-gdce35ea2f5

Aaron Trevena ast at bestpractical.com
Thu May 7 16:21:57 EDT 2020


The branch, 5.0/support_gpg2 has been created
        at  dce35ea2f5719b7d1b4e39b71c5a4b6385ee7273 (commit)

- Log -----------------------------------------------------------------
commit 6c1926d300c43bb139d4c71d7c1329b195a5e670
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Fri May 1 21:25:10 2020 +0100

    Add new AvailableKeys method to RT::User
    
    Added new method providing list of key fingerprints for user
    reworked PreferredKey to use it

diff --git a/lib/RT/User.pm b/lib/RT/User.pm
index c1dc4f490b..c10eb0e9c4 100644
--- a/lib/RT/User.pm
+++ b/lib/RT/User.pm
@@ -2055,26 +2055,35 @@ sub PreferredKey
     }
 
 
-
     my $prefkey = $self->FirstAttribute('PreferredKey');
     return $prefkey->Content if $prefkey;
 
-    # we don't have a preferred key for this user, so now we must query GPG
+    ($prefkey) = $self->AvailableKeys;
+    return undef unless ($prefkey);
+
+    $self->SetAttribute(Name => 'PreferredKey', Content => $prefkey);
+    return $prefkey;
+}
+
+=head2 AvailableKeys
+
+This will query GPG and return a list of fingerprints ordered by maximally trusted key found
+for the users email address. Returns C<undef> if no keys can be found.
+
+=cut
+
+sub AvailableKeys {
+    my $self = shift;
     my %res = RT::Crypt->GetKeysForEncryption($self->EmailAddress);
-    return undef unless defined $res{'info'};
+    return ( ) unless defined $res{'info'};
     my @keys = @{ $res{'info'} };
-    return undef if @keys == 0;
+    return ( ) if @keys == 0;
 
     if (@keys == 1) {
-        $prefkey = $keys[0]->{'Fingerprint'};
+        return $keys[0]->{'Fingerprint'};
     } else {
-        # prefer the maximally trusted key
-        @keys = sort { $b->{'TrustLevel'} <=> $a->{'TrustLevel'} } @keys;
-        $prefkey = $keys[0]->{'Fingerprint'};
+        return map { $_->{'Fingerprint'} } sort { $b->{'TrustLevel'} <=> $a->{'TrustLevel'} } @keys;
     }
-
-    $self->SetAttribute(Name => 'PreferredKey', Content => $prefkey);
-    return $prefkey;
 }
 
 sub PrivateKey {

commit 261f0df6aa2a2b858ecf48b375077332b21e18b7
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Fri May 1 21:26:01 2020 +0100

    Handle new GPG 2.2.x status keywords

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index c78a870b65..17985287f3 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -1344,7 +1344,7 @@ my %parse_keyword = map { $_ => 1 } qw(
     DECRYPTION_FAILED DECRYPTION_OKAY
     BAD_PASSPHRASE GOOD_PASSPHRASE
     NO_SECKEY NO_PUBKEY
-    NO_RECP INV_RECP NODATA UNEXPECTED
+    NO_RECP INV_RECP NODATA UNEXPECTED FAILURE
 );
 
 # keywords we ignore without any messages as we parse them using other
@@ -1354,7 +1354,7 @@ my %ignore_keyword = map { $_ => 1 } qw(
     BEGIN_ENCRYPTION SIG_ID VALIDSIG
     ENC_TO BEGIN_DECRYPTION END_DECRYPTION GOODMDC
     TRUST_UNDEFINED TRUST_NEVER TRUST_MARGINAL TRUST_FULLY TRUST_ULTIMATE
-    DECRYPTION_INFO
+    DECRYPTION_INFO KEY_CONSIDERED DECRYPTION_KEY NEWSIG
 );
 
 sub ParseStatus {
@@ -1570,8 +1570,20 @@ sub ParseStatus {
                 Reason     => $reason,
             };
         }
+        elsif ( $keyword eq 'FAILURE' ) {
+            # FAILURE encrypt 167772218
+            my ($op, $rcode) = split /\s+/, $args;
+            my $reason = ReasonCodeToText( $keyword, $rcode );
+            push @res, {
+                Operation  => ucfirst($op),
+                Status     => 'ERROR',
+                Message    => "Failed to $op",
+                ReasonCode => $rcode,
+                Reason     => $reason,
+            };
+        }
         else {
-            $RT::Logger->warning("Keyword $keyword is unknown");
+            $RT::Logger->warning("Keyword $keyword is unknown : status line is $line");
             next;
         }
         $res[-1]{'Keyword'} = $keyword if @res && !$res[-1]{'Keyword'};

commit 6c6d5c753dc5053e90eadcc99b9fc3b17124e43e
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Fri May 1 21:26:32 2020 +0100

    Updated web crypt gnupg test to work with new GPG

diff --git a/t/web/crypt-gnupg.t b/t/web/crypt-gnupg.t
index 790225c883..bc8f6d2913 100644
--- a/t/web/crypt-gnupg.t
+++ b/t/web/crypt-gnupg.t
@@ -350,12 +350,12 @@ my $nokey = RT::Test->load_or_create_user(Name => 'nokey', EmailAddress => 'noke
 $nokey->PrincipalObj->GrantRight(Right => 'CreateTicket');
 $nokey->PrincipalObj->GrantRight(Right => 'OwnTicket');
 
+#    qr/.*nokey\@example.com' via WKD: No data/,
 my $tick = RT::Ticket->new( RT->SystemUser );
-warning_like {
+warnings_exist {
     $tick->Create(Subject => 'owner lacks pubkey', Queue => 'general',
                   Owner => $nokey);
 } [
-    qr/nokey\@example.com: skipped: public key not found/,
     qr/Recipient 'nokey\@example.com' is unusable/,
 ];
 ok(my $id = $tick->id, 'created ticket for owner-without-pubkey');
@@ -372,12 +372,12 @@ To: general\@example.com
 
 hello
 MAIL
- 
+
 my $status;
-warning_like {
+warnings_exist {
     ($status, $id) = RT::Test->send_via_mailgate($mail);
 } [
-    qr/nokey\@example.com: skipped: public key not found/,
+    qr/nokey\@example.com.\s(skipped: public key not found|via WKD: No data)/,
     qr/Recipient 'nokey\@example.com' is unusable/,
 ];
 
@@ -393,9 +393,17 @@ is ($tick->Subject,
     "Correct subject"
 );
 
-# test key selection
+# test key selection, GPG2.2+ can pick different signatures for keys based on updated rules/behaviour
+# Note: need to check that upgrading with old preferred keys in db will still work correctly with GPG2
 my $key1 = "EC1E81E7DC3DB42788FB0E4E9FA662C06DE22FC2";
 my $key2 = "75E156271DCCF02DDD4A7A8CDF651FA0632C4F50";
+my $key_sig1 = '299728D87681E34B744E31B046CA26A25AB388D9';
+my $key_sig2 = '4A203DDC79EBD0CC9D48BA94568810E072208BA5';
+
+# get key1/2 from gpg and update if updated fingerprint
+my @keys_from_gpg = $user->AvailableKeys;
+$key1 = $key_sig1 if (shift(@keys_from_gpg) eq $key_sig1 );
+$key2 = $key_sig2 if (shift(@keys_from_gpg) eq $key_sig2 );
 
 ok($user = RT::User->new(RT->SystemUser));
 ok($user->Load('root'), "Loaded user 'root'");
@@ -458,8 +466,8 @@ like($content, qr/KR-<recipient\@example\.com>-K/,
 like($content, qr/KR-nokey \(no pubkey!\)-K/,
      "KeyRequestors DOES issue no-pubkey warning for nokey\@example.com");
 
-$m->next_warning_like(qr/public key not found/);
-$m->next_warning_like(qr/public key not found/);
+$m->next_warning_like(qr/(public key not found|No public key)/);
+$m->next_warning_like(qr/(public key not found|No public key)/);
 $m->no_leftover_warnings_ok;
 
 done_testing;

commit ca7dec9a1528f57b26ea9dfb05deaf1d67f074bd
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Sat May 2 15:08:36 2020 +0100

    wip

diff --git a/t/mail/crypt-gnupg.t b/t/mail/crypt-gnupg.t
index 567573e934..5f476b79d0 100644
--- a/t/mail/crypt-gnupg.t
+++ b/t/mail/crypt-gnupg.t
@@ -64,15 +64,20 @@ diag 'only signing. missing passphrase';
         Data    => ['test'],
     );
     my %res;
+#   Failed test at t/mail/crypt-gnupg.t line 73.
+# found warning: gpg: no default secret key: bad passphrase
     warning_like {
         %res = RT::Crypt->SignEncrypt(
             Entity     => $entity,
             Encrypt    => 0,
             Passphrase => ''
         );
-    } qr/can't query passphrase in batch mode/;
+    } qr/(no default secret key|can't query passphrase in batch mode)/;
     ok( $res{'exit_code'}, "couldn't sign without passphrase");
     ok( $res{'error'} || $res{'logger'}, "error is here" );
+    use Data::Dumper;
+    warn Dumper( { error => $res{'error'},
+                   logger => $res{'logger'} );
 
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}

commit bde623ac53b1cf395bc44378a1d6057ba9ca01f6
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Mon May 4 14:16:38 2020 +0100

    wip t/mail/crypt-gnupg.t

diff --git a/t/mail/crypt-gnupg.t b/t/mail/crypt-gnupg.t
index 5f476b79d0..cfdee1e682 100644
--- a/t/mail/crypt-gnupg.t
+++ b/t/mail/crypt-gnupg.t
@@ -13,6 +13,9 @@ BEGIN {
 use RT::Test::GnuPG tests => 100, gnupg_options => { homedir => $homedir };
 use Test::Warn;
 
+my $gnupg;
+my ($gnupg_version, $gnupg_subversion) = split /\./, GnuPG::Interface->new->version;
+
 use_ok('RT::Crypt');
 use_ok('MIME::Entity');
 
@@ -25,16 +28,26 @@ diag 'only signing. correct passphrase';
     );
     my %res = RT::Crypt->SignEncrypt( Entity => $entity, Encrypt => 0, Passphrase => 'test' );
     ok( $entity, 'signed entity');
-    ok( !$res{'logger'}, "log is here as well" ) or diag $res{'logger'};
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}
     );
-    is( scalar @status, 2, 'two records: passphrase, signing');
-    is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
-    is( $status[0]->{'Status'}, 'DONE', 'good passphrase');
-    is( $status[1]->{'Operation'}, 'Sign', 'operation is correct');
-    is( $status[1]->{'Status'}, 'DONE', 'done');
-    is( $status[1]->{'User'}->{'EmailAddress'}, 'rt at example.com', 'correct email');
+
+    if ($gnupg_version < 2 ) {
+        ok( !$res{'logger'}, "log is here as well" ) or diag $res{'logger'};
+        is( scalar @status, 2, 'two records: passphrase, signing');
+        is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
+        is( $status[0]->{'Status'}, 'DONE', 'good passphrase');
+        is( $status[1]->{'Operation'}, 'Sign', 'operation is correct');
+        is( $status[1]->{'Status'}, 'DONE', 'done');
+        is( $status[1]->{'User'}->{'EmailAddress'}, 'rt at example.com', 'correct email');
+    }
+    else {
+        is( scalar @status, 1, 'one record: signing');
+        is( $status[0]->{'Operation'}, 'Sign', 'operation is correct');
+        is( $status[0]->{'Status'}, 'DONE', 'done');
+        is( $status[0]->{'Message'}, 'Signed message', 'message is correct');
+        is( $status[0]->{'KeyFingerprint'}, 'F23574193C1BA40ACB8DC6A4B5A462194345F7A5', 'signing key is correct');
+    }
 
     ok( $entity->is_multipart, 'signed message is multipart' );
     is( $entity->parts, 2, 'two parts' );
@@ -64,8 +77,6 @@ diag 'only signing. missing passphrase';
         Data    => ['test'],
     );
     my %res;
-#   Failed test at t/mail/crypt-gnupg.t line 73.
-# found warning: gpg: no default secret key: bad passphrase
     warning_like {
         %res = RT::Crypt->SignEncrypt(
             Entity     => $entity,
@@ -73,11 +84,11 @@ diag 'only signing. missing passphrase';
             Passphrase => ''
         );
     } qr/(no default secret key|can't query passphrase in batch mode)/;
+    use Data::Dumper;
+    warn Dumper({res => \%res });
+
     ok( $res{'exit_code'}, "couldn't sign without passphrase");
     ok( $res{'error'} || $res{'logger'}, "error is here" );
-    use Data::Dumper;
-    warn Dumper( { error => $res{'error'},
-                   logger => $res{'logger'} );
 
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}
@@ -158,7 +169,7 @@ diag 'encryption only, bad recipient';
             Entity => $entity,
             Sign   => 0,
         );
-    } qr/public key not found/;
+    } qr/(public key not found|No public key)/;
 
     ok( $res{'exit_code'}, 'no way to encrypt without keys of recipients');
     ok( $res{'logger'}, "errors are in logger" );
@@ -185,13 +196,22 @@ diag 'encryption and signing with combined method';
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}
     );
-    is( scalar @status, 3, 'three records: passphrase, sign and encrypt');
-    is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
-    is( $status[0]->{'Status'}, 'DONE', 'done');
-    is( $status[1]->{'Operation'}, 'Sign', 'operation is correct');
-    is( $status[1]->{'Status'}, 'DONE', 'done');
-    is( $status[2]->{'Operation'}, 'Encrypt', 'operation is correct');
-    is( $status[2]->{'Status'}, 'DONE', 'done');
+    if ($gnupg_version < 2) {
+        is( scalar @status, 3, 'three records: passphrase, sign and encrypt');
+        is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
+        is( $status[0]->{'Status'}, 'DONE', 'done');
+        is( $status[1]->{'Operation'}, 'Sign', 'operation is correct');
+        is( $status[1]->{'Status'}, 'DONE', 'done');
+        is( $status[2]->{'Operation'}, 'Encrypt', 'operation is correct');
+        is( $status[2]->{'Status'}, 'DONE', 'done');
+    }
+    else {
+        is( scalar @status, 2, 'two records: sign and encrypt');
+        is( $status[0]->{'Operation'}, 'Sign', 'operation is correct');
+        is( $status[0]->{'Status'}, 'DONE', 'done');
+        is( $status[1]->{'Operation'}, 'Encrypt', 'operation is correct');
+        is( $status[1]->{'Status'}, 'DONE', 'done');
+    }
 
     ok($entity, 'get an encrypted and signed part');
 

commit 3adc7df3632355a614e522cbf9ecaf9f800fa01a
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Mon May 4 14:17:13 2020 +0100

    wip RT::Crypt::GnuPG

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index 17985287f3..14ade0fe8d 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -1542,10 +1542,12 @@ sub ParseStatus {
                 Class          => $props[3],
                 Timestamp      => $props[4],
                 KeyFingerprint => $props[5],
-                User           => $user_hint{ $latest_user_main_key },
+                (defined $latest_user_main_key ? (User => $user_hint{ $latest_user_main_key } ) : ( ) )
             };
-            $res[-1]->{Message} .= ' by '. $user_hint{ $latest_user_main_key }->{'EmailAddress'}
-                if $user_hint{ $latest_user_main_key };
+            if ($latest_user_main_key) {
+                $res[-1]->{Message} .= ' by '. $user_hint{ $latest_user_main_key }->{'EmailAddress'}
+                    if $user_hint{ $latest_user_main_key };
+            }
         }
         elsif ( $keyword eq 'INV_RECP' ) {
             my ($rcode, $recipient) = split /\s+/, $args, 2;

commit 286e3959c216c46613aae370cc0a099c0a5f65ee
Author: Brian C. Duggan <brian at bestpractical.com>
Date:   Thu Apr 19 15:27:10 2018 -0400

    Add GnuPG 2.1+ specific test homedir and supporting test files
    
    GnuPG 2.1 requires some different settings in gpg.conf to function
    properly for tests. This change adds a new homedir with keyrings in
    2.1+ format and new config files.
    
    GnuPG 2.1 emits some warnings when importing keys
    that were created by GnuPG 1.4 with preferred compression algorithms
    that are no longer supported. The warnings tell the user about those
    algorithms. These probably wouldn't cause any tests to fail. But this
    change adds new keys that were imported and then exported again by
    GnuPG 2.1. GnuPG 2.1 can import these keys without warnings.
    
    Some other files included in this commit are probably unnecessary with
    some test re-design. But they are a safe base for updating
    GnuPG-related tests to work with 2.1+.

diff --git a/t/data/gnupg2/bin/fake-pinentry.pl b/t/data/gnupg2/bin/fake-pinentry.pl
new file mode 100755
index 0000000000..8a46066608
--- /dev/null
+++ b/t/data/gnupg2/bin/fake-pinentry.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+# Use this for your test suites when a perl interpreter is available.
+#
+# The encrypted keys in your test suite that you expect to work must
+# be locked with a passphrase of "test"
+#
+# Author: Daniel Kahn Gillmor <dkg at fifthhorseman.net>
+#
+# License: This trivial work is hereby explicitly placed into the
+# public domain.  Anyone may reuse it, modify it, redistribute it for
+# any purpose.
+
+use strict;
+use warnings;
+#use File::Basename;
+#my $dirname = dirname($0);
+
+#open (my $fh, '<', '/home/user/projects/rt/t/data/gnupg2/bin/passphrase') or die "Cannot open passphrase file: $!";
+#my $passphrase = <$fh>;
+#chomp $passphrase;
+#close $fh;
+
+# turn off buffering
+$| = 1;
+
+my $passphrase = 'test';
+
+print "OK This is only for test suites, and should never be used in production\n";
+while (<STDIN>) {
+  chomp;
+  next if (/^$/);
+  next if (/^#/);
+  print ("D $passphrase\n") if (/^getpin/i);
+  #print ("D \n") if (/^getpin/i);
+  print "OK\n";
+  exit if (/^bye/i);
+}
+1;
diff --git a/t/data/gnupg2/bin/passphrase b/t/data/gnupg2/bin/passphrase
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/t/data/gnupg2/emails/1-signed-MIME-plain.txt b/t/data/gnupg2/emails/1-signed-MIME-plain.txt
new file mode 100644
index 0000000000..bbf316b595
--- /dev/null
+++ b/t/data/gnupg2/emails/1-signed-MIME-plain.txt
@@ -0,0 +1,38 @@
+Message-ID: <46D7309C.9040804 at example.com>
+Date: Fri, 31 Aug 2007 01:03:24 +0400
+From: rt-test at example.com
+User-Agent: Thunderbird 2.0.0.6 (X11/20070804)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:1
+X-Enigmail-Version: 0.95.3
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature";
+ boundary="------------enigF67974ED650702891ACEBB10"
+
+This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
+--------------enigF67974ED650702891ACEBB10
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+
+This is a test email with MIME signature.
+ID:1
+
+
+
+--------------enigF67974ED650702891ACEBB10
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: OpenPGP digital signature
+Content-Disposition: attachment; filename="signature.asc"
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.7 (GNU/Linux)
+Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
+
+iD8DBQFG1zCi0ygDXYSIHxsRAqEmAJ9mKiEdoWg9IFGlUlhPrzo9+1tKSwCfdqRG
++HKnj+81jWpBEhj6D00uNrQ=
+=ZFav
+-----END PGP SIGNATURE-----
+
+--------------enigF67974ED650702891ACEBB10--
+
diff --git a/t/data/gnupg2/emails/10-encrypted-inline-plain.txt b/t/data/gnupg2/emails/10-encrypted-inline-plain.txt
new file mode 100644
index 0000000000..4f3e151c39
--- /dev/null
+++ b/t/data/gnupg2/emails/10-encrypted-inline-plain.txt
@@ -0,0 +1,31 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 3AAFC37F5A; Fri, 10 Aug 2007 15:52:03 -0400 (EDT)
+Date: Fri, 10 Aug 2007 15:52:03 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:10
+Message-ID: <20070810195203.GB5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii; x-action=pgp-encrypted
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgAyB2wkXAxcNw6+iKwzSlXlyZCsdZFSstJbhIr/i+ujIrk
++NLUAIgPfgIeg1nGVVK1z/hszrHRo3FT2b+jSrPF2Ox/wsUqpSvDf641hFbDCIlx
+bbqNmUEOCP5Q64Bw+RHoDoGLx9CPgeXLbciXvPZtlC3MPqG9w8lQdJlhTM1lqwCs
+1kqyvQ8YiFrvCNxU6x/81O9wWwiGOVELVnwX62crUK8howCpmeGx28Uo3HKG7NMv
+vTsdO6vwh38tNRz0kX05+AlxWP+3Vs4se6YwePc+XnhgWQoHqrYcxTOA0OrivJja
+1ty5CAHzGudBdXBcDncg0+6d1Ih60d5JP7nhl3lyzAgArA8CO/iv/kFOkQN9qm4O
+4zq189niju7mVCmcTLgBoxN2U1AeAlSl/JacPw4b3CGDQKmj1L/SMKOfUvOvCUlU
+o6XB7fHPxsFrJag9Yp5snenMRrvoUbypRljebHYsjtkCOsLqK7KUYLx2JQ/pHJjs
+AXwuyytBpLVxwEy0xkujpAQ4rsYT+z410zdH8hAthFo9FwFGKsT95WzfGcOa2+B3
+Qi1LX2uav8q5PAQgbjatp/aiHn3mHZSkRtLbOPr9A8GkmjQaNqIFgUMfaKx2hu8z
+nIZmAjpZ8CDvyKoFU0g9Z2KqNPagOqHgq6sRKuAp/5nz62sMyl4Hc7UfeYMTHWn/
+tNKCAYtyAHAGuvwLiRCN3M5h5Y1DdgEyIri7RtH/LW2QLCqYt9MLvmVRsPIEtuEh
+tZAb+KQzr9W6+fOhpW/1zkBCGxw2PEhv0HafXsVxEjOITbc2Hfwn9kySZ1aeSxL8
+DXzE9fSwcCOXQE1YY7TVNKuqqm34BADCnO7jw/b8EaOHRWgElw==
+=MYSm
+-----END PGP MESSAGE-----
diff --git a/t/data/gnupg2/emails/11-encrypted-inline-attachment.txt b/t/data/gnupg2/emails/11-encrypted-inline-attachment.txt
new file mode 100644
index 0000000000..892433c41d
--- /dev/null
+++ b/t/data/gnupg2/emails/11-encrypted-inline-attachment.txt
@@ -0,0 +1,80 @@
+Message-ID: <46BCDCA0.4000205 at mit.edu>
+Date: Fri, 10 Aug 2007 17:46:08 -0400
+From: rt-test at example.com
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:11
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------010900070701080408060501"
+
+This is a multi-part message in MIME format.
+--------------010900070701080408060501
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+
+-----BEGIN PGP MESSAGE-----
+Charset: ISO-8859-1
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAf/dbKZrl//1Q5r/FjPmqjp2+NDajR7Fj2afjKtkR8ySKni
+gc8kTvx2ceQ8bdOMfdn2AngPlKKyADp8xLDge3hwZg/mBRpOtk5B6eqGZDSwDxgQ
+Q2+mUVilhDBqLB5uv4rXoclT/JqR/WBWW1SjZgVVaf/lB9mI5amcmOPuY5vBq/iY
+q+qBAlWc27AfafGPSz0nifohc2qmq/pj2G6YDkKBE01EZRwbwvm35bTjI6rFL6dp
+Zzx2kGhAu928orL5Ft/KtyOEqdGwGlrGApLVV2X6+G1X6ASdgR24OAqnPxYMnhoT
+I3uYidSE6DSmUAm4R0rGRc1yMG5rBgRDDOYumRJFHAgA9WsNlQTkSuzypFzW7xT1
+zAzurHA1OYttjjWSAFb/eOnLxc27r1mBS0JVoEz/9+HtHOgGcsRe/sym6uwOOMT1
+znpgRGtQ+vL0bwBK3HyLqQzY9o5BGphf3ipCpI6HWwBDdGUJT+K7S8J9Og4AmV9V
+iq6V1PCdGwWS/XD4tulHIPUiA7Z6osVqtbHVTuQNWwsFU06SEHOmhNEGDSmO7Q7i
+bUS1YvC1STmJttzSsh+A/dh7uN/mfrPG1BJEAi4iZRGM6GFoKS5CQnpyQ4Az222n
+w1iB3u170ijcgLvDNR1Nz5DVnXdJcbVg46GvAGjctI7qWmFIKuazCA/AA0hwRjfz
+j4UCDgOxaIPydPr+7xAH/AzvNqeXEU9n7Y7K6rALWKwETU98ltzyp0FdO0YCbN/Z
+HWAyazGpPL6VqECWdc9xAYa1zYRf9HEW25yi5BMqbPav7oxfkEMbfLEl2OJr+EfO
+/GeTijv8riPFazcXdj7CKuumsld/GQgVLjwmRdoVtGN8WMRZfM/CII6uhg2wVbxq
+iThRc03DSNwLr0N0aNr66rySOnvTZNEARljPA1VaRgy1YkHXAyj6Z+s5OBZgj3yh
+3f6KZXaRBq9r+7iXJFuOpQ35k/pykHL6wwaTYMmEvlPZ9EO1zgvBxS6NWm4Ct4+X
+l9anXjRRPS9aSEUZQRjP6VfQPrrlhBNIgAEoKHlIJe4H/RVbTUAqRlTf3k4XBwkR
+HoTk/b/vM5grRQTR12DLXKB+NeNEpQPQFbdFOhfX22ZJbVzl3CVxaOEYHB29KT4D
+2frp99spiO8gksYdC5kviXeXXlXINtqsAWCEQr96wOlE03NuKh9TLF3ykAKageqr
+yDVdFjmeuMwL5XWVdWFUCDKROQz0gbX3WglCVhccrB4aMPx1vP4HiQIn7R2Q9/GJ
+I0lrn/se5GuT078BnhpApZkA0zU+Fi32NWTY7TLXYKxK1BpHWREEFIwrPe1D3Sot
+tLh+E65rDp2dt9LrZgGerSQqP1V8z50reNcGdRuWXfJSBwWJfVVo6ApEqD17bPo1
+Y8HSfAGGTN7euRDBuov2eMPKlLTYqQAqOE7DJK1IWQtw9aIMxLuTBCORy+DHh8v3
+elFBb1PxNZ64BJrOK4+gUm09eizynTdtHYhvhe8Gplu6JO5U28djXVqlIiHtEhF1
+VltikOnWlztV/2M8XoUKZneB9MBqhJ3W0lqN5Xzw7Jk=
+=bB9/
+-----END PGP MESSAGE-----
+
+--------------010900070701080408060501
+Content-Type: application/octet-stream;
+ name="text-attachment.pgp"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="text-attachment.pgp"
+
+hQIOA076g5OuwfIOEAf+KE8JLsuGPug17A+1JJwCliRR8Iid4CxXyFplTXYgeFGKh2EN0UJw
+Rj0k10BKnefbhL2gRM90aQaAF4gBF9mCh4H4Rg1reZ5ohoinNPk1Qgkotx1JnyVxIEk7mzKE
+tDIU4BGdcaN6LPhlBRBsSA/nzA19oM8HwecBstws9fbS6ZRwV8XLXKEWsQASEfmJxSYWpdkJ
+GEWIprcwkKClXf9RO+FXhFeg9i1ucFC05/1053w1CZtBAB9ohqs/GhILiCzVc8RZtQ+Xig6c
+Pdv7Q7zZBRy3lFz3o6bAjefxZfNbvVZmuJGMLPrevXF02v4aGazCtzqm7wR5cH0sxaaW0maD
+Fgf8DAeE4A+GqG16s6GGodVllO2JsDWYlyVnf+kfE4FU94uspYteDeGBf4zXhd9ccRYOnDWO
+o6yBwgonzgrZHicF6kcYhJLQS0uM4C1cK9S5nh6CP8cZEUUmEar9g5TKQjWivNGl4qNdzm10
+4dZOK1/u5xFb6dkrqOZ1a1M2DfrZRxgdz2RwZZbwre88wGKP3taBtvJvFXk26QNEa78fuoGL
+wqo3jvsn1evswD/JL4bVJl6VGRDNAsqSxkR6209W8qseFA1tw1aFM8XhpZzhchOlshg+ri60
+r7fMKln4t1hiaBstROGCCtdLomb4ezxJQddp/SH4K3XdHBJg+4ttjsUmkoUCDgOxaIPydPr+
+7xAH/RbwjSq8A8C7lJVXcwnmEIIpQfaKNaFkSRhp9+/y8e8skhUz6JRopeLnMv0u4o6jos+2
+9VGQ8ei+wzA8NgIbWtnxktT4aobI+lWpy7fyC13aMcG64lYbDUjktW7YNxkMYD9+Pk5bBpwJ
+hf9cXhfdSPPofqUM1DmA1LcrkkO+d/qvTCnHjrrjwvTFGBmvKi+iKUk1pltTvOdc5rkK7oI4
+6U6JTYWp9HfvNt7oYCMuILYEftvY0XhBCiUIWUClsQ7WhfqoGpix1peOv4ajzDYeDPo18cMi
+oyDrAHAeWAOjYWtuDXOtwpdaWkAoxgZOJgcu2ZVUWdGyFYvSCwOxfZYzv5IH/2a3xIjO21OC
+M5ql+lXb1OFfqsqXYXAhOP5+JhBOa5UN+VBIKG9pxVL48mWCK1GwHN5RX5aB+ky6tvkrK1QD
+XjCZRxj8o+le03bZ16QiWSEuqxTg2e4/zWY1ZUXBqkxpBVRwT5hzEbLVays0Bju6vKV8CyX9
+apFxFf/vWZ347x+/cK6jc/Bpc8u9PSdOBwGC1ReZixmvgL3fI9ozLOlkNXGvjKxx2Ui6v6LB
+e6SBQsD0cnhRGgfWXgJQsmmPDVPbcmM9+pU/p4JsqdA15lNUILXeeiieFNGHjUORgZtjhY45
+Z1Hw8EOfZWBquFbNt5tRaR6UmroviHO4kNx5N39DtfvSegEma6N5QIsTxrpw0IP2NMVXJ9qa
+4in+Orrc1EQfljFTLYSyK3zowghdHlZsMUo7d5+AMjDlsjKf9H0f1gMB8hWebQQNlyNOmKa/
+uHMcJVlbpGFCOspBgN4N2+s/Ldz+c9hy9W9x7J5U2bcdsdbEKlMF0EkgUE+f3Jhc
+--------------010900070701080408060501--
+
+
diff --git a/t/data/gnupg2/emails/12-encrypted-inline-binary.txt b/t/data/gnupg2/emails/12-encrypted-inline-binary.txt
new file mode 100644
index 0000000000..5c646ec790
--- /dev/null
+++ b/t/data/gnupg2/emails/12-encrypted-inline-binary.txt
@@ -0,0 +1,86 @@
+Message-ID: <46BCDCF2.3080704 at mit.edu>
+Date: Fri, 10 Aug 2007 17:47:30 -0400
+From: rt-test at example.com
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:12
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------090206040704060905090502"
+
+This is a multi-part message in MIME format.
+--------------090206040704060905090502
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+
+-----BEGIN PGP MESSAGE-----
+Charset: ISO-8859-1
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAf/bD4qivq3N/0qZZnLucbOARr1mypqomT+gvm1It/DllR/
+F3RRLlm0wcBoVQp52aNecT9OJiZNh32oxPW78XBG2OCZv+jATd2vMf4ESOX1Pj4+
+1DATM9V3lOJ8XYJqAX9dVe3MdUntpwqmGvlv2bYmbrc1o6IVQroPm6eV+ttB0BKc
+ELj+1NjpaXDGERoV2P300JcJNR6tu9pXo56kz1vAjAQj/xQBNCoSOxBB1TJA1sKF
+iNuQVObWYG2cE63PRZFTlzvTofeHo9kt9ykfyfNMnslwAaXPI5LJP3KGjUOZiomq
+XA+FYLzMuFzHaOgRGcpJGKTeZ578N7WZ21zmNOgS8ggA0/RNae8CHklYRd9sySdo
+0vxoAO6pokK9HSCaxeX96nS4JJfij/uTMRyR1cbwFBvJSQHUtGNGL1Tn9vhgGfqL
+TjrkvkC/HhBqu4QDYH3ekobV/tu/uQjGhxAASTFB5vtYSQvZtmCR1COTmO559aDz
+oO+93N4x3AOhC1Nhcmyds9mSCKCt4TCWE3gmHuPKYuLpSwj5Ndi5er6jCsq7RpsJ
+W0GzGOGg8wUUPDgBWJbXS5CVAkiJs/SlP0yUqeVR18mf9r/oKUt9DL3GCp230/o+
+0wyVkzqOBPNiIHpFRN1NhikXdKRVOL4ewJeCc9nrlBtLwqpEyZ1g4Ht7SKkE3rl1
+64UCDgOxaIPydPr+7xAH+gNwaV49PwLd8WUJpPuL+YmH5RRsAasWvX+VlnxM+g/7
+cn1BrvpXekq7vctMByxHaV2WnaC42n4M8xC+V1B/7Wk1rmhRMZKpIVjM6X9eNsPg
+FvOX5DhJdhgNOhjwT7rk29P24p9TQj06TwPnvLYjQJ6LViiX5l4T1YpG0mMb6Sc2
+vmp1MbGeV8zZ3hVbSpWOmwlotvfiGa4LjLGNduXIiOFF93pviV2xApYNt+FgJHLc
+p63GfqUXuj/K2iqKwFIbo7nssx/ceWBRdlgPrE/MSStYhBm/e9mw55nwDsUIB4Pg
+tkle/6XgRsOgvHydiTD+mxng/1bx9cmvVtNfvOq82wMH/3JI/rfmQUQGRJ/JFufk
+Kl26lQcbd/Vyxff3MVww7oUFBY2oUPwYL/5N3TjhI7HwiCkMP6S9bL1AfHvkLenu
+n5GKjSLJmyx7BNQMEIIKWD4tNSjA0CCk3+QVGr9sRIVIVD44Be9I8jlcpkn2r5Qs
+9djSXzEBpM+Aiqv5cCBFq2rgYyd9m2c2iHsI6EBaxCzYFz1qobsfvXk4a7ax0/Ck
+ug/jPEq8GK36UTp+51G8JhxzgJKSm4Fo7N3Os8emIlZ2QymPrzPkxEQj9eRsMmp3
+qIQ0rOPjTC8847s4lIlAx7di80OYQ1dV2J8NLL/qxF09rr6f978oH59IfSHRKJ2b
+aCnSfAGfFBr68Zm20se6/0mzrYY2MDljPrKSDQPmNW7nJ761/YjMgVAeZlnKW7JM
+hTdZciuHMTX7+3BDTGCMbAnmYYWurX0jKGJ4X0UJLV8m4nsXvqHvsG6FBzVC5z2w
+kytey5Bqi2gXRjk6xqckH4O79kEJw0kLkxJbT9IPBKw=
+=vGEb
+-----END PGP MESSAGE-----
+
+--------------090206040704060905090502
+Content-Type: application/octet-stream;
+ name="favicon.png.pgp"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="favicon.png.pgp"
+
+hQIOA076g5OuwfIOEAf+P0Qp/k1B0WDRr9bNcEANStTaiefYoLrUrtMJv+aFtkiSqKfft0A9
+okrYkVUKs6kxfgxueuqNMFQh58nl8+d7Z2qGIgVEXxC8rRxexEQ8mXu5LXzzBbc6Dq8Jsa7B
+bXzwGty51culYcKeMEjpEY8Qx76qoNQDNCuvth1JJxJ6xQix/pVyZZbJRu/nLrv1i3Z4KRFY
+qafnJlcsUTVj2o9dLfeU13z8nd0uBPY+hiCgYJHSPDLr+mkA+c6YK0m4a88r/wjLmsVHMkn2
+N5nCjuqP4tzT8SCjhoICGTbu+fFdks9NhQjvsW7MHBi9HFFzm6SoEvquFHThzwMl3hAhTLpi
+Jwf/a6unMP/swAxoFTJ2GRXBmQOH4sJHR/M31rEVkLZGJixhU94Tpx8ptgLXqme5VCXgl+M3
+Oh0GHRXqFYjR/HGUTZokRKR/BgCEpOGlH5FcabHiu/Gy8UBezPbuC+BNvxuCbuwODMp9R5DE
+F8RSCAQ1hrRoJjeHT2wyE7HdCvN/xx7NyenA3GdJa5Z6W7Y0gshr2fAOFL39jKXw4WwCh/Yq
+XnyG8uOyPgFrnHI3WpO24VpQHp3MBKebWNhQ/Opy/cABunCSwWQpDB9Ar4GeS3R1WGtMNC4r
+ph4afmTHJcQQkoa0VfvHL0hEzycwysYD46O9QhZfhxtKKShgX356oCeMEIUCDgOxaIPydPr+
+7xAH+gMnbi5OLPf5xMeZydvNWdHE/wJTub2rrWFtzvj0Aa5Ne/KFhcDDqSjaL3MXP1WfIJr1
+/ANe1eWcM2hlYVDpEn6YOh0bz6BASE4kbHA5nGMyUrgH0hWfcOgkMUloRZdf1q32j80mchCJ
+rF4YsQ6EndnUYzAiXKHGJRUy/6IA2qBH2n/fRiyC2FmmQPtWO4c6t15Vgh4fB3QXSTri8J5r
+577yIiHRE+dq6gg1BfyqCtw0DW56lSFQ7dxyMXeLyTGyjTGPlUDc+FbP23CRK7zDIVujARmm
+mX3bP2lMfCK326FwBZf2Q4Zl/ac1BN8Mcb4wwcnKvRzfEw8d1Y6pkphe7KYH/0MDDqtmuEw2
+D/xdw4FHB16/HW32bcPaMVvFuseczEfrwPGCrCiPHPm++edAoY0rWoBtzHVpgN+s5bset5OR
+snhjuWceuCb+Ga0QV0s/xmIPIQ8VYaXyD5hob6nHEIeskS68Vbni0BpY3nejDPoV3dNHY2Tp
+2fjYNHCpsdTz8yyavQVixoQjZQH9hUb48zZDHCt0Af9Rfq6Et5/Qr8iJqAyEU8JzZtrkpO4O
+HgLU7JTPLxOGzYtOj8JkLmLguVA5kOafAuU4OTEU43utQfS3KYbdEWT2jJ1QaJVS8CjFJrqH
+V99FUsDvgKWSTy5hA9gkQAQE1QdwkoQKpkCWm18KZqTSwNkBfrsEuvHC3Cz4Sy+cJmhr4Hvx
+dyZY8DuuWExUcVCjkeuASLgjLEgahnCbMkyKATazswwTEdfzjcOowjLTdaWFEN/Cg22nF/px
+9MXMtzBkrTkjYPhfywETKoMVH/Nw7rRNZhkOSb5WJV5ynF1BlbzXI7Z8rA/KrIn8aydzwJUU
+qFr8Dw1C7kbE76+SFVWX8fqpwGmQhDAO+kos6ivgN9HDHtuXmwfGeROi2U0WcmFGbAyLo5fT
+LCcNPOMflU27WDXm8m+tjq9naUynqvwg5zBBz/xY67L1R8uOwfZplvRi35iZAJjzMHGirkiB
+W3ZDXbDqEfKl4aCXqU+XhQZsku2z3OtKZOBVVI5p8nGVEfavg6QECRUNUS7qbtMxlj5IwCGl
+babK3W5YVuERjklrrLUYZjqFIZ2yLK3Z2VmSn7yKAb/eRvdEeha+9PKcN11pXPkS/M3t+Vpr
+G+4TqNgqwLVWMvbENp08dS3OAPpZLDnqG9CJV0qacDMjv69X26V3Xp6vuZoKqAPxMG9QKAfX
+E9LInR1Kd0cpRUkb
+--------------090206040704060905090502--
+
+
diff --git a/t/data/gnupg2/emails/13-signed-encrypted-MIME-plain.txt b/t/data/gnupg2/emails/13-signed-encrypted-MIME-plain.txt
new file mode 100644
index 0000000000..a09ccec4cd
--- /dev/null
+++ b/t/data/gnupg2/emails/13-signed-encrypted-MIME-plain.txt
@@ -0,0 +1,49 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 19FD037F61; Fri, 10 Aug 2007 16:03:35 -0400 (EDT)
+Date: Fri, 10 Aug 2007 16:03:35 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:13
+Message-ID: <20070810200335.GC5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="+nBD6E3TurpgldQp"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--+nBD6E3TurpgldQp
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--+nBD6E3TurpgldQp
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgAhFFX4adckICRP4VEhrElZ8rRYAwJVbTLd7S5yOnrovcG
+sRAIZTjEmb8CRPX926hm3fJ/5O+pm9ZPE1wzvEBQGcJ+6oZPD4GMwuMqJpaZLw4v
+6zj4ogzac0i32vkwLYDLHXle9ytgiBwTFHuOKllCvBmTe5PrFAHqhA0EPJ824gD9
+H93LJUyvn/elOHASKVcUhm1XLV0RxdNTh8Afc7dEAIr0uPaWu1rVatdnc9JnQjsB
+luYLP8M+UD9u/sZwSBv7x/PVIOE9QsaFQGQZTYEzKb/4zeujcUyM0+4rjJ+45QUX
+cDsrFVmXoQfts2nw0BN5mERZdbOIwvkhZMZzsf+EKgf/dA7x9rguO/eGy/keQf0f
+sBHAz24WGWRqcmRNdBsaecVgAsygAEi564RQYvxM7eJxqKl+1TsjUmGUAmacShN7
+JjpqTH9HRrV522UNvVXFitel4Ri3UItP3zI+951x7YvkzUtIz8gfaCOHC71NmPBO
+RdKDDBYDEajJkYN6mhL+QpX9fIIP5ALkfVz0JmdHN1e81Z5myuEWnCSuxeyZHCgl
+Xw8PuV/Af/+GHqjNUaXRDxN4SWm82pKkK4rxioMI4liI5zuR73GH8wd1RjspCkKd
+gPEhmqDxvkxykjhtJt5Izj+iQsyZNRDHRkGJA4BLOLUnvFtwpNCg6DaRDUOBjBmI
+P9LAXwGbhZU7uZLtSzwn1gr8TD+cqkpQrFlKRiUCdh6sTwfp+HE3JDmKAwX6t8bM
+ndBMYwIPddYdkFFpWOQbl1G72zR3SSuwgyCC5+xZxDWPHT97iCKbvCYAmdN3cGHZ
+8Lqu56ulz54pIkBZzSsu8TWzZner2eax1MqITH3WNYYuH57yiMSaUK1DSdFrg9Mc
+o/aK0QUaW6pCFbYGZRS1cqUBaN11Z2debMC60JiNFA/htzLwgSwmZiEdAIt4lvU6
+xMdA7dFYuVLmVh9+VQYp3KspNDWsILiPsKbV8oomlcLiZ+g8cRY/NzLKXVqX2a+7
+Jl3hLlEuVKdcWe+XCfWt07Y2Ibwtpkq/vph61cPdus0dgV8U+QITQ4kt1ky8xNBc
+L51c
+=zSIe
+-----END PGP MESSAGE-----
+
+--+nBD6E3TurpgldQp--
diff --git a/t/data/gnupg2/emails/14-signed-encrypted-MIME-attachment.txt b/t/data/gnupg2/emails/14-signed-encrypted-MIME-attachment.txt
new file mode 100644
index 0000000000..e6d23ea966
--- /dev/null
+++ b/t/data/gnupg2/emails/14-signed-encrypted-MIME-attachment.txt
@@ -0,0 +1,51 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 061F037F56; Fri, 10 Aug 2007 16:12:29 -0400 (EDT)
+Date: Fri, 10 Aug 2007 16:12:29 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:14
+Message-ID: <20070810201229.GD5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="N1GIdlSm9i+YlY4t"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--N1GIdlSm9i+YlY4t
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--N1GIdlSm9i+YlY4t
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAf+MEje2ZVc5yRFxINYBmz8l5oRdrDkldSFISKNlcFogKeA
+ZAwvP0Y2Utxjs+aT25gqR72uftGzCLhKdIb8X/i8CswKHX/1NnLKFTFB+T3Mmwtg
+3a9jiB6kQ5haWvcd9y1DBcm1Wnw5B51QmiHZzHu209dphl7qnoak79M0NK4KPSqr
+NKqn7yTKFOjJ3qIlCLqawQbQy++IFmtJVKMQSNZawqSX/JSGMNPz9hioyOgyjxtE
+XZlrdgV1jumnZ3nVF1bQFMGUMGpi6NAA7+TiPjSZgFkKp2zvyOXwFKjKqkVgAgUh
++295JO9kjFmRYOxpWcSfBaibX4qFSsWvJbvltNceDAf/WCCcvP6+JYHmZL32YL6+
+oSM3SnHuG3PIqaT0/99pMVIhHzhrdrmWsyR6ijcK7PRpQg3mIZDd5pzAgcae3c4M
+mYsImADyUC6CX0PvSOYYvG7CskDUiGk76fjDKTkKPkgqEFJXz1v9TA+ptx9v2PTd
+CW8cES9Du5PdwPLbltfC54ax/tCKcyyHbtgozVQJB6RfkXKhUjYI632qnXa7BDqO
+c5Pcpn7gKKik4MkGEWnf50aqQ6ph4Q9MfOZ+5hc/EBUQd2Genqn8iCTPa2rkrI49
+6sKJ9FSdXL4Xdlat09MxnD5Dw6DKF6G6Ig2SAQA/WBG5+sZxWC5NMd5oeJWHVnCz
+VNLA5QEIo0BNtY+wm2W/YH3hSHV5K+Mz+MEKEUaimYSLWKl1p6vboBjHuk0XY1Tn
+FDGmLVcO/jLBkiPOhNyibRXaCW/x3iws+xCHngjX4rDeidEtphHCxihVtS1Sh1wT
+IHHE+Kl6jlateIeBpug79RsGKcdwYTUg2SuaZXEf5A2tQtUhU6TEWYqhFc0g2dCV
+u/lkhrVRt4S+En4DYJ7myQYdMBeHym52Mz9tFZKKQ54dMWDhDsRZIe0Zy8TKBwXd
+cwc5kMpkwFK3drbhFuf3WnQUUR80oyGKCffJw3n40ET91b+nAYJ8bPvYFE+gDB+S
+vHktXvM+vk4PTAKGN21TyZfB9n8VVtIHq3DUPpStrFFQQUDKjMeZf0TDtEWVd1zl
+7jVJ2d+Su/KcAXUITXAQMl4ECXMZ3VD3fnbyRAHI375+wcBh08rM1DQRdhWd40XZ
+55rzTy6T0RVa3JcQBCtM8FYubYQvy8iU5XcA2LEDWdDn8D89IJ+UAnFHIYoeipj8
+qbYjl9JetF1gcmm3QlUwtec6nb5VSmWdQrdfnvdxrW54J3gqlGnzCQg=
+=7/EE
+-----END PGP MESSAGE-----
+
+--N1GIdlSm9i+YlY4t--
diff --git a/t/data/gnupg2/emails/15-signed-encrypted-MIME-binary.txt b/t/data/gnupg2/emails/15-signed-encrypted-MIME-binary.txt
new file mode 100644
index 0000000000..58049e1f2d
--- /dev/null
+++ b/t/data/gnupg2/emails/15-signed-encrypted-MIME-binary.txt
@@ -0,0 +1,60 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 171AA37F6B; Fri, 10 Aug 2007 16:13:42 -0400 (EDT)
+Date: Fri, 10 Aug 2007 16:13:42 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:15
+Message-ID: <20070810201341.GE5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="QWpDgw58+k1mSFBj"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--QWpDgw58+k1mSFBj
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--QWpDgw58+k1mSFBj
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgAiH54xEwaxc/DL+nyd5f/77c6Vk27bdxRz1eXHVU0ofqs
+oeZHkEWpkub80YQL1HOQTabAF3ZUIGfyfGufnqXpWWNjhnxP/Bi/Itxk4p3oq6Pj
+RDoDsrO6SPcM1wlbz7M/8rTmpjTk0cYl3nA9Bc7ZDP7jRWRRKFp3Jl63fvK2BWG3
+x0yA1WwJX/gzgsRlFSBBFukaffCqaeQZJ2GSKGbuHTH8EYvGDjqALlEwE/iPYRYq
+OoSa27KIzDCwPFJf8/ZK+03qX2D2LrEViflbFlZMcMGrIFmU0BLrlBx8Obimu3lm
+8bCDX5zQsOIptLQqrhQ5E1HIeEFHqJAxJwHu5v7AFggAqSNH4adYAxz3vZyQ3HdV
+IiDYdwwGh4usb7R7afc8uiFGzxmcc9ktyQ8bBAEpGHMU+ahcUMcfg1svcSKKFQqS
+xNJb5rl3Q9D7qqsoFnNdVFGIxhnUpjt16TdFEtRHDUnC6dWjxKw2fzdR7YsclzkP
+IjUP1yHRK0ees3r7LGU90zQUcUXGnuX4xbMi3+t8NFPqpi9DIkOKS77XEpLFg+Yg
+qrMi3/p72jGBcgbchyS5JJyrVfZjz3igEDy4A2rEw9lJvyemahpccYf9v8LjVCn8
+ofdeLujIyDV1T+wFuB2gIY8fbnvP2UC+ffJ2qGA4uDiz9T1t+IapBjwwrhG/P541
+KdLpAfXAJzKb/gnXdicy/TyGnMguVXryCVZXAx392jA5se/OVjtVkUV8hMcqBPFC
+6zMEPZDXVaCZ7r4VX4xK1y7MGTrq+t4v8UhmfxckiwDVrKZkt6MOwdhTq1YBwFwq
+DEDN391R2fFr08i+3ogKv30gNlqs1gfqh55uCsZMsrtjMAEnM7JcB6pnptND/mRm
+9MYsz5Sxra5L59SNNhJS0GjuTVGIaEhzwusWdFTAeE358AqTOTwdSNe/Fa3qEXBr
+YzmrCgTn4x4YTn8IDQkh80It7ENEc7tkgRN/FcG+Q6cwHWgPOj7QDBJsN/lm8V3K
+cWKVxwvp+hoP8isigZxi/7nOD1EZkQkMAWyZSFp+iCZH14GcAKwqxp9Y8bgSuF/5
+jzASoge+POvEIpsbS7lmfalU8qR2kCYg17fEvDH+6olqRCT6Bq30cVUYY+LVAHgz
+KXgJjK3WYue2XQieGaNYjtwr9AsVl4fxpjXmb+QwL6H0K4JMdXc9tabF5j5YFeTQ
+rWYzED39EiXst9dAFomVhXDHD1OdpAbNh5F9/9wlccgZ7co+tK3bdcD18k2G4XGq
+1AX27utveaSU8M1jeHG4a9//f6NLn4cqJ8Qryv0uiY7N0iiwWHsoHrci0doMQI0U
+glPhkk7qjHf7YAhsRsybfdNrum4jPHMpk1wqY4GR4xhV3JLAbDfKN17yHJWR3c2w
+TQ8sOLMPKMibyo/KRBLCz3CpnuSvpc7A5tCenDJLYtDhmUMofTN1ki3gBW3OFQpd
+zH6pCuVBQDQ3iLO/lg6Y434fPz3cuKnxBdN/QvdbeiX4H7tGzC/q+qXpu/8Yv2x0
+AVSQkrXcc4CQXAvLzqNMXa6NgKrVtVNXUgHyIxvOgGyVxULKDQo+3bByccCOjNOZ
+3gN/JnU2HvEk3iYDYPa+VOJzS1i6itZOCeCBF+NDaaTvG30owmINGCGl/nxv+yIO
+9nlCF3QYdaod2TVYfxdp2X7hlPEhv6nHYt2r3/pXYW4Hjy5M/mT7sR+OVAgknpiJ
+yOzeNy/dVoxpAAlOuzwl+sYI6TkDnF0vduJO0jxWP5+oa+Al9sWr4x4E59OkGAg/
+lQ==
+=NbQY
+-----END PGP MESSAGE-----
+
+--QWpDgw58+k1mSFBj--
diff --git a/t/data/gnupg2/emails/16-signed-encrypted-inline-plain.txt b/t/data/gnupg2/emails/16-signed-encrypted-inline-plain.txt
new file mode 100644
index 0000000000..84e49caf24
--- /dev/null
+++ b/t/data/gnupg2/emails/16-signed-encrypted-inline-plain.txt
@@ -0,0 +1,33 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 98F6C37F69; Fri, 10 Aug 2007 16:17:42 -0400 (EDT)
+Date: Fri, 10 Aug 2007 16:17:42 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:16
+Message-ID: <20070810201742.GF5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii; x-action=pgp-encrypted
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgAsnA+yHerSZnvxR6TIiWSIRlohPBIQHUhoeHBH+9Q0DFJ
+r6in5UmN1luVGtT8kl1dbLAnoVu2Yyf/d57IWgam41MbWi1EmGLQaaLHcIbQ3JXR
+MmXXwG7PTHWdZJismmqCOuT3svTlkqerIBicsHXvfKE209y+jP3lruJ7cVpxZyCI
+M75H8d313r3MwBpoRuEiNMBOjG6MXOATFmgRw93J6pzjWirxwmawhaSNeghkO8tN
+3vdDkzZlLmM/Pq4jQrkWbIbGH/EwdchbWNnhd91o/Lll77fshkXNMYQlgyU154sk
+3wCY5IFGJTUdR1hrETz2nOASLDHIdamhhz1xMItClwgA2uXkVhG0Fslp/A7z4a09
+ivX/gM6a4KuFSNVJtHrlc6Z8/WKe1LNdLiulbFMtbppvMtIkzgZfv/DBavZJBqVI
+EOI+9VzLb6IdqybbNp54nRbniU6aiboEk90waSjqHggCnk5qnOUxrxp2ZCIn9pwP
+KUisxy6cAKGCEeFdvtXIBqfC6uITAu9kNq78rPN64TUaZbJs8VshIj1zpGi6DUYa
+uPvGPIhlLi5xN/oK3Yu2TDrIPxO4m1ZdHQJH8TBn6l6EifAVsDeskSQ4nCZJzc0H
+0D+ofkCzxqRkjDY0IOcl7hI79cRxO5tagtf6od0vcK883wUHxe6Kfv26tKm8IsX1
+ANLAFQFi867dLG+X9wc/QyBwNXZ1hPSE8MulfAYyzT/rXno4nkmQrw6zFLf9q4gA
+Z7aZsgxXPAvWwhwLGyinNgi0ua5LHZL17CWOfG8/GlIK59mesnk8tC9Gyj8aLU3/
+ROteGBBGfk0UJbfcQ+reAjmORofZdHSMCsGYZ5DJEy3KIUrNHzW4yYAlfzLWYfX8
+k9R41E0xGBuooe578MTBtVOPZKY4gurQZdfrHdYnsUXgfpV1w6WYvEM31n90Px6m
+aXWFWq9JVxX/JFOmWJV38fw+EhNgApncTw==
+=J8xa
+-----END PGP MESSAGE-----
diff --git a/t/data/gnupg2/emails/17-signed-encrypted-inline-attachment.txt b/t/data/gnupg2/emails/17-signed-encrypted-inline-attachment.txt
new file mode 100644
index 0000000000..6991f0b7fe
--- /dev/null
+++ b/t/data/gnupg2/emails/17-signed-encrypted-inline-attachment.txt
@@ -0,0 +1,84 @@
+Message-ID: <46D73CE2.8060202 at example.com>
+Date: Fri, 31 Aug 2007 01:55:46 +0400
+From: rt-test at example.com
+User-Agent: Thunderbird 2.0.0.6 (X11/20070804)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:17
+X-Enigmail-Version: 0.95.3
+Content-Type: multipart/mixed;
+ boundary="------------070807070206050202070908"
+
+This is a multi-part message in MIME format.
+--------------070807070206050202070908
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+-----BEGIN PGP MESSAGE-----
+Charset: UTF-8
+Version: GnuPG v1.4.7 (GNU/Linux)
+Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
+
+hQIOA076g5OuwfIOEAgAn0IWP59DHAWRYz8MG09D5vp+V3rfVdwv8ud2hp/jAUDZ
+ogXobK3KkUH5CIDaohqgrxobAtU9D7XhxO1ti6G9ana7+u2GiTIQmC7F1THSipNJ
+GZajUNG4E0WQXjvkWvDgx2cLdjn+L/i4Y5lQvP6CEmzZpdfKQk4DZdmMJf/Fz0Ag
+jqPI0weYSEr8YBz/p0bEy2Xh7UPw8rwC6ajk/v/E/SfZXI+TpWnFxLt9OUN+o0E/
+o8RQ+5LTpPvkR4RTFFnqZAKu8CU2LqNIWYlzhm67pi+QqeepMuhbW+Ix8tt6oBbN
+EXFrwBYfjLeLcmMJcm2fEwE7otDqKHHW5/G/lu8RBwf9E0TjxnGbpTH3ERrj172E
+T/LT0LD2qRitQQCdFyeDvnq6KKyoUtkyhwrrfpDfB1ZYBSjgIB8rgolbO6OxnY8s
+O6dob+07mQrC3EsbrTQhRjwtLCWB/4kaI0d/9Y4/InStq14AvW0wZWX3kukUq8Us
+ReJhrDA/fOV+duOQgcEc6ZsMjLE/snQv6KMN7ey7iOe10ejLs9qHFZClqHhpjbn7
+zTPRapgTOV1hwBWq9603NDP1EQM/wAOFCw1TDUnhFOzUocpBfSwajWY1bKB4pz94
+Nf/U4BBUFq3aQVX3g4mh4sBesYInZ8wMq7fw9fegyiaLL7YzTbxg/YSXHWkTaYCk
+YIUCDgOxaIPydPr+7xAH/1BIgIWDNzXHWbrmi2pxg547LWoJ3EpJQ46fk2ryfIll
+6Ot1xpCXGStZA1bUnRB0KTZlTNVfXkIy2TuFKJ0xP5JgkeeVQ+Vn8wCXyPB1nYte
+WJ9aKHIk9UhKHhW6FHIjWs3CYjfmpJPaI3AXu4hwT/W1yPIFbAb2UYwuvRn5XABk
+RDxauFRDoHKPvy4IsorGBPIa5ZkJxuBsP7lxp03CfgnUHX7HYehlNp+rKzp82uLg
+fXJdwQAE3OcrnB7rbD9AirIyJpy4q/sYUOnC2M137PF+HYA5zCxktpnkVDtWd6Te
+DyQy7T5Ey5/NzP8IbJpS3Wv+bYOiozv1zNCZ4ZbopbcH/RKMlLN78fSTZmgC6Snb
+dcwZqi8lvL6vx83VBwUAaQeNDLvtlyjojt0UuDWUI3JQJpv5vcGdLjP21+5f/INt
+lua80hg/pKwoKijzQPPtnPBJQOiRkzIEYlaqMkmPi+jgkosf0kcAWxnQGt0L74tD
+Q4ENpgCK6jJVkQFN9Gd2efT7EFUc2acY7/YfFcTOBVm6xi0FXoa0HzL4NzMhbrsx
+NhlC7/Yp34y3NHjzVlMIKiU9kbHrVCyZyXKuSSV2em0a1SqbJu2wj2/qjK6Ibtts
+0aowVn5HafWR6jm8sEEyX/v8c1BdR5Ibmup7Z2DPd0j+fY65GK0nNYZ5QeYq7PxR
+rSbSwA0B+Ot9P47q0c2vGrQF7EKvug2sgnE/9K8DX+Q5IVwMQEoJUZvKf66x7DTA
+YIMnWxlJeeU6fkURzeBpv0TzidU6/KRa/2xg/QoUTZvftAoaQidsajzFSIZTBEqC
+xjzLnkqlDMtlZYBtdvVYDxrBvj8u5whGnhe6GhO8GUfIe/N+bWM5N1kbUAsE7Tau
+ify77kszQdf20rLVO9eU0MjXyvKpWcT/Dpk/Nzth3iLACEtjr/dXo5pMwK0mofx1
+I4lLS7P5PtTz4Oat7aV1up1o
+=LNkV
+-----END PGP MESSAGE-----
+
+--------------070807070206050202070908
+Content-Type: application/octet-stream;
+ name="text-attachment.pgp"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="text-attachment.pgp"
+
+hQIOA076g5OuwfIOEAf/fLTYMB41pbPXfa0LaNlQ5PVkAa8i9W/RVfA8s+BGgFYz/herlLi+
+eCE9Ls1RoiEmh3e3ZOG0M/iPA0qBMryH4fcYWqx3R7uaZDVIOEcUM3lR9Q0ffNfGRyVMKX+N
+nUUI/HAaSLCl1NWF6Qnh+/S8tV97D6FDdqQqJKeG7HtPcXMJ3daqHcCl5mMrL/OgcwEcqdHl
+dw8VnESjnkQ3NAvzyNJEpyB7fHN6HtaynxmZbU262ez9Ywh8XsfBbKsDhnLRf/rEUt7X3RQz
+YjXL2C6scGT9ctZ6i1yxPQJOP1+Z+UxijfSd8S59n51/SATsdjmhNFst1JZTbX9Xm/Gv//mj
+aQgAuzhrqVBvyOtX1fMNxGACBhMuJKMLvb9bCltnl4V8IN76d1HP65bw9FvFC7JNcLnbeLBk
+6J6CGhwZYcQHuLBiTAfycM636RotiszjLTx1/7j/Jp3vvzToLm3sNNb4INVmoRBrmVqqP2wl
+Ykl7mxdHAq0Lr6NMiTnk9/TVbJnXdCFseLONJaX6ZPrPZUbw6jhgDMeyAjoBkHJjGqfbde2S
+TsHvPvT53g8d2RgZx5ATptTphU5QsBbS0eYEIiKoU4lUh7augb6EratU63xTsKc9pJ8DJOqB
+l7Ic1ujUDQqlccTVJgYyIJJVO/GUR/AkIYrzWcvEwhtk+PW5CMwrcbEo5IUCDgOxaIPydPr+
+7xAH/RYdKbPnEo/0R8mZls6xuycjGoGNWYuhhaze7NiDPuflz/oMkPL9f/o/7a+9t5mBbdQ9
+XXnNKuhclocbDg6N/TLXWWw9011Ba2ko2l8LpvzlLo7oARaMYZu4kmMYZIkIeQ2GW97gIV4w
+yXLJOuVnH5cudt36/P4QqJM0PxSqmQA5sqAMB7cvgK3RFKbDvvrMvmyrdoTFmrcFhKMWbTq+
+g51hVLm7HEHjicP6LEhHv7m4ooe+rojS4D+0HofvkPou4XWJ+R2T4CVKOSfobrp0RjMqjRuJ
+PvdzhyUNjP1qhtvUyM0JBgYHd7biFKOKjYG7E7j9+5EhHG0uSG+xRWq9NtgH+QF2Mhb1WB24
+lpXZM2KPM6OdStgEJFEzjr9DwULJpEzQhvOAUI45Jd7oqLQjEdmzuPmkEBdNfcUBKkCNdADp
+JBn/0Ak2C4OQImtZX6kyJ2afF7zwMQ5J1eH2e/eOYJTOAVnt29EH51UZHi6OCWosYQhDMNZW
+8AXoza4H3474bPzlxw7utSRm/CJwetrmp3L9BahuEheYv3PZCmy/1aHpt5OHIJDmrDVMzaAH
+DhWNkRuY4/CLvg/+r4W21Y7tsPllPGNfxLJt9kilu8F3M/alhNK8CxbM3sskNnxSPPid5vE2
+e88iO74uhwvQzTrPKlXfsUDpnGacAwG3uNS3x3CbimjSwAkBjvCRETU1DziOU5xVTCGEQFPv
+gF3YtRG7Bmvm0d1zeAlPDuflRhadYCdNvy17gA8LI+YBuk74XavAqKURN6FEevULYaSPZCx8
+HXgjE0uyo8U7l2D9hrYjGuvON84Cwp2O6+jsiLk4oVvdBVbb0PRz4xj/Egnlu+yjGD88Swge
+zpQzBdaqE8m6sizWBlYyPGh8amL8/PfS3OC6hZcg4LOiLhj+h+h3eeamTyAE62zjJjC4UMKc
+ZEI9ZhQ95BxH9bTS+JxP6UySLnQ=
+--------------070807070206050202070908--
+
diff --git a/t/data/gnupg2/emails/18-signed-encrypted-inline-binary.txt b/t/data/gnupg2/emails/18-signed-encrypted-inline-binary.txt
new file mode 100644
index 0000000000..61e11e22c0
--- /dev/null
+++ b/t/data/gnupg2/emails/18-signed-encrypted-inline-binary.txt
@@ -0,0 +1,89 @@
+Message-ID: <46BCDC0C.6090400 at mit.edu>
+Date: Fri, 10 Aug 2007 17:43:40 -0400
+From: rt-test at example.com
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:18
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------090909060406090905060708"
+
+This is a multi-part message in MIME format.
+--------------090909060406090905060708
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+
+-----BEGIN PGP MESSAGE-----
+Charset: ISO-8859-1
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAf+KwEEEyzyWahb5iwjSff0D3MfGimfD7AJTEBjjDgtxcC4
+8xKSJsXhZ2feCi3Wx3TYAoFedoiR0DkyNd//B6dE51bpDpoUX1R8M4W0tOKH03ZZ
+N3sIBYSnJBF66GdLfjSvyEGD9sdi+OnWTv9DbQ4x9Sq2d3u8PBLu3krwk75hJEH7
+z9Q4rhqzpRU9ymhWpS/QPd+4SvuhlJ0ciUGeYLmOFc1YAUJNWzTtnja/jZptFY7l
+8oDXtHTapeJPB9M0WaDf6R60Evkl9DcvGA6FRBMCzWRjqMSdAPGYiceeMiDYcwCq
+hJWSzbDKAHDSY2qwlHZ+2y7mIze3x05qcBHYCIOKewgA5mer22WKZIiEP++p4TZF
+kJbwFxfCqf7mB/nsRGDWsfThGED4KSr18feba8ychNLbVx83FEtTZ5tei96N6NrK
+eS6BdjedTCbvrq7lhIFmC/qPXy/5cjNxr50RBT0sLUEdnY9dhrwLxo69Rqr5qHQT
+luYu7/NhQwOV8OlMTpvy/AfUXGiICLa1iBxtVK8UQ9YMLe1GOyCmseeF3UyfTmKN
+YfEylY17YRsmYZerulSwsHnEoCipjEHOwzksR5zXDHmnv7cqVq1gV1SnjSXOd1Cd
+QuJFdXY5fBdugcrAAJsiB8Iq4t0B7Ai1Lou6x+kKQoigF4i3zhSmH6blZmc99B1r
+jYUCDgOxaIPydPr+7xAH/j7bst78EmNmr4RJvQ4A5bss5BJeOdG36MsTkQ4rXTKv
+tA+chOccB3irMYqpWpKoDMWRz8VgAu9MVVc8SBUr6XRIhLRyCpuZxlwLA+EJJUk6
+yeKBHZZ8KgQ+PgC6WYMaTcRRLeOWbTxhhIrZmT2EbEEDE1jbeeLNrEu1wmrdMBBb
+fhtQTjOHKb7iau3LOGTbbV+F9llnPHrdy2WTp8ozFbsruEqdUG85zQ8X58sy/iC4
+hS9mj+vRs8nanbYABfDHUhoBk8VWUWPlpWTUfzDX0Wuai7LWo5wn7mK0p2i84vMU
+IghS5OGRJfrGVK/1giklqUrmPuiz8M2bG9voLoOVnVIH/izycMW2zZh12TD+YySt
+D1NP6OPy/5PgYgVZvzTYtOW7Y5EI1eTYoC0cMgjITokq6NKqN9aI7sReVV9P24El
+J/LxLvv9Nk7/8Jq6z1CjF0THtFg1mQYTWn52mrYwBr7aPpv/UDDFA0dmIancXwf0
+CHwFMMHFlYSBChy/vwx8+QiE60pLiz6EnajSq8lEQCf6nSFIvmkWn8y3IxmYRgr/
+CMn0BZc+VLgyzIJYG1Ygll10vXDdmjV4Y4f33stWr2Qse5Wp2Pyg/Lsfqw3C7+H1
+1BoxYJma2NmJ6sQu8xDNKPt8dsyOCYEyJqf8KGhi8eslRPuilKOreZ9b/KZh6OE2
+cNTSwA4Buvhbv4626sdq/BJxEi4Cxrhu3dMPCyeyl1540BOSMpThXdKa5pheJTs1
+78UDi87cJBZx8eQ5Gcg2VfwXkolc/dOvIRBEvnuIvA/3DaqH4gxMZ90UCFSzZ9Jm
+By83H0GVB0l8UbneSKtbr4wms5qjSUUzT7NTmqOdZwFmxJIbB0hVZtC1ve00WlkG
+qSmK2BXyG2bccsjeC/XOKO2WmZm9Gfuvtr6KcOnHFQYj08ZSfDPzJCuY7PK4/egc
+TR4wApehk6BzQwbz66uN2PlHIw==
+=2ZQG
+-----END PGP MESSAGE-----
+
+--------------090909060406090905060708
+Content-Type: application/octet-stream;
+ name="favicon.png.pgp"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="favicon.png.pgp"
+
+hQIOA076g5OuwfIOEAf/fVq/LJs3vrFnybm6thFjpDte1mawn7xw9op6UIFqEFRjkesreTn2
+b4vzYgi/8HUKJj6A/b9OBBobsOuHkKddZ+wRnTnMTc6ZGahJOFdOc3C84hEJYvyEgRqJ9hBh
+F6awMfPYHIfN3y6PpeJ8jbtWN2QxYvy9a9dsb7oUGi9FuBC7nI0qIqdxeLwjK4MkVGzDhdJU
+N4OCCe3LhYyD+Ev8Ote2NiWFdPnCkFiO6vwYI1cEyzltJXeOXYe/7YCKDb3FcTG9UszG2nDl
+jz7hIXF4NtYVQjIxxtRxPfxKgkzboXIoAD1enJpBkNtTdVS3jtdbFvSlypDhG3+mfMlUo/k4
+vwf/RF+30fL1kZjue/Jecd4oh6NcOokKRRScIwxTwittYPVYtR5W+swTRyF+YA5SLfygmmYb
+QHDjFX+cOx8u8WzmVgK4szOBgh921p6DWxMdD6aLK2wDT//ZVdRDqNV/0AbApexlDriCP/CH
+8BQxHKTCsentMtdVDf66Y/44K6HYceeU8iZT3pvQKXfAmetiMau7G/pN+BvkN2HXFhBPa8id
+dHYIpixvjk7Mg3PBzt6mJa4SOSf8vzProFx4UmnkexOQcRxpS0Zoep1mB16oWqm7tXEUjBJx
+39BwDg8e9sU4Yrri2WzUkIPU0pG3ub5sxbCTMSxMJnZkRk8ul8s9GMtWYIUCDgOxaIPydPr+
+7xAIAIu4kheO0n6eNJeng1XE/giRvZodwsO27kA00KIW8mi6WGLvehlmFoxntck1r2oCNVvH
+Oj94nfWsG2i1zvjQDvMp2Cnp3KTmhTrOss37dFayWVODF/Q9Kx+7WXnh9zCEjQe0eCd6PiKF
+fvb4zCU3ANAY8dTmqRcDDB9TK39nafpWHEfzhjClHrQhuQDh+yb4ayXAvUXkNLIYzAvuwvku
+9x46MPLHf/4VVQAplymRvsMy/Vj3R9triHoE9tD42EOWgbo525IwLQ590x/AZoZhkCOeffWv
+6fq29Z6om8TqFTHFGPb7I88s5ihlpvUgvXkAA7ZYdF6q06pDldWqVOCUm98H/0LZKiiURX1P
+30EAe7DpKi0bAUvHj2Qc5GCU+Hf1ASGJmeENFNMwY+eDwYA6wuBf0tN5zitvncUj5SBZjXjV
+o8Uz7JJ9/6BuUcfAa4/O2qTIFdctBI9bwzzzuXYF3LbYXfjB4WmoaR0nRh8kTlpgFij7WQlg
+l+C1G630ynSm4bVHSmD0J/kBDfNUF7Kyr/riPuqnyqf2wVffbLIJYe/axb4slACZ+F4FhfsZ
+0NLYL2+pvGW05sv+k/kEyhSQeQZwmu8X4iZdfFK6kOpkHeS7K/yFX7BYRD9nMnZ5Zwekh8l7
+eVno90OdJ4rVJkp4+c2N3kEPPLgrEVlaut9gybv553PSwSIBeo8TwJX0khartEsmJRh4fuQq
+Ni8JhsMDG5Mr8DMvmjhWy5Awp+uQ+neNcnk11wQ+OYDFw4JopRED0m+igEK0i/737ANzEhLN
+ssbKnPSivQCBo7Yzv9o3XUx+UU4c3E2bE3MQRGDgDmB1SS2h+wyLDWDoBHGXZ17Hxcb83huJ
+HxFt+5e2K8T6hL3Rwghtg1DHt9eVS05v35xomDn1zPR+EWTEEhvWrPEw00CGpsq3ub4vJajJ
+Aa+4ClaBivaZVKE4rC87cdLNkiBFbXR3ROvkzoSnrA7/ZUgupDLfagDQKAj91hC1hmF1nRix
+SOIYGGeM1IsKm806Ah58IOUWsE5vAzoFqCMB4kYNZLbXU1ccxZVTU6QnpE8DzHoDqOtyN5y3
+2nyRLH9jBwKfECR3YHH3NxRbbI317fhmU5pAvRWeHpRp1yzGrCf21lgx12Ot1EWxHuXrd23p
+0O2EiQAcwadItgkfKW+UwAxGsVX+vueqSBYmYViCTFWKGqMXmgXgirR4nLt7L20WqrXBFKBH
+ms+7e9LwLHStfAzilr1deHnriNfwz0b9UPAvCV3n6FN3uz2asBWZKjOxlEr2VmaQYLiiFWe0
+UhX685wevk7AOX2LZ7iq7SkVmMLSIMgOVI8vmt2PEw==
+--------------090909060406090905060708--
+
+
diff --git a/t/data/gnupg2/emails/19-signed-inline-plain-nested.txt b/t/data/gnupg2/emails/19-signed-inline-plain-nested.txt
new file mode 100644
index 0000000000..6ed683d076
--- /dev/null
+++ b/t/data/gnupg2/emails/19-signed-inline-plain-nested.txt
@@ -0,0 +1,34 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 3EDA537F80; Mon, 13 Aug 2007 15:34:17 -0400 (EDT)
+Date: Mon, 13 Aug 2007 15:34:17 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:19
+Message-ID: <20070813193417.GD6392 at mit.edu>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii; x-action=pgp-signed
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+- -----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+This is a test email with inline nested signature.
+ID:19
+- -----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.9 (Darwin)
+
+iEYEARECAAYFAkmETNkACgkQ0ygDXYSIHxv3ewCgijZQyL5vWIOfk+06XjqTXdrN
+VDcAnj13TCHvhas6rMtxcljNNGvPidw6
+=VMc6
+- -----END PGP SIGNATURE-----
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.9 (Darwin)
+
+iEYEARECAAYFAkmETOIACgkQ0ygDXYSIHxvvvQCfZlRPNjt77jJ7ANxwOpkHkwCY
+wsIAn0PzLhCKhIcAm+hk8CpduzYcY0xW
+=Xy5t
+-----END PGP SIGNATURE-----
diff --git a/t/data/gnupg2/emails/2-signed-MIME-plain-with-attachment.txt b/t/data/gnupg2/emails/2-signed-MIME-plain-with-attachment.txt
new file mode 100644
index 0000000000..c658e6b690
--- /dev/null
+++ b/t/data/gnupg2/emails/2-signed-MIME-plain-with-attachment.txt
@@ -0,0 +1,48 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 74BF637F75; Mon, 13 Aug 2007 15:23:57 -0400 (EDT)
+Date: Mon, 13 Aug 2007 15:23:57 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:2
+Message-ID: <20070813192357.GB6392 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/signed; micalg=pgp-sha1;
+	protocol="application/pgp-signature"; boundary="bKyqfOwhbdpXa4YI"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--bKyqfOwhbdpXa4YI
+Content-Type: multipart/mixed; boundary="DKU6Jbt7q3WqK7+M"
+Content-Disposition: inline
+
+
+--DKU6Jbt7q3WqK7+M
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+This is a test email with a text attachment.
+ID:2
+
+--DKU6Jbt7q3WqK7+M
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: attachment; filename=text-attachment
+
+This is a test attachment.  The magic word is:  zanzibar.
+
+--DKU6Jbt7q3WqK7+M--
+
+--bKyqfOwhbdpXa4YI
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: Digital signature
+Content-Disposition: inline
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFGwK/N0ygDXYSIHxsRAlbuAJ4wxUVCNerg6dLm+w7llCj51YYbFACgvNJR
+ajbUy9MMkljajl6Of3IlqRA=
+=R6Gi
+-----END PGP SIGNATURE-----
+
+--bKyqfOwhbdpXa4YI--
diff --git a/t/data/gnupg2/emails/3-signed-MIME-plain-with-binary.txt b/t/data/gnupg2/emails/3-signed-MIME-plain-with-binary.txt
new file mode 100644
index 0000000000..ed8e392b48
--- /dev/null
+++ b/t/data/gnupg2/emails/3-signed-MIME-plain-with-binary.txt
@@ -0,0 +1,55 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 9745537F7B; Mon, 13 Aug 2007 15:29:41 -0400 (EDT)
+Date: Mon, 13 Aug 2007 15:29:41 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:3
+Message-ID: <20070813192941.GC6392 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/signed; micalg=pgp-sha1;
+	protocol="application/pgp-signature"; boundary="pY3vCvL1qV+PayAL"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--pY3vCvL1qV+PayAL
+Content-Type: multipart/mixed; boundary="at6+YcpfzWZg/htY"
+Content-Disposition: inline
+
+
+--at6+YcpfzWZg/htY
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+This is a test email with binary attachment and MIME signature.
+ID:3
+
+--at6+YcpfzWZg/htY
+Content-Type: image/png
+Content-Disposition: attachment; filename="favicon.png"
+Content-Transfer-Encoding: base64
+
+iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t/AAAB
+BElEQVR42u1WWw6DMAwz0+5FbzbvZuZk2cfUritpea77wVIRIBQ7dhsBdIQkM8AMMJImyW6d
+BXweyJ7UAMnUvQFGwHp2bizIJfUTUHZO8j/k1pt8lntvchbdH8ndtqyS+Gj3fyVPAtZAkm3N
+ffCyi/chBIQQ3iqs3cQ0TZCERzbhngDocOS4z94wXTCmu2V45LuQW8hsSWpaP8v9sy+2IRZj
+ZTP5ububbp8Az4ly5W6QqJ33YwKSkIYbZVy5uNMFsOJGLaLTBMRC8Yy7bmR/OD8TUB00DvkW
+AcPSB7FIPoji0AGQBtU4jt+Fh1R6Dcc6B2Znv4HTHTiAJkfXv+ILFy5c8PACgtsiPj7qOgAA
+AAAASUVORK5CYII=
+
+--at6+YcpfzWZg/htY--
+
+--pY3vCvL1qV+PayAL
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: Digital signature
+Content-Disposition: inline
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFGwLEl0ygDXYSIHxsRAuYxAKDQeRS40bRiW5jmrwHNsCDN67vu7wCfV0Pd
+7T/gCO7TrbuGaJ0BVsJnJsY=
+=Pjdg
+-----END PGP SIGNATURE-----
+
+--pY3vCvL1qV+PayAL--
diff --git a/t/data/gnupg2/emails/4-signed-inline-plain.txt b/t/data/gnupg2/emails/4-signed-inline-plain.txt
new file mode 100644
index 0000000000..9240d81b0c
--- /dev/null
+++ b/t/data/gnupg2/emails/4-signed-inline-plain.txt
@@ -0,0 +1,24 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 3EDA537F80; Mon, 13 Aug 2007 15:34:17 -0400 (EDT)
+Date: Mon, 13 Aug 2007 15:34:17 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:4
+Message-ID: <20070813193417.GD6392 at mit.edu>
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii; x-action=pgp-signed
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+This is a test email with inline signature.
+ID:4
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFGwLI50ygDXYSIHxsRAp40AJ9ErYdLH2SVRXtgRtx7n/FVFOmKDwCgl/0T
+BeRSaF4Xbi8uGhVIkmU+YCs=
+=e4u6
+-----END PGP SIGNATURE-----
diff --git a/t/data/gnupg2/emails/5-signed-inline-with-attachment.txt b/t/data/gnupg2/emails/5-signed-inline-with-attachment.txt
new file mode 100644
index 0000000000..763f97138d
--- /dev/null
+++ b/t/data/gnupg2/emails/5-signed-inline-with-attachment.txt
@@ -0,0 +1,48 @@
+Message-ID: <46BCDA81.3030308 at mit.edu>
+Date: Fri, 10 Aug 2007 17:37:05 -0400
+From: rt-test at example.com
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:5
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------010302000403000103080306"
+
+This is a multi-part message in MIME format.
+--------------010302000403000103080306
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+This is a test email with a text attachment and inline signature.
+ID:5
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFGvNqA0ygDXYSIHxsRAuCHAKC0HnduLWqihY5wzGYDFGbFtA4chwCgr6+t
+mQo4oXIqu+kIZ0ExWyiUENs=
+=3ABp
+-----END PGP SIGNATURE-----
+
+--------------010302000403000103080306
+Content-Type: text/plain;
+ name="text-attachment"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline;
+ filename="text-attachment"
+
+This is a test attachment.  The magic word is:  zanzibar.
+
+--------------010302000403000103080306
+Content-Type: application/octet-stream;
+ name="text-attachment.sig"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="text-attachment.sig"
+
+iD8DBQBGvNqB0ygDXYSIHxsRAmkbAJ0esGNEDMr01u45ZHIIKZpCFSE8tgCfXBedq0Yu5mnZ
+zOZyASZYUIf9wSE=
+--------------010302000403000103080306--
diff --git a/t/data/gnupg2/emails/6-signed-inline-with-binary.txt b/t/data/gnupg2/emails/6-signed-inline-with-binary.txt
new file mode 100644
index 0000000000..d0251ccc71
--- /dev/null
+++ b/t/data/gnupg2/emails/6-signed-inline-with-binary.txt
@@ -0,0 +1,55 @@
+Message-ID: <46BCDAE6.4090803 at mit.edu>
+Date: Fri, 10 Aug 2007 17:38:46 -0400
+From: rt-test at example.com
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:6
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature";
+ boundary="------------enigAEEA002E4229CA8E5445ED73"
+
+This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
+--------------enigAEEA002E4229CA8E5445ED73
+Content-Type: multipart/mixed;
+ boundary="------------000104020205010403010301"
+
+This is a multi-part message in MIME format.
+--------------000104020205010403010301
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: quoted-printable
+
+This is a email signed inline with a binary attachment.
+ID:6
+
+--------------000104020205010403010301
+Content-Type: image/png;
+ name="favicon.png"
+Content-Transfer-Encoding: base64
+Content-Disposition: inline;
+ filename="favicon.png"
+
+iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t/AAAB
+BElEQVR42u1WWw6DMAwz0+5FbzbvZuZk2cfUritpea77wVIRIBQ7dhsBdIQkM8AMMJImyW6d
+BXweyJ7UAMnUvQFGwHp2bizIJfUTUHZO8j/k1pt8lntvchbdH8ndtqyS+Gj3fyVPAtZAkm3N
+ffCyi/chBIQQ3iqs3cQ0TZCERzbhngDocOS4z94wXTCmu2V45LuQW8hsSWpaP8v9sy+2IRZj
+ZTP5ububbp8Az4ly5W6QqJ33YwKSkIYbZVy5uNMFsOJGLaLTBMRC8Yy7bmR/OD8TUB00DvkW
+AcPSB7FIPoji0AGQBtU4jt+Fh1R6Dcc6B2Znv4HTHTiAJkfXv+ILFy5c8PACgtsiPj7qOgAA
+AAAASUVORK5CYII=
+--------------000104020205010403010301--
+
+--------------enigAEEA002E4229CA8E5445ED73
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: OpenPGP digital signature
+Content-Disposition: attachment; filename="signature.asc"
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQFGvNrm0ygDXYSIHxsRAvwSAKC4d3U6SjfhYpUHu2V/vXtgxGFa1QCfeK6p
+dyDDlvlqP9Ns4EExvHXfHuY=
+=sX3V
+-----END PGP SIGNATURE-----
+
+--------------enigAEEA002E4229CA8E5445ED73--
diff --git a/t/data/gnupg2/emails/7-encrypted-MIME-plain.txt b/t/data/gnupg2/emails/7-encrypted-MIME-plain.txt
new file mode 100644
index 0000000000..cabed5314e
--- /dev/null
+++ b/t/data/gnupg2/emails/7-encrypted-MIME-plain.txt
@@ -0,0 +1,47 @@
+Received: by anduril (Postfix, from userid 1000)
+	id CEA9137F51; Fri, 10 Aug 2007 15:27:49 -0400 (EDT)
+Date: Fri, 10 Aug 2007 15:27:49 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:7
+Message-ID: <20070810192749.GA5572 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="YiEDa0DAkWCtVeE4"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--YiEDa0DAkWCtVeE4
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--YiEDa0DAkWCtVeE4
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAf9FtBMrkLWUKK5BtwuUsYXV9Mbe/YkkmK61MuysAtLcX/M
+DiXPzngjL62Dr9l88R3imf2kPmY36yx5WNeXUrFFVmFPaeZrHEJiMNvPGVVQCqRK
+uar2vsYRK9th4msZnn0hBYnA8+8kZ8rWefWHpszOcJ1YZpyyEMLf8Vnstyf0Pebp
+Wxixr99+mn3MVH38CrhoErI6CMiCFJgPAl5wtGWd0lT3+657dLJCsNI0cT3AY/JC
+IJwWD2sdOXOzDo7tdC3l7/YuGsXvd4jGu4A8PdoBMOgPx/N4KT3+uPhp2sRD3PMg
+LU59613xT8/FOYxQSib9hGqNZPqXS3ryC3ZvY4Sp8AgApCMocKsN7vm8N+6Yh7Nc
+Jjy/kuf8tjuTTs32Yk0ACU3y2SFXKSBZo6cVXgJhUvmG2Dq4O/A8mtP0cjqeBFqp
++vZOb7xhtxxTE6HWWThvx5qxcwjpijzDMS9uzfGaHwLvewdGVLODCup06MJmeAmj
+N1WEZqc/cqFZvZ9omCpcvTGoELpOzcUY1MxAq1IVkMzAk7dPIHYuyPSFQK6Y8IPl
+xsfSMcq9gjth8qautnriB0ohwkUebGnxgM4CjGjnSmLmUFXkndUOXKbM7R7E3QdL
++6TKMr2pvLl8U3OJrCiyyPVyVi3in4TYi4uegXJl05CAEjEXRf5RFhaWRnn66EYN
+WdLAAQHpkESfESVUaWvJwI+JB+LMBoKZjWgvIQ7AQKqLAvIsAqs9PKM4mYOMaawl
+en9XNRkW0dSGUxjW4K8u7fLS/xzWrZeCrafEkvCowVv/nR+Wxm296bxX+7z2R52/
+j+J0zms1fRdVxEs+rOI6JuXg4xWxUdLTav7cqvQ5c/izM+jU4yWEa3y0fHma6Jeh
+o4+1NerQby8Yzxszh9XVfkbYnQilhP8qCVxYe4HGjKlNi5v/xOgCznCKsqkGYMPU
+S32K6lg=
+=xeKr
+-----END PGP MESSAGE-----
+
+--YiEDa0DAkWCtVeE4--
diff --git a/t/data/gnupg2/emails/8-encrypted-MIME-with-attachment.txt b/t/data/gnupg2/emails/8-encrypted-MIME-with-attachment.txt
new file mode 100644
index 0000000000..c28eb9843c
--- /dev/null
+++ b/t/data/gnupg2/emails/8-encrypted-MIME-with-attachment.txt
@@ -0,0 +1,49 @@
+Received: by anduril (Postfix, from userid 1000)
+	id C962637F57; Fri, 10 Aug 2007 15:39:14 -0400 (EDT)
+Date: Fri, 10 Aug 2007 15:39:14 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:8
+Message-ID: <20070810193914.GC5572 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="FFoLq8A0u+X9iRU8"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--FFoLq8A0u+X9iRU8
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--FFoLq8A0u+X9iRU8
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgA4dZa3t55kB5pY4Q7+h4thTJVZ+wV2QxI5wZFRvMs7yw3
+MEIWqHusoe7R2zeXLxaT0gMSQj3osO+GrGJRDk4qCGjcjSneFmYKkELx8KRML59N
+X7/HeX7v8nSGpyqM5foaky38uAGxj2xBpswfvsY8qdQ37a4mNH2atESnkxYLomZb
+4vTRTSE1XtvhaG7oHaXxfmeNln0JezfbfpDGTktZJOupEX99j6/bvloimXyBT6SZ
+3wbcP/EYoqC8DQOQTtFTAisWwveTVp6FDFvi5L2BCJ2NzYZSDOBNeXrzf1AJ04dN
+9lTzbtejdE/AgwDclDnZYZByiGLM43X6nTk7c9gH1AgAlrxxvO1yz4sZchGM2rrn
+yzNJpcvcgbJLTt54gqie/BdQHSnvlCBLZzplx2xV9HIwJB7Kf29Ka2gg2p6mjyID
+YUd1451K1hDUmBHgya8jb6g2c6bBxiusUODlGfmv+c+kq/yG0tKws5d0/IGanL+Z
+h7XkcEYq3its0acCbcKizgzLSmxSqu6NK7rnDvioUOHHKG8uC9fk2JetdTdYOTBn
+AWYDxa3D+kRvOAiOWGMqtvOWAC1BZJ8hssBpesuG1+sucTh7W4ZROtQfEbqC8W51
+s6e17x1YUqE8QIs/aUYkUkX2JqObKsZPJAiVYCQkqJceIk/lT4rXNOfUwl5dAynk
+WNLAZQGKuVghSfSoRyKbFMRDimigisWN2JUudaV0Ld6E/5iO7EP7XhjqkzTlwsaN
+wui2n0Omxye2dNVMKz3q76fVp79XbznaI1ckeVjiiDmkiaQOp1Au/Sx2Bj0/wolJ
+OXnp27oqc9THy3RANLRXIQuRaYOyoxUIjVvhbOVfM3U7MlcAW3jT2kMTI7H83HWc
+ezxKfqM7nJUKkIVmRY4J/6X4uo5c8DdIxLeG+ioj+3I7BRkLfIAPYDGaeB5+BD1k
+EPcVGd3u1EW7D8f5CRARnU8aaC8DCPk5YYN6wM9JY9n0FEgIkwoniTpqHLs/UMa8
+DWGer1UCGp4qElmHvWHVV8b82nw6Ta2BhWKjA9pphf96KOTt3y4jqxfU4GbrOYDJ
+786/cggItsc0
+=qJrM
+-----END PGP MESSAGE-----
+
+--FFoLq8A0u+X9iRU8--
diff --git a/t/data/gnupg2/emails/9-encrypted-MIME-with-binary.txt b/t/data/gnupg2/emails/9-encrypted-MIME-with-binary.txt
new file mode 100644
index 0000000000..1cc8f06960
--- /dev/null
+++ b/t/data/gnupg2/emails/9-encrypted-MIME-with-binary.txt
@@ -0,0 +1,57 @@
+Received: by anduril (Postfix, from userid 1000)
+	id 215C737F5D; Fri, 10 Aug 2007 15:46:27 -0400 (EDT)
+Date: Fri, 10 Aug 2007 15:46:27 -0400
+To: rt-recipient at example.com
+Subject: Test Email ID:9
+Message-ID: <20070810194627.GA5815 at mit.edu>
+MIME-Version: 1.0
+Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
+	boundary="GID0FwUMdk1T2AWN"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.13 (2006-08-11)
+From: rt-test at example.com
+
+
+--GID0FwUMdk1T2AWN
+Content-Type: application/pgp-encrypted
+Content-Disposition: attachment
+
+Version: 1
+
+--GID0FwUMdk1T2AWN
+Content-Type: application/octet-stream
+Content-Disposition: inline; filename="msg.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+hQIOA076g5OuwfIOEAgAqwVRwpeOIRMvrgswuYagJfk57HvSvrAg7tVzXHaHW5LI
+zJeWpKg0PVwmJUYTG9cZN0gkfpr33SULruvniZRSX650E/vv9H03P1dVYhBbcP01
+AyfPoaySinipoqG5OK7aTJVEnPZqqsCKgzFbqEg+FdF3YjNVa1etfmKV/JvoXTxR
+il6pOqv+xUJ66GpPUoP7mCZJ/cJEF1zz/EbZoYcS9MgxoP42bOIYBhyqIv3fUh7X
+fuDpup5xnJwM3FRjkNQPlqKhgGHCgk04OGgLUw8wzRwYQ5jSyij45J/UcGoNWePi
+eVTZignbYIfrlwa5GH6776U9QA9ei7PFP3RqO2CB2Af6AiIdkeN9MfPFfiQ/ASwR
+/zePg+OOmKC6locoUHWTEuBCZhgty7XarfPZufBHlA3Z3f369Pxz9nMV07KkO22t
+thhltpsxan2pFZL4oPfwA9OdDRGeWIISn4jGc+foNfKTmERY7EZv9ruDC0lxaSvs
+HEWJC38sJ3xGdlS439qaddSbm0Lft8JbNwi6FEpThE4abBdITu+BxbkoFrjIy6aC
+UJgyJ3YtPTpU8JuT49Ocn+51YPXZTSc/ePnvlzSqRXHeJrOKp5Oyoa9001242MRM
+mpaC1lw/sfGIIAXv5t2B569RXDsZ2jIvPjFIleIdyKOG17m8qsP82nWKbN2N96am
+p9LpAb5gqid4Hw1PjjjCB0A9w7G9orQeEQuF+2V9MGWAEWOHoVbGWTRjfh4uXASz
+4PlazbNDIZZB09ACaDfxG3Y3/TI2X0sl9KJNRALFtHm4+DNbWVeWe+aKrG9ZY9Os
+xjD/UQFFQrchpNPD7xV98WWEg4+s8pkk9Mwv+Q/gNf2xBXJXDOhIm2LlY0VlhETq
+fk4YS3EUS78Ti4V99w/L9PTnoaZY/8kkI6NNjb+bqldhd9AQHXEkpV5Gh/PrsgFn
+FzBZxEwcY8wKP2yKMTp+A3rsjHwM4OChjtkDShf4KDwGS5D+E4o1RJVcM3jfh2SG
+RRKge5ewErBmIDIqeU8Wpj5cuyqS77CIB3aplSKLqUu2bC2EiLFZxs2UTg+cp5WK
+WFzt+YmH6/p0y9eyaAGOleSh3dnIZHv2BDtzF9x5fHFesjaVp3jpmMsHQ1ol53TR
+8N4fUuO140oE0Gnci61EXzLjkGCSBhzZqy/+K8PR0d1hGv+vlwfadpzsPfX8WcxZ
+DBuI1E7OcqVaXemR90/C2AbLB8qGuwQ+wTIHPqXlm8s0+6wZ4YUcUoa/F+2VLSxN
+VWGji1yioKrSaBjlBBUpHfoC/Q/0hLk2FgIrAZFIPvhHl9nF3Vq/HqlxtGZQ7gnL
+TjQtRuI+oU7IhJRR1VZbhr8xn1pirueiiwJUPub6w4XfMGyvcvlIOVpUImW5Hab7
+kg20iwrcJNLCcPJsR5iEbhJBBHLsViMtfdRbstlEV8I4wTY2tNAkfMtUtWdUhwOA
+fdx/UmHjbNZFSS6cpsGHL8+QJ2Bo1urkHIz6z1w4f1vTL31NAPeyvZ4kNstSqkNt
+6fjdrt8mBRVGQfqRQsK2b/R61ErJoFULboeqOT/ed/Dufu2Wxf/wuuRvG77S8xoq
+OiDT8nhyHh7ljjdHZZ2uLro8gg==
+=BIke
+-----END PGP MESSAGE-----
+
+--GID0FwUMdk1T2AWN--
diff --git a/t/data/gnupg2/emails/README b/t/data/gnupg2/emails/README
new file mode 100644
index 0000000000..634f53794c
--- /dev/null
+++ b/t/data/gnupg2/emails/README
@@ -0,0 +1,28 @@
+Set of emails signed and/or encrypted using real MUAs(mutt, thunderbird).
+
+All messages have subejct 'Test Email ID:\d+'.
+ID matches number in name of the corresponding file.
+Top most entity of a message as well contains 'ID:\d+' text.
+
+Emails may have either text plain or binary attachment.
+Text of plain attachment is
+"This is a test attachment.  The magic word is:  zanzibar."
+
+Content of binary attachment is RT's favicon.png.
+
+Encrypted messages encrypted for rt-recipient at example.com.
+
+Messages signed using rt-test at example.com key.
+
+Name of a file may contain the following parts separated by dash:
+* signed
+* encrypted
+* MIME - RFC format
+* inline - inline format
+* with-attachment - text plain attachment
+* with-binary     - binary attachment
+
+In total 18 emails using all possible combinations.
+18 = 3 (signed/encrypted/both) * 2 (MIME/inline)
+    * 3 (no/text/binary)
+
diff --git a/t/data/gnupg2/emails/special/binary-asc-attach-marked-plain-text.txt b/t/data/gnupg2/emails/special/binary-asc-attach-marked-plain-text.txt
new file mode 100644
index 0000000000..db904ae241
--- /dev/null
+++ b/t/data/gnupg2/emails/special/binary-asc-attach-marked-plain-text.txt
@@ -0,0 +1,60 @@
+Message-ID: <46BCDCF2.3080704 at mit.edu>
+Date: Fri, 10 Aug 2007 17:47:30 -0400
+From: Christian Ternus <ternus at mit.edu>
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:12
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------090206040704060905090502"
+
+This is a multi-part message in MIME format.
+--------------090206040704060905090502
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+
+Attached file has .asc extension
+and content type is text/plain.
+
+ASC in some clients stands for ascii, so it's
+attached as text/plain.
+
+--------------090206040704060905090502
+Content-Type: text/plain;
+ name="favicon.png.asc"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="favicon.png.asc"
+
+hQIOA076g5OuwfIOEAf+P0Qp/k1B0WDRr9bNcEANStTaiefYoLrUrtMJv+aFtkiSqKfft0A9
+okrYkVUKs6kxfgxueuqNMFQh58nl8+d7Z2qGIgVEXxC8rRxexEQ8mXu5LXzzBbc6Dq8Jsa7B
+bXzwGty51culYcKeMEjpEY8Qx76qoNQDNCuvth1JJxJ6xQix/pVyZZbJRu/nLrv1i3Z4KRFY
+qafnJlcsUTVj2o9dLfeU13z8nd0uBPY+hiCgYJHSPDLr+mkA+c6YK0m4a88r/wjLmsVHMkn2
+N5nCjuqP4tzT8SCjhoICGTbu+fFdks9NhQjvsW7MHBi9HFFzm6SoEvquFHThzwMl3hAhTLpi
+Jwf/a6unMP/swAxoFTJ2GRXBmQOH4sJHR/M31rEVkLZGJixhU94Tpx8ptgLXqme5VCXgl+M3
+Oh0GHRXqFYjR/HGUTZokRKR/BgCEpOGlH5FcabHiu/Gy8UBezPbuC+BNvxuCbuwODMp9R5DE
+F8RSCAQ1hrRoJjeHT2wyE7HdCvN/xx7NyenA3GdJa5Z6W7Y0gshr2fAOFL39jKXw4WwCh/Yq
+XnyG8uOyPgFrnHI3WpO24VpQHp3MBKebWNhQ/Opy/cABunCSwWQpDB9Ar4GeS3R1WGtMNC4r
+ph4afmTHJcQQkoa0VfvHL0hEzycwysYD46O9QhZfhxtKKShgX356oCeMEIUCDgOxaIPydPr+
+7xAH+gMnbi5OLPf5xMeZydvNWdHE/wJTub2rrWFtzvj0Aa5Ne/KFhcDDqSjaL3MXP1WfIJr1
+/ANe1eWcM2hlYVDpEn6YOh0bz6BASE4kbHA5nGMyUrgH0hWfcOgkMUloRZdf1q32j80mchCJ
+rF4YsQ6EndnUYzAiXKHGJRUy/6IA2qBH2n/fRiyC2FmmQPtWO4c6t15Vgh4fB3QXSTri8J5r
+577yIiHRE+dq6gg1BfyqCtw0DW56lSFQ7dxyMXeLyTGyjTGPlUDc+FbP23CRK7zDIVujARmm
+mX3bP2lMfCK326FwBZf2Q4Zl/ac1BN8Mcb4wwcnKvRzfEw8d1Y6pkphe7KYH/0MDDqtmuEw2
+D/xdw4FHB16/HW32bcPaMVvFuseczEfrwPGCrCiPHPm++edAoY0rWoBtzHVpgN+s5bset5OR
+snhjuWceuCb+Ga0QV0s/xmIPIQ8VYaXyD5hob6nHEIeskS68Vbni0BpY3nejDPoV3dNHY2Tp
+2fjYNHCpsdTz8yyavQVixoQjZQH9hUb48zZDHCt0Af9Rfq6Et5/Qr8iJqAyEU8JzZtrkpO4O
+HgLU7JTPLxOGzYtOj8JkLmLguVA5kOafAuU4OTEU43utQfS3KYbdEWT2jJ1QaJVS8CjFJrqH
+V99FUsDvgKWSTy5hA9gkQAQE1QdwkoQKpkCWm18KZqTSwNkBfrsEuvHC3Cz4Sy+cJmhr4Hvx
+dyZY8DuuWExUcVCjkeuASLgjLEgahnCbMkyKATazswwTEdfzjcOowjLTdaWFEN/Cg22nF/px
+9MXMtzBkrTkjYPhfywETKoMVH/Nw7rRNZhkOSb5WJV5ynF1BlbzXI7Z8rA/KrIn8aydzwJUU
+qFr8Dw1C7kbE76+SFVWX8fqpwGmQhDAO+kos6ivgN9HDHtuXmwfGeROi2U0WcmFGbAyLo5fT
+LCcNPOMflU27WDXm8m+tjq9naUynqvwg5zBBz/xY67L1R8uOwfZplvRi35iZAJjzMHGirkiB
+W3ZDXbDqEfKl4aCXqU+XhQZsku2z3OtKZOBVVI5p8nGVEfavg6QECRUNUS7qbtMxlj5IwCGl
+babK3W5YVuERjklrrLUYZjqFIZ2yLK3Z2VmSn7yKAb/eRvdEeha+9PKcN11pXPkS/M3t+Vpr
+G+4TqNgqwLVWMvbENp08dS3OAPpZLDnqG9CJV0qacDMjv69X26V3Xp6vuZoKqAPxMG9QKAfX
+E9LInR1Kd0cpRUkb
+--------------090206040704060905090502--
+
+
diff --git a/t/data/gnupg2/emails/special/inline-binary-attachment-with-wrap.txt b/t/data/gnupg2/emails/special/inline-binary-attachment-with-wrap.txt
new file mode 100644
index 0000000000..6c84b53a2c
--- /dev/null
+++ b/t/data/gnupg2/emails/special/inline-binary-attachment-with-wrap.txt
@@ -0,0 +1,54 @@
+Message-ID: <46BCDCF2.3080704 at mit.edu>
+Date: Fri, 10 Aug 2007 17:47:30 -0400
+From: Christian Ternus <ternus at mit.edu>
+User-Agent: Thunderbird 1.5.0.12 (X11/20070604)
+MIME-Version: 1.0
+To:  rt-recipient at example.com
+Subject: Test Email ID:12
+X-Enigmail-Version: 0.94.2.0
+Content-Type: multipart/mixed;
+ boundary="------------090206040704060905090502"
+
+This is a multi-part message in MIME format.
+--------------090206040704060905090502
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+
+A binary file encrypted with PGP MESSAGE wrapping then attached
+to a mail. As it's .asc some clients attach it as content type is
+text/plain.
+
+--------------090206040704060905090502
+Content-Type: text/plain;
+ name="favicon.png.asc"
+Content-Disposition: attachment;
+ filename="favicon.png.asc"
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.11 (Darwin)
+
+hQIOA076g5OuwfIOEAf/Qxa6rk76JTSjlyb27k1kZwpsvtXocnALZEd1tbJ4HwwH
+o0CQb5Ew6apUzAcfSFdVcZ+IbFXYmjJ7bH1mpG5kjfSz8mEYO0muX+ZrgVeL+Q3J
+/lR+A+THD7LNxnsZe11OfDi1aX8Uz71R03vmK+0o1ZIge3zzdm1BoUT9cmy1QPMi
+aJSdBAJn01EJ++ETfrBqspFj8n6yR/q0BukAcoefaMA0qzrJNQeluMsrqSEjbcuq
+nwXDEv8fhqF6efrWW+wtyMnY/JpIEwmlNbcCI0NZQFM92vkp89nusRPwbP0+z87m
+Qsr1vyLHMX79kqwcRKadf1EW/3eWVqlbrOC+yhvKKAf+MAcixgFDIUDup+NuWpjp
+YUbS357E4yqh2LXogpTZDsvjSL+Z4hKEurKq8TYju8T4exGHkas3VbcWnoPBKiMU
+3RjyVNCQzS3XeOtQv9g8WclENq6Pg8eQVNKd5tbpQ6Sios0J1FYFVXHSr/dQOaET
+Y1jSVKV/6GxVwERpR7DN+yTIVIr//pYnMIb6agNapSKbosvTKNEcGPSjjSB8ixpo
+C9yiZuIhml5lQUXV9ouDDMtHOFtguDUSSm7Ta84wRJ2VcVQUIv/ADg3jBC5Lmp5Q
+CGqwq5Hx7q5AKKZDnGNqHepWzeCiEs5Dg9J9onBYx4zrNMrGVP5uvF+RwK4J0pf0
+XtLAzgFryuv7cswKKxP9vJaEjLDI4Tizdui+la0vA2tJ6gVQ1CPVtREt0s3s+LM0
+oUzgVMvnb1X9KgyazcGp/a+bGHAZwy9/CscxoDYyDrQuUbypNK+f0xefpOURiQ0z
+N86G/DeaRwLkePoGWZySWk5Ktat6594lRP5h1/B/VYXhvBeh98Rm6E7S8gpjJlMr
+6wit2Bd3oPVeqv1fxru9BR1CEl4N+/4ODVwphqMhYM9MplIzGrrCC9bTudKC7g34
+UZ+IQV4GLlCK/1BckJQgkWEHTS5fDxAdwG4F7TWfpGzsp43IlDUr073aL7Z3TfkY
+iyAYGVdnq1EpzVAOPAc2IUMlybUGjoYTmolI1/XIEAxZG9cSFuSMXlrJ2On2kvFO
+/rla7j5euFpucFWumcNDbZ1HIgDUQ0AMxpzIqwVtd8ZGE0OhSqbT6lgP7jZUwiSA
+H4g6/4w+aM5XIy26jifvHOlHzsCraG/xGbzXgYkocXbmSuBhtFdoR4KFzOyFaI7H
+uFoUez7HUuEjl80w77pBeU2v
+=j0Yd
+-----END PGP MESSAGE-----
+--------------090206040704060905090502--
+
+
diff --git a/t/data/gnupg2/emails/special/quoted_inline_signature.txt b/t/data/gnupg2/emails/special/quoted_inline_signature.txt
new file mode 100644
index 0000000000..af67b7e096
--- /dev/null
+++ b/t/data/gnupg2/emails/special/quoted_inline_signature.txt
@@ -0,0 +1,26 @@
+To: rt-recipient at example.com
+Subject: Test Email ID:4
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+From: rt-test at example.com
+
+Forwarded email with signature quoted. RT shouldn't bother
+about it.
+
+> ------ Forwarded Message
+> From: Xxx Yyy <xxx.yyy at localhost>
+> Subject: test email
+> 
+> -----BEGIN PGP SIGNED MESSAGE-----
+> Hash: SHA1
+> 
+> This is a test email with inline signature.
+> ID:4
+> -----BEGIN PGP SIGNATURE-----
+> Version: GnuPG v1.4.6 (GNU/Linux)
+> 
+> iD8DBQFGwLI50ygDXYSIHxsRAp40AJ9ErYdLH2SVRXtgRtx7n/FVFOmKDwCgl/0T
+> BeRSaF4Xbi8uGhVIkmU+YCs=
+> =e4u6
+> -----END PGP SIGNATURE-----
diff --git a/t/data/gnupg2/keyrings/.gpg-v21-migrated b/t/data/gnupg2/keyrings/.gpg-v21-migrated
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/t/data/gnupg2/keyrings/crls.d/DIR.txt b/t/data/gnupg2/keyrings/crls.d/DIR.txt
new file mode 100644
index 0000000000..2a29a47b8d
--- /dev/null
+++ b/t/data/gnupg2/keyrings/crls.d/DIR.txt
@@ -0,0 +1 @@
+v:1:
diff --git a/t/data/gnupg2/keyrings/gpg-agent.conf b/t/data/gnupg2/keyrings/gpg-agent.conf
new file mode 100644
index 0000000000..563b2d1a2c
--- /dev/null
+++ b/t/data/gnupg2/keyrings/gpg-agent.conf
@@ -0,0 +1,3 @@
+allow-loopback-pinentry
+#pinentry-program /home/user/projects/rt/t/data/gnupg2/bin/fake-pinentry.pl
+#pinentry-program /usr/bin/pinentry
diff --git a/t/data/gnupg2/keyrings/gpg.conf b/t/data/gnupg2/keyrings/gpg.conf
new file mode 100644
index 0000000000..7781328564
--- /dev/null
+++ b/t/data/gnupg2/keyrings/gpg.conf
@@ -0,0 +1,20 @@
+# Do not attempt to automatically download unknown keys from external
+# sources
+#
+# This prevents gpg from emitting some warnings (even warnings about
+# operation success) related to key lookup. Removing this setting, or
+# enabling a non-local source for retrieving keys that are not in the
+# keyring, will cause many tests that look for an absence of warnings
+# to fail.
+no-auto-key-locate
+
+# GnuPG versions 2.1+ emit far more logging statements than GnuPG
+# 1.4.x. RT tests don't expect some logging statements, like 'gpg:
+# using "rt at example.com" as default secret key for signing'. This
+# option disables some of that verbosity to allow some tests to pass.
+quiet
+
+# When gpg-agent has 'allow-loopback-pinentry' set, This allows the
+# gpg binary to accept a passphrase via --passphrase, --passphrase-fd,
+# or --passphrase-file.
+pinentry-mode loopback
diff --git a/t/data/gnupg2/keyrings/passphrase b/t/data/gnupg2/keyrings/passphrase
new file mode 100644
index 0000000000..30d74d2584
--- /dev/null
+++ b/t/data/gnupg2/keyrings/passphrase
@@ -0,0 +1 @@
+test
\ No newline at end of file
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/1CE41E7AA5FAAFEE76B5305F221976D0CEDB2768.key b/t/data/gnupg2/keyrings/private-keys-v1.d/1CE41E7AA5FAAFEE76B5305F221976D0CEDB2768.key
new file mode 100644
index 0000000000..d31e2b912b
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/1CE41E7AA5FAAFEE76B5305F221976D0CEDB2768.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/210870ABB621F9D1E253F252D7B53C9C02040F42.key b/t/data/gnupg2/keyrings/private-keys-v1.d/210870ABB621F9D1E253F252D7B53C9C02040F42.key
new file mode 100644
index 0000000000..1c031dc898
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/210870ABB621F9D1E253F252D7B53C9C02040F42.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/2B67804D7DB2AD2AC92532890FB4C6005EBCE0CE.key b/t/data/gnupg2/keyrings/private-keys-v1.d/2B67804D7DB2AD2AC92532890FB4C6005EBCE0CE.key
new file mode 100644
index 0000000000..ac377a3e7c
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/2B67804D7DB2AD2AC92532890FB4C6005EBCE0CE.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/5647B70F9BF8E8CD28BC49F8FB20653411028576.key b/t/data/gnupg2/keyrings/private-keys-v1.d/5647B70F9BF8E8CD28BC49F8FB20653411028576.key
new file mode 100644
index 0000000000..dceafcab85
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/5647B70F9BF8E8CD28BC49F8FB20653411028576.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/5F27C38EAF5C322CF050172BDA498DE8D67D2143.key b/t/data/gnupg2/keyrings/private-keys-v1.d/5F27C38EAF5C322CF050172BDA498DE8D67D2143.key
new file mode 100644
index 0000000000..3e141cc6b9
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/5F27C38EAF5C322CF050172BDA498DE8D67D2143.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/656F164F4A0493D8365DBAD67D3616E7702CAA0D.key b/t/data/gnupg2/keyrings/private-keys-v1.d/656F164F4A0493D8365DBAD67D3616E7702CAA0D.key
new file mode 100644
index 0000000000..48c3c380d7
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/656F164F4A0493D8365DBAD67D3616E7702CAA0D.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/DAB23BFE9603D82F14238A74210663638798C598.key b/t/data/gnupg2/keyrings/private-keys-v1.d/DAB23BFE9603D82F14238A74210663638798C598.key
new file mode 100644
index 0000000000..afe3aa5dba
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/DAB23BFE9603D82F14238A74210663638798C598.key differ
diff --git a/t/data/gnupg2/keyrings/private-keys-v1.d/E620D10200EC263627621E130E01865F56C57564.key b/t/data/gnupg2/keyrings/private-keys-v1.d/E620D10200EC263627621E130E01865F56C57564.key
new file mode 100644
index 0000000000..8c6e895c93
Binary files /dev/null and b/t/data/gnupg2/keyrings/private-keys-v1.d/E620D10200EC263627621E130E01865F56C57564.key differ
diff --git a/t/data/gnupg2/keyrings/pubring.kbx b/t/data/gnupg2/keyrings/pubring.kbx
new file mode 100644
index 0000000000..75f17ffcbd
Binary files /dev/null and b/t/data/gnupg2/keyrings/pubring.kbx differ
diff --git a/t/data/gnupg2/keyrings/random_seed b/t/data/gnupg2/keyrings/random_seed
new file mode 100644
index 0000000000..81e1ee40ea
Binary files /dev/null and b/t/data/gnupg2/keyrings/random_seed differ
diff --git a/t/data/gnupg2/keyrings/signed_old_style_with_attachment.eml b/t/data/gnupg2/keyrings/signed_old_style_with_attachment.eml
new file mode 100644
index 0000000000..0bae0d4af0
--- /dev/null
+++ b/t/data/gnupg2/keyrings/signed_old_style_with_attachment.eml
@@ -0,0 +1,48 @@
+Message-ID: <45A10003.1090705 at bestpractical.com>
+Date: Sun, 07 Jan 2007 17:13:23 +0300
+From: "Ruslan U. Zakirov" <ruz at bestpractical.com>
+User-Agent: Thunderbird 1.5.0.9 (X11/20061221)
+MIME-Version: 1.0
+To:  rt at example.com
+Subject: test
+X-Enigmail-Version: 0.94.1.0
+Content-Type: multipart/mixed;
+ boundary="------------030903040907010006050500"
+
+This is a multi-part message in MIME format.
+--------------030903040907010006050500
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 7bit
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+inline
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
+
+iD8DBQFFoQADtaRiGUNF96URAmHSAKCDdVnRJ2gb1idhE1ZXEg1JARalsQCgkaU8
+74cnNxVyp/0XwBA73qzkvx0=
+=UmxP
+-----END PGP SIGNATURE-----
+
+--------------030903040907010006050500
+Content-Type: text/plain;
+ name="test.txt"
+Content-Transfer-Encoding: base64
+Content-Disposition: inline;
+ filename="test.txt"
+
+YXR0YWNobWVudAo=
+--------------030903040907010006050500
+Content-Type: application/pgp-signature;
+ name="test.txt.sig"
+Content-Transfer-Encoding: base64
+Content-Disposition: inline;
+ filename="test.txt.sig"
+
+iD8DBQBFoQADtaRiGUNF96URAqmBAJ42zyr06nK6R4dNpZD5067DNDgjRwCgkR+SKgz7OdAq
+p11D7PQGCR1Wuvg=
+--------------030903040907010006050500--
diff --git a/t/data/gnupg2/keyrings/sshcontrol b/t/data/gnupg2/keyrings/sshcontrol
new file mode 100644
index 0000000000..c61ee5cbe8
--- /dev/null
+++ b/t/data/gnupg2/keyrings/sshcontrol
@@ -0,0 +1,11 @@
+# List of allowed ssh keys.  Only keys present in this file are used
+# in the SSH protocol.  The ssh-add tool may add new entries to this
+# file to enable them; you may also add them manually.  Comment
+# lines, like this one, as well as empty lines are ignored.  Lines do
+# have a certain length limit but this is not serious limitation as
+# the format of the entries is fixed and checked by gpg-agent. A
+# non-comment line starts with optional white spaces, followed by the
+# keygrip of the key given as 40 hex digits, optionally followed by a
+# caching TTL in seconds, and another optional field for arbitrary
+# flags.   Prepend the keygrip with an '!' mark to disable it.
+
diff --git a/t/data/gnupg2/keyrings/trustdb.gpg b/t/data/gnupg2/keyrings/trustdb.gpg
new file mode 100644
index 0000000000..14ea734bfc
Binary files /dev/null and b/t/data/gnupg2/keyrings/trustdb.gpg differ
diff --git a/t/data/gnupg2/keys/general-at-example.com.2.public.key b/t/data/gnupg2/keys/general-at-example.com.2.public.key
new file mode 100644
index 0000000000..5b5f7fa23a
--- /dev/null
+++ b/t/data/gnupg2/keys/general-at-example.com.2.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEbgjJQRBACx8uMHcl9JlKCUU5yh0rBw636MXhKr7cH/+zBTeUVQyfs+J4fo
+HlI3fwJzZOxwXKTwmXsHSKxomeBJxPpFCnwHvn7xTYh6Wtis1Rm2Vr4lsw4gxrFj
+bpk1ISkHo4tO3dPTNx6Jhz+gYzoVUyfclz/byUmEbe2HJkBCQNmC9/lcuwCg477S
+siOdObqTKtQhDqXzFfOHKmsEAKVB8RImtLAO/HPY5+rxiVkfKjsmZovi0PfioGDI
+3o1jcSwq/RwWPZTNB0vnlEx1aD3zedUn1T7ZPnKoRttIv0xYlg9wYhX/xvOA9mKy
+G5aXSypiJiNwJSQfcChlyVHX3R88pURIzPiwWv2OBOvRagE8Bmgz0DFa0/AQfmvI
+vpUmA/4qZVzOJ5hC6fVP+ESKEC6fStvHAEZM3sQK5AnZsuUls3+tgfkD9T6ei5YF
+MXDLMGz3thue1M0QEu3IL7cLoTMalWQpjpyDuqXS8UAsd5cG2eP2iA6Uf2VoKQ11
+w6Q1FyMwTC9B0F8JijwdLF77ERSCtIG+TOA1EtH9HfTV5+BfHbQfZ2VuZXJhbCAy
+IDxnZW5lcmFsQGV4YW1wbGUuY29tPoh3BBMRAgA3AhsDAh4BAheAFiEEdeFWJx3M
+8C3dSnqM32UfoGMsT1AFAlrT1cIFCwkIBwIGFQgJCgsCAxYCAQAKCRDfZR+gYyxP
+UCNKAJ0VgY4ApzOYcq5lfRhgmghJgSFzGgCfXRnslIGTMkArNLx2LSRI6CNMUTG5
+Ag0ERuCMlBAIAPnmaC0Xj3gG+OG6ZQRm7Xlb1Av33vvYSe0AecZ3q3HqvYaWpaYg
+evN7+OC4h3JepUYRVYCiwMC7Ty8XUQIMMmgLP+2TKOFc5PgwEpYvQal62TrU+LZC
+/QazFBJgb4XAqNOT6kTirGdP3fafdTzsrFS2AjHMftj+gXGBvQsZDGCiRI+6r8T6
+O2CVjF7L1/N4VaOvZPvuDmha709c8IWOD6Sbd/2tDHFGAO4zhs+vm1aOEtOk0HTE
+pkxvHphRVQ/8PIr8OGpoxnlC3W9nRAj8I5I/L0qrvrBHVZboTRIMVTj3EBu0ybYx
+mAOHm6P+UWn3nIMaYFJnPDFjSrL8Fs1zgcMAAwUIANuI+3LjbGJ4a0S1B2+Op6MS
+wTXlmGdr7N//gVyH8R72Vo6a1b016SDaW1QwfD41zlWx5Ygq0WqWc5m1y607rJiB
+Uf4YnbzuCdfDeArzMRxtDZFTFgR2K7A5G4yqjCZWU4IXGA9bpW/kSbwTeRvV0QzH
+4Rz9JWZ5ek5wZXmRL09L2947eu6herHqXcarcFTfG8OEncVFGWxRi0Y4G4mXT+he
+T/VNSMC5CKezEz42HhWWN4jd6JPZiBvKl1eMfrOZMPLs+UTLlENh0U6wpbWxlcpa
+hjrLZNTgg70kFZ6FLwuGfekxO/rkUwTo7D1bn6EtMFij0T+RRlda8+UmAYDXjf2I
+SQQYEQIACQUCRuCMlAIbDAAKCRDfZR+gYyxPUET6AJwNpkgxKEdjvIbdB7Y+IPgA
+1wyt+ACdGc0py11j1RLa2gn01+nPnBIS7R8=
+=4sFa
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/general-at-example.com.2.secret.key b/t/data/gnupg2/keys/general-at-example.com.2.secret.key
new file mode 100644
index 0000000000..cdfcff77c8
--- /dev/null
+++ b/t/data/gnupg2/keys/general-at-example.com.2.secret.key
@@ -0,0 +1,32 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQHpBEbgjJQRBACx8uMHcl9JlKCUU5yh0rBw636MXhKr7cH/+zBTeUVQyfs+J4fo
+HlI3fwJzZOxwXKTwmXsHSKxomeBJxPpFCnwHvn7xTYh6Wtis1Rm2Vr4lsw4gxrFj
+bpk1ISkHo4tO3dPTNx6Jhz+gYzoVUyfclz/byUmEbe2HJkBCQNmC9/lcuwCg477S
+siOdObqTKtQhDqXzFfOHKmsEAKVB8RImtLAO/HPY5+rxiVkfKjsmZovi0PfioGDI
+3o1jcSwq/RwWPZTNB0vnlEx1aD3zedUn1T7ZPnKoRttIv0xYlg9wYhX/xvOA9mKy
+G5aXSypiJiNwJSQfcChlyVHX3R88pURIzPiwWv2OBOvRagE8Bmgz0DFa0/AQfmvI
+vpUmA/4qZVzOJ5hC6fVP+ESKEC6fStvHAEZM3sQK5AnZsuUls3+tgfkD9T6ei5YF
+MXDLMGz3thue1M0QEu3IL7cLoTMalWQpjpyDuqXS8UAsd5cG2eP2iA6Uf2VoKQ11
+w6Q1FyMwTC9B0F8JijwdLF77ERSCtIG+TOA1EtH9HfTV5+BfHf4HAwLtyIiCjzEz
+GPB60i8g+ZD5r0nI/4fCiyvtxzeymBsMjkfp0jqrRkkYrqm13fb10+FiXK9DKp+E
+v7tvhu8+i4s2QcNltB9nZW5lcmFsIDIgPGdlbmVyYWxAZXhhbXBsZS5jb20+iHcE
+ExECADcCGwMCHgECF4AWIQR14VYnHczwLd1KeozfZR+gYyxPUAUCWtPVwgULCQgH
+AgYVCAkKCwIDFgIBAAoJEN9lH6BjLE9QI0oAnRWBjgCnM5hyrmV9GGCaCEmBIXMa
+AJ9dGeyUgZMyQCs0vHYtJEjoI0xRMZ0CawRG4IyUEAgA+eZoLRePeAb44bplBGbt
+eVvUC/fe+9hJ7QB5xnerceq9hpalpiB683v44LiHcl6lRhFVgKLAwLtPLxdRAgwy
+aAs/7ZMo4Vzk+DASli9BqXrZOtT4tkL9BrMUEmBvhcCo05PqROKsZ0/d9p91POys
+VLYCMcx+2P6BcYG9CxkMYKJEj7qvxPo7YJWMXsvX83hVo69k++4OaFrvT1zwhY4P
+pJt3/a0McUYA7jOGz6+bVo4S06TQdMSmTG8emFFVD/w8ivw4amjGeULdb2dECPwj
+kj8vSqu+sEdVluhNEgxVOPcQG7TJtjGYA4ebo/5RafecgxpgUmc8MWNKsvwWzXOB
+wwADBQgA24j7cuNsYnhrRLUHb46noxLBNeWYZ2vs3/+BXIfxHvZWjprVvTXpINpb
+VDB8PjXOVbHliCrRapZzmbXLrTusmIFR/hidvO4J18N4CvMxHG0NkVMWBHYrsDkb
+jKqMJlZTghcYD1ulb+RJvBN5G9XRDMfhHP0lZnl6TnBleZEvT0vb3jt67qF6sepd
+xqtwVN8bw4SdxUUZbFGLRjgbiZdP6F5P9U1IwLkIp7MTPjYeFZY3iN3ok9mIG8qX
+V4x+s5kw8uz5RMuUQ2HRTrCltbGVylqGOstk1OCDvSQVnoUvC4Z96TE7+uRTBOjs
+PVufoS0wWKPRP5FGV1rz5SYBgNeN/f4HAwKvZ4Taueg6H/C98kThe+fS6Sf5am17
+5h1AvoghRFIuRUlIhnnhyMobTPkEiLnrqO7BYy91tlvXMyUs/yyqOQWG6yArsCPX
+Ajm3XLIActMQt6HTgV0VVNuB0YGISQQYEQIACQUCRuCMlAIbDAAKCRDfZR+gYyxP
+UET6AJwNpkgxKEdjvIbdB7Y+IPgA1wyt+ACdGc0py11j1RLa2gn01+nPnBIS7R8=
+=94rw
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/general-at-example.com.public.key b/t/data/gnupg2/keys/general-at-example.com.public.key
new file mode 100644
index 0000000000..67899bc962
--- /dev/null
+++ b/t/data/gnupg2/keys/general-at-example.com.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEYrdhQRBACpTwAjSJchxV9rgWJj/4GUe92xZ2wWHVrkv7cELO5GD1ie8wtA
+nh57oXfcFhuSmtLTyT/C1Mbzo/tz4Sigf33bZlEMXusp0bLsSz1S/5mslBGRdApJ
+Dz5jETEcakpzWsHA5sHfv8HLn+o8WUDtlGZf+Edi0DqUKSiLRkjWMAdcJwCg7cN1
+IIhhFFAf9Lr3Ny7ngJDwn/sEAJoZVUmhBHo9TipR9lZY1si5U0hA8Yn4XghLp4z9
+0rm8dAgLSZwFI2/zoU5u9qjW0UAo8Sp2SO9F03wQpfUGnpQtea/HVNuwiZVU42bB
+E5gn5EIYrHYT8X7cd+ZpWVGYu2117uoJtRHwnfuh857ocs7M7xeo7IQUZArqeHOG
+i3hABACV9mqnZoPyCOtaBogdXtDlEbqDvYclONJTsSKAfPsNRjJi8lzvJL9ZhtS8
+YKIUvxFu+XX0UVXWoNnzte8Ip/0hwupJu9jIcBJpI9dVEK3H2tWr+NElzML/uch+
+VO7UUmk2H/hF8+a3wXkdEN45FnJCyqC0Kk59OcY3bJIrI56SZrQdZ2VuZXJhbCA8
+Z2VuZXJhbEBleGFtcGxlLmNvbT6IdwQTEQIANwIbAwIeAQIXgBYhBOwegefcPbQn
+iPsOTp+mYsBt4i/CBQJa09gsBQsJCAcCBhUICQoLAgMWAgEACgkQn6ZiwG3iL8K+
+WwCgxUmzX8JKh+8yXvlU0haInT7AOxYAn1ayq7XZU4+QtDhQYaEvFNUR8kKiuQIN
+BEYrdjAQCACrEeGjKhWIYmwiYwobZdDDEcgElzbXNovAbwwCfrE1chlEOuOWDLQi
+214YHQezVWqJsTvR/Bn2rk78S/fYz+x/G0SAkzJ9nM5U8zFjQBm7uxR2x8OJOpX/
+QXAoyMYzVpXa6WppVksmviGl3GODKd9NSq2QmNi1QwDAxyx5785GfK5IEZxobdKN
+bI7Ksj6gObh7ZBn+MaYg0/hvc8cm70Ilerd1H+8kaVjGv24ClpceNWSxrn648DqK
+qPIKhGj9K/5XdIA1I5glgj22coUe4sxgCrA659Y2e8eNvbNLSEIAknqnQIxwGGZo
+2J5dw6Ca3wwgl79vlbgi1+BL/YP7Ij+LAAMFB/4hJOSHaljZATFe0aaGM7UtLEH+
+w7mfTMk6RC9/8jlo6BbFcM/x1hxz2anaxXmiQH5LgOiX+mkZrFqz6SKx3BM2NrXY
+SvbUuuboIZ/KqnbXgQplwzjgqYhvUcC60uW6MEmxaB/osOCAfizvzkYrPC0D00d+
+JZ5aRdYZesYWwUro5YNx1IfQZwe6zYX0UcvI6HmOmR3hdzPHmUQCfXC9SFC1Gf1s
+FTsUsZSKd3fna9sp6B4WNS+EYIun5gUjFIHY5d5V3NRsyOJQzTMm7dU0Oyr0g/kQ
+G9XdzCLG44X9fNiIMg+p7MMNT0/kfZF3UhAGAwg+X1ZcAVGQIglSeya9A4g0iEkE
+GBECAAkFAkYrdjACGwwACgkQn6ZiwG3iL8IS7ACgqGQCKktwadlp3UKmSbxwUruH
+9FQAoLJU+CKSRdQXWzLwPqMr2FYL94P3
+=WJec
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/general-at-example.com.secret.key b/t/data/gnupg2/keys/general-at-example.com.secret.key
new file mode 100644
index 0000000000..c706b7239d
--- /dev/null
+++ b/t/data/gnupg2/keys/general-at-example.com.secret.key
@@ -0,0 +1,31 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQG7BEYrdhQRBACpTwAjSJchxV9rgWJj/4GUe92xZ2wWHVrkv7cELO5GD1ie8wtA
+nh57oXfcFhuSmtLTyT/C1Mbzo/tz4Sigf33bZlEMXusp0bLsSz1S/5mslBGRdApJ
+Dz5jETEcakpzWsHA5sHfv8HLn+o8WUDtlGZf+Edi0DqUKSiLRkjWMAdcJwCg7cN1
+IIhhFFAf9Lr3Ny7ngJDwn/sEAJoZVUmhBHo9TipR9lZY1si5U0hA8Yn4XghLp4z9
+0rm8dAgLSZwFI2/zoU5u9qjW0UAo8Sp2SO9F03wQpfUGnpQtea/HVNuwiZVU42bB
+E5gn5EIYrHYT8X7cd+ZpWVGYu2117uoJtRHwnfuh857ocs7M7xeo7IQUZArqeHOG
+i3hABACV9mqnZoPyCOtaBogdXtDlEbqDvYclONJTsSKAfPsNRjJi8lzvJL9ZhtS8
+YKIUvxFu+XX0UVXWoNnzte8Ip/0hwupJu9jIcBJpI9dVEK3H2tWr+NElzML/uch+
+VO7UUmk2H/hF8+a3wXkdEN45FnJCyqC0Kk59OcY3bJIrI56SZgAAn2a5NRggeMB1
+vXJiR6c1NjYO2+hHCRC0HWdlbmVyYWwgPGdlbmVyYWxAZXhhbXBsZS5jb20+iHcE
+ExECADcCGwMCHgECF4AWIQTsHoHn3D20J4j7Dk6fpmLAbeIvwgUCWtPYLAULCQgH
+AgYVCAkKCwIDFgIBAAoJEJ+mYsBt4i/CvlsAoMVJs1/CSofvMl75VNIWiJ0+wDsW
+AJ9Wsqu12VOPkLQ4UGGhLxTVEfJCop0CPQRGK3YwEAgAqxHhoyoViGJsImMKG2XQ
+wxHIBJc21zaLwG8MAn6xNXIZRDrjlgy0ItteGB0Hs1VqibE70fwZ9q5O/Ev32M/s
+fxtEgJMyfZzOVPMxY0AZu7sUdsfDiTqV/0FwKMjGM1aV2ulqaVZLJr4hpdxjgynf
+TUqtkJjYtUMAwMcsee/ORnyuSBGcaG3SjWyOyrI+oDm4e2QZ/jGmINP4b3PHJu9C
+JXq3dR/vJGlYxr9uApaXHjVksa5+uPA6iqjyCoRo/Sv+V3SANSOYJYI9tnKFHuLM
+YAqwOufWNnvHjb2zS0hCAJJ6p0CMcBhmaNieXcOgmt8MIJe/b5W4ItfgS/2D+yI/
+iwADBQf+ISTkh2pY2QExXtGmhjO1LSxB/sO5n0zJOkQvf/I5aOgWxXDP8dYcc9mp
+2sV5okB+S4Dol/ppGaxas+kisdwTNja12Er21Lrm6CGfyqp214EKZcM44KmIb1HA
+utLlujBJsWgf6LDggH4s785GKzwtA9NHfiWeWkXWGXrGFsFK6OWDcdSH0GcHus2F
+9FHLyOh5jpkd4Xczx5lEAn1wvUhQtRn9bBU7FLGUind352vbKegeFjUvhGCLp+YF
+IxSB2OXeVdzUbMjiUM0zJu3VNDsq9IP5EBvV3cwixuOF/XzYiDIPqezDDU9P5H2R
+d1IQBgMIPl9WXAFRkCIJUnsmvQOINAABVAp0QyiYtzj0z2cOBzeZCSaRLUJ7TEj4
+EER/QuF2JRhFT2ZyU3seQKPd+XwRQIhJBBgRAgAJBQJGK3YwAhsMAAoJEJ+mYsBt
+4i/CEuwAoKhkAipLcGnZad1Cpkm8cFK7h/RUAKCyVPgikkXUF1sy8D6jK9hWC/eD
+9w==
+=Nsws
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/recipient-at-example.com.public.key b/t/data/gnupg2/keys/recipient-at-example.com.public.key
new file mode 100644
index 0000000000..810627baa0
--- /dev/null
+++ b/t/data/gnupg2/keys/recipient-at-example.com.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEWOOBARBAClfdK23heqW39sO3K0p+KtZkDxWhgpjjRfMSWQWwY++eDFhDr5
+BGG3zxsB2R8MOaHVKetuDjWjmfDi/LvDR8br8+eaLt94F4PBcLa+vVjboYyjvTFs
+2t3leyXjNd+mBTZmUcY6WLM0E+biIJdlDhVOv95n8VwvT10R0J/mGO7hTwCg20NC
+vJJ/fpWzPItFfKHnKg3gO3MD/RhG6CxmsZs+1bdzY07UwABQG8NhoR5Veqg2+uBr
+xiYjemtC+8fAtthEojJ334BE7qDuXEO7eq1R+JOtEj/Hx8gtgWQfDNZlgLA4NUSc
+aU3PthtXD4CnY5MsTrxjpD+bjTde6ziEJ3RHPQQSq2S1fKqo5Bf6H7GYWueRiSGS
+cNK2A/4/WAYFQbj9Jm7zgvPrLRRnk7RP3A4+ABaWEtGMRbpCaFEHd63gjYEH7P3i
+/O6y9kXsYr3SkDbhk6h1Cx8+4fjpZHAd4XbgabZhp5u7Nq3m/TIzQiXMYXrZGleB
+CGoQrERbM9mavEgOHGZEwO1I/JKSHdmAg/adTRAbG+AxZK79u7QhVGVzdCBVc2Vy
+IDxyZWNpcGllbnRAZXhhbXBsZS5jb20+iHcEExECADcCGwMCHgECF4AWIQRyMqPG
+D3loZXljcKVIVe2Ik+ud5wUCWtPg0AULCQgHAgYVCAkKCwIDFgIBAAoJEEhV7YiT
+653nGiwAnRKTxz+PMj0gsVDG/geQf9nTZTozAJ0bEVqiPkxLE7t+OFATnXumOfFN
+YrkCDQRFjjgUEAgAsBzdX0WwQrenF1wgthWNXzmusvnz6EZyyB42oXZMiCd4ncPC
+LTMDzYrWByF+8FPsBv4DtYaLoTStec6z+sygNX7lChpzgz2FbWpvWx4G37Rq7vae
+kgxKoXlX/idmvgvbWDq8Tj9yCst3cEpsDWEIN0gZ6obcuOLL75EaeEiSJj4Uak1h
+gAj1uReW0L0Fi2XkMG8yulOqUNR9LOqvPfNlhoPfQVQZtNOp8hJTVELixjtoSaAW
+8Hq++Jr+z1fKV2eA8XC5MQsIAb8mQV1m+h2TCVN2/+8hjRIWQclKOZPZrv3vC6HG
+5oLXt5atCF8XSzGxmEnUBzeiysZBC+vx1kJ3ZwADBQf+JweTHCZgprtQ9Blh7EPh
+CwZL6urtNtjNtJZzHPaXknXX+kd0Pqa10Zu0SfmZA+MGc4jcZjC+2pvMbhY7nLmq
+yxihbbZkv2i/rtCknIokgs0sidbCKrGhGAHcqCTknm8M3DsJkvGsS9A0oTWBMSp+
+ZAZQCJeKknZVdtNZ6c83p8O/m90p6wV2cOaT6N+NsvT8byNTC3q+dBcxVmci7FMz
+Gz7i1NB8rWqHmIx1oLfDLXmmDbBmiTI7ONUQnLAhCaoADyVy8PRL+Xj4kzoSl/Hy
+B30iM5VQtR3b9OI9K8Yz+Ckl2indtRxSaVZ4Xn1fH25k+ju3AO5soHqCsxY5nAaA
+zYhJBBgRAgAJBQJFjjgUAhsMAAoJEEhV7YiT653n4RUAoJd1DuGANpd7VGGwNfoM
+CCpAk/4TAKCrbh6NpoJr0Ab41toDA5lM/EYYPw==
+=fEl7
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/recipient-at-example.com.secret.key b/t/data/gnupg2/keys/recipient-at-example.com.secret.key
new file mode 100644
index 0000000000..b21ec5ab95
--- /dev/null
+++ b/t/data/gnupg2/keys/recipient-at-example.com.secret.key
@@ -0,0 +1,33 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQHpBEWOOBARBAClfdK23heqW39sO3K0p+KtZkDxWhgpjjRfMSWQWwY++eDFhDr5
+BGG3zxsB2R8MOaHVKetuDjWjmfDi/LvDR8br8+eaLt94F4PBcLa+vVjboYyjvTFs
+2t3leyXjNd+mBTZmUcY6WLM0E+biIJdlDhVOv95n8VwvT10R0J/mGO7hTwCg20NC
+vJJ/fpWzPItFfKHnKg3gO3MD/RhG6CxmsZs+1bdzY07UwABQG8NhoR5Veqg2+uBr
+xiYjemtC+8fAtthEojJ334BE7qDuXEO7eq1R+JOtEj/Hx8gtgWQfDNZlgLA4NUSc
+aU3PthtXD4CnY5MsTrxjpD+bjTde6ziEJ3RHPQQSq2S1fKqo5Bf6H7GYWueRiSGS
+cNK2A/4/WAYFQbj9Jm7zgvPrLRRnk7RP3A4+ABaWEtGMRbpCaFEHd63gjYEH7P3i
+/O6y9kXsYr3SkDbhk6h1Cx8+4fjpZHAd4XbgabZhp5u7Nq3m/TIzQiXMYXrZGleB
+CGoQrERbM9mavEgOHGZEwO1I/JKSHdmAg/adTRAbG+AxZK79u/4HAwKFk9XsfmB3
+Z/DqZQlA5RqbcZ8AXS2OmGuQyAQOK4SGMNi2BzxieMSk7++KEhbtXNr3NmTqWb7/
+s5Xu46ayhOOcm9BjtCFUZXN0IFVzZXIgPHJlY2lwaWVudEBleGFtcGxlLmNvbT6I
+dwQTEQIANwIbAwIeAQIXgBYhBHIyo8YPeWhleWNwpUhV7YiT653nBQJa0+DQBQsJ
+CAcCBhUICQoLAgMWAgEACgkQSFXtiJPrnecaLACdEpPHP48yPSCxUMb+B5B/2dNl
+OjMAnRsRWqI+TEsTu344UBOde6Y58U1inQJrBEWOOBQQCACwHN1fRbBCt6cXXCC2
+FY1fOa6y+fPoRnLIHjahdkyIJ3idw8ItMwPNitYHIX7wU+wG/gO1houhNK15zrP6
+zKA1fuUKGnODPYVtam9bHgbftGru9p6SDEqheVf+J2a+C9tYOrxOP3IKy3dwSmwN
+YQg3SBnqhty44svvkRp4SJImPhRqTWGACPW5F5bQvQWLZeQwbzK6U6pQ1H0s6q89
+82WGg99BVBm006nyElNUQuLGO2hJoBbwer74mv7PV8pXZ4DxcLkxCwgBvyZBXWb6
+HZMJU3b/7yGNEhZByUo5k9mu/e8Locbmgte3lq0IXxdLMbGYSdQHN6LKxkEL6/HW
+QndnAAMFB/4nB5McJmCmu1D0GWHsQ+ELBkvq6u022M20lnMc9peSddf6R3Q+prXR
+m7RJ+ZkD4wZziNxmML7am8xuFjucuarLGKFttmS/aL+u0KSciiSCzSyJ1sIqsaEY
+AdyoJOSebwzcOwmS8axL0DShNYExKn5kBlAIl4qSdlV201npzzenw7+b3SnrBXZw
+5pPo342y9PxvI1MLer50FzFWZyLsUzMbPuLU0HytaoeYjHWgt8MteaYNsGaJMjs4
+1RCcsCEJqgAPJXLw9Ev5ePiTOhKX8fIHfSIzlVC1Hdv04j0rxjP4KSXaKd21HFJp
+VnhefV8fbmT6O7cA7mygeoKzFjmcBoDN/gcDApr1uenNHLSy8HhuI89qB6BX4tWu
+cd/KhFAijXXHEffpww07jHru2TZaBniTy3gwLXsyb8DOnO4By3LJ6CqTwLSu7CrQ
+u2Nm9uPS9991CGity3lX7i5LVV4wnIhJBBgRAgAJBQJFjjgUAhsMAAoJEEhV7YiT
+653n4RUAoJd1DuGANpd7VGGwNfoMCCpAk/4TAKCrbh6NpoJr0Ab41toDA5lM/EYY
+Pw==
+=5sSw
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-recipient-at-example.com.public.key b/t/data/gnupg2/keys/rt-recipient-at-example.com.public.key
new file mode 100644
index 0000000000..5babf7148d
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-recipient-at-example.com.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEa8u6QRBADCqPh8w3cO51hPVb1Sttqq5UhCeB5t2dAL8aVEDkpPfV7LItDi
+pN4VqHo2zbGE8q2bCoqW06Ogn0R4xsxEeD9Jq9/k3dHReFL2gbA5F/el1PKXVxG8
+62BnjLkDub8yCdWsg0QDJ6ah7LC7vukTMlJj+3HhoXWEqBrTBKjtFkNIrwCg/LtU
+CEyj+z/cl6NQGZUw2A6+5DUD/2DfcLeSir7xrlcidqO4BxtxdWkEBDAnmARKrqaw
+zSATIK11+HO3Gteovfa08J1XXU2+IFqi2Ssyaqss1kteJE8DmOAcllSXqmCfOmPm
+xoW4gXOQfEv6tkTvF9JST1OZRj5w+ecyxn0282XrzKcxNeLjc+JcLfzPmmuhw4lA
+s/nJA/4tBqT0V7QiwaznBo8Bh7N3sz75x0vgSdZLUA0e2VzHKh9mAfK/FeVS1mcJ
+04iHWvxOGMqEfXnpxUrogME7f/TWNBVfT4M2JW0sHLvaiJhTtIhn+Q67awQ1f0qG
+mGQLIo9OAWZnIfBZ8e2tBwJ3ajiSZ2LIPWFv4Q1hKxOclODpf7QmUlQgVXNlciBC
+b2IgPHJ0LXJlY2lwaWVudEBleGFtcGxlLmNvbT6IdwQTEQIANwIbAwIeAQIXgBYh
+BMYEkamF4Ji66cavW84wxB7CJ0omBQJa0+HzBQsJCAcCBhUICQoLAgMWAgEACgkQ
+zjDEHsInSiZw7gCfRc3hNcOUCZH9lq7PrxDgYjJ45TQAoKen4iVaGPcvNeG3kK3r
+6LEoAOMuuQINBEa8u68QCAD+oPIN4M8WsOGHvnu2mC8mnYKYjHx/K/6L2csQFUJm
+O2QuqCty+02HyX7G7fLy+MYHr5Og+8ZkTcVHHItY08YiWrWlBJEQL19oQNYOs3vI
+DyaJqKQsiV8ycbDDNvlsRdayZfNy1O8ODFMK58OPxPrpMq/5wKpz1P3npdjqrj1n
++nrJkOJjstnQ3oaQdKhPyjpkI6+XzuciPApHwBcNYHEvn5J56c2Rnx7fSlJUMlM5
+7i7pb8wordEEPQUpiv4M4yHkFC0TvJNASHOYNM98Z72bnYVXwVtIumKYycgUzaEZ
+F/qPKehHXSzS2TYNUANcPJzA1hqtFgYDFXpdp8sI8O/jAAMFCAC2kzvOFVyH82wv
+npogbRBmZJooJ2TpQ+wm5r3V4sQckWjM7N62GwBYQPkocPlOGxgEo8ar6YXPtBC3
+Dz8MGZxqO0HEy/Z+9U4TtKtZ94fIxWVGCJ0lzc7oeU8+cD+/yVCGxhPGlR11ioHi
+ULSS2mdzELNf9U2vrZiSauknHZi/J3Qv+Url+KSjrmBALW/9dD9Aj2SkZs4VcWcS
+BBeYVwNNfiTNOCkndw4Gsz0YA7+FzAfzZ4LSPx9jDyYthHzJAbSOxckoK8fFOCQ6
+HSdKQtp4uirWZoun41skoKqCmyZ5XidCYQkThh7sj8vTvsG0ku/W2TQbQmHcXZZ5
+LMS8HtxLiEkEGBECAAkFAka8u68CGwwACgkQzjDEHsInSib8VwCeLdgy5axSbYZ8
+Ez42Kcj8Ku2Q4ZUAnjJ92jFcfC7XWcM/6AX5IyU0jtEW
+=icTP
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-recipient-at-example.com.secret.key b/t/data/gnupg2/keys/rt-recipient-at-example.com.secret.key
new file mode 100644
index 0000000000..5bbd7f505d
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-recipient-at-example.com.secret.key
@@ -0,0 +1,33 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQHpBEa8u6QRBADCqPh8w3cO51hPVb1Sttqq5UhCeB5t2dAL8aVEDkpPfV7LItDi
+pN4VqHo2zbGE8q2bCoqW06Ogn0R4xsxEeD9Jq9/k3dHReFL2gbA5F/el1PKXVxG8
+62BnjLkDub8yCdWsg0QDJ6ah7LC7vukTMlJj+3HhoXWEqBrTBKjtFkNIrwCg/LtU
+CEyj+z/cl6NQGZUw2A6+5DUD/2DfcLeSir7xrlcidqO4BxtxdWkEBDAnmARKrqaw
+zSATIK11+HO3Gteovfa08J1XXU2+IFqi2Ssyaqss1kteJE8DmOAcllSXqmCfOmPm
+xoW4gXOQfEv6tkTvF9JST1OZRj5w+ecyxn0282XrzKcxNeLjc+JcLfzPmmuhw4lA
+s/nJA/4tBqT0V7QiwaznBo8Bh7N3sz75x0vgSdZLUA0e2VzHKh9mAfK/FeVS1mcJ
+04iHWvxOGMqEfXnpxUrogME7f/TWNBVfT4M2JW0sHLvaiJhTtIhn+Q67awQ1f0qG
+mGQLIo9OAWZnIfBZ8e2tBwJ3ajiSZ2LIPWFv4Q1hKxOclODpf/4HAwJnN8tSAfuX
+2fCKI0/luaROdButIgzcL/CCMZv21DHAOzlBDjQB05lP8KiHunQn8ASc+ZDMWiAm
+YDfjNU9pFpr0IQfytCZSVCBVc2VyIEJvYiA8cnQtcmVjaXBpZW50QGV4YW1wbGUu
+Y29tPoh3BBMRAgA3AhsDAh4BAheAFiEExgSRqYXgmLrpxq9bzjDEHsInSiYFAlrT
+4fMFCwkIBwIGFQgJCgsCAxYCAQAKCRDOMMQewidKJnDuAJ9FzeE1w5QJkf2Wrs+v
+EOBiMnjlNACgp6fiJVoY9y814beQrevosSgA4y6dAmsERry7rxAIAP6g8g3gzxaw
+4Ye+e7aYLyadgpiMfH8r/ovZyxAVQmY7ZC6oK3L7TYfJfsbt8vL4xgevk6D7xmRN
+xUcci1jTxiJataUEkRAvX2hA1g6ze8gPJomopCyJXzJxsMM2+WxF1rJl83LU7w4M
+Uwrnw4/E+ukyr/nAqnPU/eel2OquPWf6esmQ4mOy2dDehpB0qE/KOmQjr5fO5yI8
+CkfAFw1gcS+fknnpzZGfHt9KUlQyUznuLulvzCit0QQ9BSmK/gzjIeQULRO8k0BI
+c5g0z3xnvZudhVfBW0i6YpjJyBTNoRkX+o8p6EddLNLZNg1QA1w8nMDWGq0WBgMV
+el2nywjw7+MAAwUIALaTO84VXIfzbC+emiBtEGZkmignZOlD7CbmvdXixByRaMzs
+3rYbAFhA+Shw+U4bGASjxqvphc+0ELcPPwwZnGo7QcTL9n71ThO0q1n3h8jFZUYI
+nSXNzuh5Tz5wP7/JUIbGE8aVHXWKgeJQtJLaZ3MQs1/1Ta+tmJJq6ScdmL8ndC/5
+SuX4pKOuYEAtb/10P0CPZKRmzhVxZxIEF5hXA01+JM04KSd3DgazPRgDv4XMB/Nn
+gtI/H2MPJi2EfMkBtI7FySgrx8U4JDodJ0pC2ni6KtZmi6fjWySgqoKbJnleJ0Jh
+CROGHuyPy9O+wbSS79bZNBtCYdxdlnksxLwe3Ev+BwMCZLtA7pP4k8rwMMZvp9Z4
+YWyUr3tkgQCD5SjnuJBiFPHR4UBhhIJFxfTXASLLIgOzEg+zzXnDiQXSon6MIKYF
+/8NYmeFyEGVb+snL3B0WJ10RhUDp7w3L+uTAiEkEGBECAAkFAka8u68CGwwACgkQ
+zjDEHsInSib8VwCeLdgy5axSbYZ8Ez42Kcj8Ku2Q4ZUAnjJ92jFcfC7XWcM/6AX5
+IyU0jtEW
+=J3At
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-test-at-example.com.2.public.key b/t/data/gnupg2/keys/rt-test-at-example.com.2.public.key
new file mode 100644
index 0000000000..3234911cf6
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-test-at-example.com.2.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEbl4D0RBADu+s2KTTSMl2/aK3Jkhy9ZTBMFOOCPeleidjV8z7RVGEwTjcby
+B0DbPFC/eK0ot9m/F9CojE6QHK0hqjCKPfARptjG6C/Iqxql0DaRWdo4UYTgT6WW
+hhoKK5DUN57Eu0essy1qTyzcXVIRsQdfkn2ldRKC1XSXnKAiL0vODLtL7wCgoDgj
+tDtOHdi0vlSHvRhPD1F9P3sEAMvSaiEMN/3AlAWQLqrg0rQRr4dpRZqahoffBIeX
+OZGzDSrWtIshMQLLA0HmkphPtRe/y74GBWfpwr6Hs6yl5tP2PSXsAAl+W92st2Vp
+lKJWsLZtvW39nS5cwmv0Etz6j0F9tn7Ah4+x89egzIg9GwU14cS2GNqxYsK3+YMY
+jSXzA/4zEDOQkrRuSEm9JNG5JCFKexAvjLzhYQQRCOI1PrX3iAMzbYFFIgTpr26h
+sPfOb5SMy2OGeECXGd0rxF4+rMCbp0jrQ8B18CWuho7HJK97WuT6NFoaPZCh/pYK
+OQkKGnJCUQNSm5u4uWY6yNs/+U4kvYJvIGw7F7uNWuXcpfREabQmUlQgVGVzdCB0
+aGUgc2FtZSA8cnQtdGVzdEBleGFtcGxlLmNvbT6IdwQTEQIANwIbAwIeAQIXgBYh
+BEz9P33NRkhS25gPJseYWRqoMdv7BQJa0+NnBQsJCAcCBhUICQoLAgMWAgEACgkQ
+x5hZGqgx2/u2ngCeKr9zdI2vdczqTTpKi5h6hK4it6wAn26j8k6zIecPNDbe5XMx
+eE4Ii+OguQINBEbl4D0QCACh7HH146iEmlfRUnyA1VKUWwsurrS6CJbN/DOsaQva
+/ijlCgLCPpcWEr/G0OaqFa7dRIFW2pa+sy6rZUJZY+J7Nn/xmXw1jsaPEPIuB64S
+i18GRLyoUtAftMao0Uugk4iLdSM0VfxxHHb0JJDJzeOPzweILUie4wzANd/y6SmR
+g0bSfsTeVnd1Y5p0Jdjb6QDEnmoZXRRaYQGi7H1NTyEUCrgO1GZ/bH8y3eT57lle
+ludsobEAAiYxXxZHRIYB3k5yB4T6sHfOIC0Pxhsz5YPFuKGWiN7tg3SFVIVJOwa/
+KkgL+M9I1NWCQl0bs3Q16kaH9PfBsBV4N5sxgOZRBguLAAMFCACasCTKivVX8zbU
+RGhl2g0UyVt3G65DlCEEiSSLKCfZ2rV3sJo4XUeLmzejoOwP0RHZgQ2U9iA+1U8f
+9qAa4hMce6AYqK2P2xEz9AIYwp/8gprPFxNB9weY5QxeszoZbM9mKJOsgGk5nJEP
+IU3XHTL0b3PuVW3nTsCTIXdpLZ1rrJyXaSdJfe8+0WQcJRWW8rPrJcYTjEubz8AI
+f/M8OO5DZf9jP4V+kkB42KHPr8nzwZo7uyBTWPHfN1FofmFlclGXI7sBbUp060jz
+FmLdIE1coGd8JtRRIFvFrayley3QR6mKMQO2wOEr6KZ0WNfy6X8kTReEmihGtx16
+8RuiEyfYiEkEGBECAAkFAkbl4D0CGwwACgkQx5hZGqgx2/s4jgCfeukl8vl9mMua
+riu08MsuywQ77y4An1cIwl1x997LwJrR5WF/WoGvPQ61
+=uDbb
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-test-at-example.com.2.secret.key b/t/data/gnupg2/keys/rt-test-at-example.com.2.secret.key
new file mode 100644
index 0000000000..7003324e2d
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-test-at-example.com.2.secret.key
@@ -0,0 +1,33 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQHpBEbl4D0RBADu+s2KTTSMl2/aK3Jkhy9ZTBMFOOCPeleidjV8z7RVGEwTjcby
+B0DbPFC/eK0ot9m/F9CojE6QHK0hqjCKPfARptjG6C/Iqxql0DaRWdo4UYTgT6WW
+hhoKK5DUN57Eu0essy1qTyzcXVIRsQdfkn2ldRKC1XSXnKAiL0vODLtL7wCgoDgj
+tDtOHdi0vlSHvRhPD1F9P3sEAMvSaiEMN/3AlAWQLqrg0rQRr4dpRZqahoffBIeX
+OZGzDSrWtIshMQLLA0HmkphPtRe/y74GBWfpwr6Hs6yl5tP2PSXsAAl+W92st2Vp
+lKJWsLZtvW39nS5cwmv0Etz6j0F9tn7Ah4+x89egzIg9GwU14cS2GNqxYsK3+YMY
+jSXzA/4zEDOQkrRuSEm9JNG5JCFKexAvjLzhYQQRCOI1PrX3iAMzbYFFIgTpr26h
+sPfOb5SMy2OGeECXGd0rxF4+rMCbp0jrQ8B18CWuho7HJK97WuT6NFoaPZCh/pYK
+OQkKGnJCUQNSm5u4uWY6yNs/+U4kvYJvIGw7F7uNWuXcpfREaf4HAwLSZsZRiBBH
+1/BOd08u4kwmEN2SFpszP5OoRitSFg0OZjFWEc8lINI1uMiZwe3vKCenf29nGXsI
+c2w0duaHvCxTLo9VtCZSVCBUZXN0IHRoZSBzYW1lIDxydC10ZXN0QGV4YW1wbGUu
+Y29tPoh3BBMRAgA3AhsDAh4BAheAFiEETP0/fc1GSFLbmA8mx5hZGqgx2/sFAlrT
+42cFCwkIBwIGFQgJCgsCAxYCAQAKCRDHmFkaqDHb+7aeAJ4qv3N0ja91zOpNOkqL
+mHqEriK3rACfbqPyTrMh5w80Nt7lczF4TgiL46CdAmsERuXgPRAIAKHscfXjqISa
+V9FSfIDVUpRbCy6utLoIls38M6xpC9r+KOUKAsI+lxYSv8bQ5qoVrt1EgVbalr6z
+LqtlQllj4ns2f/GZfDWOxo8Q8i4HrhKLXwZEvKhS0B+0xqjRS6CTiIt1IzRV/HEc
+dvQkkMnN44/PB4gtSJ7jDMA13/LpKZGDRtJ+xN5Wd3VjmnQl2NvpAMSeahldFFph
+AaLsfU1PIRQKuA7UZn9sfzLd5PnuWV6W52yhsQACJjFfFkdEhgHeTnIHhPqwd84g
+LQ/GGzPlg8W4oZaI3u2DdIVUhUk7Br8qSAv4z0jU1YJCXRuzdDXqRof098GwFXg3
+mzGA5lEGC4sAAwUIAJqwJMqK9VfzNtREaGXaDRTJW3cbrkOUIQSJJIsoJ9natXew
+mjhdR4ubN6Og7A/REdmBDZT2ID7VTx/2oBriExx7oBiorY/bETP0AhjCn/yCms8X
+E0H3B5jlDF6zOhlsz2Yok6yAaTmckQ8hTdcdMvRvc+5VbedOwJMhd2ktnWusnJdp
+J0l97z7RZBwlFZbys+slxhOMS5vPwAh/8zw47kNl/2M/hX6SQHjYoc+vyfPBmju7
+IFNY8d83UWh+YWVyUZcjuwFtSnTrSPMWYt0gTVygZ3wm1FEgW8WtrKV7LdBHqYox
+A7bA4SvopnRY1/LpfyRNF4SaKEa3HXrxG6ITJ9j+BwMCNKozezApKhzwX/AtE7fD
+QDwoBA8NLATd9yLb+p/As2KHrgFP7/ZcFn2ktY6I7ugLD6Rgc47ueOACJ6taNKo6
+dYHMkoyaGi8LHYNXGkgV5CpEo+nsTQ+lPXogiEkEGBECAAkFAkbl4D0CGwwACgkQ
+x5hZGqgx2/s4jgCfeukl8vl9mMuariu08MsuywQ77y4An1cIwl1x997LwJrR5WF/
+WoGvPQ61
+=+yKX
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-test-at-example.com.public.key b/t/data/gnupg2/keys/rt-test-at-example.com.public.key
new file mode 100644
index 0000000000..f038037109
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-test-at-example.com.public.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGiBEa4o04RBADc+2sFcnuTTaqcKRTmSBQKdXvumT4GoATk194UYMghwprrNb1/
+flXQRk9zLkc0YENFHLMoRUmXKEF+WFxzXrZgHJS096tGn+Ud2FXQbSL47Vl3EHng
+c+jSvvVaZRcEySaCyQrsDR7gWlQtCbxbe96Y2x9jX3Zbih9UYnRvWBeczwCg4tgz
+EOmScnWiwUdyZNQsvXDqvKUD/REf0WjWDaykQvXYZ0aTpc/WMBsDS16nl8GNz5eD
+lCB/JJHKh5QDu89p0557AbVDSi5LCOYAM+v4oi8k5zgiO/7HJptirDkZ27Ichyes
+kzhu3Xr9rPLawie/o4FCfncNLbOAEE4EjEGDGRlyowAaXlW7DWT+TLbxY0qL0uHy
+AQPGA/9AmYHBJQqHTfQ4/QXdCnp+UwYs+rhPh7YHymBLn8Saa14heE9SZcYfSerL
+FAE7KKeBx96+RplgsiaqfWrliUwrV3KnnJICMyqWmn2OyMYiV9iFWqAHFTCsitS2
+q1COv5/Lg1a+XkAwEfoIuLrAXT8buIxXs/BhLc1PD1t9My8srbQdUlQgVGVzdCA8
+cnQtdGVzdEBleGFtcGxlLmNvbT6IdwQTEQIANwIbAwIeAQIXgBYhBPDLO0gs+khW
+gKSgvdMoA12EiB8bBQJa0+PnBQsJCAcCBhUICQoLAgMWAgEACgkQ0ygDXYSIHxsi
+MACgtUoqViAa6qhMNb/UZqsgTsPU+QcAnRLxo54ov6tqdJG466teVmieffODuQIN
+BEa4o2EQCACNIoV50VxT1GMuZIQajsTioxBY62I2ihbg21GwoLZxslecYlQ5P4YH
+MYLGMFm3z1PoxWw7LsOgDOz7FYoDkJ+AURfnFlYzVzoQDh/suELWFrC0ZCQxAjIf
+MTL1vs08RwyWR055uOOFng5vyy8aKXJD2M3rOlHZzfqLSwtpnmA5Egcn0M5fWTmV
+TMSGSiARihih/jxVDAe3/nFRRGWLaQsNqqL5fb7qP+82n3oRDexsWJ+Y16NY1oPL
+KuXIZS/H2D8SHnAxGiymYUD+gTWRLCy0qIHEA+zXU4kYFGt7ZDpBVbZQsCHFk4WC
+QKrQM1vxMyeEk5jiOE4/nuuu+kzK72rjAAMFCACFGXhqJ6P2Vf5illRzKEGSogH9
+wPBh6aa0hbOjqZVa4O5VzIuX/+wmwGKnAkXo7mevRkLkJP4ZGCMGaH2tCO/9S1YG
+V0nuiD8d+5IwbrEh+WM7YXEqNpsOEZqIrOBOTvkuc+p/HQV5E1s3vx0/LiFX+Ii8
+c8A27JSWZsGzH2FIaoxzvwUgPDB9m0GKbldQlukexqG7j/xqBAsG748Ur7kIhVay
+SthUvVHrqc8cLOx9hw6/7UJgKy4WV0a0U08J6AbETtPsIWzubtph5J2DJw1pH3C4
+Fl5XXsmc4nbP+a2xH7yni9lnNIxxOSN/WPtQKCIpL+KhMPTelT85kTL36XVJiEkE
+GBECAAkFAka4o2ECGwwACgkQ0ygDXYSIHxs69QCgxvFIuPg6xpgRDUXE5+xc9GZI
+9VYAn3U+8U7AuSGybzySM8AhzyjKaN3s
+=cI7P
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/t/data/gnupg2/keys/rt-test-at-example.com.secret.key b/t/data/gnupg2/keys/rt-test-at-example.com.secret.key
new file mode 100644
index 0000000000..7da968961e
--- /dev/null
+++ b/t/data/gnupg2/keys/rt-test-at-example.com.secret.key
@@ -0,0 +1,32 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQHpBEa4o04RBADc+2sFcnuTTaqcKRTmSBQKdXvumT4GoATk194UYMghwprrNb1/
+flXQRk9zLkc0YENFHLMoRUmXKEF+WFxzXrZgHJS096tGn+Ud2FXQbSL47Vl3EHng
+c+jSvvVaZRcEySaCyQrsDR7gWlQtCbxbe96Y2x9jX3Zbih9UYnRvWBeczwCg4tgz
+EOmScnWiwUdyZNQsvXDqvKUD/REf0WjWDaykQvXYZ0aTpc/WMBsDS16nl8GNz5eD
+lCB/JJHKh5QDu89p0557AbVDSi5LCOYAM+v4oi8k5zgiO/7HJptirDkZ27Ichyes
+kzhu3Xr9rPLawie/o4FCfncNLbOAEE4EjEGDGRlyowAaXlW7DWT+TLbxY0qL0uHy
+AQPGA/9AmYHBJQqHTfQ4/QXdCnp+UwYs+rhPh7YHymBLn8Saa14heE9SZcYfSerL
+FAE7KKeBx96+RplgsiaqfWrliUwrV3KnnJICMyqWmn2OyMYiV9iFWqAHFTCsitS2
+q1COv5/Lg1a+XkAwEfoIuLrAXT8buIxXs/BhLc1PD1t9My8srf4HAwI92BupvSl4
+dvDCGR1Ko7sVJz53j7e72lgpgHGyk/bg7my5XuLRu/NY+U/WoS2Dr8Y77sAcvLHH
+i1NIpVUuXzJyMg1YtB1SVCBUZXN0IDxydC10ZXN0QGV4YW1wbGUuY29tPoh3BBMR
+AgA3AhsDAh4BAheAFiEE8Ms7SCz6SFaApKC90ygDXYSIHxsFAlrT4+cFCwkIBwIG
+FQgJCgsCAxYCAQAKCRDTKANdhIgfGyIwAKC1SipWIBrqqEw1v9RmqyBOw9T5BwCd
+EvGjnii/q2p0kbjrq15WaJ5984OdAmsERrijYRAIAI0ihXnRXFPUYy5khBqOxOKj
+EFjrYjaKFuDbUbCgtnGyV5xiVDk/hgcxgsYwWbfPU+jFbDsuw6AM7PsVigOQn4BR
+F+cWVjNXOhAOH+y4QtYWsLRkJDECMh8xMvW+zTxHDJZHTnm444WeDm/LLxopckPY
+zes6UdnN+otLC2meYDkSByfQzl9ZOZVMxIZKIBGKGKH+PFUMB7f+cVFEZYtpCw2q
+ovl9vuo/7zafehEN7GxYn5jXo1jWg8sq5chlL8fYPxIecDEaLKZhQP6BNZEsLLSo
+gcQD7NdTiRgUa3tkOkFVtlCwIcWThYJAqtAzW/EzJ4STmOI4Tj+e6676TMrvauMA
+AwUIAIUZeGono/ZV/mKWVHMoQZKiAf3A8GHpprSFs6OplVrg7lXMi5f/7CbAYqcC
+RejuZ69GQuQk/hkYIwZofa0I7/1LVgZXSe6IPx37kjBusSH5YzthcSo2mw4Rmois
+4E5O+S5z6n8dBXkTWze/HT8uIVf4iLxzwDbslJZmwbMfYUhqjHO/BSA8MH2bQYpu
+V1CW6R7GobuP/GoECwbvjxSvuQiFVrJK2FS9Ueupzxws7H2HDr/tQmArLhZXRrRT
+TwnoBsRO0+whbO5u2mHknYMnDWkfcLgWXldeyZzids/5rbEfvKeL2Wc0jHE5I39Y
++1AoIikv4qEw9N6VPzmRMvfpdUn+BwMCfVbsm+BZz7/wrtVZRYT3htVzFbLDv6IJ
+CtmJjewXPbDbV0wAAjpDC6b9MBPvraZLAsWfqQCKhzjA/6Kf9vNt6Sa51yrMPiIb
+MKwK8nBWwNsyLLEGwk3WjDtyiEkEGBECAAkFAka4o2ECGwwACgkQ0ygDXYSIHxs6
+9QCgxvFIuPg6xpgRDUXE5+xc9GZI9VYAn3U+8U7AuSGybzySM8AhzyjKaN3s
+=jFJl
+-----END PGP PRIVATE KEY BLOCK-----

commit 440a6b6b1f7c684676646bf2e086bc04a16227e9
Author: Brian C. Duggan <brian at bestpractical.com>
Date:   Thu Apr 19 13:29:22 2018 -0400

    Allow GnuPG 2.1 warning, keybox instead of keyring
    
    GnuPG 2.1 calls a keyring a keybox. Expand the warning regex to match.

diff --git a/t/security/CVE-2012-4735-incoming-encryption-header.t b/t/security/CVE-2012-4735-incoming-encryption-header.t
index 6c15632979..56767cf2cf 100644
--- a/t/security/CVE-2012-4735-incoming-encryption-header.t
+++ b/t/security/CVE-2012-4735-incoming-encryption-header.t
@@ -57,7 +57,7 @@ EOF
     warnings_like {
         ($status, $id) = RT::Test->send_via_mailgate($mail);
         ok $id, "created a ticket";
-    } [qr/keyring .* created/,
+    } [qr/key(ring|box) .* created/,
        qr/Failure during GnuPG data: No data has been found\. The reason is 'Invalid packet found'/,
        qr/Failure during GnuPG data: No data has been found\. The reason is 'No armored data'/,
    ];

commit 2dae5e989126d78b579ce00539c029f208333cef
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Wed May 6 17:00:50 2020 +0100

    add extra keywords for gnupg 2.2.x

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index 14ade0fe8d..58d3c08eac 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -1354,7 +1354,7 @@ my %ignore_keyword = map { $_ => 1 } qw(
     BEGIN_ENCRYPTION SIG_ID VALIDSIG
     ENC_TO BEGIN_DECRYPTION END_DECRYPTION GOODMDC
     TRUST_UNDEFINED TRUST_NEVER TRUST_MARGINAL TRUST_FULLY TRUST_ULTIMATE
-    DECRYPTION_INFO KEY_CONSIDERED DECRYPTION_KEY NEWSIG
+    DECRYPTION_INFO KEY_CONSIDERED PINENTRY_LAUNCHED DECRYPTION_KEY NEWSIG
 );
 
 sub ParseStatus {

commit 6d9f54c19240b3b65771418a490be6f8197792fd
Author: Brian C. Duggan <brian at bestpractical.com>
Date:   Thu Apr 19 12:51:02 2018 -0400

    Parse GnuPG subkeys for 2.x
    
    Parse subkeys in colons output for gpg 2.x. Preserve behavior for
    previous versions.

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index 58d3c08eac..da0c541d4f 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -1698,12 +1698,15 @@ sub ParseKeysInfo {
 
     my %gpg_opt = RT->Config->Get('GnuPGOptions');
 
+    my $gnupg = GnuPG::Interface->new;
+    my @gnupg_versions = split /\./, $gnupg->version;
+
     my @res = ();
     foreach my $line( @lines ) {
         chomp $line;
         my $tag;
         ($tag, $line) = split /:/, $line, 2;
-        if ( $tag eq 'pub' ) {
+       if ( $tag eq 'pub' || $gnupg_versions[0] >= 2 && $tag eq 'sub'  ) {
             my %info;
             @info{ qw(
                 TrustChar KeyLength Algorithm Key
@@ -1731,7 +1734,7 @@ sub ParseKeysInfo {
                 foreach qw(Created Expire);
             push @res, \%info;
         }
-        elsif ( $tag eq 'sec' ) {
+        elsif ( $tag eq 'sec' || $gnupg_versions[0] >= 2 && $tag eq 'ssb' ) {
             my %info;
             @info{ qw(
                 Empty KeyLength Algorithm Key

commit 5866c582c8ab786d86f09f87b5940099911a043a
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Wed May 6 21:06:02 2020 +0100

    Added warnings_exist method to RT::Test::Web

diff --git a/lib/RT/Test/Web.pm b/lib/RT/Test/Web.pm
index 2faecf20ab..abd3f9b03a 100644
--- a/lib/RT/Test/Web.pm
+++ b/lib/RT/Test/Web.pm
@@ -243,6 +243,31 @@ sub warning_like {
     return Test::More::like($warnings[0], $re, $name);
 }
 
+
+sub warnings_exist {
+    my $self = shift;
+    my $re   = shift;
+    my $name = shift;
+
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+    my @warnings = $self->get_warnings;
+    if (@warnings == 0) {
+        Test::More::fail("no warnings emitted; expected 1");
+        return 0;
+    }
+    else {
+        foreach my $warning (@warnings) {
+	   if ($warning =~ $re) {
+               return Test::More::pass($name);
+	   }
+	}
+    }
+    Test::More::fail("no warnings emitted matching $re");
+    return 0;
+}
+
+
 sub next_warning_like {
     my $self = shift;
     my $re   = shift;

commit a2167dbd161442e4400a8465a6f27b4fb96e7840
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Wed May 6 21:06:57 2020 +0100

    Updated RT::Test::GnuPG to prepare homedir and agent for GPG2 testing

diff --git a/lib/RT/Test/GnuPG.pm b/lib/RT/Test/GnuPG.pm
index d50c2cada1..25620ecb19 100644
--- a/lib/RT/Test/GnuPG.pm
+++ b/lib/RT/Test/GnuPG.pm
@@ -52,13 +52,120 @@ use warnings;
 use Test::More;
 use base qw(RT::Test);
 use File::Temp qw(tempdir);
+use Cwd;
+use File::Path qw (make_path);
+use File::Copy;
+use GnuPG::Interface;
+use RT::Crypt::GnuPG;
 
 our @EXPORT =
-  qw(create_a_ticket update_ticket cleanup_headers set_queue_crypt_options 
+  qw(create_a_ticket update_ticket cleanup_headers set_queue_crypt_options
           check_text_emails send_email_and_check_transaction
           create_and_test_outgoing_emails
           );
 
+use vars qw($homedir $gnupg_version $using_legacy_gnupg);
+no warnings qw(redefine once);
+
+BEGIN {
+    if (-f "test/gnupghome") {
+        my $record = IO::File->new( "< t/data/gnupghome" );
+        $homedir = <$record>;
+        $record->close();
+    } else {
+        $homedir = tempdir( DIR => '/tmp');
+        my $record = IO::File->new( "> t/data/gnupghome" );
+        $record->write($homedir);
+        $record->close();
+    }
+
+    $ENV{'GNUPGHOME'} =  $homedir;
+
+    my %supported_opt = map { $_ => 1 } qw(
+       always_trust
+       armor
+       batch
+       comment
+       compress_algo
+       default_key
+       encrypt_to
+       extra_args
+       force_v3_sigs
+       homedir
+       logger_fd
+       no_greeting
+       no_options
+       no_verbose
+       openpgp
+       options
+       passphrase_fd
+       quiet
+       recipients
+       rfc1991
+       status_fd
+       textmode
+       verbose
+                                      );
+
+    *RT::Crypt::GnuPG::_PrepareGnuPGOptions = sub {
+
+        # you are here - need to force no-default-key option, maybe add as a flag to GPG::Interface
+        # also need to copy / specify keychain, etc from new 2.1 test dir maybe - provide helper to handle that here
+        # also need to update references to 2.1 to 2.2
+        # Added --keyring and --no-default-keyring options to GnuPG::Options
+        my %opt = @_;
+        $opt{homedir} = $homedir;
+        my %res = map { lc $_ => $opt{ $_ } } grep $supported_opt{ lc $_ }, keys %opt;
+        $res{'extra_args'} ||= [];
+        foreach my $o ( grep !$supported_opt{ lc $_ }, keys %opt ) {
+            push @{ $res{'extra_args'} }, '--'. lc $o;
+            push @{ $res{'extra_args'} }, $opt{ $o }
+                if defined $opt{ $o };
+        }
+        return %res;
+    };
+
+    make_path($homedir, { mode => 0700 });
+    copy('t/data//gpg.conf', $homedir . '/gpg.conf');
+
+    my $gnupg = GnuPG::Interface->new;
+    $gnupg->options->hash_init(
+       RT::Crypt::GnuPG::_PrepareGnuPGOptions( ),
+    );
+
+    $gnupg_version = $gnupg->version;
+    $using_legacy_gnupg = 1;
+
+    if ($gnupg->cmp_version($gnupg_version, '2.2') >= 0 ) {
+        $using_legacy_gnupg = 0;
+        my $agentconf = IO::File->new( "> " . $homedir . "/gpg-agent.conf" );
+        # Classic gpg can't use loopback pinentry programs like fake-pinentry.pl.
+
+        $agentconf->write(
+            "allow-preset-passphrase\n".
+                "allow-loopback-pinentry\n".
+                "pinentry-program " . getcwd() . "/test/fake-pinentry.pl\n"
+            );
+        $agentconf->close();
+
+        my $error = system("gpg-connect-agent", "--homedir", "$homedir", '/bye');
+        if ($error) {
+            warn "gpg-connect-agent returned error : $error";
+        }
+
+        $error = system('gpg-connect-agent', "--homedir", "$homedir", 'reloadagent', '/bye');
+        if ($error) {
+            warn "gpg-connect-agent returned error : $error";
+        }
+
+        $error = system("gpg-agent", '--homedir', "$homedir");
+        if ($error) {
+            warn "gpg-agent returned error : $error";
+        }
+
+    }
+}
+
 sub import {
     my $class = shift;
     my %args  = @_;
@@ -73,7 +180,8 @@ sub import {
     return $class->export_to_level(1)
         if $^C;
 
-    RT::Test::diag "GnuPG --homedir " . RT->Config->Get('GnuPGOptions')->{'homedir'};
+    RT::Test::diag "GnuPG --homedir over-ridden for tests : " . $ENV{'GNUPGHOME'};
+    RT::Test::diag "GnuPG --homedir from config " . RT->Config->Get('GnuPGOptions')->{'homedir'};
 
     $class->set_rights(
         Principal => 'Everyone',

commit 8deb6727e1d9cdf3e5f7afc3332ea080f8dc8dc5
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Wed May 6 21:07:53 2020 +0100

    fixed no-signer-address test for gpg2

diff --git a/t/crypt/no-signer-address.t b/t/crypt/no-signer-address.t
index 31ba5ebc2a..f1b46bf9d1 100644
--- a/t/crypt/no-signer-address.t
+++ b/t/crypt/no-signer-address.t
@@ -35,8 +35,8 @@ my ($status, undef, $msg) = $ticket->Create(
 );
 ok( $status, "created ticket" ) or diag "error: $msg";
 
-is( scalar @warnings, 1, "Got a warning" );
-like( $warnings[0], qr{signing failed: secret key not available},
+ok( scalar @warnings, "Got a warning" );
+like( $warnings[0], qr/signing failed: (No secret key|secret key not available)/,
     "Found warning of no secret key");
 
 done_testing;

commit 5b8d8091eb78f05724c361464004a6968ad4174a
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Wed May 6 21:09:38 2020 +0100

    fixed gnupg-reverification test for gpg2

diff --git a/t/mail/gnupg-reverification.t b/t/mail/gnupg-reverification.t
index e5dcf09bb4..5612352b07 100644
--- a/t/mail/gnupg-reverification.t
+++ b/t/mail/gnupg-reverification.t
@@ -60,11 +60,11 @@ foreach my $file ( @files ) {
     );
     $m->content_like(qr/This is .*ID:$eid/ims, "$eid: content is there and message is decrypted");
 
-    $m->next_warning_like(qr/public key not found/);
+    $m->next_warning_like(qr/(No public key|public key not found)/);
 
     # some mails contain multiple signatures
     if ($eid == 5 || $eid == 17 || $eid == 18) {
-        $m->next_warning_like(qr/public key not found/);
+            $m->next_warning_like(qr/(No public key|public key not found)/);
     }
 
     $m->no_leftover_warnings_ok;

commit 444d77e45d73e55733d661202cfbd6918eda5f78
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Thu May 7 19:54:43 2020 +0100

    GnuPG 2.2 - Added IMPORT_OK keyword to Crypt::GnuPG parser

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index da0c541d4f..25cb4975d2 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -338,6 +338,7 @@ sub CallGnuPG {
     $gnupg->options->hash_init(
         _PrepareGnuPGOptions( %opt ),
     );
+
     $gnupg->options->armor( 1 );
     $gnupg->options->meta_interactive( 0 );
     $gnupg->options->default_key( $args{Signer} )
@@ -1351,10 +1352,10 @@ my %parse_keyword = map { $_ => 1 } qw(
 # keywords as starting point or just ignore as they are useless for us
 my %ignore_keyword = map { $_ => 1 } qw(
     NEED_PASSPHRASE MISSING_PASSPHRASE BEGIN_SIGNING PLAINTEXT PLAINTEXT_LENGTH
-    BEGIN_ENCRYPTION SIG_ID VALIDSIG
+    BEGIN_ENCRYPTION SIG_ID VALIDSIG NEWSIG IMPORT_OK
     ENC_TO BEGIN_DECRYPTION END_DECRYPTION GOODMDC
     TRUST_UNDEFINED TRUST_NEVER TRUST_MARGINAL TRUST_FULLY TRUST_ULTIMATE
-    DECRYPTION_INFO KEY_CONSIDERED PINENTRY_LAUNCHED DECRYPTION_KEY NEWSIG
+    DECRYPTION_INFO KEY_CONSIDERED PINENTRY_LAUNCHED DECRYPTION_KEY
 );
 
 sub ParseStatus {

commit 76ca68cd7d9228e41b183d6b496a549ce08783df
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Thu May 7 19:55:07 2020 +0100

    Added helpers and setup for GPG 2 to RT::Test::GnuPG

diff --git a/lib/RT/Test/GnuPG.pm b/lib/RT/Test/GnuPG.pm
index 25620ecb19..c6a52866c3 100644
--- a/lib/RT/Test/GnuPG.pm
+++ b/lib/RT/Test/GnuPG.pm
@@ -60,24 +60,18 @@ use RT::Crypt::GnuPG;
 
 our @EXPORT =
   qw(create_a_ticket update_ticket cleanup_headers set_queue_crypt_options
-          check_text_emails send_email_and_check_transaction
+          check_text_emails send_email_and_check_trangnsaction
           create_and_test_outgoing_emails
+          copy_test_keys_to_homedir copy_test_keyring_to_homedir get_test_gnupg_interface
+          $homedir $gnupg_version $using_legacy_gnupg
           );
 
-use vars qw($homedir $gnupg_version $using_legacy_gnupg);
 no warnings qw(redefine once);
 
 BEGIN {
-    if (-f "test/gnupghome") {
-        my $record = IO::File->new( "< t/data/gnupghome" );
-        $homedir = <$record>;
-        $record->close();
-    } else {
-        $homedir = tempdir( DIR => '/tmp');
-        my $record = IO::File->new( "> t/data/gnupghome" );
-        $record->write($homedir);
-        $record->close();
-    }
+    use vars qw($homedir $gnupg_version $using_legacy_gnupg);
+    my $tempdir_template = 'test_gnupg_XXXXXXXXX';
+    $homedir = tempdir( $tempdir_template, DIR => '/tmp', CLEANUP => 1);
 
     $ENV{'GNUPGHOME'} =  $homedir;
 
@@ -126,7 +120,8 @@ BEGIN {
     };
 
     make_path($homedir, { mode => 0700 });
-    copy('t/data//gpg.conf', $homedir . '/gpg.conf');
+    my $data_path = RT::Test::get_abs_relocatable_dir( File::Spec->updir(), 'data');
+    copy('$data_path/gpg.conf', $homedir . '/gpg.conf');
 
     my $gnupg = GnuPG::Interface->new;
     $gnupg->options->hash_init(
@@ -141,11 +136,14 @@ BEGIN {
         my $agentconf = IO::File->new( "> " . $homedir . "/gpg-agent.conf" );
         # Classic gpg can't use loopback pinentry programs like fake-pinentry.pl.
 
+        # default to empty passphrase pinentry
+        # passphrase in "pinentry-program $data_path/gnupg2/bin/fake-pinentry.pl\n"
         $agentconf->write(
             "allow-preset-passphrase\n".
                 "allow-loopback-pinentry\n".
-                "pinentry-program " . getcwd() . "/test/fake-pinentry.pl\n"
+                "pinentry-program $data_path/gnupg2/bin/empty-pinentry.pl\n"
             );
+
         $agentconf->close();
 
         my $error = system("gpg-connect-agent", "--homedir", "$homedir", '/bye');
@@ -162,7 +160,14 @@ BEGIN {
         if ($error) {
             warn "gpg-agent returned error : $error";
         }
+    }
+}
 
+
+END {
+    unless ($using_legacy_gnupg) {
+        system('gpgconf', '--homedir', $homedir,'--quiet', '--kill', 'gpg-agent');
+        delete $ENV{'GNUPGHOME'};
     }
 }
 
@@ -471,3 +476,60 @@ sub create_and_test_outgoing_emails {
         }
     }
 }
+
+sub copy_test_keyring_to_homedir {
+    my (%args) = @_;
+    my $srcdir;
+    if ($using_legacy_gnupg || $args{use_legacy_keys}) {
+        $srcdir =
+            RT::Test::get_abs_relocatable_dir( File::Spec->updir(),
+                                               qw/data gnupg keyrings/ );
+    }
+    else {
+        $srcdir =
+            RT::Test::get_abs_relocatable_dir( File::Spec->updir(),
+                                               qw/data gnupg2 keyrings/ );
+    }
+    opendir(my $DIR, $srcdir) || die "can't opendir $srcdir: $!";
+    my @files = readdir($DIR);
+    foreach my $file (@files) {
+        if(-f "$srcdir/$file" ) {
+            copy "$srcdir/$file", "$homedir/$file";
+        }
+    }
+    closedir($DIR);
+}
+
+sub copy_test_keys_to_homedir {
+    my (%args) = @_;
+    my $srcdir;
+    if ($using_legacy_gnupg || $args{use_legacy_keys}) {
+        $srcdir =
+            RT::Test::get_abs_relocatable_dir( File::Spec->updir(),
+                                               qw/data gnupg keys/ );
+    }
+    else {
+        $srcdir =
+            RT::Test::get_abs_relocatable_dir( File::Spec->updir(),
+                                               qw/data gnupg2 keys/ );
+    }
+
+    opendir(my $DIR, $srcdir) || die "can't opendir $srcdir: $!";
+    my @files = readdir($DIR);
+    foreach my $file (@files) {
+        if(-f "$srcdir/$file" ) {
+            copy "$srcdir/$file", "$homedir/$file";
+        }
+    }
+    closedir($DIR);
+}
+
+sub get_test_gnupg_interface {
+    my $gnupg = GnuPG::Interface->new;
+    $gnupg->options->hash_init(
+       RT::Crypt::GnuPG::_PrepareGnuPGOptions( ),
+    );
+    return $gnupg;
+}
+
+1;

commit 07bbbe5df575a33cd6f06d004998a80b682e9d41
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Thu May 7 19:56:57 2020 +0100

    Added new fake pinentry script for gpg2.2 testing

diff --git a/t/data/gnupg2/bin/empty-pinentry.pl b/t/data/gnupg2/bin/empty-pinentry.pl
new file mode 100755
index 0000000000..63cc19a863
--- /dev/null
+++ b/t/data/gnupg2/bin/empty-pinentry.pl
@@ -0,0 +1,28 @@
+#!/usr/bin/perl -w
+# Use this for your test suites when a perl interpreter is available.
+#
+# The encrypted keys in your test suite that you expect to work must
+# be locked with a passphrase of "test"
+#
+# Author: Daniel Kahn Gillmor <dkg at fifthhorseman.net>
+#
+# License: This trivial work is hereby explicitly placed into the
+# public domain.  Anyone may reuse it, modify it, redistribute it for
+# any purpose.
+
+use strict;
+use warnings;
+$| = 1;
+
+my $passphrase = '';
+
+print "OK This is only for test suites, and should never be used in production\n";
+while (<STDIN>) {
+  chomp;
+  next if (/^$/);
+  next if (/^#/);
+  print ("D $passphrase\n") if (/^getpin/i);
+  print "OK\n";
+  exit if (/^bye/i);
+}
+1;

commit dce35ea2f5719b7d1b4e39b71c5a4b6385ee7273
Author: Aaron Trevena <ast at bestpractical.com>
Date:   Thu May 7 21:12:53 2020 +0100

    fixes to encryption tests for GnuPG 2.2

diff --git a/t/data/gnupg2/keyrings/pubring.kbx b/t/data/gnupg2/keyrings/pubring.kbx
index 75f17ffcbd..c68093d282 100644
Binary files a/t/data/gnupg2/keyrings/pubring.kbx and b/t/data/gnupg2/keyrings/pubring.kbx differ
diff --git a/t/data/gnupg2/keyrings/trustdb.gpg b/t/data/gnupg2/keyrings/trustdb.gpg
index 14ea734bfc..80e4b471a3 100644
Binary files a/t/data/gnupg2/keyrings/trustdb.gpg and b/t/data/gnupg2/keyrings/trustdb.gpg differ
diff --git a/t/mail/crypt-gnupg.t b/t/mail/crypt-gnupg.t
index cfdee1e682..e7bad212d0 100644
--- a/t/mail/crypt-gnupg.t
+++ b/t/mail/crypt-gnupg.t
@@ -13,12 +13,84 @@ BEGIN {
 use RT::Test::GnuPG tests => 100, gnupg_options => { homedir => $homedir };
 use Test::Warn;
 
-my $gnupg;
-my ($gnupg_version, $gnupg_subversion) = split /\./, GnuPG::Interface->new->version;
+copy_test_keyring_to_homedir(use_legacy_keys => 1);
 
 use_ok('RT::Crypt');
 use_ok('MIME::Entity');
 
+diag 'only signing. missing passphrase';
+{
+    my $entity = MIME::Entity->build(
+        From    => 'rt at example.com',
+        Subject => 'test',
+        Data    => ['test'],
+    );
+    my %res;
+
+    # We don't use Test::Warn here, because it apparently only captures up
+    # to the first newline -- and the meat of this message is on the fourth
+    # line.
+
+    my @warnings;
+    {
+        local $SIG{__WARN__} = sub {
+            push @warnings, map { split("\n", $_) } @_;
+        };
+
+        %res = RT::Crypt->SignEncrypt(
+            Entity     => $entity,
+            Encrypt    => 0,
+            Passphrase => ''
+        );
+        ok( scalar @warnings, "Got warnings" );
+        ok (grep { m/(no default secret key|can't query passphrase in batch mode|No passphrase given)/ } @warnings );
+    }
+    ok( $res{'exit_code'}, "couldn't sign without passphrase");
+    ok( $res{'error'} || $res{'logger'}, "error is here" );
+
+    my @status = RT::Crypt->ParseStatus(
+        Protocol => $res{'Protocol'}, Status => $res{'status'}
+    );
+    is( scalar @status, 1, 'one record');
+    like( $status[0]->{'Operation'}, qr/(Sign|PassphraseCheck)/, 'operation is correct');
+    like( $status[0]->{'Status'}, qr/(ERROR|MISSING)/, 'missing passphrase');
+}
+
+diag 'only signing. wrong passphrase';
+{
+    my $entity = MIME::Entity->build(
+        From    => 'rt at example.com',
+        Subject => 'test',
+        Data    => ['test'],
+    );
+
+    my %res;
+    my @warnings;
+    {
+        local $SIG{__WARN__} = sub {
+            push @warnings, map { split("\n", $_) } @_;
+        };
+
+        %res = RT::Crypt->SignEncrypt(
+            Entity     => $entity,
+            Encrypt    => 0,
+            Passphrase => 'wrong',
+        );
+        ok( scalar @warnings, "Got warnings" );
+        ok (grep { m/bad passphrase/i } @warnings );
+    }
+    ok( $res{'exit_code'}, "couldn't sign with bad passphrase");
+    ok( $res{'error'} || $res{'logger'}, "error is here" );
+
+    my @status = RT::Crypt->ParseStatus(
+        Protocol => $res{'Protocol'}, Status => $res{'status'}
+    );
+    is( scalar @status, 1, 'one record');
+
+    like( $status[0]->{'Operation'}, qr/(Sign|PassphraseCheck)/, 'operation is correct');
+    like( $status[0]->{'Status'}, qr/(ERROR|BAD)/, 'wrong passphrase');
+}
+
 diag 'only signing. correct passphrase';
 {
     my $entity = MIME::Entity->build(
@@ -32,7 +104,7 @@ diag 'only signing. correct passphrase';
         Protocol => $res{'Protocol'}, Status => $res{'status'}
     );
 
-    if ($gnupg_version < 2 ) {
+    if ($using_legacy_gnupg) {
         ok( !$res{'logger'}, "log is here as well" ) or diag $res{'logger'};
         is( scalar @status, 2, 'two records: passphrase, signing');
         is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
@@ -69,62 +141,7 @@ diag 'only signing. correct passphrase';
     is( $status[0]->{'Trust'}, 'ULTIMATE', 'have trust value');
 }
 
-diag 'only signing. missing passphrase';
-{
-    my $entity = MIME::Entity->build(
-        From    => 'rt at example.com',
-        Subject => 'test',
-        Data    => ['test'],
-    );
-    my %res;
-    warning_like {
-        %res = RT::Crypt->SignEncrypt(
-            Entity     => $entity,
-            Encrypt    => 0,
-            Passphrase => ''
-        );
-    } qr/(no default secret key|can't query passphrase in batch mode)/;
-    use Data::Dumper;
-    warn Dumper({res => \%res });
-
-    ok( $res{'exit_code'}, "couldn't sign without passphrase");
-    ok( $res{'error'} || $res{'logger'}, "error is here" );
-
-    my @status = RT::Crypt->ParseStatus(
-        Protocol => $res{'Protocol'}, Status => $res{'status'}
-    );
-    is( scalar @status, 1, 'one record');
-    is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
-    is( $status[0]->{'Status'}, 'MISSING', 'missing passphrase');
-}
-
-diag 'only signing. wrong passphrase';
-{
-    my $entity = MIME::Entity->build(
-        From    => 'rt at example.com',
-        Subject => 'test',
-        Data    => ['test'],
-    );
 
-    my %res;
-    warning_like {
-        %res = RT::Crypt->SignEncrypt(
-            Entity     => $entity,
-            Encrypt    => 0,
-            Passphrase => 'wrong',
-        );
-    } qr/bad passphrase/;
-
-    ok( $res{'exit_code'}, "couldn't sign with bad passphrase");
-    ok( $res{'error'} || $res{'logger'}, "error is here" );
-
-    my @status = RT::Crypt->ParseStatus(
-        Protocol => $res{'Protocol'}, Status => $res{'status'}
-    );
-    is( scalar @status, 1, 'one record');
-    is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
-    is( $status[0]->{'Status'}, 'BAD', 'wrong passphrase');
-}
 
 diag 'encryption only';
 {
@@ -164,20 +181,26 @@ diag 'encryption only, bad recipient';
     );
 
     my %res;
-    warning_like {
+    my @warnings;
+    {
+        local $SIG{__WARN__} = sub {
+            push @warnings, map { split("\n", $_) } @_;
+        };
+
         %res = RT::Crypt->SignEncrypt(
             Entity => $entity,
             Sign   => 0,
         );
-    } qr/(public key not found|No public key)/;
-
+        ok( scalar @warnings, "Got warnings" );
+        ok (grep { m/(public key not found|No public key|No Data)/i } @warnings );
+    }
     ok( $res{'exit_code'}, 'no way to encrypt without keys of recipients');
     ok( $res{'logger'}, "errors are in logger" );
 
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}
     );
-    is( scalar @status, 1, 'one record');
+    ok( scalar @status, 'have records');
     is( $status[0]->{'Keyword'}, 'INV_RECP', 'invalid recipient');
 }
 
@@ -191,12 +214,17 @@ diag 'encryption and signing with combined method';
     );
     my %res = RT::Crypt->SignEncrypt( Entity => $entity, Passphrase => 'test' );
     ok( !$res{'exit_code'}, "successful encryption with signing" );
-    ok( !$res{'logger'}, "no records in logger" );
+    if ($using_legacy_gnupg) {
+        ok( !$res{'logger'}, "no records in logger" );
+    }
+    else {
+        ok(1);
+    }
 
     my @status = RT::Crypt->ParseStatus(
         Protocol => $res{'Protocol'}, Status => $res{'status'}
     );
-    if ($gnupg_version < 2) {
+    if ($using_legacy_gnupg) {
         is( scalar @status, 3, 'three records: passphrase, sign and encrypt');
         is( $status[0]->{'Operation'}, 'PassphraseCheck', 'operation is correct');
         is( $status[0]->{'Status'}, 'DONE', 'done');
@@ -211,6 +239,7 @@ diag 'encryption and signing with combined method';
         is( $status[0]->{'Status'}, 'DONE', 'done');
         is( $status[1]->{'Operation'}, 'Encrypt', 'operation is correct');
         is( $status[1]->{'Status'}, 'DONE', 'done');
+        ok(1);
     }
 
     ok($entity, 'get an encrypted and signed part');
@@ -235,7 +264,14 @@ diag 'encryption and signing with cascading, sign on encrypted';
     ok( !$res{'logger'}, "no records in logger" );
     %res = RT::Crypt->SignEncrypt( Entity => $entity, Encrypt => 0, Passphrase => 'test' );
     ok( !$res{'exit_code'}, 'successful signing' );
-    ok( !$res{'logger'}, "no records in logger" );
+
+    if ($using_legacy_gnupg) {
+        ok( !$res{'logger'}, "no records in logger" );
+    }
+    else {
+        ok(1);
+    }
+
 
     my @parts = RT::Crypt->FindProtectedParts( Entity => $entity );
     is( scalar @parts, 1, 'one protected part, top most' );
diff --git a/t/mail/gnupg-incoming.t b/t/mail/gnupg-incoming.t
index 54b30d2a36..a132009022 100644
--- a/t/mail/gnupg-incoming.t
+++ b/t/mail/gnupg-incoming.t
@@ -1,26 +1,19 @@
 use strict;
 use warnings;
 
-my $homedir;
-BEGIN {
-    require RT::Test;
-    $homedir =
-      RT::Test::get_abs_relocatable_dir( File::Spec->updir(),
-        qw/data gnupg keyrings/ );
-}
-
 use RT::Test::GnuPG
   tests         => 53,
   actual_server => 1,
   gnupg_options => {
     passphrase => 'rt-test',
-    homedir    => $homedir,
   };
 
 use String::ShellQuote 'shell_quote';
 use IPC::Run3 'run3';
 use MIME::Base64;
 
+copy_test_keys_to_homedir(use_legacy_keys => 1);
+
 my ($baseurl, $m) = RT::Test->started_ok;
 
 # configure key for General queue
@@ -69,10 +62,10 @@ my $buf = '';
 
 run3(
     shell_quote(
-        qw(gpg --batch --no-tty --armor --sign),
+        qw(echo "recipient" | gpg --batch --yes --no-tty --armor --sign),
         '--default-key' => 'recipient at example.com',
         '--homedir'     => $homedir,
-        '--passphrase'  => 'recipient',
+        '--passphrase-fd'  => 0,
         '--no-permission-warning',
     ),
     \"fnord\r\n",
@@ -80,6 +73,57 @@ run3(
     \*STDOUT
 );
 
+warn "encrypted via cli : $buf";
+
+#####
+
+my $gnupg = get_test_gnupg_interface;
+# This time we'll catch the standard error for our perusing
+my ( $input, $output, $error ) = ( IO::Handle->new(),
+                                   IO::Handle->new(),
+                                   IO::Handle->new(),
+                               );
+
+my $handles = GnuPG::Handles->new( stdin    => $input,
+                                   stdout   => $output,
+                                   stderr   => $error,
+                               );
+
+# indicate our pasphrase through the
+# convenience method
+$gnupg->options->default_key('recipient at example.com');
+$gnupg->passphrase( "recipient" );
+
+# this sets up the communication
+my $pid = $gnupg->sign( handles => $handles );
+
+my @original_plaintext = ("fnord\r\n");
+
+# this passes in the plaintext
+print $input @original_plaintext;
+
+# this closes the communication channel,
+# indicating we are done
+close $input;
+
+my @ciphertext   = <$output>;  # reading the output
+my @error_output = <$error>;   # reading the error
+
+close $output;
+close $error;
+
+waitpid $pid, 0;  # clean up the finished GnuPG process
+
+use Data::Dumper;
+warn Dumper ({ciphertext => \@ciphertext,
+              error_output => \@error_output
+          });
+
+
+$buf = join('', at ciphertext);
+
+#####
+
 $mail = RT::Test->open_mailgate_ok($baseurl);
 print $mail <<"EOF";
 From: recipient\@example.com
@@ -90,6 +134,9 @@ $buf
 EOF
 RT::Test->close_mailgate_ok($mail);
 
+exit;
+
+
 {
     my $tick = RT::Test->last_ticket;
     is( $tick->Subject, 'signed message for queue',
@@ -112,10 +159,10 @@ $buf = '';
 
 run3(
     shell_quote(
-        qw(gpg --batch --no-tty --armor --sign --clearsign),
+        qw(echo "recipient" | gpg --batch --yes --no-tty --armor --sign --clearsign),
         '--default-key' => 'recipient at example.com',
         '--homedir'     => $homedir,
-        '--passphrase'  => 'recipient',
+        '--passphrase-fd'  => 0,
         '--no-permission-warning',
     ),
     \"clearfnord\r\n",
@@ -123,6 +170,8 @@ run3(
     \*STDOUT
 );
 
+diag "encrypted via cli : $buf";
+
 $mail = RT::Test->open_mailgate_ok($baseurl);
 print $mail <<"EOF";
 From: recipient\@example.com
diff --git a/t/web/gnupg-select-keys-on-create.t b/t/web/gnupg-select-keys-on-create.t
index 2b9a680833..4fe8c71bf5 100644
--- a/t/web/gnupg-select-keys-on-create.t
+++ b/t/web/gnupg-select-keys-on-create.t
@@ -1,9 +1,11 @@
 use strict;
 use warnings;
 
-use RT::Test::GnuPG tests => undef, gnupg_options => { passphrase => 'rt-test' };
 use RT::Action::SendEmail;
 
+use RT::Test::GnuPG tests => undef, gnupg_options => { passphrase => 'rt-test' };
+require RT::Test;
+
 my $queue = RT::Test->load_or_create_queue(
     Name              => 'Regression',
     CorrespondAddress => 'rt-recipient at example.com',
@@ -28,17 +30,20 @@ diag "check that signing doesn't work if there is no key";
         'unable to sign outgoing email messages',
         'problems with passphrase'
     );
-    $m->warning_like(qr/signing failed: secret key not available/);
+    $m->warnings_exist(qr/signing failed: (No secret key|secret key not available)/);
 
     my @mail = RT::Test->fetch_caught_mails;
     ok !@mail, 'there are no outgoing emails';
 }
 
 {
+
     RT::Test->import_gnupg_key('rt-recipient at example.com');
     RT::Test->trust_gnupg_key('rt-recipient at example.com');
     my %res = RT::Crypt->GetKeysInfo( Key => 'rt-recipient at example.com' );
     is $res{'info'}[0]{'TrustTerse'}, 'ultimate', 'ultimately trusted key';
+    # use Data::Dumper;
+    # warn Dumper ( { keys_info_after => $res{'info'} }) ;
 }
 
 diag "check that things don't work if there is no key";
@@ -66,7 +71,7 @@ diag "check that things don't work if there is no key";
     my @mail = RT::Test->fetch_caught_mails;
     ok !@mail, 'there are no outgoing emails';
 
-    $m->next_warning_like(qr/public key not found/) for 1 .. 2;
+    $m->next_warning_like(qr/(No public key|public key not found)/) for 1 .. 2;
     $m->no_leftover_warnings_ok;
 }
 

-----------------------------------------------------------------------


More information about the rt-commit mailing list