Merge with sync sequoia_windows
authorThomas
Wed, 15 May 2019 14:20:48 +0200
branchsequoia_windows
changeset 36878e04a1fb8bf7
parent 3671 d3d503d42bf5
parent 3686 7dbf0a0f6163
child 3701 1f717dccd337
Merge with sync
src/pgp_sequoia.c
     1.1 --- a/src/etpan_mime.c	Mon May 13 16:43:46 2019 +0200
     1.2 +++ b/src/etpan_mime.c	Wed May 15 14:20:48 2019 +0200
     1.3 @@ -1853,7 +1853,7 @@
     1.4              status = mime_encode_message_plain(msg, omit_fields, &mime, transport_encode);
     1.5              break;
     1.6  
     1.7 -        case PEP_enc_pieces:
     1.8 +        case PEP_enc_inline:
     1.9              status = mime_encode_message_plain(msg, omit_fields, &mime, transport_encode);
    1.10              break;
    1.11  
     2.1 --- a/src/message.h	Mon May 13 16:43:46 2019 +0200
     2.2 +++ b/src/message.h	Wed May 15 14:20:48 2019 +0200
     2.3 @@ -30,7 +30,8 @@
     2.4  
     2.5  typedef enum _PEP_enc_format {
     2.6      PEP_enc_none = 0,                       // message is not encrypted
     2.7 -    PEP_enc_pieces,                         // inline PGP + PGP extensions
     2.8 +    PEP_enc_pieces = 1,                     // inline PGP + PGP extensions, was removed
     2.9 +    PEP_enc_inline = 1,                     // still there
    2.10      PEP_enc_S_MIME,                         // RFC5751
    2.11      PEP_enc_PGP_MIME,                       // RFC3156
    2.12      PEP_enc_PEP,                            // pEp encryption format
     3.1 --- a/src/message_api.c	Mon May 13 16:43:46 2019 +0200
     3.2 +++ b/src/message_api.c	Wed May 15 14:20:48 2019 +0200
     3.3 @@ -971,6 +971,38 @@
     3.4      return NULL;    
     3.5  }
     3.6  
     3.7 +static PEP_STATUS encrypt_PGP_inline(
     3.8 +        PEP_SESSION session,
     3.9 +        const message *src,
    3.10 +        stringlist_t *keys,
    3.11 +        message *dst
    3.12 +    )
    3.13 +{
    3.14 +    char *ctext = NULL;
    3.15 +    size_t csize = 0;
    3.16 +
    3.17 +    PEP_STATUS status = encrypt_and_sign(session, keys, src->longmsg,
    3.18 +            strlen(src->longmsg), &ctext, &csize);
    3.19 +    if (status)
    3.20 +        return status;
    3.21 +
    3.22 +    if (src->shortmsg) {
    3.23 +        dst->shortmsg = strdup(src->shortmsg);
    3.24 +        assert(dst->shortmsg);
    3.25 +        if (!dst->shortmsg)
    3.26 +            return PEP_OUT_OF_MEMORY;
    3.27 +    }
    3.28 +
    3.29 +    char *_ctext = realloc(ctext, csize + 1);
    3.30 +    assert(_ctext);
    3.31 +    if (!_ctext)
    3.32 +        return PEP_OUT_OF_MEMORY;
    3.33 +    _ctext[csize] = 0;
    3.34 +
    3.35 +    dst->longmsg = _ctext;
    3.36 +    return PEP_STATUS_OK;
    3.37 +}
    3.38 +
    3.39  static PEP_STATUS encrypt_PGP_MIME(
    3.40      PEP_SESSION session,
    3.41      const message *src,
    3.42 @@ -1575,7 +1607,7 @@
    3.43      assert(msg);
    3.44  
    3.45      if (is_PGP_message_text(msg->longmsg)) {
    3.46 -        msg->enc_format = PEP_enc_pieces;
    3.47 +        msg->enc_format = PEP_enc_inline;
    3.48          return PEP_crypt_OpenPGP;
    3.49      }
    3.50      else if (msg->attachments && msg->attachments->next &&
    3.51 @@ -1914,9 +1946,9 @@
    3.52                  status = encrypt_PGP_MIME(session, _src, keys, msg, flags);
    3.53                  break;
    3.54  
    3.55 -            /* case PEP_enc_PEP:
    3.56 -                // TODO: implement
    3.57 -                NOT_IMPLEMENTED */
    3.58 +            case PEP_enc_inline:
    3.59 +                status = encrypt_PGP_inline(session, _src, keys, msg);
    3.60 +                break;
    3.61  
    3.62              default:
    3.63                  assert(0);
    3.64 @@ -2249,6 +2281,10 @@
    3.65                  _cleanup_src(src, false);
    3.66              break;
    3.67  
    3.68 +        case PEP_enc_inline:
    3.69 +            status = encrypt_PGP_inline(session, _src, keys, msg);
    3.70 +            break;
    3.71 +
    3.72          default:
    3.73              assert(0);
    3.74              status = PEP_ILLEGAL_VALUE;
    3.75 @@ -2589,7 +2625,7 @@
    3.76      
    3.77      switch (src->enc_format) {
    3.78          case PEP_enc_PGP_MIME:
    3.79 -        case PEP_enc_pieces:
    3.80 +        case PEP_enc_inline:
    3.81          case PEP_enc_PGP_MIME_Outlook1:
    3.82  //        case PEP_enc_none: // FIXME - this is wrong
    3.83  
    3.84 @@ -2681,7 +2717,7 @@
    3.85              *text_size = src->attachments->size;
    3.86              break;
    3.87  
    3.88 -        case PEP_enc_pieces:
    3.89 +        case PEP_enc_inline:
    3.90              *crypto_text = src->longmsg;
    3.91              *text_size = strlen(*crypto_text);
    3.92              break;
    3.93 @@ -3458,7 +3494,7 @@
    3.94                  }
    3.95                  break;
    3.96  
    3.97 -            case PEP_enc_pieces:
    3.98 +            case PEP_enc_inline:
    3.99                  status = PEP_STATUS_OK;
   3.100                  
   3.101                  _decrypt_in_pieces_status = _decrypt_in_pieces(session, src, &msg, ptext, psize);
     4.1 --- a/src/pgp_sequoia.c	Mon May 13 16:43:46 2019 +0200
     4.2 +++ b/src/pgp_sequoia.c	Wed May 15 14:20:48 2019 +0200
     4.3 @@ -27,9 +27,17 @@
     4.4  // enable tracing if in debugging mode
     4.5  #if TRACING
     4.6  #include "status_to_string.h"
     4.7 +
     4.8 +#ifdef ANDROID
     4.9 +#  include <android/log.h>
    4.10 +#  define _T(...) do {                          \
    4.11 +        __android_log_print(ANDROID_LOG_DEBUG, "pEpEngine-sequoia", __VA_ARGS__);         \
    4.12 +    } while (0)
    4.13 +#else
    4.14  #  define _T(...) do {                          \
    4.15          fprintf(stderr, ##__VA_ARGS__);         \
    4.16      } while (0)
    4.17 +#endif
    4.18  #else
    4.19  #  define _T(...) do { } while (0)
    4.20  #endif
    4.21 @@ -752,6 +760,49 @@
    4.22          pgp_packet_t userid = pgp_user_id_new (user_id_value);
    4.23          pgp_user_id_name(NULL, userid, &name);
    4.24          pgp_user_id_address(NULL, userid, &email);
    4.25 +                
    4.26 +        if (!email || email[0] == '\0') {
    4.27 +            size_t uid_value_len;
    4.28 +            const char* uid_value = (const char*)pgp_user_id_value(userid, &uid_value_len);
    4.29 +            if (!uid_value) {
    4.30 +                // We need some kind of an error here, maybe?
    4.31 +                 
    4.32 +            }
    4.33 +            else {
    4.34 +                const char* split = strstr(uid_value, "<");
    4.35 +                if (split != uid_value) {       
    4.36 +                    while (split) {
    4.37 +                        if (isspace(*(split - 1)))
    4.38 +                            break;
    4.39 +                        split = strstr(split + 1, "<");
    4.40 +                    }
    4.41 +                }
    4.42 +                if (split) {
    4.43 +                    char* stopchr = strrchr(split, '>');
    4.44 +                    if (stopchr) {
    4.45 +                        int email_len = stopchr - split - 1;
    4.46 +                        email = calloc(email_len + 1, 1); 
    4.47 +                        strlcpy(email, split + 1, email_len + 1);
    4.48 +                        const char* last = NULL;
    4.49 +                        if (split != uid_value) {
    4.50 +                            for (last = split - 1; last > uid_value; last--) {
    4.51 +                                if (!isspace(*last))
    4.52 +                                    break;
    4.53 +                            }
    4.54 +                            int name_len = (last - uid_value) + 1;
    4.55 +                            name = calloc(name_len + 1, 1);
    4.56 +                            strlcpy(name, uid_value, name_len + 1);
    4.57 +                        }
    4.58 +                    }
    4.59 +                    else  
    4.60 +                        split = NULL;
    4.61 +                }
    4.62 +                if (split == NULL) {
    4.63 +                    email = strdup(uid_value);
    4.64 +                }
    4.65 +            }
    4.66 +        }
    4.67 +        
    4.68          pgp_packet_free(userid);
    4.69          free(user_id_value);
    4.70  
    4.71 @@ -829,6 +880,8 @@
    4.72      stringlist_t *recipient_keylist;
    4.73      stringlist_t *signer_keylist;
    4.74      int good_checksums;
    4.75 +    int good_but_expired;
    4.76 +    int good_but_revoked;
    4.77      int missing_keys;
    4.78      int bad_checksums;
    4.79      int decrypted;
    4.80 @@ -1116,6 +1169,8 @@
    4.81                                            &tpk, NULL) != PEP_STATUS_OK)
    4.82                          ; // Soft error.  Ignore.
    4.83  
    4.84 +                    keyid_str = pgp_keyid_to_string (keyid);
    4.85 +
    4.86                      if (tpk) {
    4.87                          // Ok, we have a TPK.
    4.88  
    4.89 @@ -1125,27 +1180,79 @@
    4.90                              = pgp_tpk_fingerprint(tpk);
    4.91                          char *primary_fpr_str
    4.92                              = pgp_fingerprint_to_hex(primary_fpr);
    4.93 -                        stringlist_add_unique(cookie->signer_keylist,
    4.94 -                                              primary_fpr_str);
    4.95 -
    4.96 -                        T("Good signature from %s", primary_fpr_str);
    4.97 -
    4.98 -                        // XXX: Check that the TPK and the key used to make
    4.99 -                        // the signature and the signature itself are alive
   4.100 -                        // and not revoked.  Revoked =>
   4.101 -                        // PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH; Expired key
   4.102 -                        // or sig => PEP_DECRYPTED.
   4.103 -                        cookie->good_checksums ++;
   4.104 +
   4.105 +                        bool good = true;
   4.106 +
   4.107 +                        // Make sure the TPK is not revoked, it's
   4.108 +                        // creation time is <= now, and it hasn't
   4.109 +                        // expired.
   4.110 +                        pgp_revocation_status_t rs = pgp_tpk_revocation_status(tpk);
   4.111 +                        bool revoked = (pgp_revocation_status_variant(rs)
   4.112 +                                        == PGP_REVOCATION_STATUS_REVOKED);
   4.113 +                        pgp_revocation_status_free(rs);
   4.114 +                        if (revoked) {
   4.115 +                            T("TPK %s is revoked.", primary_fpr_str);
   4.116 +                            good = false;
   4.117 +                            cookie->good_but_revoked ++;
   4.118 +                        } else if (! pgp_tpk_alive(tpk)) {
   4.119 +                            T("TPK %s is not alive.", primary_fpr_str);
   4.120 +                            good = false;
   4.121 +                            cookie->good_but_expired ++;
   4.122 +                        }
   4.123 +
   4.124 +                        // Same thing for the signing key.
   4.125 +                        if (good) {
   4.126 +                            pgp_tpk_key_iter_t iter = pgp_tpk_key_iter_all(tpk);
   4.127 +                            pgp_key_t key;
   4.128 +                            pgp_signature_t sig;
   4.129 +                            while ((key = pgp_tpk_key_iter_next(iter, &sig, &rs))
   4.130 +                                   && good) {
   4.131 +                                pgp_keyid_t x = pgp_key_keyid(key);
   4.132 +                                if (pgp_keyid_equal(keyid, x)) {
   4.133 +                                    // Found the signing key.  Let's make
   4.134 +                                    // sure it is valid.
   4.135 +
   4.136 +                                    revoked = (pgp_revocation_status_variant(rs)
   4.137 +                                               == PGP_REVOCATION_STATUS_REVOKED);
   4.138 +                                    if (revoked) {
   4.139 +                                        T("TPK %s's signing key %s is revoked.",
   4.140 +                                          primary_fpr_str, keyid_str);
   4.141 +                                        good = false;
   4.142 +                                        cookie->good_but_revoked ++;
   4.143 +                                    } else if (! pgp_signature_key_alive(sig, key)) {
   4.144 +                                        T("TPK %s's signing key %s is expired.",
   4.145 +                                          primary_fpr_str, keyid_str);
   4.146 +                                        good = false;
   4.147 +                                        cookie->good_but_expired ++;
   4.148 +                                    }
   4.149 +                                }
   4.150 +                                pgp_keyid_free(x);
   4.151 +                                pgp_revocation_status_free(rs);
   4.152 +                                pgp_signature_free(sig);
   4.153 +                                pgp_key_free(key);
   4.154 +                            }
   4.155 +                            pgp_tpk_key_iter_free(iter);
   4.156 +                        }
   4.157 +
   4.158 +                        if (good) {
   4.159 +                            stringlist_add_unique(cookie->signer_keylist,
   4.160 +                                                  primary_fpr_str);
   4.161 +
   4.162 +                            T("Good signature from %s", primary_fpr_str);
   4.163 +
   4.164 +                            cookie->good_checksums ++;
   4.165 +                        }
   4.166  
   4.167                          free(primary_fpr_str);
   4.168                          pgp_fingerprint_free(primary_fpr);
   4.169                          pgp_tpk_free(tpk);
   4.170                      } else {
   4.171                          // If we get
   4.172 -                        // PGP_VERIFICATION_RESULT_CODE_GOOD_CHECKSUM, then the
   4.173 -                        // TPK should be available.  But, another process
   4.174 -                        // could have deleted the key from the store in the
   4.175 -                        // mean time, so be tolerant.
   4.176 +                        // PGP_VERIFICATION_RESULT_CODE_GOOD_CHECKSUM,
   4.177 +                        // then the TPK should be available.  But,
   4.178 +                        // another process could have deleted the key
   4.179 +                        // from the store in the mean time, so be
   4.180 +                        // tolerant.
   4.181                          T("Key to check signature from %s disappeared",
   4.182                            keyid_str);
   4.183                          cookie->missing_keys ++;
   4.184 @@ -1206,7 +1313,7 @@
   4.185      char** filename_ptr)
   4.186  {
   4.187      PEP_STATUS status = PEP_STATUS_OK;
   4.188 -    struct decrypt_cookie cookie = { session, 0, NULL, NULL, 0, 0, 0, };
   4.189 +    struct decrypt_cookie cookie = { session, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, };
   4.190      pgp_reader_t reader = NULL;
   4.191      pgp_writer_t writer = NULL;
   4.192      pgp_reader_t decryptor = NULL;
   4.193 @@ -1267,13 +1374,23 @@
   4.194  
   4.195   out:
   4.196      if (status == PEP_STATUS_OK) {
   4.197 -        if (cookie.bad_checksums) {
   4.198 -            // If there are any bad signatures, fail.
   4.199 -            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   4.200 -        } else if (cookie.good_checksums) {
   4.201 +        // **********************************
   4.202 +        // Sync changes with pgp_verify_text.
   4.203 +        // **********************************
   4.204 +
   4.205 +        if (cookie.good_checksums) {
   4.206              // If there is at least one signature that we can verify,
   4.207              // succeed.
   4.208              status = PEP_DECRYPTED_AND_VERIFIED;
   4.209 +        } else if (cookie.good_but_revoked) {
   4.210 +            // If there are any signatures from revoked keys, fail.
   4.211 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   4.212 +        } else if (cookie.bad_checksums) {
   4.213 +            // If there are any bad signatures, fail.
   4.214 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   4.215 +        } else if (cookie.good_but_expired) {
   4.216 +            // If there are any signatures from expired keys, fail.
   4.217 +            status = PEP_DECRYPTED;
   4.218          } else {
   4.219              // We couldn't verify any signatures (possibly because we
   4.220              // don't have the keys).
   4.221 @@ -1357,7 +1474,17 @@
   4.222  
   4.223   out:
   4.224      if (status == PEP_STATUS_OK) {
   4.225 -        if (cookie.bad_checksums) {
   4.226 +        // *****************************************
   4.227 +        // Sync changes with pgp_decrypt_and_verify.
   4.228 +        // *****************************************
   4.229 +
   4.230 +        if (cookie.good_but_expired) {
   4.231 +            // If there are any signatures from expired keys, fail.
   4.232 +            status = PEP_UNENCRYPTED;
   4.233 +        } else if (cookie.good_but_revoked) {
   4.234 +            // If there are any signatures from revoked keys, fail.
   4.235 +            status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   4.236 +        } else if (cookie.bad_checksums) {
   4.237              // If there are any bad signatures, fail.
   4.238              status = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   4.239          } else if (cookie.good_checksums) {
   4.240 @@ -1716,7 +1843,6 @@
   4.241      return PEP_STATUS_OK;
   4.242  }
   4.243  
   4.244 -// XXX: This also needs to handle revocation certificates.
   4.245  PEP_STATUS pgp_import_keydata(PEP_SESSION session, const char *key_data,
   4.246                                size_t size, identity_list **private_idents)
   4.247  {
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/test/include/URIAddressTests.h	Wed May 15 14:20:48 2019 +0200
     5.3 @@ -0,0 +1,20 @@
     5.4 +// This file is under GNU General Public License 3.0
     5.5 +// see LICENSE.txt
     5.6 +
     5.7 +#ifndef U_R_I_ADDRESS_H
     5.8 +#define U_R_I_ADDRESS_H
     5.9 +
    5.10 +#include <string>
    5.11 +#include "EngineTestIndividualSuite.h"
    5.12 +
    5.13 +using namespace std;
    5.14 +
    5.15 +class URIAddressTests : public EngineTestIndividualSuite {
    5.16 +    public:
    5.17 +        URIAddressTests(string test_suite, string test_home_dir);
    5.18 +    private:
    5.19 +        void check_uri_address_genkey();
    5.20 +        void check_uri_address_encrypt();        
    5.21 +};
    5.22 +
    5.23 +#endif
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/test/include/VerifyTests.h	Wed May 15 14:20:48 2019 +0200
     6.3 @@ -0,0 +1,23 @@
     6.4 +// This file is under GNU General Public License 3.0
     6.5 +// see LICENSE.txt
     6.6 +
     6.7 +#ifndef VERIFY_H
     6.8 +#define VERIFY_H
     6.9 +
    6.10 +#include <string>
    6.11 +#include "EngineTestIndividualSuite.h"
    6.12 +
    6.13 +using namespace std;
    6.14 +
    6.15 +class VerifyTests : public EngineTestIndividualSuite {
    6.16 +    public:
    6.17 +        VerifyTests(string test_suite, string test_home_dir);
    6.18 +    private:
    6.19 +        static constexpr const char *mary_fpr = "599B3D67800DB37E2DCE05C07F59F03CD04A226E";
    6.20 +        void check_revoked_tpk();
    6.21 +        void check_revoked_signing_key();
    6.22 +        void check_expired_tpk();
    6.23 +        void check_expired_signing_key();
    6.24 +};
    6.25 +
    6.26 +#endif
     7.1 --- a/test/src/SuiteMaker.cc	Mon May 13 16:43:46 2019 +0200
     7.2 +++ b/test/src/SuiteMaker.cc	Wed May 15 14:20:48 2019 +0200
     7.3 @@ -12,9 +12,11 @@
     7.4  #include "SuiteMaker.h"
     7.5  
     7.6  // Begin where we generate stuff
     7.7 +#include "URIAddressTests.h"
     7.8  #include "MimeTests.h"
     7.9  #include "OwnIdentitiesRetrieveTests.h"
    7.10  #include "ExpiredSubkeyTests.h"
    7.11 +#include "VerifyTests.h"
    7.12  #include "UserIdCollisionTests.h"
    7.13  #include "Engine463Tests.h"
    7.14  #include "BloblistTests.h"
    7.15 @@ -72,9 +74,11 @@
    7.16  
    7.17  
    7.18  const char* SuiteMaker::all_suites[] = {
    7.19 +    "URIAddressTests",
    7.20      "MimeTests",
    7.21      "OwnIdentitiesRetrieveTests",
    7.22      "ExpiredSubkeyTests",
    7.23 +    "VerifyTests",
    7.24      "UserIdCollisionTests",
    7.25      "Engine463Tests",
    7.26      "BloblistTests",
    7.27 @@ -132,15 +136,19 @@
    7.28  };
    7.29  
    7.30  // This file is generated, so magic constants are ok.
    7.31 -int SuiteMaker::num_suites = 57;
    7.32 +int SuiteMaker::num_suites = 59;
    7.33  
    7.34  void SuiteMaker::suitemaker_build(const char* test_class_name, const char* test_home, Test::Suite** test_suite) {
    7.35 -    if (strcmp(test_class_name, "MimeTests") == 0)
    7.36 +    if (strcmp(test_class_name, "URIAddressTests") == 0)
    7.37 +        *test_suite = new URIAddressTests(test_class_name, test_home);
    7.38 +    else if (strcmp(test_class_name, "MimeTests") == 0)
    7.39          *test_suite = new MimeTests(test_class_name, test_home);
    7.40      else if (strcmp(test_class_name, "OwnIdentitiesRetrieveTests") == 0)
    7.41          *test_suite = new OwnIdentitiesRetrieveTests(test_class_name, test_home);
    7.42      else if (strcmp(test_class_name, "ExpiredSubkeyTests") == 0)
    7.43          *test_suite = new ExpiredSubkeyTests(test_class_name, test_home);
    7.44 +    else if (strcmp(test_class_name, "VerifyTests") == 0)
    7.45 +        *test_suite = new VerifyTests(test_class_name, test_home);
    7.46      else if (strcmp(test_class_name, "UserIdCollisionTests") == 0)
    7.47          *test_suite = new UserIdCollisionTests(test_class_name, test_home);
    7.48      else if (strcmp(test_class_name, "Engine463Tests") == 0)
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/test/src/engine_tests/URIAddressTests.cc	Wed May 15 14:20:48 2019 +0200
     8.3 @@ -0,0 +1,85 @@
     8.4 +// This file is under GNU General Public License 3.0
     8.5 +// see LICENSE.txt
     8.6 +
     8.7 +#include <stdlib.h>
     8.8 +#include <cstring>
     8.9 +#include <string>
    8.10 +
    8.11 +#include <cpptest.h>
    8.12 +#include "test_util.h"
    8.13 +
    8.14 +#include "pEpEngine.h"
    8.15 +
    8.16 +#include "EngineTestIndividualSuite.h"
    8.17 +#include "URIAddressTests.h"
    8.18 +
    8.19 +using namespace std;
    8.20 +
    8.21 +URIAddressTests::URIAddressTests(string suitename, string test_home_dir) :
    8.22 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
    8.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("URIAddressTests::check_uri_address_genkey"),
    8.24 +                                                                      static_cast<Func>(&URIAddressTests::check_uri_address_genkey)));
    8.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("URIAddressTests::check_uri_address_encrypt"),
    8.26 +                                                                      static_cast<Func>(&URIAddressTests::check_uri_address_encrypt)));
    8.27 +}
    8.28 +
    8.29 +// FIXME: URL, URN
    8.30 +void URIAddressTests::check_uri_address_genkey() {
    8.31 +    const char* uri_addr = "shark://grrrr/39874293847092837443987492834";
    8.32 +    const char* uname = "GRRRR, the angry shark";
    8.33 +    
    8.34 +    pEp_identity* me = new_identity(uri_addr, NULL, PEP_OWN_USERID, uname);
    8.35 +    
    8.36 +    PEP_STATUS status = myself(session, me);
    8.37 +    
    8.38 +    TEST_ASSERT(status == PEP_STATUS_OK);
    8.39 +    TEST_ASSERT(me->fpr && me->fpr[0] != '\0');
    8.40 +    
    8.41 +    char* keydata = NULL;
    8.42 +    size_t keysize = 0;
    8.43 +    status = export_key(session, me->fpr, 
    8.44 +                        &keydata, &keysize);
    8.45 +
    8.46 +    cout << keydata << endl;
    8.47 +
    8.48 +    free(keydata);
    8.49 +    free_identity(me);
    8.50 +}
    8.51 +
    8.52 +// FIXME: URL, URN
    8.53 +void URIAddressTests::check_uri_address_encrypt() {
    8.54 +    const char* uri_addr = "shark://grrrr/39874293847092837443987492834";
    8.55 +    const char* uname = "GRRRR, the angry shark";
    8.56 +    
    8.57 +    pEp_identity* me = new_identity(uri_addr, NULL, PEP_OWN_USERID, uname);
    8.58 +    
    8.59 +    PEP_STATUS status = myself(session, me);
    8.60 +    
    8.61 +    TEST_ASSERT(status == PEP_STATUS_OK);
    8.62 +    TEST_ASSERT(me->fpr && me->fpr[0] != '\0');
    8.63 +    
    8.64 +    const char* you_uri_addr = "shark://bait/8uyoi3lu4hl2..dfoif983j4b@%";
    8.65 +    const char* youname = "Nemo, the delicious fish";
    8.66 +    pEp_identity* you = new_identity(you_uri_addr, NULL, "Food for Shark", youname);
    8.67 +    status = generate_keypair(session, you);
    8.68 +    TEST_ASSERT(status == PEP_STATUS_OK);
    8.69 +
    8.70 +    stringlist_t* keylist = NULL;
    8.71 +    status = find_keys(session, you_uri_addr, &keylist);
    8.72 +    TEST_ASSERT(status == PEP_STATUS_OK);    
    8.73 +    TEST_ASSERT(keylist && keylist->value);
    8.74 +
    8.75 +    status = update_identity(session, you);
    8.76 +    TEST_ASSERT(status == PEP_STATUS_OK);
    8.77 +    TEST_ASSERT(you->fpr && you->fpr[0] != '\0');
    8.78 +    
    8.79 +    message* msg = new_message(PEP_dir_outgoing);
    8.80 +    
    8.81 +    msg->from = me;
    8.82 +    msg->to = new_identity_list(you);
    8.83 +    msg->shortmsg = strdup("Invitation");
    8.84 +    msg->longmsg = strdup("Yo Neems, wanna come over for dinner?");
    8.85 +
    8.86 +    message* enc_msg = NULL;
    8.87 +    status = encrypt_message(session, msg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
    8.88 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/test/src/engine_tests/VerifyTests.cc	Wed May 15 14:20:48 2019 +0200
     9.3 @@ -0,0 +1,248 @@
     9.4 +// This file is under GNU General Public License 3.0
     9.5 +// see LICENSE.txt
     9.6 +
     9.7 +#include <stdlib.h>
     9.8 +#include <string>
     9.9 +#include <cstring>
    9.10 +#include <cpptest.h>
    9.11 +#include <fstream>
    9.12 +
    9.13 +#include "pEpEngine.h"
    9.14 +
    9.15 +#include "test_util.h"
    9.16 +#include "EngineTestIndividualSuite.h"
    9.17 +#include "VerifyTests.h"
    9.18 +
    9.19 +using namespace std;
    9.20 +
    9.21 +VerifyTests::VerifyTests(string suitename, string test_home_dir) :
    9.22 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
    9.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_revoked_tpk"),
    9.24 +                                                                      static_cast<Func>(&VerifyTests::check_revoked_tpk)));
    9.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_revoked_signing_key"),
    9.26 +                                                                      static_cast<Func>(&VerifyTests::check_revoked_signing_key)));
    9.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_expired_tpk"),
    9.28 +                                                                      static_cast<Func>(&VerifyTests::check_expired_tpk)));
    9.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("VerifyTests::check_expired_signing_key"),
    9.30 +                                                                      static_cast<Func>(&VerifyTests::check_expired_signing_key)));
    9.31 +}
    9.32 +
    9.33 +void VerifyTests::check_revoked_tpk() {
    9.34 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
    9.35 +
    9.36 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
    9.37 +
    9.38 +    // Decrypt and verify it.
    9.39 +    char *plaintext = NULL;
    9.40 +    size_t plaintext_size = 0;
    9.41 +    stringlist_t *keylist = NULL;
    9.42 +    PEP_STATUS status = decrypt_and_verify(session,
    9.43 +                                           ciphertext.c_str(),
    9.44 +                                           ciphertext.size(),
    9.45 +                                           NULL, 0,
    9.46 +                                           &plaintext, &plaintext_size,
    9.47 +                                           &keylist, NULL);
    9.48 +
    9.49 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED_AND_VERIFIED, tl_status_string(status));
    9.50 +    TEST_ASSERT(keylist);
    9.51 +    // Signer is mary.
    9.52 +    TEST_ASSERT(keylist->value);
    9.53 +    cout << "fpr: " << mary_fpr << "; got: " << keylist->value << endl;
    9.54 +    TEST_ASSERT(strcmp(mary_fpr, keylist->value) == 0);
    9.55 +    // Recipient is mary.
    9.56 +    TEST_ASSERT(keylist->next);
    9.57 +    TEST_ASSERT(keylist->next->value);
    9.58 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
    9.59 +    // Content is returned.
    9.60 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
    9.61 +
    9.62 +    // Import the revocation certificate.
    9.63 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E.rev");
    9.64 +
    9.65 +    plaintext = NULL;
    9.66 +    plaintext_size = 0;
    9.67 +    keylist = NULL;
    9.68 +    status = decrypt_and_verify(session,
    9.69 +                                ciphertext.c_str(), ciphertext.size(),
    9.70 +                                NULL, 0,
    9.71 +                                &plaintext, &plaintext_size,
    9.72 +                                &keylist, NULL);
    9.73 +
    9.74 +    // Now it should fail.
    9.75 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
    9.76 +    TEST_ASSERT(keylist);
    9.77 +    // No signer.
    9.78 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
    9.79 +    // Recipient is mary.
    9.80 +    TEST_ASSERT(keylist->next);
    9.81 +    TEST_ASSERT(keylist->next->value);
    9.82 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
    9.83 +    // Content is returned.
    9.84 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
    9.85 +
    9.86 +
    9.87 +    string text = slurp("test_files/pep-test-mary-signed.txt");
    9.88 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
    9.89 +
    9.90 +    plaintext = NULL;
    9.91 +    plaintext_size = 0;
    9.92 +    keylist = NULL;
    9.93 +    status = verify_text(session,
    9.94 +                         text.c_str(), text.size(),
    9.95 +                         sig.c_str(), sig.size(),
    9.96 +                         &keylist);
    9.97 +
    9.98 +    // Now it should fail.
    9.99 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   9.100 +    TEST_ASSERT(keylist);
   9.101 +    // No signer.
   9.102 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.103 +    TEST_ASSERT(! keylist->next);
   9.104 +}
   9.105 +
   9.106 +void VerifyTests::check_revoked_signing_key() {
   9.107 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   9.108 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_revoked_sig_key.asc");
   9.109 +
   9.110 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   9.111 +
   9.112 +    // Decrypt and verify it.
   9.113 +    char *plaintext = NULL;
   9.114 +    size_t plaintext_size = 0;
   9.115 +    stringlist_t *keylist = NULL;
   9.116 +    PEP_STATUS status = decrypt_and_verify(session,
   9.117 +                                           ciphertext.c_str(),
   9.118 +                                           ciphertext.size(),
   9.119 +                                           NULL, 0,
   9.120 +                                           &plaintext, &plaintext_size,
   9.121 +                                           &keylist, NULL);
   9.122 +
   9.123 +    // It should fail.
   9.124 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   9.125 +    TEST_ASSERT(keylist);
   9.126 +    // No signer.
   9.127 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.128 +    // Recipient is mary.
   9.129 +    TEST_ASSERT(keylist->next);
   9.130 +    TEST_ASSERT(keylist->next->value);
   9.131 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   9.132 +    // Content is returned.
   9.133 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   9.134 +
   9.135 +
   9.136 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   9.137 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   9.138 +
   9.139 +    plaintext = NULL;
   9.140 +    plaintext_size = 0;
   9.141 +    keylist = NULL;
   9.142 +    status = verify_text(session,
   9.143 +                         text.c_str(), text.size(),
   9.144 +                         sig.c_str(), sig.size(),
   9.145 +                         &keylist);
   9.146 +
   9.147 +    // Now it should fail.
   9.148 +    TEST_ASSERT_MSG(status == PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH, tl_status_string(status));
   9.149 +    TEST_ASSERT(keylist);
   9.150 +    // No signer.
   9.151 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.152 +    TEST_ASSERT(! keylist->next);
   9.153 +}
   9.154 +
   9.155 +void VerifyTests::check_expired_tpk() {
   9.156 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   9.157 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_pub.asc");
   9.158 +
   9.159 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   9.160 +
   9.161 +    // Decrypt and verify it.
   9.162 +    char *plaintext = NULL;
   9.163 +    size_t plaintext_size = 0;
   9.164 +    stringlist_t *keylist = NULL;
   9.165 +    PEP_STATUS status = decrypt_and_verify(session,
   9.166 +                                           ciphertext.c_str(),
   9.167 +                                           ciphertext.size(),
   9.168 +                                           NULL, 0,
   9.169 +                                           &plaintext, &plaintext_size,
   9.170 +                                           &keylist, NULL);
   9.171 +
   9.172 +    // It should fail.
   9.173 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED, tl_status_string(status));
   9.174 +    TEST_ASSERT(keylist);
   9.175 +    // No signer.
   9.176 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.177 +    // Recipient is mary.
   9.178 +    TEST_ASSERT(keylist->next);
   9.179 +    TEST_ASSERT(keylist->next->value);
   9.180 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   9.181 +    // Content is returned.
   9.182 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   9.183 +
   9.184 +
   9.185 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   9.186 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   9.187 +
   9.188 +    plaintext = NULL;
   9.189 +    plaintext_size = 0;
   9.190 +    keylist = NULL;
   9.191 +    status = verify_text(session,
   9.192 +                         text.c_str(), text.size(),
   9.193 +                         sig.c_str(), sig.size(),
   9.194 +                         &keylist);
   9.195 +
   9.196 +    // Now it should fail.
   9.197 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));
   9.198 +    TEST_ASSERT(keylist);
   9.199 +    // No signer.
   9.200 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.201 +    TEST_ASSERT(! keylist->next);
   9.202 +}
   9.203 +
   9.204 +void VerifyTests::check_expired_signing_key() {
   9.205 +    slurp_and_import_key(session, "test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc");
   9.206 +    slurp_and_import_key(session, "test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_sig_key.asc");
   9.207 +
   9.208 +    string ciphertext = slurp("test_files/pep-test-mary-signed-encrypted-to-self.asc");
   9.209 +
   9.210 +    // Decrypt and verify it.
   9.211 +    char *plaintext = NULL;
   9.212 +    size_t plaintext_size = 0;
   9.213 +    stringlist_t *keylist = NULL;
   9.214 +    PEP_STATUS status = decrypt_and_verify(session,
   9.215 +                                           ciphertext.c_str(),
   9.216 +                                           ciphertext.size(),
   9.217 +                                           NULL, 0,
   9.218 +                                           &plaintext, &plaintext_size,
   9.219 +                                           &keylist, NULL);
   9.220 +
   9.221 +    // It should fail.
   9.222 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED, tl_status_string(status));
   9.223 +    TEST_ASSERT(keylist);
   9.224 +    // No signer.
   9.225 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.226 +    // Recipient is mary.
   9.227 +    TEST_ASSERT(keylist->next);
   9.228 +    TEST_ASSERT(keylist->next->value);
   9.229 +    TEST_ASSERT(strcmp(mary_fpr, keylist->next->value) == 0);
   9.230 +    // Content is returned.
   9.231 +    TEST_ASSERT(strcmp(plaintext, "tu was!\n") == 0);
   9.232 +
   9.233 +
   9.234 +    string text = slurp("test_files/pep-test-mary-signed.txt");
   9.235 +    string sig = slurp("test_files/pep-test-mary-signed.txt.sig");
   9.236 +
   9.237 +    plaintext = NULL;
   9.238 +    plaintext_size = 0;
   9.239 +    keylist = NULL;
   9.240 +    status = verify_text(session,
   9.241 +                         text.c_str(), text.size(),
   9.242 +                         sig.c_str(), sig.size(),
   9.243 +                         &keylist);
   9.244 +
   9.245 +    // Now it should fail.
   9.246 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));
   9.247 +    TEST_ASSERT(keylist);
   9.248 +    // No signer.
   9.249 +    TEST_ASSERT(strcmp(keylist->value, "") == 0);
   9.250 +    TEST_ASSERT(! keylist->next);
   9.251 +}
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/test/test_files/pep-test-mary-signed-encrypted-to-self.asc	Wed May 15 14:20:48 2019 +0200
    10.3 @@ -0,0 +1,24 @@
    10.4 +-----BEGIN PGP MESSAGE-----
    10.5 +
    10.6 +hQGMA6aSYtgJ++dOAQv/f5Q5icNJ2cXMe9HJgWeTiBDDBflPwuIUEVyeCGa82kyl
    10.7 +DwwWG/vS/KMwkJOzzttdT4PDlUKotRy1ujYtxYGByM8QLDEgWwGSGkS+XN0iG4Uz
    10.8 +p8SHzJbGgDbvsZCbEXrcSeR8XBLCGHRzvu1l2Dg43Co8QO250BV8PvhFAJrjEOUT
    10.9 +BhiR++biD64OuEA///zp+7lhqN6ejZw9P8lhqcl8e8wpirUTmZjrpWhNK/nSkWs1
   10.10 +ghBcteVBVdDFQX/UYKgluGldyGNy/CmYGhOuUfx3cmPGxO9qef+p3OjMVNlyYViM
   10.11 +xoawV+fn8c5hv9IK/jkCYyQmzJflzO1boQLMTCGL7DyyL9B7x58ib2lbHqIqWVTC
   10.12 +0Lq/IxKDhOf/E/qMT88g+uRRD6AUV5/CtxnHXPsomOhRINnuq8FNQjSBqws3jeXd
   10.13 +6zzI24ys0bpKk1VX3SAxIyPOcyHbSQQ4xRUGdo0dWdcm6XanC0oeri2ZaMJzfDnv
   10.14 +dUgQ8pr1AGfiih7l2MjP0ukB9SIGGjlqf7P+KQiU6TgCd5ZOPrp0hDp4vsP0wVNK
   10.15 +2S5kfK6sv+coGpEUEnUoBO827JW19MU0vLLwWkXZFoCB3DmI2KDvSBett9t2bSbT
   10.16 +N2Djvi9dLDCt05oNdmfR1e1HVIwZQm5qetHHycxQy8OscTUp9ZYlGkyrQ6jlMMeE
   10.17 +40OxcxSCmuk2ln5N5EZqUImAFv6ynuWNiN1vmKVI1ozTrDvb7QVn72QWN1slS0z6
   10.18 +b5WVunNYso58fFOjnJ4CFVCuWt5XhEhn5ArQoZrzWeDdWwV2l+vfwXlu2SXZdg6l
   10.19 +jW6tIJaUtEjPLg6PeTG0coLGE6JrUDcWCiqGEBdrV/9txssKG/efVdPn+Q1JXqom
   10.20 +//jAWwjFcDkRkrMbWVgEbtaUFHt67mTRQTQojfueqh8JbkmEVcxDzyAVtPiAnl9G
   10.21 +EZmWUD/OGePlJJjbf/B8ddRmUWzSjgtLfEQLekj9ubjq0e6+095bYHv14BOGbpdo
   10.22 +sqlxEevCwtx1F8+NoRFZq3qi1y+5BZacfoUZip3M7BVDpvAXX2t+6lKVQiMUsnSZ
   10.23 +SmupON6y8n/m6WaxnPqZkGbL07+umdPYUh68UO51A/UrCUujfFweaL2rXOK8pNkB
   10.24 +179q9WmLOWhBRNghDJlEZHbw/+OsJDiss96oGrxVBYq8T2iBM7MpFj3gW3ZDoIOr
   10.25 +Qws8uwuXIkEkwe8t+Q==
   10.26 +=BXG/
   10.27 +-----END PGP MESSAGE-----
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/test/test_files/pep-test-mary-signed.txt	Wed May 15 14:20:48 2019 +0200
    11.3 @@ -0,0 +1,1 @@
    11.4 +was soll ich machen?
    12.1 Binary file test/test_files/pep-test-mary-signed.txt.sig has changed
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E.rev	Wed May 15 14:20:48 2019 +0200
    13.3 @@ -0,0 +1,15 @@
    13.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    13.5 +Comment: This is a revocation certificate
    13.6 +
    13.7 +iQG2BCABCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakXgCHQAACgkQf1nw
    13.8 +PNBKIm6RXgv/X4oQggntl/bpPA31RJCrfND2bQUekpH8rG0BsoY5VdXww2JuGdS5
    13.9 +q7CluWviPshEYLOe1xcb9wPM1Yo2c1OQfXapDhnLXR69q32vA7yxdkcdVcvJRD5I
   13.10 +Lotm2bwe5DURW256G8dLcL4pmCweCt8UKJNppyXUk7FB4U7wQcYHdR6dAVIebovh
   13.11 +aCopH/gXEsIxKXl5/P3E+1cb4jJlsmGrP2SBymx8etvGmT48F/PG1L2lWnZrkUfc
   13.12 +Ldj/W2ds/ukhizswpL/RI7fT+nmRmDCY11tWRzMxGOBYb2/fZmeqOtaFZe/PnVC7
   13.13 +Zv3XyK/WA0wLnpHCBtM9TmWwHOwyVwI4/o2cGtZMAtVlIcWNgYYnpf5BZY7vJjM0
   13.14 +eaUjNbuCUCuiOFeW35qHNZAq1VJj5QrfwBvvLWQrEpVPzCSMNSe9YuFEhKH4z5b7
   13.15 +YHX0Na3sSEBuvtnSkPKtixkd8H6lMhJ8eEpIyKJTjDgNVFSkMsLmiK+jikuJgIpw
   13.16 ++IM1ZSCnyfCF
   13.17 +=kqka
   13.18 +-----END PGP PUBLIC KEY BLOCK-----
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/test/test_keys/priv/pep-test-mary-0x7F59F03CD04A226E_priv.asc	Wed May 15 14:20:48 2019 +0200
    14.3 @@ -0,0 +1,129 @@
    14.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    14.5 +
    14.6 +lQVYBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    14.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    14.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    14.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   14.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   14.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   14.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   14.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   14.14 +dHZuhDzoSFpPTbMAEQEAAQAL/ijRhZ6aT9nPOu3n9X/feTLwzBKGZu+S1uHpxd5i
   14.15 +HScoFr0CdiPOnKVNNpiyBzAhTfvMRG5KXlR4QwjkaYvsWzXqD1gKnWHENGd9Lj5n
   14.16 +9dg1LUpNWnE/pcQ4SnDKox1AbjVJwUNEaLUXiCmaKqP2U+d3zYn1vfvAJ9KVy3JO
   14.17 +qKKccDDxDs6f3u0fuTv11taA7gkXSLrOxRYZyVM7wH4DncMEd5p8q/qhnbz0Vl4/
   14.18 +6ViMB89RCKlJ63kn5CabPp/cNU+5X8bC700tgg30EcUfwE6a+GSnfLVwAquZAfPI
   14.19 ++6ikSjaA+4Ha0LiDYTqtVzW1LohKHbU9ZQgwuCngIVUn3LmFGk7NFN4QHIw4MmnA
   14.20 +un5bfoIELxBPbpGFPguZ1b+UwUjabrfXyoC6xEydIGNqV7vTYo8BW5JZqaMvMWQY
   14.21 +7RXGJpTZdxRV8FBA2PsnhmD1aGI0DR1/xjiTdiZLl+wvRj3b4s/0dvisYDAx6fbL
   14.22 +AWFqH+FxAlxdHE2qtvaHcNmK0QYAyKpbX7tb8rRpdM67yiYCT33jall0wewZn4pb
   14.23 +bJr54eoSCcpIS17AP+A3pk67ppvWJTQGGx6lMNYpy8kfgF1EsL4JD70lrAHMrXke
   14.24 +o6DbDxzG1tl+FBAvCtvVcC/wICiX97XTvsk85X/SsfGGYi4ZdrVMiLwLY0A++uHl
   14.25 +khe11Odope8ZLuGo43xi9Ug3G+1g5FsLmn2IyTuELOgyV8NBRTiewBTQcr1ON4HZ
   14.26 +rVCjWx3svk3c2kEOUWtGP/uE9hdJBgD7qZ7mI7LZaWF4la3icvMge80a1BfYC+kR
   14.27 +h5aKrlrS0QU61XHqt6n3IeXv5brm1xMBwyUiVB4JgWU9xo/BxJp1nKh0UAFG5TLc
   14.28 +7mvrtdE1AY0PjfXVaouCgsyYb+cW6HOsrMvqBMfrLz/ehZc3uKv+zRc4eHITOm4R
   14.29 +UqEH/SxKPje15IkhQf7QfqI4LwZU0HKeU5ehTqzNwm0I33eBbXQClGNbBtWfPH1e
   14.30 +aSFQmjWu5hlLH4uATnIffqBwQ3tXERsF/1rBF+nFczeJduKgzjQpNV5TBzKQrgWX
   14.31 ++12LSjcBYPsBPct9k9H36JoO8zPZ2N0Xa+YBn+dgp9g3g2mN4/D3Q0lKrEReRfnN
   14.32 +nN8/54LlbEIRTgkFlt+evH46t5lVNui4pegyBQMMUAGew4TATkf6wTcrG4644Z9C
   14.33 +wpGi2Lxe0xsM8DxngRAMtT7u87vuKTgwPZWPIlUNmyCepISHnTOxdqgRx4Dujvsb
   14.34 +h6f6XkSd8QJpnRBrZ5HGsgfSN/Qt/NNcrt+StElNYXJ5IFN1c2FuIE1hcmlhIEth
   14.35 +cmVuIExpc2EgTGluZGEgRG9ubmEgUGF0cmljaWEgU21pdGggPDE5NjBAZXhhbXBs
   14.36 +ZS5vcmc+iQHOBBMBCAA4FiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakXICGwEF
   14.37 +CwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQf1nwPNBKIm4ebgv/ax2NjqFViCSY
   14.38 +wpH0O2Mre+sdy+Qlk+IZlVs33WgLTF3+6UEtO2mSWriwTw0FJVKkKmFcC2JDnDCY
   14.39 +eR13FZVB1W7RPHHkpJzheqRTommYXvYLQN1squUVD1d1rrxsWCwMDB3j+nfmixds
   14.40 +T3GZYBdmaZbvSXnwyhm5XTUqzs9tYgftHOGwpE20ySSOSNDpJ0t6wOlp7CuuZlTp
   14.41 +BBfZl1PmiALKwbPSKhXOJyuEI/W7cJ2/LyKfGPW7lkGAbek9JowK6Y9DGos6kOf8
   14.42 +W8Api3ZBXJJeBaSPqCZ0Nk/LP93JFv8yAdgKZiLKrr7YWylSEGLD/PVwOcTW/mUR
   14.43 +vnecah3WAbBVSN6fRYzjV8sDzNCPRTmObXsLmxC7uM6F8sMlzFCUPhZTY3ghjmU6
   14.44 +jDQlXEJn/6I2Q38lsjOX6dPnvFy7221LwHz9KYBIB8GgVT9rxJ0pNlZwChUmAOTn
   14.45 +rRUFjx+zMh1G0uKk6cDsqaVBjwncOu/aQJ+nVaCp6uxDXrnuhUienQVYBFzakZYB
   14.46 +DAC2Goe/yDgr+5Nj+XwMEENhIgo0FnUJMcYXSZhb1Cp8I5k2j7ge8yet6BVVYlEj
   14.47 +VKZ7C2UWqh7h5WlaVBn/ICqoDUqkJl9LktXNVbeTswoTVJTyKagJ/FaUb7Ysb51+
   14.48 +iWsC7LZNKUY8h7CLHsaF442iHHks97iSwl5EMTv/0q1AeBa/c1wmJh3w1c0fEYjy
   14.49 +TRe/VREhYBsnHkcRns8qZKX+FyJxtgKlGh7LFxqOUEA8rKzS8157qaS+GG8HvN3X
   14.50 +r1d8cwf/XnADAwsfQahxEMeFZoUUWtclfgcBDAEJTU9davTZJrvd43IR3rqYHBCc
   14.51 +Kic0Do+Qvt43DM/Y2are2NuIo7uliEY380gSHZAI9EmVRuOe/TrwmIPyxHTocxUx
   14.52 +5oNLXN3b0G3gnzaCLv2bMGeFszIcOtmuev1zHiRRcMbIuQQbRaVsGG6Rsy7S3hmw
   14.53 +G427bbI4k+Kqmteuy0WGEgUdMZEr629focujrS0Qh2E30KM6H2P8pKFjK20QSQZ0
   14.54 +gNkAEQEAAQAL/0E4X0Ygv32BLNixkewAJyGyv1TIdkJEwV21zguVgWHUnhscfiUX
   14.55 +kS6H4JwkCktNFhMbkaj8ZPMi5wii9myZaK2nlQQVeivm+wv/lzAe/4zMzkus/7IT
   14.56 +3i5rlCN2FkIrlVgGz4PzNGSZdHFfJFrvlNpquDuSvVhSpNBnkcWd/s8IM51+A5Lm
   14.57 +M/L9n+lwrkuZsNel7+y0LwVjorB84FWelpTaVEvFlEztffne3HP76gXRElS7NSu1
   14.58 +Jnuu5JUw34NQGLnB4T77upRHa4ngZeK3+VV5UYX9vHWEiz+TrvGkHA4fFbik04jF
   14.59 +rBwxcc0lHFC2O+lxiEzWGAgxDbqHifE9TzWrpPxAUZSo4On1XnKzu9EHAZVpexHJ
   14.60 +9l8jH1H7XvxBQGbG42e/aRAL3rlbP6iZqXhJ6pUeF4KlsVRbFo1XqwKUYhcryKCp
   14.61 +6bEip5R8W4S8/3EfrSpmRymsei7cV8e572ROPYlx6tDwOUJMRNDBarvT75Z3vZ2Y
   14.62 +xfP1/4Uy7uwfwQYAwjFRDnNYC+ChfP5cdWDpfBGoulCKQ107+2TzKwnDqCi+a901
   14.63 +KxnK1iE7PVNEVL/SkF1RKJPgU2yAXJacd9AlrPRaXV8ftTaL8F8wZkSrybCodpcO
   14.64 +avOuMSztqvnldJjZk0ZJrKa+kgyKRESMDmPSe6WV7zl9S/qFox1vzncYfnCYD90X
   14.65 +DABxeqBukUEk+hWBSyZY+t0qnOcW2XP0LxFZHOix+ZWwIlRj50AS2s6uIlGKv99Z
   14.66 +fotRuwxRaxAFysiXBgDwEDWfdQX9vmw8vqzMxK0z4cj9NhMWHrDNH9QMeX4/K9V9
   14.67 +7LsTibsbTw6jpwPh/+s9zxC0RR1Ro+kZQnvleLz6+k0gqiJErHHvl4qmgFdq4T13
   14.68 +J7ISEPCH5sVO+1t1Di3oLBtEP1COY2UpNyC2Otjml3A1/CmYdGI9G6JyEVKQF4Ju
   14.69 +BwJ14RSz0b1i5pjotkD8PfGmNIVF2nOUATbFRYYnDP8MH8c8TzasIwjKrnPxY2Yx
   14.70 +k2kEOWGqm9d3TQabQA8F/2PKyMSbIjBwiGpi9PMC0MZCDjc+j2H4J/C06ycaMWiK
   14.71 +1ZPKE3yGv8bhA6zhQAAYuH02BUZBrRY2uTXHcgnyULcg0/+AWvJklaw4dbRy3iLT
   14.72 +O45J1N392Q5JFO9bOaIpemamEP+/MoD+VV8+U/Al9RSBMmxgq8BmRt0+F881d5n5
   14.73 +71g9dOjrdd1zX4Xl7eASS00kbAcGoZCb34oW0uRi9nYunzltXzM+s5INXvycoTjo
   14.74 +jEpb4FyLMeS6CPJwphAGvdy7iQNsBBgBCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBK
   14.75 +Im4FAlzakZYCGwIBwAkQf1nwPNBKIm7A9CAEGQEIAB0WIQQ0rQXUJuRMayXQhG++
   14.76 +0LH0HLDcUQUCXNqRlgAKCRC+0LH0HLDcUavFC/48V+NZzS3NlSa/R2mcBwAZyEZi
   14.77 +CGstMeualsNtpxeAI3dJD2YOptqF0EwCardYBrRYH4lvbPNCUC0/pPVBdlZGi+nX
   14.78 +7LqOffSlmYRyz9K6idLOWqLQcab7NZG8fgyygtx/zVyLvRtCcqsGuCj98vIZXgyA
   14.79 +QZnaDDaUXRPwlXlCUXXAYmEMr2zTVZzxmz18Kzr1bK7w0f6wxDHiN7gGpSX7ASp4
   14.80 +fh3glAIW7V6o03eUfzcIizXqVP+jNVrR2XbdFP6b3eW2UAXf1nAmUX7JKS1fGhk6
   14.81 +f+3Cdzmy1tGsCfB6bUQhxkzYhuWvzuLXwG5BVpKzjwMqGqwy2UnaIuq0Q8sU8N1u
   14.82 +AmphZm7+1x/4jVdQLm9if6okY51du/zPdoHucRo/sT+Sr+xAXn6QkB6SdzkwUXAC
   14.83 +/uRF3Zg2RBVyhcrrIG+mrIAW5FO12njOgrJAWP09zKilYnOGoDnbnexrqTUjpcZu
   14.84 +oaW/Yn2DobIJFAl/d6mTx2nlNfU0Ol1gwmWOA1YN4gwAhsnkzW5K5HEUPuYBxE2G
   14.85 +UAZgclQdh0/TWdUrxcooRShwZ3p0cVqmmz3xZlUUy8atx6w/hUnh173df82D/XfI
   14.86 +7HnaN27p6hA61GBhkGXXR5IYInesB+eKPgp2jzHtbxzhb4cuT+CNsyCYtlkmN278
   14.87 +9cxadYpskwhMDFWCPgGD3W16hFa7pCmgR4J8UYmZZP5LcOAgmRO3SzIroPnVj3TM
   14.88 +ftelH1Auq8GR6qysVtAlb1ckmS3m1l8jrCu53CS+UkG7HEK1LCb5L2e5DnzDLIkj
   14.89 +Z4IcByQVFvAkN/V0kx4/JWN9iZVFnhlJXkC/qgA26nM5VvCX5MoMLs9ksxdyJ4tm
   14.90 +BZCDjgefymve1y3dhNcmY8Gt0PxNYTrg22m0L7aNSz8RwShlrmlDOMn+r/x9Gt1/
   14.91 +664f6MlSmE8HXO6Ucos4z0gD9N3WCclVGJ1AXE8Q7fd/v5xiw0lARnH4++cQ0AMT
   14.92 +Ay8qn5qdai0FBVeEtrAbxdguCkcVbdbsxFOjldhDGbcdnQVYBFzakaUBDAC2L+tD
   14.93 +AJvji5xqrfPunpCa0/C+Q5zax4ypDYlNj+7KU2edPNd3Y7ZOXXU58nv2BbeKVqoZ
   14.94 +VUs5jbAe40a7XYUSoqTeechk9JxLIwsvpLh5E1bGD67U7FnXfZqvm9b7mKWeDriP
   14.95 +mPfJceWQy4b6s968BOeo0L1iR0tDu04u5mAgZDXTHmLr5oxhHixtMxOJkQUIlEaJ
   14.96 +P/NGS4R9rq1fgkS3kv+kNveiZRlxq2vGE2/g+uU4Cscq+j+19DdzTZgOu6JY02uX
   14.97 +tbPv0Z9Gaj9SUgTnUbFF/9qlV/FkAAHK1Q/j8XPoPFkeC+akeEAP3GyhLmnEgY+d
   14.98 +3MA5xWRDgsOe+0+xP3YhABIOMk0LTNb5NSXeIS+2t+9NzAA1BT9E1CTthDHC3waL
   14.99 +5Fk9w1MNwoyaAo96qEqLbFbpO1HB2k8ak3uCvdysWWkV2/zPRph3R1zcXWEm/vAD
  14.100 +Ja9sztx7dZDTy9AjDmquBWSk2/Fhs9noQsXI2xOPZd4rBwimTSNHX2xDEC8AEQEA
  14.101 +AQAL/RFyuGjT05owwjuzSjPVqsqxNpK6Pfjz+IQuQDKV8MwevcMg0w/jlE+gAryY
  14.102 +fQe8V24fy62ebhRmffIPWTRTig2VVw3ZgvgsNxW5Fvaqo2IxGHPih59rvVT2egyM
  14.103 +c8PnxCDFjyZtg3me91ntLBGxjUjbfWY9C44wfsRPWXcDaDxh7Ie6FsY578LTVXTl
  14.104 +2d6obV97d9/oKH/Ydqlkw8TsYHFmWiZbf07luNCalrlDHklhLfe2jImQqu5do7ve
  14.105 +uAvdK087vvm4G6THAEdOjLx+bs46QbeVDuCKQcI4CQbYtik4BtXlY6BNkORJczxd
  14.106 +8S9V2n61fp4TEFdzDQw/udDPXUkue6RW8as0EOT7VFiTlTvsCoK0d4L3bkYKJ2w5
  14.107 +cjt014i2959NFR4qOO+M36/mcEc2l12tA3dzZWnj/h8L9gZOcDwlgldCGY+FdIEe
  14.108 +pgwZ8hjMfNC94qhGyn/+RAbjUCgYthZx5RH6zf1WNSBMEkFRR+WJcFENCuPuXl4H
  14.109 +w536BQYAyn30zNYJlm2XsYgrM9B27ZavUNNehHu8K9yeD3oASa5E0gGk4Oj9JQm6
  14.110 +vDIbpP1ImbbiI1hUHkL+XK8tdvjxu8cKISi3KfUZvSxs12G2ax7tmUyWtnql4CHx
  14.111 +PJJOIagFlPY0f1LEuAXVGPd68hSZ5mzn3zuUbt/pLdbZ7YNTJ1aIawOZqWOBYltr
  14.112 +znrAKcjVs6OFzKeujNa+K2JYyawEU/eG4322OBVSDspEV0Z2X/z8sGgDhfAlyZmq
  14.113 +HdebYdSDBgDmVGUiErIVQAMp/LsuYr+GdrZDdAwkusAUcAS5JLt2MvLOhDjJ910t
  14.114 +ByUjU0uHWxYCZH4kcv0/aAeCF3lWuTYmGRbdFk89p7Y6zggf6W1jqWLQ7JIvZQsQ
  14.115 +KidKHP1dTb6aQp6v7tKcUoYaPlgLE+eFjdAX6f0CQ+FBYfszYbqWkRfoREW3NyDV
  14.116 +G8qlH0fZrMjYdvt3dTKRO11wh958O4eOM9yLiPxk/ZrFNcvfxzQLyjzZ65ub4JSi
  14.117 +M6zdK/pUfeUF/20iloJMsXlYTqXI1taYtKAmA1iwJ5kvpz3uPGOtNRSrISkLoSab
  14.118 +ocfojHAsOhRwZMvhrh7mXfycWZGFm58ZP6C3r0nYNeHsjDwI8UOvKUiD1w9xVSJl
  14.119 +kFR5gH3cqawPA0M8O6Ya8nnO4GayQgKwFMzB0Z6j87G0SViT3fS89DwcRjTC5QeY
  14.120 +Tj0fEeFz7/CX0buEsnsd0FM1w2We/DAK/kAQXMDirmabIOasYPDk3+BS3fWGaJf7
  14.121 +xICz4DJE99QSfd5GiQG2BBgBCAAgFiEEWZs9Z4ANs34tzgXAf1nwPNBKIm4FAlza
  14.122 +kaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBozPqmmprEolo2iPZFLBwVqXueIPjQ
  14.123 +S6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oCsmfLjfQSV6FygdjjFRjbhm14ny1v
  14.124 +ZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsGvZ6BnWWKEtXyBN2vTCZC8+hGfo6p
  14.125 ++WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qRKggZvecQL+k0ebWeQzUwvTTWgfDa
  14.126 +Vh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd1J/cQtAZiZCCnKS41aLUKnMNjrGt
  14.127 +MdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vli8ERoZm5GXki9d54Gu1lAZ6QDM6O
  14.128 +iKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6I2NDR/R9kZzuQ/42CiUf8XX/4Tzb
  14.129 +vU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj1PNN1xt0qNxYPy3tbQVnCOD6a0po
  14.130 +mCsddt0ANDA4BDMM32UW0FU2Ahu0
  14.131 +=EuxL
  14.132 +-----END PGP PRIVATE KEY BLOCK-----
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_pub.asc	Wed May 15 14:20:48 2019 +0200
    15.3 @@ -0,0 +1,68 @@
    15.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    15.5 +
    15.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    15.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    15.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    15.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   15.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   15.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   15.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   15.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   15.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
   15.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokB1AQT
   15.16 +AQgAPgIbAQULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgBYhBFmbPWeADbN+Lc4FwH9Z
   15.17 +8DzQSiJuBQJc2pITBQkAAVIhAAoJEH9Z8DzQSiJuT9oMAMDohz5ee4mz8d1GZxgn
   15.18 +IVmktrUxhr7PoJoLjyQF5VHCifYC1fdH3ax8EblRfnjI9G+JlGXcS+Vyae0UXlTe
   15.19 +zfVHBSyDM1VWZ4X+mSs4mXgU6IQOn/zGIFfEU1TgEl7FjK70zhjJNfr1LruVA/I/
   15.20 ++oLD2oH8AObOTrYF6ZsKqqnLyAC3H0NI+FoczkXJom7h27RoRXJsCO2FGElLGhak
   15.21 +zSJwSYTbGLBT9ELqpboCop5AIiL9daPqkcHktbONNKyC5sBbXn+nRU6cWirbLrsF
   15.22 +t9epabSVpI0QlnvWsTcr0jv6yCXx5vyS8kBqmXt3hi9UbC3nsg4+7V+8iBlOTjUL
   15.23 +R3CTZepj1b4mE0vRr+JBKHXfakwdAJYvQRuPYPC6w2Hmwk7MIio+ROVdD9yb/yOA
   15.24 +LoVNzLllGM9wmpX6921suFh7romAZXD1V4AH8UzBgcRSDZfcW0oxjcYfdlQpO5QW
   15.25 +eujvNxeUXqXui7ia5f6EjGT0wAgknZd3IY/M/DsR6jHqu7kBjQRc2pGWAQwAthqH
   15.26 +v8g4K/uTY/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1Smewtl
   15.27 +Fqoe4eVpWlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2
   15.28 +TSlGPIewix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1UR
   15.29 +IWAbJx5HEZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH
   15.30 +/15wAwMLH0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6P
   15.31 +kL7eNwzP2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd
   15.32 +29Bt4J82gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22y
   15.33 +OJPiqprXrstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEB
   15.34 +AAGJA2wEGAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqRlgIbAgHACRB/
   15.35 +WfA80EoibsD0IAQZAQgAHRYhBDStBdQm5ExrJdCEb77QsfQcsNxRBQJc2pGWAAoJ
   15.36 +EL7QsfQcsNxRq8UL/jxX41nNLc2VJr9HaZwHABnIRmIIay0x65qWw22nF4Ajd0kP
   15.37 +Zg6m2oXQTAJqt1gGtFgfiW9s80JQLT+k9UF2VkaL6dfsuo599KWZhHLP0rqJ0s5a
   15.38 +otBxpvs1kbx+DLKC3H/NXIu9G0Jyqwa4KP3y8hleDIBBmdoMNpRdE/CVeUJRdcBi
   15.39 +YQyvbNNVnPGbPXwrOvVsrvDR/rDEMeI3uAalJfsBKnh+HeCUAhbtXqjTd5R/NwiL
   15.40 +NepU/6M1WtHZdt0U/pvd5bZQBd/WcCZRfskpLV8aGTp/7cJ3ObLW0awJ8HptRCHG
   15.41 +TNiG5a/O4tfAbkFWkrOPAyoarDLZSdoi6rRDyxTw3W4CamFmbv7XH/iNV1Aub2J/
   15.42 +qiRjnV27/M92ge5xGj+xP5Kv7EBefpCQHpJ3OTBRcAL+5EXdmDZEFXKFyusgb6as
   15.43 +gBbkU7XaeM6CskBY/T3MqKVic4agOdud7GupNSOlxm6hpb9ifYOhsgkUCX93qZPH
   15.44 +aeU19TQ6XWDCZY4DVg3iDACGyeTNbkrkcRQ+5gHETYZQBmByVB2HT9NZ1SvFyihF
   15.45 +KHBnenRxWqabPfFmVRTLxq3HrD+FSeHXvd1/zYP9d8jsedo3bunqEDrUYGGQZddH
   15.46 +khgid6wH54o+CnaPMe1vHOFvhy5P4I2zIJi2WSY3bvz1zFp1imyTCEwMVYI+AYPd
   15.47 +bXqEVrukKaBHgnxRiZlk/ktw4CCZE7dLMiug+dWPdMx+16UfUC6rwZHqrKxW0CVv
   15.48 +VySZLebWXyOsK7ncJL5SQbscQrUsJvkvZ7kOfMMsiSNnghwHJBUW8CQ39XSTHj8l
   15.49 +Y32JlUWeGUleQL+qADbqczlW8Jfkygwuz2SzF3Ini2YFkIOOB5/Ka97XLd2E1yZj
   15.50 +wa3Q/E1hOuDbabQvto1LPxHBKGWuaUM4yf6v/H0a3X/rrh/oyVKYTwdc7pRyizjP
   15.51 +SAP03dYJyVUYnUBcTxDt93+/nGLDSUBGcfj75xDQAxMDLyqfmp1qLQUFV4S2sBvF
   15.52 +2C4KRxVt1uzEU6OV2EMZtx25AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT8L5D
   15.53 +nNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKipN55
   15.54 +yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE56jQ
   15.55 +vWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS/6Q2
   15.56 +96JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdRsUX/
   15.57 +2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/diEA
   15.58 +Eg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qoSots
   15.59 +Vuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMOaq4F
   15.60 +ZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEEWZs9
   15.61 +Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBo
   15.62 +zPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oC
   15.63 +smfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsG
   15.64 +vZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qR
   15.65 +KggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd
   15.66 +1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vl
   15.67 +i8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6
   15.68 +I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj
   15.69 +1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
   15.70 +=Lvco
   15.71 +-----END PGP PUBLIC KEY BLOCK-----
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_expired_sig_key.asc	Wed May 15 14:20:48 2019 +0200
    16.3 @@ -0,0 +1,68 @@
    16.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    16.5 +
    16.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    16.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    16.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    16.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   16.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   16.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   16.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   16.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   16.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
   16.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokBzgQT
   16.16 +AQgAOBYhBFmbPWeADbN+Lc4FwH9Z8DzQSiJuBQJc2pFyAhsBBQsJCAcCBhUICQoL
   16.17 +AgQWAgMBAh4BAheAAAoJEH9Z8DzQSiJuHm4L/2sdjY6hVYgkmMKR9DtjK3vrHcvk
   16.18 +JZPiGZVbN91oC0xd/ulBLTtpklq4sE8NBSVSpCphXAtiQ5wwmHkddxWVQdVu0Txx
   16.19 +5KSc4XqkU6JpmF72C0DdbKrlFQ9Xda68bFgsDAwd4/p35osXbE9xmWAXZmmW70l5
   16.20 +8MoZuV01Ks7PbWIH7RzhsKRNtMkkjkjQ6SdLesDpaewrrmZU6QQX2ZdT5ogCysGz
   16.21 +0ioVzicrhCP1u3Cdvy8inxj1u5ZBgG3pPSaMCumPQxqLOpDn/FvAKYt2QVySXgWk
   16.22 +j6gmdDZPyz/dyRb/MgHYCmYiyq6+2FspUhBiw/z1cDnE1v5lEb53nGod1gGwVUje
   16.23 +n0WM41fLA8zQj0U5jm17C5sQu7jOhfLDJcxQlD4WU2N4IY5lOow0JVxCZ/+iNkN/
   16.24 +JbIzl+nT57xcu9ttS8B8/SmASAfBoFU/a8SdKTZWcAoVJgDk560VBY8fszIdRtLi
   16.25 +pOnA7KmlQY8J3Drv2kCfp1WgqersQ1657oVInrkBjQRc2pGWAQwAthqHv8g4K/uT
   16.26 +Y/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1SmewtlFqoe4eVp
   16.27 +WlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2TSlGPIew
   16.28 +ix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1URIWAbJx5H
   16.29 +EZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH/15wAwML
   16.30 +H0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6PkL7eNwzP
   16.31 +2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd29Bt4J82
   16.32 +gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22yOJPiqprX
   16.33 +rstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEBAAGJA3IE
   16.34 +GAEIACYCGwIWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqSVQUJAAFSPwHAwPQg
   16.35 +BBkBCAAdFiEENK0F1CbkTGsl0IRvvtCx9Byw3FEFAlzakZYACgkQvtCx9Byw3FGr
   16.36 +xQv+PFfjWc0tzZUmv0dpnAcAGchGYghrLTHrmpbDbacXgCN3SQ9mDqbahdBMAmq3
   16.37 +WAa0WB+Jb2zzQlAtP6T1QXZWRovp1+y6jn30pZmEcs/SuonSzlqi0HGm+zWRvH4M
   16.38 +soLcf81ci70bQnKrBrgo/fLyGV4MgEGZ2gw2lF0T8JV5QlF1wGJhDK9s01Wc8Zs9
   16.39 +fCs69Wyu8NH+sMQx4je4BqUl+wEqeH4d4JQCFu1eqNN3lH83CIs16lT/ozVa0dl2
   16.40 +3RT+m93ltlAF39ZwJlF+ySktXxoZOn/twnc5stbRrAnwem1EIcZM2Iblr87i18Bu
   16.41 +QVaSs48DKhqsMtlJ2iLqtEPLFPDdbgJqYWZu/tcf+I1XUC5vYn+qJGOdXbv8z3aB
   16.42 +7nEaP7E/kq/sQF5+kJAeknc5MFFwAv7kRd2YNkQVcoXK6yBvpqyAFuRTtdp4zoKy
   16.43 +QFj9PcyopWJzhqA5253sa6k1I6XGbqGlv2J9g6GyCRQJf3epk8dp5TX1NDpdYMJl
   16.44 +jgNWCRB/WfA80EoibqLdC/4ssznHmOhxlEmPHZOgOsJQgtQGt3Zz4EDqOY5ejxaj
   16.45 +B9Nl5zJdypDhx1Dfb6gCR9ZOsKelpZJeees2HjKA0mqwFkQ30s/HN1ocVCKaq3md
   16.46 +ozGQv0z5Cihw1Buj+CZwHztPRbtDPNAyrLUjgJN0Lg/jfU4G90aS1aQEGnnlksE3
   16.47 +qkBw+86RV2gHoVfWOGQGFCajlJgnz6X93YL1A7IJv19rP+4fHJKubq98gnXvo60Z
   16.48 +OBiUKmIkgja2lDlZo26qz/yHiS/WBo/ZWMBiH7brM7TikIAC3JgXrc+98m8vJqAQ
   16.49 ++Ak6yndQDaMmnfaj53E4YaZ937xGiNRZq5lEnPZqII5Ki+gvscpBOrVo/N1hVsAB
   16.50 +Zqiy29r67lcrZjYAWpYVtTWtQP1el6WyhClZnZiRJJ0blnhSWF+W6G9anjPerqnw
   16.51 ++hC1oVehym7tCm/NoIMwxaUHa90T8637jYh/pEutQD3xWFRUcEMa+l9rvW9yuIYW
   16.52 +kXTPWsuZllyaw37qSGCMUA+5AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT8L5D
   16.53 +nNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKipN55
   16.54 +yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE56jQ
   16.55 +vWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS/6Q2
   16.56 +96JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdRsUX/
   16.57 +2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/diEA
   16.58 +Eg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qoSots
   16.59 +Vuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMOaq4F
   16.60 +ZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEEWZs9
   16.61 +Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrzhMBo
   16.62 +zPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7z0oC
   16.63 +smfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4BjhxqORsG
   16.64 +vZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUDa/qR
   16.65 +KggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH0Shd
   16.66 +1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaXR1Vl
   16.67 +i8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT9iQ6
   16.68 +I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4qF7Lj
   16.69 +1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
   16.70 +=INdi
   16.71 +-----END PGP PUBLIC KEY BLOCK-----
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/test/test_keys/pub/pep-test-mary-0x7F59F03CD04A226E_revoked_sig_key.asc	Wed May 15 14:20:48 2019 +0200
    17.3 @@ -0,0 +1,77 @@
    17.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    17.5 +
    17.6 +mQGNBFzakXIBDADFQ/yauFR/q9HPFfszr8Cd2t4tZA9xBC46CtTnvetfL40EnCPV
    17.7 +umzsKCt0ZICiqMS538yMzgE5V7cUGCJJxabTt9Xnm/mqD6JJFiNxx49+BxapiJgN
    17.8 +VE7Uo5s2tXzy/BUGP3B5OeW2frFbse0zRWkgN/jvbkNr43LsHVYkBUQKSiqm3Ud7
    17.9 +1NZRaapAbkxisCOHNTZ2uyayX2WZlxKgufp/61wL75XRoPoQdnajaQvro1rr35sC
   17.10 +teG9k425WS60j80ie+AmGEIguPPc4Go5rhwf3SCqU7BfiYCxVAvX5ESr+HpyicEF
   17.11 +5iL+4wm/VMxj4zzFMQKQvQ0lHmw4I1SreS250sVfkXWdYtjiq+2XWGoQUWOnU/j4
   17.12 +nBol10pwOQVI0jL+ok8OlXfFZm6LIYY7Pmd9O4e5WbCid/UU+uc0UW1qDtkHie8t
   17.13 +25epIQGqmLOHgQJDWxdSnmNRcM7A9ckktGNMG3n53qJ8bvdfqlioRNJwm0IUF1cz
   17.14 +dHZuhDzoSFpPTbMAEQEAAbRJTWFyeSBTdXNhbiBNYXJpYSBLYXJlbiBMaXNhIExp
   17.15 +bmRhIERvbm5hIFBhdHJpY2lhIFNtaXRoIDwxOTYwQGV4YW1wbGUub3JnPokBzgQT
   17.16 +AQgAOBYhBFmbPWeADbN+Lc4FwH9Z8DzQSiJuBQJc2pFyAhsBBQsJCAcCBhUICQoL
   17.17 +AgQWAgMBAh4BAheAAAoJEH9Z8DzQSiJuHm4L/2sdjY6hVYgkmMKR9DtjK3vrHcvk
   17.18 +JZPiGZVbN91oC0xd/ulBLTtpklq4sE8NBSVSpCphXAtiQ5wwmHkddxWVQdVu0Txx
   17.19 +5KSc4XqkU6JpmF72C0DdbKrlFQ9Xda68bFgsDAwd4/p35osXbE9xmWAXZmmW70l5
   17.20 +8MoZuV01Ks7PbWIH7RzhsKRNtMkkjkjQ6SdLesDpaewrrmZU6QQX2ZdT5ogCysGz
   17.21 +0ioVzicrhCP1u3Cdvy8inxj1u5ZBgG3pPSaMCumPQxqLOpDn/FvAKYt2QVySXgWk
   17.22 +j6gmdDZPyz/dyRb/MgHYCmYiyq6+2FspUhBiw/z1cDnE1v5lEb53nGod1gGwVUje
   17.23 +n0WM41fLA8zQj0U5jm17C5sQu7jOhfLDJcxQlD4WU2N4IY5lOow0JVxCZ/+iNkN/
   17.24 +JbIzl+nT57xcu9ttS8B8/SmASAfBoFU/a8SdKTZWcAoVJgDk560VBY8fszIdRtLi
   17.25 +pOnA7KmlQY8J3Drv2kCfp1WgqersQ1657oVInrkBjQRc2pGWAQwAthqHv8g4K/uT
   17.26 +Y/l8DBBDYSIKNBZ1CTHGF0mYW9QqfCOZNo+4HvMnregVVWJRI1SmewtlFqoe4eVp
   17.27 +WlQZ/yAqqA1KpCZfS5LVzVW3k7MKE1SU8imoCfxWlG+2LG+dfolrAuy2TSlGPIew
   17.28 +ix7GheONohx5LPe4ksJeRDE7/9KtQHgWv3NcJiYd8NXNHxGI8k0Xv1URIWAbJx5H
   17.29 +EZ7PKmSl/hcicbYCpRoeyxcajlBAPKys0vNee6mkvhhvB7zd169XfHMH/15wAwML
   17.30 +H0GocRDHhWaFFFrXJX4HAQwBCU1PXWr02Sa73eNyEd66mBwQnConNA6PkL7eNwzP
   17.31 +2Nmq3tjbiKO7pYhGN/NIEh2QCPRJlUbjnv068JiD8sR06HMVMeaDS1zd29Bt4J82
   17.32 +gi79mzBnhbMyHDrZrnr9cx4kUXDGyLkEG0WlbBhukbMu0t4ZsBuNu22yOJPiqprX
   17.33 +rstFhhIFHTGRK+tvX6HLo60tEIdhN9CjOh9j/KShYyttEEkGdIDZABEBAAGJAbYE
   17.34 +KAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqSlwIdAAAKCRB/WfA80Eoi
   17.35 +bh1TC/96wk38W5QoHEff/k09349xQv1+JwvSiQSyPwaOfFM03tymNhzA/hVTsm5t
   17.36 +qihmSNRRPAyeyIcoBxkDGdr6Kr2cfeOwCroKKGzLuwh4RVc8nnzIIG4NEox+pUUa
   17.37 +V8UvQRBOgsmzedfFHmfAn48VET1hShy8a25XvFS/foRrUO4zPZatLuFbfZFGDWEt
   17.38 +mQeXvxv3w34LTcMwLo6PGLZlj0qX0qkUBP5DM37iG+eVOh5GFmg24NDKFYdoNmyf
   17.39 +w32ThCbE6hsyo18k8jdbJ3mi2Llyl0pU7MTO9VPO1N16aj9dv2G2hg3tvFIXV1r0
   17.40 +t1P2iJ3697is4fmUpt7zNTvuzbt0h4ZSSXXm9mRY0zh6DaBjIvj+k98i3Yo0czY9
   17.41 +uZDsjE3eHD6fZG0Yzg92ifDXlXSkunEBp43ofBDUcZ1Zr4AcioxGd+KUwUt6CLn7
   17.42 +0deDKETnzokYeNt0jgePrz6QvevQnfDlEEXqEo/Hevp5UeGekI18ecN6Pi226NuH
   17.43 +mNc//saJA2wEGAEIACAWIQRZmz1ngA2zfi3OBcB/WfA80EoibgUCXNqRlgIbAgHA
   17.44 +CRB/WfA80EoibsD0IAQZAQgAHRYhBDStBdQm5ExrJdCEb77QsfQcsNxRBQJc2pGW
   17.45 +AAoJEL7QsfQcsNxRq8UL/jxX41nNLc2VJr9HaZwHABnIRmIIay0x65qWw22nF4Aj
   17.46 +d0kPZg6m2oXQTAJqt1gGtFgfiW9s80JQLT+k9UF2VkaL6dfsuo599KWZhHLP0rqJ
   17.47 +0s5aotBxpvs1kbx+DLKC3H/NXIu9G0Jyqwa4KP3y8hleDIBBmdoMNpRdE/CVeUJR
   17.48 +dcBiYQyvbNNVnPGbPXwrOvVsrvDR/rDEMeI3uAalJfsBKnh+HeCUAhbtXqjTd5R/
   17.49 +NwiLNepU/6M1WtHZdt0U/pvd5bZQBd/WcCZRfskpLV8aGTp/7cJ3ObLW0awJ8Hpt
   17.50 +RCHGTNiG5a/O4tfAbkFWkrOPAyoarDLZSdoi6rRDyxTw3W4CamFmbv7XH/iNV1Au
   17.51 +b2J/qiRjnV27/M92ge5xGj+xP5Kv7EBefpCQHpJ3OTBRcAL+5EXdmDZEFXKFyusg
   17.52 +b6asgBbkU7XaeM6CskBY/T3MqKVic4agOdud7GupNSOlxm6hpb9ifYOhsgkUCX93
   17.53 +qZPHaeU19TQ6XWDCZY4DVg3iDACGyeTNbkrkcRQ+5gHETYZQBmByVB2HT9NZ1SvF
   17.54 +yihFKHBnenRxWqabPfFmVRTLxq3HrD+FSeHXvd1/zYP9d8jsedo3bunqEDrUYGGQ
   17.55 +ZddHkhgid6wH54o+CnaPMe1vHOFvhy5P4I2zIJi2WSY3bvz1zFp1imyTCEwMVYI+
   17.56 +AYPdbXqEVrukKaBHgnxRiZlk/ktw4CCZE7dLMiug+dWPdMx+16UfUC6rwZHqrKxW
   17.57 +0CVvVySZLebWXyOsK7ncJL5SQbscQrUsJvkvZ7kOfMMsiSNnghwHJBUW8CQ39XST
   17.58 +Hj8lY32JlUWeGUleQL+qADbqczlW8Jfkygwuz2SzF3Ini2YFkIOOB5/Ka97XLd2E
   17.59 +1yZjwa3Q/E1hOuDbabQvto1LPxHBKGWuaUM4yf6v/H0a3X/rrh/oyVKYTwdc7pRy
   17.60 +izjPSAP03dYJyVUYnUBcTxDt93+/nGLDSUBGcfj75xDQAxMDLyqfmp1qLQUFV4S2
   17.61 +sBvF2C4KRxVt1uzEU6OV2EMZtx25AY0EXNqRpQEMALYv60MAm+OLnGqt8+6ekJrT
   17.62 +8L5DnNrHjKkNiU2P7spTZ50813djtk5ddTnye/YFt4pWqhlVSzmNsB7jRrtdhRKi
   17.63 +pN55yGT0nEsjCy+kuHkTVsYPrtTsWdd9mq+b1vuYpZ4OuI+Y98lx5ZDLhvqz3rwE
   17.64 +56jQvWJHS0O7Ti7mYCBkNdMeYuvmjGEeLG0zE4mRBQiURok/80ZLhH2urV+CRLeS
   17.65 +/6Q296JlGXGra8YTb+D65TgKxyr6P7X0N3NNmA67oljTa5e1s+/Rn0ZqP1JSBOdR
   17.66 +sUX/2qVX8WQAAcrVD+Pxc+g8WR4L5qR4QA/cbKEuacSBj53cwDnFZEOCw577T7E/
   17.67 +diEAEg4yTQtM1vk1Jd4hL7a3703MADUFP0TUJO2EMcLfBovkWT3DUw3CjJoCj3qo
   17.68 +SotsVuk7UcHaTxqTe4K93KxZaRXb/M9GmHdHXNxdYSb+8AMlr2zO3Ht1kNPL0CMO
   17.69 +aq4FZKTb8WGz2ehCxcjbE49l3isHCKZNI0dfbEMQLwARAQABiQG2BBgBCAAgFiEE
   17.70 +WZs9Z4ANs34tzgXAf1nwPNBKIm4FAlzakaUCGwwACgkQf1nwPNBKIm6jJwwAhjrz
   17.71 +hMBozPqmmprEolo2iPZFLBwVqXueIPjQS6YOVaitJxQePNOHpkWJqGaVRpmVlUg7
   17.72 +z0oCsmfLjfQSV6FygdjjFRjbhm14ny1vZeSbYNROSwWVDWB/KoLnC3YFQh4Bjhxq
   17.73 +ORsGvZ6BnWWKEtXyBN2vTCZC8+hGfo6p+WbTbwCnzPWTvuhxqxFC/P9esgBfYzUD
   17.74 +a/qRKggZvecQL+k0ebWeQzUwvTTWgfDaVh+Fl2OB3tt9kI9th46mfw1a6MXQssyH
   17.75 +0Shd1J/cQtAZiZCCnKS41aLUKnMNjrGtMdYjCq6f9WGTqB5tXhYYkMZBCiJBmXaX
   17.76 +R1Vli8ERoZm5GXki9d54Gu1lAZ6QDM6OiKngsknRFAyvQz4zDAHm0olGA4+SIdRT
   17.77 +9iQ6I2NDR/R9kZzuQ/42CiUf8XX/4TzbvU/DhExIEyxN6S8khYaDfsDVoBrKOn4q
   17.78 +F7Lj1PNN1xt0qNxYPy3tbQVnCOD6a0pomCsddt0ANDA4BDMM32UW0FU2Ahu0
   17.79 +=CDai
   17.80 +-----END PGP PUBLIC KEY BLOCK-----