sequoia: Check for revoked or expired keys sync
authorNeal H. Walfield <neal@pep.foundation>
Wed, 15 May 2019 13:56:54 +0200
branchsync
changeset 36801e0ce2ec02b1
parent 3679 0077eaafde26
child 3683 c6914bf63ee4
sequoia: Check for revoked or expired keys

- When verifying a signature, also check the the TPK/signing key is
not revoked or expired.
src/pgp_sequoia.c
test/include/VerifyTests.h
test/src/engine_tests/VerifyTests.cc
test/test_files/pep-test-mary-signed-encrypted-to-self.asc
test/test_files/pep-test-mary-signed.txt
test/test_files/pep-test-mary-signed.txt.sig
test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E.rev
test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc
test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_pub.asc
test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_sig_key.asc
test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_revoked_sig_key.asc
     1.1 --- a/src/pgp_sequoia.c	Wed May 15 13:08:33 2019 +0200
     1.2 +++ b/src/pgp_sequoia.c	Wed May 15 13:56:54 2019 +0200
     1.3 @@ -816,6 +816,8 @@
     1.4      stringlist_t *recipient_keylist;
     1.5      stringlist_t *signer_keylist;
     1.6      int good_checksums;
     1.7 +    int good_but_expired;
     1.8 +    int good_but_revoked;
     1.9      int missing_keys;
    1.10      int bad_checksums;
    1.11      int decrypted;
    1.12 @@ -1103,6 +1105,8 @@
    1.13                                            &tpk, NULL) != PEP_STATUS_OK)
    1.14                          ; // Soft error.  Ignore.
    1.15  
    1.16 +                    keyid_str = pgp_keyid_to_string (keyid);
    1.17 +
    1.18                      if (tpk) {
    1.19                          // Ok, we have a TPK.
    1.20  
    1.21 @@ -1112,27 +1116,79 @@
    1.22                              = pgp_tpk_fingerprint(tpk);
    1.23                          char *primary_fpr_str
    1.24                              = pgp_fingerprint_to_hex(primary_fpr);
    1.25 -                        stringlist_add_unique(cookie->signer_keylist,
    1.26 -                                              primary_fpr_str);
    1.27 -
    1.28 -                        T("Good signature from %s", primary_fpr_str);
    1.29 -
    1.30 -                        // XXX: Check that the TPK and the key used to make
    1.31 -                        // the signature and the signature itself are alive
    1.32 -                        // and not revoked.  Revoked =>
    1.33 -                        // PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH; Expired key
    1.34 -                        // or sig => PEP_DECRYPTED.
    1.35 -                        cookie->good_checksums ++;
    1.36 +
    1.37 +                        bool good = true;
    1.38 +
    1.39 +                        // Make sure the TPK is not revoked, it's
    1.40 +                        // creation time is <= now, and it hasn't
    1.41 +                        // expired.
    1.42 +                        pgp_revocation_status_t rs = pgp_tpk_revocation_status(tpk);
    1.43 +                        bool revoked = (pgp_revocation_status_variant(rs)
    1.44 +                                        == PGP_REVOCATION_STATUS_REVOKED);
    1.45 +                        pgp_revocation_status_free(rs);
    1.46 +                        if (revoked) {
    1.47 +                            T("TPK %s is revoked.", primary_fpr_str);
    1.48 +                            good = false;
    1.49 +                            cookie->good_but_revoked ++;
    1.50 +                        } else if (! pgp_tpk_alive(tpk)) {
    1.51 +                            T("TPK %s is not alive.", primary_fpr_str);
    1.52 +                            good = false;
    1.53 +                            cookie->good_but_expired ++;
    1.54 +                        }
    1.55 +
    1.56 +                        // Same thing for the signing key.
    1.57 +                        if (good) {
    1.58 +                            pgp_tpk_key_iter_t iter = pgp_tpk_key_iter_all(tpk);
    1.59 +                            pgp_key_t key;
    1.60 +                            pgp_signature_t sig;
    1.61 +                            while ((key = pgp_tpk_key_iter_next(iter, &sig, &rs))
    1.62 +                                   && good) {
    1.63 +                                pgp_keyid_t x = pgp_key_keyid(key);
    1.64 +                                if (pgp_keyid_equal(keyid, x)) {
    1.65 +                                    // Found the signing key.  Let's make
    1.66 +                                    // sure it is valid.
    1.67 +
    1.68 +                                    revoked = (pgp_revocation_status_variant(rs)
    1.69 +                                               == PGP_REVOCATION_STATUS_REVOKED);
    1.70 +                                    if (revoked) {
    1.71 +                                        T("TPK %s's signing key %s is revoked.",
    1.72 +                                          primary_fpr_str, keyid_str);
    1.73 +                                        good = false;
    1.74 +                                        cookie->good_but_revoked ++;
    1.75 +                                    } else if (! pgp_signature_key_alive(sig, key)) {
    1.76 +                                        T("TPK %s's signing key %s is expired.",
    1.77 +                                          primary_fpr_str, keyid_str);
    1.78 +                                        good = false;
    1.79 +                                        cookie->good_but_expired ++;
    1.80 +                                    }
    1.81 +                                }
    1.82 +                                pgp_keyid_free(x);
    1.83 +                                pgp_revocation_status_free(rs);
    1.84 +                                pgp_signature_free(sig);
    1.85 +                                pgp_key_free(key);
    1.86 +                            }
    1.87 +                            pgp_tpk_key_iter_free(iter);
    1.88 +                        }
    1.89 +
    1.90 +                        if (good) {
    1.91 +                            stringlist_add_unique(cookie->signer_keylist,
    1.92 +                                                  primary_fpr_str);
    1.93 +
    1.94 +                            T("Good signature from %s", primary_fpr_str);
    1.95 +
    1.96 +                            cookie->good_checksums ++;
    1.97 +                        }
    1.98  
    1.99                          free(primary_fpr_str);
   1.100                          pgp_fingerprint_free(primary_fpr);
   1.101                          pgp_tpk_free(tpk);
   1.102                      } else {
   1.103                          // If we get
   1.104 -                        // PGP_VERIFICATION_RESULT_CODE_GOOD_CHECKSUM, then the
   1.105 -                        // TPK should be available.  But, another process
   1.106 -                        // could have deleted the key from the store in the
   1.107 -                        // mean time, so be tolerant.
   1.108 +                        // PGP_VERIFICATION_RESULT_CODE_GOOD_CHECKSUM,
   1.109 +                        // then the TPK should be available.  But,
   1.110 +                        // another process could have deleted the key
   1.111 +                        // from the store in the mean time, so be
   1.112 +                        // tolerant.
   1.113                          T("Key to check signature from %s disappeared",
   1.114                            keyid_str);
   1.115                          cookie->missing_keys ++;
   1.116 @@ -1193,7 +1249,7 @@
   1.117      char** filename_ptr)
   1.118  {
   1.119      PEP_STATUS status = PEP_STATUS_OK;
   1.120 -    struct decrypt_cookie cookie = { session, 0, NULL, NULL, 0, 0, 0, };
   1.121 +    struct decrypt_cookie cookie = { session, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, };
   1.122      pgp_reader_t reader = NULL;
   1.123      pgp_writer_t writer = NULL;
   1.124      pgp_reader_t decryptor = NULL;
   1.125 @@ -1254,13 +1310,23 @@
   1.126  
   1.127   out:
   1.128      if (status == PEP_STATUS_OK) {
   1.129 -        if (cookie.bad_checksums) {
   1.130 -            // If there are any bad signatures, fail.
   1.131 -            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   1.132 -        } else if (cookie.good_checksums) {
   1.133 +        // **********************************
   1.134 +        // Sync changes with pgp_verify_text.
   1.135 +        // **********************************
   1.136 +
   1.137 +        if (cookie.good_checksums) {
   1.138              // If there is at least one signature that we can verify,
   1.139              // succeed.
   1.140              status = PEP_DECRYPTED_AND_VERIFIED;
   1.141 +        } else if (cookie.good_but_revoked) {
   1.142 +            // If there are any signatures from revoked keys, fail.
   1.143 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   1.144 +        } else if (cookie.bad_checksums) {
   1.145 +            // If there are any bad signatures, fail.
   1.146 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   1.147 +        } else if (cookie.good_but_expired) {
   1.148 +            // If there are any signatures from expired keys, fail.
   1.149 +            status = PEP_DECRYPTED;
   1.150          } else {
   1.151              // We couldn't verify any signatures (possibly because we
   1.152              // don't have the keys).
   1.153 @@ -1344,7 +1410,17 @@
   1.154  
   1.155   out:
   1.156      if (status == PEP_STATUS_OK) {
   1.157 -        if (cookie.bad_checksums) {
   1.158 +        // *****************************************
   1.159 +        // Sync changes with pgp_decrypt_and_verify.
   1.160 +        // *****************************************
   1.161 +
   1.162 +        if (cookie.good_but_expired) {
   1.163 +            // If there are any signatures from expired keys, fail.
   1.164 +            status = PEP_UNENCRYPTED;
   1.165 +        } else if (cookie.good_but_revoked) {
   1.166 +            // If there are any signatures from revoked keys, fail.
   1.167 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   1.168 +        } else if (cookie.bad_checksums) {
   1.169              // If there are any bad signatures, fail.
   1.170              status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   1.171          } else if (cookie.good_checksums) {
   1.172 @@ -1703,7 +1779,6 @@
   1.173      return PEP_STATUS_OK;
   1.174  }
   1.175  
   1.176 -// XXX: This also needs to handle revocation certificates.
   1.177  PEP_STATUS pgp_import_keydata(PEP_SESSION session, const char *key_data,
   1.178                                size_t size, identity_list **private_idents)
   1.179  {
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/include/VerifyTests.h	Wed May 15 13:56:54 2019 +0200
     2.3 @@ -0,0 +1,23 @@
     2.4 +// This file is under GNU General Public License 3.0
     2.5 +// see LICENSE.txt
     2.6 +
     2.7 +#ifndef VERIFY_H
     2.8 +#define VERIFY_H
     2.9 +
    2.10 +#include <string>
    2.11 +#include "EngineTestIndividualSuite.h"
    2.12 +
    2.13 +using namespace std;
    2.14 +
    2.15 +class VerifyTests : public EngineTestIndividualSuite {
    2.16 +    public:
    2.17 +        VerifyTests(string test_suite, string test_home_dir);
    2.18 +    private:
    2.19 +        static constexpr const char *mary_fpr = "599B3D67800DB37E2DCE05C07F59F03CD04A226E";
    2.20 +        void check_revoked_tpk();
    2.21 +        void check_revoked_signing_key();
    2.22 +        void check_expired_tpk();
    2.23 +        void check_expired_signing_key();
    2.24 +};
    2.25 +
    2.26 +#endif
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/src/engine_tests/VerifyTests.cc	Wed May 15 13:56:54 2019 +0200
     3.3 @@ -0,0 +1,248 @@
     3.4 +// This file is under GNU General Public License 3.0
     3.5 +// see LICENSE.txt
     3.6 +
     3.7 +#include <stdlib.h>
     3.8 +#include <string>
     3.9 +#include <cstring>
    3.10 +#include <cpptest.h>
    3.11 +#include <fstream>
    3.12 +
    3.13 +#include "pEpEngine.h"
    3.14 +
    3.15 +#include "test_util.h"
    3.16 +#include "EngineTestIndividualSuite.h"
    3.17 +#include "VerifyTests.h"
    3.18 +
    3.19 +using namespace std;
    3.20 +
    3.21 +VerifyTests::VerifyTests(string suitename, string test_home_dir) :
    3.22 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
    3.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_revoked_tpk"),
    3.24 +                                                                      static_cast<Func>(&VerifyTests::check_revoked_tpk)));
    3.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_revoked_signing_key"),
    3.26 +                                                                      static_cast<Func>(&VerifyTests::check_revoked_signing_key)));
    3.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_expired_tpk"),
    3.28 +                                                                      static_cast<Func>(&VerifyTests::check_expired_tpk)));
    3.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_expired_signing_key"),
    3.30 +                                                                      static_cast<Func>(&VerifyTests::check_expired_signing_key)));
    3.31 +}
    3.32 +
    3.33 +void VerifyTests::check_revoked_tpk() {
    3.34 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
    3.35 +
    3.36 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
    3.37 +
    3.38 +    // Decrypt and verify it.
    3.39 +    char *plaintext = NULL;
    3.40 +    size_t plaintext_size = 0;
    3.41 +    stringlist_t *keylist = NULL;
    3.42 +    PEP_STATUS status = decrypt_and_verify(session,
    3.43 +                                           ciphertext.c_str(),
    3.44 +                                           ciphertext.size(),
    3.45 +                                           NULL, 0,
    3.46 +                                           &plaintext, &plaintext_size,
    3.47 +                                           &keylist, NULL);
    3.48 +
    3.49 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED_AND_VERIFIED, tl_status_string(status));
    3.50 +    TEST_ASSERT(keylist);
    3.51 +    // Signer is mary.
    3.52 +    TEST_ASSERT(keylist->value);
    3.53 +    cout << "fpr: " << mary_fpr << "; got: " << keylist->value << endl;
    3.54 +    TEST_ASSERT(strcmp(mary_fpr, keylist->value) == 0);
    3.55 +    // Recipient is mary.
    3.56 +    TEST_ASSERT(keylist->next);
    3.57 +    TEST_ASSERT(keylist->next->value);
    3.58 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
    3.59 +    // Content is returned.
    3.60 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
    3.61 +
    3.62 +    // Import the revocation certificate.
    3.63 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E.rev");
    3.64 +
    3.65 +    plaintext = NULL;
    3.66 +    plaintext_size = 0;
    3.67 +    keylist = NULL;
    3.68 +    status = decrypt_and_verify(session,
    3.69 +                                ciphertext.c_str(), ciphertext.size(),
    3.70 +                                NULL, 0,
    3.71 +                                &plaintext, &plaintext_size,
    3.72 +                                &keylist, NULL);
    3.73 +
    3.74 +    // Now it should fail.
    3.75 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
    3.76 +    TEST_ASSERT(keylist);
    3.77 +    // No signer.
    3.78 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
    3.79 +    // Recipient is mary.
    3.80 +    TEST_ASSERT(keylist->next);
    3.81 +    TEST_ASSERT(keylist->next->value);
    3.82 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
    3.83 +    // Content is returned.
    3.84 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
    3.85 +
    3.86 +
    3.87 +    string text = slurp("test_files/pep-test-mary-signed.txt");
    3.88 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
    3.89 +
    3.90 +    plaintext = NULL;
    3.91 +    plaintext_size = 0;
    3.92 +    keylist = NULL;
    3.93 +    status = verify_text(session,
    3.94 +                         text.c_str(), text.size(),
    3.95 +                         sig.c_str(), sig.size(),
    3.96 +                         &keylist);
    3.97 +
    3.98 +    // Now it should fail.
    3.99 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   3.100 +    TEST_ASSERT(keylist);
   3.101 +    // No signer.
   3.102 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.103 +    TEST_ASSERT(! keylist->next);
   3.104 +}
   3.105 +
   3.106 +void VerifyTests::check_revoked_signing_key() {
   3.107 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   3.108 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_revoked_sig_key.asc");
   3.109 +
   3.110 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   3.111 +
   3.112 +    // Decrypt and verify it.
   3.113 +    char *plaintext = NULL;
   3.114 +    size_t plaintext_size = 0;
   3.115 +    stringlist_t *keylist = NULL;
   3.116 +    PEP_STATUS status = decrypt_and_verify(session,
   3.117 +                                           ciphertext.c_str(),
   3.118 +                                           ciphertext.size(),
   3.119 +                                           NULL, 0,
   3.120 +                                           &plaintext, &plaintext_size,
   3.121 +                                           &keylist, NULL);
   3.122 +
   3.123 +    // It should fail.
   3.124 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   3.125 +    TEST_ASSERT(keylist);
   3.126 +    // No signer.
   3.127 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.128 +    // Recipient is mary.
   3.129 +    TEST_ASSERT(keylist->next);
   3.130 +    TEST_ASSERT(keylist->next->value);
   3.131 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   3.132 +    // Content is returned.
   3.133 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   3.134 +
   3.135 +
   3.136 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   3.137 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   3.138 +
   3.139 +    plaintext = NULL;
   3.140 +    plaintext_size = 0;
   3.141 +    keylist = NULL;
   3.142 +    status = verify_text(session,
   3.143 +                         text.c_str(), text.size(),
   3.144 +                         sig.c_str(), sig.size(),
   3.145 +                         &keylist);
   3.146 +
   3.147 +    // Now it should fail.
   3.148 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   3.149 +    TEST_ASSERT(keylist);
   3.150 +    // No signer.
   3.151 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.152 +    TEST_ASSERT(! keylist->next);
   3.153 +}
   3.154 +
   3.155 +void VerifyTests::check_expired_tpk() {
   3.156 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   3.157 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_pub.asc");
   3.158 +
   3.159 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   3.160 +
   3.161 +    // Decrypt and verify it.
   3.162 +    char *plaintext = NULL;
   3.163 +    size_t plaintext_size = 0;
   3.164 +    stringlist_t *keylist = NULL;
   3.165 +    PEP_STATUS status = decrypt_and_verify(session,
   3.166 +                                           ciphertext.c_str(),
   3.167 +                                           ciphertext.size(),
   3.168 +                                           NULL, 0,
   3.169 +                                           &plaintext, &plaintext_size,
   3.170 +                                           &keylist, NULL);
   3.171 +
   3.172 +    // It should fail.
   3.173 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED, tl_status_string(status));
   3.174 +    TEST_ASSERT(keylist);
   3.175 +    // No signer.
   3.176 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.177 +    // Recipient is mary.
   3.178 +    TEST_ASSERT(keylist->next);
   3.179 +    TEST_ASSERT(keylist->next->value);
   3.180 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   3.181 +    // Content is returned.
   3.182 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   3.183 +
   3.184 +
   3.185 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   3.186 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   3.187 +
   3.188 +    plaintext = NULL;
   3.189 +    plaintext_size = 0;
   3.190 +    keylist = NULL;
   3.191 +    status = verify_text(session,
   3.192 +                         text.c_str(), text.size(),
   3.193 +                         sig.c_str(), sig.size(),
   3.194 +                         &keylist);
   3.195 +
   3.196 +    // Now it should fail.
   3.197 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));
   3.198 +    TEST_ASSERT(keylist);
   3.199 +    // No signer.
   3.200 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.201 +    TEST_ASSERT(! keylist->next);
   3.202 +}
   3.203 +
   3.204 +void VerifyTests::check_expired_signing_key() {
   3.205 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   3.206 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_sig_key.asc");
   3.207 +
   3.208 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   3.209 +
   3.210 +    // Decrypt and verify it.
   3.211 +    char *plaintext = NULL;
   3.212 +    size_t plaintext_size = 0;
   3.213 +    stringlist_t *keylist = NULL;
   3.214 +    PEP_STATUS status = decrypt_and_verify(session,
   3.215 +                                           ciphertext.c_str(),
   3.216 +                                           ciphertext.size(),
   3.217 +                                           NULL, 0,
   3.218 +                                           &plaintext, &plaintext_size,
   3.219 +                                           &keylist, NULL);
   3.220 +
   3.221 +    // It should fail.
   3.222 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED, tl_status_string(status));
   3.223 +    TEST_ASSERT(keylist);
   3.224 +    // No signer.
   3.225 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.226 +    // Recipient is mary.
   3.227 +    TEST_ASSERT(keylist->next);
   3.228 +    TEST_ASSERT(keylist->next->value);
   3.229 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   3.230 +    // Content is returned.
   3.231 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   3.232 +
   3.233 +
   3.234 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   3.235 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   3.236 +
   3.237 +    plaintext = NULL;
   3.238 +    plaintext_size = 0;
   3.239 +    keylist = NULL;
   3.240 +    status = verify_text(session,
   3.241 +                         text.c_str(), text.size(),
   3.242 +                         sig.c_str(), sig.size(),
   3.243 +                         &keylist);
   3.244 +
   3.245 +    // Now it should fail.
   3.246 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));
   3.247 +    TEST_ASSERT(keylist);
   3.248 +    // No signer.
   3.249 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   3.250 +    TEST_ASSERT(! keylist->next);
   3.251 +}
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/test/test_files/pep-test-mary-signed-encrypted-to-self.asc	Wed May 15 13:56:54 2019 +0200
     4.3 @@ -0,0 +1,24 @@
     4.4 +-----BEGIN PGP MESSAGE-----
     4.5 +
     4.6 +hQGMA6aSYtgJ++dOAQv/f5Q5icNJ2cXMe9HJgWeTiBDDBflPwuIUEVyeCGa82kyl
     4.7 +DwwWG/vS/KMwkJOzzttdT4PDlUKotRy1ujYtxYGByM8QLDEgWwGSGkS+XN0iG4Uz
     4.8 +p8SHzJbGgDbvsZCbEXrcSeR8XBLCGHRzvu1l2Dg43Co8QO250BV8PvhFAJrjEOUT
     4.9 +BhiR++biD64OuEA///zp+7lhqN6ejZw9P8lhqcl8e8wpirUTmZjrpWhNK/nSkWs1
    4.10 +ghBcteVBVdDFQX/UYKgluGldyGNy/CmYGhOuUfx3cmPGxO9qef+p3OjMVNlyYViM
    4.11 +xoawV+fn8c5hv9IK/jkCYyQmzJflzO1boQLMTCGL7DyyL9B7x58ib2lbHqIqWVTC
    4.12 +0Lq/IxKDhOf/E/qMT88g+uRRD6AUV5/CtxnHXPsomOhRINnuq8FNQjSBqws3jeXd
    4.13 +6zzI24ys0bpKk1VX3SAxIyPOcyHbSQQ4xRUGdo0dWdcm6XanC0oeri2ZaMJzfDnv
    4.14 +dUgQ8pr1AGfiih7l2MjP0ukB9SIGGjlqf7P+KQiU6TgCd5ZOPrp0hDp4vsP0wVNK
    4.15 +2S5kfK6sv+coGpEUEnUoBO827JW19MU0vLLwWkXZFoCB3DmI2KDvSBett9t2bSbT
    4.16 +N2Djvi9dLDCt05oNdmfR1e1HVIwZQm5qetHHycxQy8OscTUp9ZYlGkyrQ6jlMMeE
    4.17 +40OxcxSCmuk2ln5N5EZqUImAFv6ynuWNiN1vmKVI1ozTrDvb7QVn72QWN1slS0z6
    4.18 +b5WVunNYso58fFOjnJ4CFVCuWt5XhEhn5ArQoZrzWeDdWwV2l+vfwXlu2SXZdg6l
    4.19 +jW6tIJaUtEjPLg6PeTG0coLGE6JrUDcWCiqGEBdrV/9txssKG/efVdPn+Q1JXqom
    4.20 +//jAWwjFcDkRkrMbWVgEbtaUFHt67mTRQTQojfueqh8JbkmEVcxDzyAVtPiAnl9G
    4.21 +EZmWUD/OGePlJJjbf/B8ddRmUWzSjgtLfEQLekj9ubjq0e6+095bYHv14BOGbpdo
    4.22 +sqlxEevCwtx1F8+NoRFZq3qi1y+5BZacfoUZip3M7BVDpvAXX2t+6lKVQiMUsnSZ
    4.23 +SmupON6y8n/m6WaxnPqZkGbL07+umdPYUh68UO51A/UrCUujfFweaL2rXOK8pNkB
    4.24 +179q9WmLOWhBRNghDJlEZHbw/+OsJDiss96oGrxVBYq8T2iBM7MpFj3gW3ZDoIOr
    4.25 +Qws8uwuXIkEkwe8t+Q==
    4.26 +=BXG/
    4.27 +-----END PGP MESSAGE-----
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/test/test_files/pep-test-mary-signed.txt	Wed May 15 13:56:54 2019 +0200
     5.3 @@ -0,0 +1,1 @@
     5.4 +was soll ich machen?
     6.1 Binary file test/test_files/pep-test-mary-signed.txt.sig has changed
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E.rev	Wed May 15 13:56:54 2019 +0200
     7.3 @@ -0,0 +1,15 @@
     7.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
     7.5 +Comment: This is a revocation certificate
     7.6 +
     7.7 +iQG2BCABCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakXgCHQAACgkQf1nw
     7.8 +PNBKIm6RXgv/X4oQggntl/bpPA31RJCrfND2bQUekpH8rG0BsoY5VdXww2JuGdS5
     7.9 +q7CluWviPshEYLOe1xcb9wPM1Yo2c1OQfXapDhnLXR69q32vA7yxdkcdVcvJRD5I
    7.10 +Lotm2bwe5DURW256G8dLcL4pmCweCt8UKJNppyXUk7FB4U7wQcYHdR6dAVIebovh
    7.11 +aCopH/gXEsIxKXl5/P3E+1cb4jJlsmGrP2SBymx8etvGmT48F/PG1L2lWnZrkUfc
    7.12 +Ldj/W2ds/ukhizswpL/RI7fT+nmRmDCY11tWRzMxGOBYb2/fZmeqOtaFZe/PnVC7
    7.13 +Zv3XyK/WA0wLnpHCBtM9TmWwHOwyVwI4/o2cGtZMAtVlIcWNgYYnpf5BZY7vJjM0
    7.14 +eaUjNbuCUCuiOFeW35qHNZAq1VJj5QrfwBvvLWQrEpVPzCSMNSe9YuFEhKH4z5b7
    7.15 +YHX0Na3sSEBuvtnSkPKtixkd8H6lMhJ8eEpIyKJTjDgNVFSkMsLmiK+jikuJgIpw
    7.16 ++IM1ZSCnyfCF
    7.17 +=kqka
    7.18 +-----END PGP PUBLIC KEY BLOCK-----
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc	Wed May 15 13:56:54 2019 +0200
     8.3 @@ -0,0 +1,129 @@
     8.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
     8.5 +
     8.6 +lQVYBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
     8.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
     8.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
     8.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
    8.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
    8.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
    8.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
    8.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
    8.14 +dHZuhDzoSFpPTbMAEQEAAQAL/ijRhZ6aT9nPOu3n9X/feTLwzBKGZu+S1uHpxd5i
    8.15 +HScoFr0CdiPOnKVNNpiyBzAhTfvMRG5KXlR4QwjkaYvsWzXqD1gKnWHENGd9Lj5n
    8.16 +9dg1LUpNWnE/pcQ4SnDKox1AbjVJwUNEaLUXiCmaKqP2U+d3zYn1vfvAJ9KVy3JO
    8.17 +qKKccDDxDs6f3u0fuTv11taA7gkXSLrOxRYZyVM7wH4DncMEd5p8q/qhnbz0Vl4/
    8.18 +6ViMB89RCKlJ63kn5CabPp/cNU+5X8bC700tgg30EcUfwE6a+GSnfLVwAquZAfPI
    8.19 ++6ikSjaA+4Ha0LiDYTqtVzW1LohKHbU9ZQgwuCngIVUn3LmFGk7NFN4QHIw4MmnA
    8.20 +un5bfoIELxBPbpGFPguZ1b+UwUjabrfXyoC6xEydIGNqV7vTYo8BW5JZqaMvMWQY
    8.21 +7RXGJpTZdxRV8FBA2PsnhmD1aGI0DR1/xjiTdiZLl+wvRj3b4s/0dvisYDAx6fbL
    8.22 +AWFqH+FxAlxdHE2qtvaHcNmK0QYAyKpbX7tb8rRpdM67yiYCT33jall0wewZn4pb
    8.23 +bJr54eoSCcpIS17AP+A3pk67ppvWJTQGGx6lMNYpy8kfgF1EsL4JD70lrAHMrXke
    8.24 +o6DbDxzG1tl+FBAvCtvVcC/wICiX97XTvsk85X/SsfGGYi4ZdrVMiLwLY0A++uHl
    8.25 +khe11Odope8ZLuGo43xi9Ug3G+1g5FsLmn2IyTuELOgyV8NBRTiewBTQcr1ON4HZ
    8.26 +rVCjWx3svk3c2kEOUWtGP/uE9hdJBgD7qZ7mI7LZaWF4la3icvMge80a1BfYC+kR
    8.27 +h5aKrlrS0QU61XHqt6n3IeXv5brm1xMBwyUiVB4JgWU9xo/BxJp1nKh0UAFG5TLc
    8.28 +7mvrtdE1AY0PjfXVaouCgsyYb+cW6HOsrMvqBMfrLz/ehZc3uKv+zRc4eHITOm4R
    8.29 +UqEH/SxKPje15IkhQf7QfqI4LwZU0HKeU5ehTqzNwm0I33eBbXQClGNbBtWfPH1e
    8.30 +aSFQmjWu5hlLH4uATnIffqBwQ3tXERsF/1rBF+nFczeJduKgzjQpNV5TBzKQrgWX
    8.31 ++12LSjcBYPsBPct9k9H36JoO8zPZ2N0Xa+YBn+dgp9g3g2mN4/D3Q0lKrEReRfnN
    8.32 +nN8/54LlbEIRTgkFlt+evH46t5lVNui4pegyBQMMUAGew4TATkf6wTcrG4644Z9C
    8.33 +wpGi2Lxe0xsM8DxngRAMtT7u87vuKTgwPZWPIlUNmyCepISHnTOxdqgRx4Dujvsb
    8.34 +h6f6XkSd8QJpnRBrZ5HGsgfSN/Qt/NNcrt+StElNYXJ5IFN1c2FuIE1hcmlhIEth
    8.35 +cmVuIExpc2EgTGluZGEgRG9ubmEgUGF0cmljaWEgU21pdGggPDE5NjBAZXhhbXBs
    8.36 +ZS5vcmc+iQHOBBMBCAA4FiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakXICGwEF
    8.37 +CwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQf1nwPNBKIm4ebgv/ax2NjqFViCSY
    8.38 +wpH0O2Mre+sdy+Qlk+IZlVs33WgLTF3+6UEtO2mSWriwTw0FJVKkKmFcC2JDnDCY
    8.39 +eR13FZVB1W7RPHHkpJzheqRTommYXvYLQN1squUVD1d1rrxsWCwMDB3j+nfmixds
    8.40 +T3GZYBdmaZbvSXnwyhm5XTUqzs9tYgftHOGwpE20ySSOSNDpJ0t6wOlp7CuuZlTp
    8.41 +BBfZl1PmiALKwbPSKhXOJyuEI/W7cJ2/LyKfGPW7lkGAbek9JowK6Y9DGos6kOf8
    8.42 +W8Api3ZBXJJeBaSPqCZ0Nk/LP93JFv8yAdgKZiLKrr7YWylSEGLD/PVwOcTW/mUR
    8.43 +vnecah3WAbBVSN6fRYzjV8sDzNCPRTmObXsLmxC7uM6F8sMlzFCUPhZTY3ghjmU6
    8.44 +jDQlXEJn/6I2Q38lsjOX6dPnvFy7221LwHz9KYBIB8GgVT9rxJ0pNlZwChUmAOTn
    8.45 +rRUFjx+zMh1G0uKk6cDsqaVBjwncOu/aQJ+nVaCp6uxDXrnuhUienQVYBFzakZYB
    8.46 +DAC2Goe/yDgr+5Nj+XwMEENhIgo0FnUJMcYXSZhb1Cp8I5k2j7ge8yet6BVVYlEj
    8.47 +VKZ7C2UWqh7h5WlaVBn/ICqoDUqkJl9LktXNVbeTswoTVJTyKagJ/FaUb7Ysb51+
    8.48 +iWsC7LZNKUY8h7CLHsaF442iHHks97iSwl5EMTv/0q1AeBa/c1wmJh3w1c0fEYjy
    8.49 +TRe/VREhYBsnHkcRns8qZKX+FyJxtgKlGh7LFxqOUEA8rKzS8157qaS+GG8HvN3X
    8.50 +r1d8cwf/XnADAwsfQahxEMeFZoUUWtclfgcBDAEJTU9davTZJrvd43IR3rqYHBCc
    8.51 +Kic0Do+Qvt43DM/Y2are2NuIo7uliEY380gSHZAI9EmVRuOe/TrwmIPyxHTocxUx
    8.52 +5oNLXN3b0G3gnzaCLv2bMGeFszIcOtmuev1zHiRRcMbIuQQbRaVsGG6Rsy7S3hmw
    8.53 +G427bbI4k+Kqmteuy0WGEgUdMZEr629focujrS0Qh2E30KM6H2P8pKFjK20QSQZ0
    8.54 +gNkAEQEAAQAL/0E4X0Ygv32BLNixkewAJyGyv1TIdkJEwV21zguVgWHUnhscfiUX
    8.55 +kS6H4JwkCktNFhMbkaj8ZPMi5wii9myZaK2nlQQVeivm+wv/lzAe/4zMzkus/7IT
    8.56 +3i5rlCN2FkIrlVgGz4PzNGSZdHFfJFrvlNpquDuSvVhSpNBnkcWd/s8IM51+A5Lm
    8.57 +M/L9n+lwrkuZsNel7+y0LwVjorB84FWelpTaVEvFlEztffne3HP76gXRElS7NSu1
    8.58 +Jnuu5JUw34NQGLnB4T77upRHa4ngZeK3+VV5UYX9vHWEiz+TrvGkHA4fFbik04jF
    8.59 +rBwxcc0lHFC2O+lxiEzWGAgxDbqHifE9TzWrpPxAUZSo4On1XnKzu9EHAZVpexHJ
    8.60 +9l8jH1H7XvxBQGbG42e/aRAL3rlbP6iZqXhJ6pUeF4KlsVRbFo1XqwKUYhcryKCp
    8.61 +6bEip5R8W4S8/3EfrSpmRymsei7cV8e572ROPYlx6tDwOUJMRNDBarvT75Z3vZ2Y
    8.62 +xfP1/4Uy7uwfwQYAwjFRDnNYC+ChfP5cdWDpfBGoulCKQ107+2TzKwnDqCi+a901
    8.63 +KxnK1iE7PVNEVL/SkF1RKJPgU2yAXJacd9AlrPRaXV8ftTaL8F8wZkSrybCodpcO
    8.64 +avOuMSztqvnldJjZk0ZJrKa+kgyKRESMDmPSe6WV7zl9S/qFox1vzncYfnCYD90X
    8.65 +DABxeqBukUEk+hWBSyZY+t0qnOcW2XP0LxFZHOix+ZWwIlRj50AS2s6uIlGKv99Z
    8.66 +fotRuwxRaxAFysiXBgDwEDWfdQX9vmw8vqzMxK0z4cj9NhMWHrDNH9QMeX4/K9V9
    8.67 +7LsTibsbTw6jpwPh/+s9zxC0RR1Ro+kZQnvleLz6+k0gqiJErHHvl4qmgFdq4T13
    8.68 +J7ISEPCH5sVO+1t1Di3oLBtEP1COY2UpNyC2Otjml3A1/CmYdGI9G6JyEVKQF4Ju
    8.69 +BwJ14RSz0b1i5pjotkD8PfGmNIVF2nOUATbFRYYnDP8MH8c8TzasIwjKrnPxY2Yx
    8.70 +k2kEOWGqm9d3TQabQA8F/2PKyMSbIjBwiGpi9PMC0MZCDjc+j2H4J/C06ycaMWiK
    8.71 +1ZPKE3yGv8bhA6zhQAAYuH02BUZBrRY2uTXHcgnyULcg0/+AWvJklaw4dbRy3iLT
    8.72 +O45J1N392Q5JFO9bOaIpemamEP+/MoD+VV8+U/Al9RSBMmxgq8BmRt0+F881d5n5
    8.73 +71g9dOjrdd1zX4Xl7eASS00kbAcGoZCb34oW0uRi9nYunzltXzM+s5INXvycoTjo
    8.74 +jEpb4FyLMeS6CPJwphAGvdy7iQNsBBgBCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBK
    8.75 +Im4FAlzakZYCGwIBwAkQf1nwPNBKIm7A9CAEGQEIAB0WIQQ0rQXUJuRMayXQhG++
    8.76 +0LH0HLDcUQUCXNqRlgAKCRC+0LH0HLDcUavFC/48V+NZzS3NlSa/R2mcBwAZyEZi
    8.77 +CGstMeualsNtpxeAI3dJD2YOptqF0EwCardYBrRYH4lvbPNCUC0/pPVBdlZGi+nX
    8.78 +7LqOffSlmYRyz9K6idLOWqLQcab7NZG8fgyygtx/zVyLvRtCcqsGuCj98vIZXgyA
    8.79 +QZnaDDaUXRPwlXlCUXXAYmEMr2zTVZzxmz18Kzr1bK7w0f6wxDHiN7gGpSX7ASp4
    8.80 +fh3glAIW7V6o03eUfzcIizXqVP+jNVrR2XbdFP6b3eW2UAXf1nAmUX7JKS1fGhk6
    8.81 +f+3Cdzmy1tGsCfB6bUQhxkzYhuWvzuLXwG5BVpKzjwMqGqwy2UnaIuq0Q8sU8N1u
    8.82 +AmphZm7+1x/4jVdQLm9if6okY51du/zPdoHucRo/sT+Sr+xAXn6QkB6SdzkwUXAC
    8.83 +/uRF3Zg2RBVyhcrrIG+mrIAW5FO12njOgrJAWP09zKilYnOGoDnbnexrqTUjpcZu
    8.84 +oaW/Yn2DobIJFAl/d6mTx2nlNfU0Ol1gwmWOA1YN4gwAhsnkzW5K5HEUPuYBxE2G
    8.85 +UAZgclQdh0/TWdUrxcooRShwZ3p0cVqmmz3xZlUUy8atx6w/hUnh173df82D/XfI
    8.86 +7HnaN27p6hA61GBhkGXXR5IYInesB+eKPgp2jzHtbxzhb4cuT+CNsyCYtlkmN278
    8.87 +9cxadYpskwhMDFWCPgGD3W16hFa7pCmgR4J8UYmZZP5LcOAgmRO3SzIroPnVj3TM
    8.88 +ftelH1Auq8GR6qysVtAlb1ckmS3m1l8jrCu53CS+UkG7HEK1LCb5L2e5DnzDLIkj
    8.89 +Z4IcByQVFvAkN/V0kx4/JWN9iZVFnhlJXkC/qgA26nM5VvCX5MoMLs9ksxdyJ4tm
    8.90 +BZCDjgefymve1y3dhNcmY8Gt0PxNYTrg22m0L7aNSz8RwShlrmlDOMn+r/x9Gt1/
    8.91 +664f6MlSmE8HXO6Ucos4z0gD9N3WCclVGJ1AXE8Q7fd/v5xiw0lARnH4++cQ0AMT
    8.92 +Ay8qn5qdai0FBVeEtrAbxdguCkcVbdbsxFOjldhDGbcdnQVYBFzakaUBDAC2L+tD
    8.93 +AJvji5xqrfPunpCa0/C+Q5zax4ypDYlNj+7KU2edPNd3Y7ZOXXU58nv2BbeKVqoZ
    8.94 +VUs5jbAe40a7XYUSoqTeechk9JxLIwsvpLh5E1bGD67U7FnXfZqvm9b7mKWeDriP
    8.95 +mPfJceWQy4b6s968BOeo0L1iR0tDu04u5mAgZDXTHmLr5oxhHixtMxOJkQUIlEaJ
    8.96 +P/NGS4R9rq1fgkS3kv+kNveiZRlxq2vGE2/g+uU4Cscq+j+19DdzTZgOu6JY02uX
    8.97 +tbPv0Z9Gaj9SUgTnUbFF/9qlV/FkAAHK1Q/j8XPoPFkeC+akeEAP3GyhLmnEgY+d
    8.98 +3MA5xWRDgsOe+0+xP3YhABIOMk0LTNb5NSXeIS+2t+9NzAA1BT9E1CTthDHC3waL
    8.99 +5Fk9w1MNwoyaAo96qEqLbFbpO1HB2k8ak3uCvdysWWkV2/zPRph3R1zcXWEm/vAD
   8.100 +Ja9sztx7dZDTy9AjDmquBWSk2/Fhs9noQsXI2xOPZd4rBwimTSNHX2xDEC8AEQEA
   8.101 +AQAL/RFyuGjT05owwjuzSjPVqsqxNpK6Pfjz+IQuQDKV8MwevcMg0w/jlE+gAryY
   8.102 +fQe8V24fy62ebhRmffIPWTRTig2VVw3ZgvgsNxW5Fvaqo2IxGHPih59rvVT2egyM
   8.103 +c8PnxCDFjyZtg3me91ntLBGxjUjbfWY9C44wfsRPWXcDaDxh7Ie6FsY578LTVXTl
   8.104 +2d6obV97d9/oKH/Ydqlkw8TsYHFmWiZbf07luNCalrlDHklhLfe2jImQqu5do7ve
   8.105 +uAvdK087vvm4G6THAEdOjLx+bs46QbeVDuCKQcI4CQbYtik4BtXlY6BNkORJczxd
   8.106 +8S9V2n61fp4TEFdzDQw/udDPXUkue6RW8as0EOT7VFiTlTvsCoK0d4L3bkYKJ2w5
   8.107 +cjt014i2959NFR4qOO+M36/mcEc2l12tA3dzZWnj/h8L9gZOcDwlgldCGY+FdIEe
   8.108 +pgwZ8hjMfNC94qhGyn/+RAbjUCgYthZx5RH6zf1WNSBMEkFRR+WJcFENCuPuXl4H
   8.109 +w536BQYAyn30zNYJlm2XsYgrM9B27ZavUNNehHu8K9yeD3oASa5E0gGk4Oj9JQm6
   8.110 +vDIbpP1ImbbiI1hUHkL+XK8tdvjxu8cKISi3KfUZvSxs12G2ax7tmUyWtnql4CHx
   8.111 +PJJOIagFlPY0f1LEuAXVGPd68hSZ5mzn3zuUbt/pLdbZ7YNTJ1aIawOZqWOBYltr
   8.112 +znrAKcjVs6OFzKeujNa+K2JYyawEU/eG4322OBVSDspEV0Z2X/z8sGgDhfAlyZmq
   8.113 +HdebYdSDBgDmVGUiErIVQAMp/LsuYr+GdrZDdAwkusAUcAS5JLt2MvLOhDjJ910t
   8.114 +ByUjU0uHWxYCZH4kcv0/aAeCF3lWuTYmGRbdFk89p7Y6zggf6W1jqWLQ7JIvZQsQ
   8.115 +KidKHP1dTb6aQp6v7tKcUoYaPlgLE+eFjdAX6f0CQ+FBYfszYbqWkRfoREW3NyDV
   8.116 +G8qlH0fZrMjYdvt3dTKRO11wh958O4eOM9yLiPxk/ZrFNcvfxzQLyjzZ65ub4JSi
   8.117 +M6zdK/pUfeUF/20iloJMsXlYTqXI1taYtKAmA1iwJ5kvpz3uPGOtNRSrISkLoSab
   8.118 +ocfojHAsOhRwZMvhrh7mXfycWZGFm58ZP6C3r0nYNeHsjDwI8UOvKUiD1w9xVSJl
   8.119 +kFR5gH3cqawPA0M8O6Ya8nnO4GayQgKwFMzB0Z6j87G0SViT3fS89DwcRjTC5QeY
   8.120 +Tj0fEeFz7/CX0buEsnsd0FM1w2We/DAK/kAQXMDirmabIOasYPDk3+BS3fWGaJf7
   8.121 +xICz4DJE99QSfd5GiQG2BBgBCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlza
   8.122 +kaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBozPqmmprEolo2iPZFLBwVqXueIPjQ
   8.123 +S6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oCsmfLjfQSV6FygdjjFRjbhm14ny1v
   8.124 +ZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsGvZ6BnWWKEtXyBN2vTCZC8+hGfo6p
   8.125 ++WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qRKggZvecQL+k0ebWeQzUwvTTWgfDa
   8.126 +Vh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd1J/cQtAZiZCCnKS41aLUKnMNjrGt
   8.127 +MdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vli8ERoZm5GXki9d54Gu1lAZ6QDM6O
   8.128 +iKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6I2NDR/R9kZzuQ/42CiUf8XX/4Tzb
   8.129 +vU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj1PNN1xt0qNxYPy3tbQVnCOD6a0po
   8.130 +mCsddt0ANDA4BDMM32UW0FU2Ahu0
   8.131 +=EuxL
   8.132 +-----END PGP PRIVATE KEY BLOCK-----
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_pub.asc	Wed May 15 13:56:54 2019 +0200
     9.3 @@ -0,0 +1,68 @@
     9.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
     9.5 +
     9.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
     9.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
     9.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
     9.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
    9.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
    9.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
    9.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
    9.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
    9.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
    9.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokB1AQT
    9.16 +AQgAPgIbAQULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgBYhBFmbPWeADbN+Lc4FwH9Z
    9.17 +8DzQSiJuBQJc2pITBQkAAVIhAAoJEH9Z8DzQSiJuT9oMAMDohz5ee4mz8d1GZxgn
    9.18 +IVmktrUxhr7PoJoLjyQF5VHCifYC1fdH3ax8EblRfnjI9G+JlGXcS+Vyae0UXlTe
    9.19 +zfVHBSyDM1VWZ4X+mSs4mXgU6IQOn/zGIFfEU1TgEl7FjK70zhjJNfr1LruVA/I/
    9.20 ++oLD2oH8AObOTrYF6ZsKqqnLyAC3H0NI+FoczkXJom7h27RoRXJsCO2FGElLGhak
    9.21 +zSJwSYTbGLBT9ELqpboCop5AIiL9daPqkcHktbONNKyC5sBbXn+nRU6cWirbLrsF
    9.22 +t9epabSVpI0QlnvWsTcr0jv6yCXx5vyS8kBqmXt3hi9UbC3nsg4+7V+8iBlOTjUL
    9.23 +R3CTZepj1b4mE0vRr+JBKHXfakwdAJYvQRuPYPC6w2Hmwk7MIio+ROVdD9yb/yOA
    9.24 +LoVNzLllGM9wmpX6921suFh7romAZXD1V4AH8UzBgcRSDZfcW0oxjcYfdlQpO5QW
    9.25 +eujvNxeUXqXui7ia5f6EjGT0wAgknZd3IY/M/DsR6jHqu7kBjQRc2pGWAQwAthqH
    9.26 +v8g4K/uTY/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1Smewtl
    9.27 +Fqoe4eVpWlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2
    9.28 +TSlGPIewix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1UR
    9.29 +IWAbJx5HEZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH
    9.30 +/15wAwMLH0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6P
    9.31 +kL7eNwzP2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd
    9.32 +29Bt4J82gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22y
    9.33 +OJPiqprXrstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEB
    9.34 +AAGJA2wEGAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqRlgIbAgHACRB/
    9.35 +WfA80EoibsD0IAQZAQgAHRYhBDStBdQm5ExrJdCEb77QsfQcsNxRBQJc2pGWAAoJ
    9.36 +EL7QsfQcsNxRq8UL/jxX41nNLc2VJr9HaZwHABnIRmIIay0x65qWw22nF4Ajd0kP
    9.37 +Zg6m2oXQTAJqt1gGtFgfiW9s80JQLT+k9UF2VkaL6dfsuo599KWZhHLP0rqJ0s5a
    9.38 +otBxpvs1kbx+DLKC3H/NXIu9G0Jyqwa4KP3y8hleDIBBmdoMNpRdE/CVeUJRdcBi
    9.39 +YQyvbNNVnPGbPXwrOvVsrvDR/rDEMeI3uAalJfsBKnh+HeCUAhbtXqjTd5R/NwiL
    9.40 +NepU/6M1WtHZdt0U/pvd5bZQBd/WcCZRfskpLV8aGTp/7cJ3ObLW0awJ8HptRCHG
    9.41 +TNiG5a/O4tfAbkFWkrOPAyoarDLZSdoi6rRDyxTw3W4CamFmbv7XH/iNV1Aub2J/
    9.42 +qiRjnV27/M92ge5xGj+xP5Kv7EBefpCQHpJ3OTBRcAL+5EXdmDZEFXKFyusgb6as
    9.43 +gBbkU7XaeM6CskBY/T3MqKVic4agOdud7GupNSOlxm6hpb9ifYOhsgkUCX93qZPH
    9.44 +aeU19TQ6XWDCZY4DVg3iDACGyeTNbkrkcRQ+5gHETYZQBmByVB2HT9NZ1SvFyihF
    9.45 +KHBnenRxWqabPfFmVRTLxq3HrD+FSeHXvd1/zYP9d8jsedo3bunqEDrUYGGQZddH
    9.46 +khgid6wH54o+CnaPMe1vHOFvhy5P4I2zIJi2WSY3bvz1zFp1imyTCEwMVYI+AYPd
    9.47 +bXqEVrukKaBHgnxRiZlk/ktw4CCZE7dLMiug+dWPdMx+16UfUC6rwZHqrKxW0CVv
    9.48 +VySZLebWXyOsK7ncJL5SQbscQrUsJvkvZ7kOfMMsiSNnghwHJBUW8CQ39XSTHj8l
    9.49 +Y32JlUWeGUleQL+qADbqczlW8Jfkygwuz2SzF3Ini2YFkIOOB5/Ka97XLd2E1yZj
    9.50 +wa3Q/E1hOuDbabQvto1LPxHBKGWuaUM4yf6v/H0a3X/rrh/oyVKYTwdc7pRyizjP
    9.51 +SAP03dYJyVUYnUBcTxDt93+/nGLDSUBGcfj75xDQAxMDLyqfmp1qLQUFV4S2sBvF
    9.52 +2C4KRxVt1uzEU6OV2EMZtx25AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT8L5D
    9.53 +nNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKipN55
    9.54 +yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE56jQ
    9.55 +vWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS/6Q2
    9.56 +96JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdRsUX/
    9.57 +2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/diEA
    9.58 +Eg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qoSots
    9.59 +Vuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMOaq4F
    9.60 +ZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEEWZs9
    9.61 +Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBo
    9.62 +zPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oC
    9.63 +smfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsG
    9.64 +vZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qR
    9.65 +KggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd
    9.66 +1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vl
    9.67 +i8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6
    9.68 +I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj
    9.69 +1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
    9.70 +=Lvco
    9.71 +-----END PGP PUBLIC KEY BLOCK-----
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_sig_key.asc	Wed May 15 13:56:54 2019 +0200
    10.3 @@ -0,0 +1,68 @@
    10.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    10.5 +
    10.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    10.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    10.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    10.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   10.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   10.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   10.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   10.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   10.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
   10.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokBzgQT
   10.16 +AQgAOBYhBFmbPWeADbN+Lc4FwH9Z8DzQSiJuBQJc2pFyAhsBBQsJCAcCBhUICQoL
   10.17 +AgQWAgMBAh4BAheAAAoJEH9Z8DzQSiJuHm4L/2sdjY6hVYgkmMKR9DtjK3vrHcvk
   10.18 +JZPiGZVbN91oC0xd/ulBLTtpklq4sE8NBSVSpCphXAtiQ5wwmHkddxWVQdVu0Txx
   10.19 +5KSc4XqkU6JpmF72C0DdbKrlFQ9Xda68bFgsDAwd4/p35osXbE9xmWAXZmmW70l5
   10.20 +8MoZuV01Ks7PbWIH7RzhsKRNtMkkjkjQ6SdLesDpaewrrmZU6QQX2ZdT5ogCysGz
   10.21 +0ioVzicrhCP1u3Cdvy8inxj1u5ZBgG3pPSaMCumPQxqLOpDn/FvAKYt2QVySXgWk
   10.22 +j6gmdDZPyz/dyRb/MgHYCmYiyq6+2FspUhBiw/z1cDnE1v5lEb53nGod1gGwVUje
   10.23 +n0WM41fLA8zQj0U5jm17C5sQu7jOhfLDJcxQlD4WU2N4IY5lOow0JVxCZ/+iNkN/
   10.24 +JbIzl+nT57xcu9ttS8B8/SmASAfBoFU/a8SdKTZWcAoVJgDk560VBY8fszIdRtLi
   10.25 +pOnA7KmlQY8J3Drv2kCfp1WgqersQ1657oVInrkBjQRc2pGWAQwAthqHv8g4K/uT
   10.26 +Y/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1SmewtlFqoe4eVp
   10.27 +WlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2TSlGPIew
   10.28 +ix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1URIWAbJx5H
   10.29 +EZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH/15wAwML
   10.30 +H0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6PkL7eNwzP
   10.31 +2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd29Bt4J82
   10.32 +gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22yOJPiqprX
   10.33 +rstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEBAAGJA3IE
   10.34 +GAEIACYCGwIWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqSVQUJAAFSPwHAwPQg
   10.35 +BBkBCAAdFiEENK0F1CbkTGsl0IRvvtCx9Byw3FEFAlzakZYACgkQvtCx9Byw3FGr
   10.36 +xQv+PFfjWc0tzZUmv0dpnAcAGchGYghrLTHrmpbDbacXgCN3SQ9mDqbahdBMAmq3
   10.37 +WAa0WB+Jb2zzQlAtP6T1QXZWRovp1+y6jn30pZmEcs/SuonSzlqi0HGm+zWRvH4M
   10.38 +soLcf81ci70bQnKrBrgo/fLyGV4MgEGZ2gw2lF0T8JV5QlF1wGJhDK9s01Wc8Zs9
   10.39 +fCs69Wyu8NH+sMQx4je4BqUl+wEqeH4d4JQCFu1eqNN3lH83CIs16lT/ozVa0dl2
   10.40 +3RT+m93ltlAF39ZwJlF+ySktXxoZOn/twnc5stbRrAnwem1EIcZM2Iblr87i18Bu
   10.41 +QVaSs48DKhqsMtlJ2iLqtEPLFPDdbgJqYWZu/tcf+I1XUC5vYn+qJGOdXbv8z3aB
   10.42 +7nEaP7E/kq/sQF5+kJAeknc5MFFwAv7kRd2YNkQVcoXK6yBvpqyAFuRTtdp4zoKy
   10.43 +QFj9PcyopWJzhqA5253sa6k1I6XGbqGlv2J9g6GyCRQJf3epk8dp5TX1NDpdYMJl
   10.44 +jgNWCRB/WfA80EoibqLdC/4ssznHmOhxlEmPHZOgOsJQgtQGt3Zz4EDqOY5ejxaj
   10.45 +B9Nl5zJdypDhx1Dfb6gCR9ZOsKelpZJeees2HjKA0mqwFkQ30s/HN1ocVCKaq3md
   10.46 +ozGQv0z5Cihw1Buj+CZwHztPRbtDPNAyrLUjgJN0Lg/jfU4G90aS1aQEGnnlksE3
   10.47 +qkBw+86RV2gHoVfWOGQGFCajlJgnz6X93YL1A7IJv19rP+4fHJKubq98gnXvo60Z
   10.48 +OBiUKmIkgja2lDlZo26qz/yHiS/WBo/ZWMBiH7brM7TikIAC3JgXrc+98m8vJqAQ
   10.49 ++Ak6yndQDaMmnfaj53E4YaZ937xGiNRZq5lEnPZqII5Ki+gvscpBOrVo/N1hVsAB
   10.50 +Zqiy29r67lcrZjYAWpYVtTWtQP1el6WyhClZnZiRJJ0blnhSWF+W6G9anjPerqnw
   10.51 ++hC1oVehym7tCm/NoIMwxaUHa90T8637jYh/pEutQD3xWFRUcEMa+l9rvW9yuIYW
   10.52 +kXTPWsuZllyaw37qSGCMUA+5AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT8L5D
   10.53 +nNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKipN55
   10.54 +yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE56jQ
   10.55 +vWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS/6Q2
   10.56 +96JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdRsUX/
   10.57 +2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/diEA
   10.58 +Eg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qoSots
   10.59 +Vuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMOaq4F
   10.60 +ZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEEWZs9
   10.61 +Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBo
   10.62 +zPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oC
   10.63 +smfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsG
   10.64 +vZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qR
   10.65 +KggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd
   10.66 +1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vl
   10.67 +i8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6
   10.68 +I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj
   10.69 +1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
   10.70 +=INdi
   10.71 +-----END PGP PUBLIC KEY BLOCK-----
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_revoked_sig_key.asc	Wed May 15 13:56:54 2019 +0200
    11.3 @@ -0,0 +1,77 @@
    11.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    11.5 +
    11.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    11.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    11.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    11.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   11.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   11.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   11.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   11.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   11.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
   11.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokBzgQT
   11.16 +AQgAOBYhBFmbPWeADbN+Lc4FwH9Z8DzQSiJuBQJc2pFyAhsBBQsJCAcCBhUICQoL
   11.17 +AgQWAgMBAh4BAheAAAoJEH9Z8DzQSiJuHm4L/2sdjY6hVYgkmMKR9DtjK3vrHcvk
   11.18 +JZPiGZVbN91oC0xd/ulBLTtpklq4sE8NBSVSpCphXAtiQ5wwmHkddxWVQdVu0Txx
   11.19 +5KSc4XqkU6JpmF72C0DdbKrlFQ9Xda68bFgsDAwd4/p35osXbE9xmWAXZmmW70l5
   11.20 +8MoZuV01Ks7PbWIH7RzhsKRNtMkkjkjQ6SdLesDpaewrrmZU6QQX2ZdT5ogCysGz
   11.21 +0ioVzicrhCP1u3Cdvy8inxj1u5ZBgG3pPSaMCumPQxqLOpDn/FvAKYt2QVySXgWk
   11.22 +j6gmdDZPyz/dyRb/MgHYCmYiyq6+2FspUhBiw/z1cDnE1v5lEb53nGod1gGwVUje
   11.23 +n0WM41fLA8zQj0U5jm17C5sQu7jOhfLDJcxQlD4WU2N4IY5lOow0JVxCZ/+iNkN/
   11.24 +JbIzl+nT57xcu9ttS8B8/SmASAfBoFU/a8SdKTZWcAoVJgDk560VBY8fszIdRtLi
   11.25 +pOnA7KmlQY8J3Drv2kCfp1WgqersQ1657oVInrkBjQRc2pGWAQwAthqHv8g4K/uT
   11.26 +Y/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1SmewtlFqoe4eVp
   11.27 +WlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2TSlGPIew
   11.28 +ix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1URIWAbJx5H
   11.29 +EZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH/15wAwML
   11.30 +H0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6PkL7eNwzP
   11.31 +2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd29Bt4J82
   11.32 +gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22yOJPiqprX
   11.33 +rstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEBAAGJAbYE
   11.34 +KAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqSlwIdAAAKCRB/WfA80Eoi
   11.35 +bh1TC/96wk38W5QoHEff/k09349xQv1+JwvSiQSyPwaOfFM03tymNhzA/hVTsm5t
   11.36 +qihmSNRRPAyeyIcoBxkDGdr6Kr2cfeOwCroKKGzLuwh4RVc8nnzIIG4NEox+pUUa
   11.37 +V8UvQRBOgsmzedfFHmfAn48VET1hShy8a25XvFS/foRrUO4zPZatLuFbfZFGDWEt
   11.38 +mQeXvxv3w34LTcMwLo6PGLZlj0qX0qkUBP5DM37iG+eVOh5GFmg24NDKFYdoNmyf
   11.39 +w32ThCbE6hsyo18k8jdbJ3mi2Llyl0pU7MTO9VPO1N16aj9dv2G2hg3tvFIXV1r0
   11.40 +t1P2iJ3697is4fmUpt7zNTvuzbt0h4ZSSXXm9mRY0zh6DaBjIvj+k98i3Yo0czY9
   11.41 +uZDsjE3eHD6fZG0Yzg92ifDXlXSkunEBp43ofBDUcZ1Zr4AcioxGd+KUwUt6CLn7
   11.42 +0deDKETnzokYeNt0jgePrz6QvevQnfDlEEXqEo/Hevp5UeGekI18ecN6Pi226NuH
   11.43 +mNc//saJA2wEGAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqRlgIbAgHA
   11.44 +CRB/WfA80EoibsD0IAQZAQgAHRYhBDStBdQm5ExrJdCEb77QsfQcsNxRBQJc2pGW
   11.45 +AAoJEL7QsfQcsNxRq8UL/jxX41nNLc2VJr9HaZwHABnIRmIIay0x65qWw22nF4Aj
   11.46 +d0kPZg6m2oXQTAJqt1gGtFgfiW9s80JQLT+k9UF2VkaL6dfsuo599KWZhHLP0rqJ
   11.47 +0s5aotBxpvs1kbx+DLKC3H/NXIu9G0Jyqwa4KP3y8hleDIBBmdoMNpRdE/CVeUJR
   11.48 +dcBiYQyvbNNVnPGbPXwrOvVsrvDR/rDEMeI3uAalJfsBKnh+HeCUAhbtXqjTd5R/
   11.49 +NwiLNepU/6M1WtHZdt0U/pvd5bZQBd/WcCZRfskpLV8aGTp/7cJ3ObLW0awJ8Hpt
   11.50 +RCHGTNiG5a/O4tfAbkFWkrOPAyoarDLZSdoi6rRDyxTw3W4CamFmbv7XH/iNV1Au
   11.51 +b2J/qiRjnV27/M92ge5xGj+xP5Kv7EBefpCQHpJ3OTBRcAL+5EXdmDZEFXKFyusg
   11.52 +b6asgBbkU7XaeM6CskBY/T3MqKVic4agOdud7GupNSOlxm6hpb9ifYOhsgkUCX93
   11.53 +qZPHaeU19TQ6XWDCZY4DVg3iDACGyeTNbkrkcRQ+5gHETYZQBmByVB2HT9NZ1SvF
   11.54 +yihFKHBnenRxWqabPfFmVRTLxq3HrD+FSeHXvd1/zYP9d8jsedo3bunqEDrUYGGQ
   11.55 +ZddHkhgid6wH54o+CnaPMe1vHOFvhy5P4I2zIJi2WSY3bvz1zFp1imyTCEwMVYI+
   11.56 +AYPdbXqEVrukKaBHgnxRiZlk/ktw4CCZE7dLMiug+dWPdMx+16UfUC6rwZHqrKxW
   11.57 +0CVvVySZLebWXyOsK7ncJL5SQbscQrUsJvkvZ7kOfMMsiSNnghwHJBUW8CQ39XST
   11.58 +Hj8lY32JlUWeGUleQL+qADbqczlW8Jfkygwuz2SzF3Ini2YFkIOOB5/Ka97XLd2E
   11.59 +1yZjwa3Q/E1hOuDbabQvto1LPxHBKGWuaUM4yf6v/H0a3X/rrh/oyVKYTwdc7pRy
   11.60 +izjPSAP03dYJyVUYnUBcTxDt93+/nGLDSUBGcfj75xDQAxMDLyqfmp1qLQUFV4S2
   11.61 +sBvF2C4KRxVt1uzEU6OV2EMZtx25AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT
   11.62 +8L5DnNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKi
   11.63 +pN55yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE
   11.64 +56jQvWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS
   11.65 +/6Q296JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdR
   11.66 +sUX/2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/
   11.67 +diEAEg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qo
   11.68 +SotsVuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMO
   11.69 +aq4FZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEE
   11.70 +WZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrz
   11.71 +hMBozPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7
   11.72 +z0oCsmfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4Bjhxq
   11.73 +ORsGvZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUD
   11.74 +a/qRKggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH
   11.75 +0Shd1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaX
   11.76 +R1Vli8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT
   11.77 +9iQ6I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4q
   11.78 +F7Lj1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
   11.79 +=CDai
   11.80 +-----END PGP PUBLIC KEY BLOCK-----