Merged in ENGINE-463
authorKrista Bennett <krista@pep-project.org>
Fri, 05 Oct 2018 08:51:46 +0200
changeset 2999ae91fe244f9b
parent 2979 104040105413
parent 2998 744b331f78c7
child 3001 8c1aafb3ad57
child 3002 3cb37672cb51
Merged in ENGINE-463
     1.1 --- a/src/keymanagement.c	Wed Oct 03 16:39:05 2018 +0200
     1.2 +++ b/src/keymanagement.c	Fri Oct 05 08:51:46 2018 +0200
     1.3 @@ -532,40 +532,53 @@
     1.4  
     1.5              if (id_list) {
     1.6                  identity_list* id_curr = id_list;
     1.7 +                bool input_is_TOFU = strstr(identity->user_id, "TOFU_") == identity->user_id;
     1.8                  while (id_curr) {
     1.9                      pEp_identity* this_id = id_curr->ident;
    1.10                      if (this_id) {
    1.11                          char* this_uid = this_id->user_id;
    1.12 -                        if (this_uid && (strstr(this_uid, "TOFU_") == this_uid)) {
    1.13 -                            // FIXME: should we also be fixing pEp_own_userId in this
    1.14 -                            // function here?
    1.15 -                            
    1.16 -                            // if usernames match, we replace the userid. Or if the temp username
    1.17 -                            // is anonymous.
    1.18 -                            // FIXME: do we need to create an address match function which
    1.19 -                            // matches the whole dot-and-case rigamarole from 
    1.20 -                            if (EMPTYSTR(this_id->username) ||
    1.21 -                                strcasecmp(this_id->username, this_id->address) == 0 ||
    1.22 -                                (identity->username && 
    1.23 -                                 strcasecmp(identity->username, 
    1.24 -                                            this_id->username) == 0)) {
    1.25 +                        bool curr_is_TOFU = strstr(this_uid, "TOFU_") == this_uid;
    1.26 +                        if (this_uid) {
    1.27 +                            if (curr_is_TOFU && !input_is_TOFU) {
    1.28 +                                // FIXME: should we also be fixing pEp_own_userId in this
    1.29 +                                // function here?
    1.30                                  
    1.31 -                                // Ok, we have a temp ID. We have to replace this
    1.32 -                                // with the real ID.
    1.33 -                                status = replace_userid(session, 
    1.34 -                                                        this_uid, 
    1.35 -                                                        identity->user_id);
    1.36 -                                if (status != PEP_STATUS_OK) {
    1.37 -                                    free_identity_list(id_list);
    1.38 -                                    free(default_own_id);
    1.39 -                                    return status;
    1.40 +                                // if usernames match, we replace the userid. Or if the temp username
    1.41 +                                // is anonymous.
    1.42 +                                // FIXME: do we need to create an address match function which
    1.43 +                                // matches the whole dot-and-case rigamarole from 
    1.44 +                                if (EMPTYSTR(this_id->username) ||
    1.45 +                                    strcasecmp(this_id->username, this_id->address) == 0 ||
    1.46 +                                    (identity->username && 
    1.47 +                                     strcasecmp(identity->username, 
    1.48 +                                                this_id->username) == 0)) {
    1.49 +                                    
    1.50 +                                    // Ok, we have a temp ID. We have to replace this
    1.51 +                                    // with the real ID.
    1.52 +                                    status = replace_userid(session, 
    1.53 +                                                            this_uid, 
    1.54 +                                                            identity->user_id);
    1.55 +                                    if (status != PEP_STATUS_OK) {
    1.56 +                                        free_identity_list(id_list);
    1.57 +                                        free(default_own_id);
    1.58 +                                        return status;
    1.59 +                                    }
    1.60 +                                        
    1.61 +                                    free(this_uid);
    1.62 +                                    this_uid = NULL;
    1.63 +                                    
    1.64 +                                    // Reflect the change we just made to the DB
    1.65 +                                    this_id->user_id = strdup(identity->user_id);
    1.66 +                                    stored_ident = this_id;
    1.67 +                                    // FIXME: free list.
    1.68 +                                    break;                                
    1.69                                  }
    1.70 -                                    
    1.71 -                                free(this_uid);
    1.72 -                                this_uid = NULL;
    1.73 -                                
    1.74 -                                // Reflect the change we just made to the DB
    1.75 -                                this_id->user_id = strdup(identity->user_id);
    1.76 +                            }
    1.77 +                            else if (input_is_TOFU && !curr_is_TOFU) {
    1.78 +                                // Replace ruthlessly - this is NOT supposed to happen.
    1.79 +                                // BAD APP BEHAVIOUR.
    1.80 +                                free(identity->user_id);
    1.81 +                                identity->user_id = strdup(this_id->user_id);
    1.82                                  stored_ident = this_id;
    1.83                                  // FIXME: free list.
    1.84                                  break;                                
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/src/labeled_int_list.c	Fri Oct 05 08:51:46 2018 +0200
     2.3 @@ -0,0 +1,121 @@
     2.4 +// This file is under GNU General Public License 3.0
     2.5 +// see LICENSE.txt
     2.6 +
     2.7 +#include <stdbool.h>
     2.8 +#include <stdlib.h>
     2.9 +#include <assert.h>
    2.10 +#include <string.h>
    2.11 +
    2.12 +#include "platform.h"
    2.13 +#include "labeled_int_list.h"
    2.14 +
    2.15 +labeled_int_list_t *new_labeled_int_list(int value, const char* label)
    2.16 +{
    2.17 +    assert(label);
    2.18 +    if (!label)
    2.19 +        return NULL;
    2.20 +        
    2.21 +    labeled_int_list_t * labeled_int_list = calloc(1, sizeof(labeled_int_list_t));
    2.22 +    assert(labeled_int_list);
    2.23 +    if (labeled_int_list == NULL)
    2.24 +        return NULL;
    2.25 +
    2.26 +    labeled_int_list->value = value;
    2.27 +    labeled_int_list->label = strdup(label);
    2.28 +    if (!labeled_int_list->label) {
    2.29 +        free(labeled_int_list);
    2.30 +        labeled_int_list = NULL;
    2.31 +    }
    2.32 +    return labeled_int_list;
    2.33 +}
    2.34 +
    2.35 +void free_labeled_int_list(labeled_int_list_t *labeled_int_list)
    2.36 +{
    2.37 +    labeled_int_list_t *curr = labeled_int_list;
    2.38 +
    2.39 +    while (curr) {
    2.40 +        labeled_int_list_t *next = curr->next;
    2.41 +        free(curr->label);
    2.42 +        free(curr);
    2.43 +        curr = next;
    2.44 +    }
    2.45 +}
    2.46 +
    2.47 +labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src)
    2.48 +{
    2.49 +    assert(src);
    2.50 +    if (src == NULL)
    2.51 +        return NULL;
    2.52 +    
    2.53 +    labeled_int_list_t *labeled_int_list = NULL;
    2.54 +
    2.55 +    labeled_int_list = new_labeled_int_list(src->value, src->label);
    2.56 +    if (labeled_int_list == NULL)
    2.57 +        goto enomem;
    2.58 +
    2.59 +    labeled_int_list_t* src_curr = src->next;
    2.60 +    labeled_int_list_t** dst_curr_ptr = &labeled_int_list->next;
    2.61 +
    2.62 +    // list
    2.63 +    while (src_curr) {
    2.64 +        *dst_curr_ptr = new_labeled_int_list(src_curr->value, src_curr->label);
    2.65 +        if (*dst_curr_ptr == NULL)
    2.66 +            goto enomem;
    2.67 +
    2.68 +        src_curr = src_curr->next;
    2.69 +        dst_curr_ptr = &((*dst_curr_ptr)->next);
    2.70 +    }
    2.71 +
    2.72 +    return labeled_int_list;
    2.73 +
    2.74 +enomem:
    2.75 +    free_labeled_int_list(labeled_int_list);
    2.76 +    return NULL;
    2.77 +}
    2.78 +
    2.79 +labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label)
    2.80 +{
    2.81 +    if (!label)
    2.82 +        return NULL;
    2.83 +        
    2.84 +    if (!labeled_int_list)
    2.85 +        return new_labeled_int_list(value, label);
    2.86 +
    2.87 +    if (!labeled_int_list->label) { // empty list
    2.88 +        assert(!labeled_int_list->next);
    2.89 +        if (labeled_int_list->next)
    2.90 +            return NULL; // invalid list
    2.91 +
    2.92 +        labeled_int_list->value = value;
    2.93 +        labeled_int_list->label = strdup(label);
    2.94 +        if (!labeled_int_list->label) {
    2.95 +            free(labeled_int_list);
    2.96 +            labeled_int_list = NULL;
    2.97 +        }
    2.98 +
    2.99 +        return labeled_int_list;
   2.100 +    }
   2.101 +
   2.102 +    labeled_int_list_t* list_curr = labeled_int_list;
   2.103 +
   2.104 +    while (list_curr->next)
   2.105 +        list_curr = list_curr->next;
   2.106 +
   2.107 +    list_curr->next = new_labeled_int_list(value, label);
   2.108 +
   2.109 +    assert(list_curr->next);
   2.110 +    if (!list_curr->next)
   2.111 +        return NULL;
   2.112 +
   2.113 +    return list_curr->next;
   2.114 +}
   2.115 +
   2.116 +int labeled_int_list_length(const labeled_int_list_t *labeled_int_list)
   2.117 +{
   2.118 +    int len = 0;
   2.119 +
   2.120 +    for (const labeled_int_list_t *_li = labeled_int_list; _li && _li->label; _li = _li->next)
   2.121 +        len++;
   2.122 +
   2.123 +    return len;
   2.124 +}
   2.125 \ No newline at end of file
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/labeled_int_list.h	Fri Oct 05 08:51:46 2018 +0200
     3.3 @@ -0,0 +1,31 @@
     3.4 +// This file is under GNU General Public License 3.0
     3.5 +// see LICENSE.txt
     3.6 +
     3.7 +#pragma once
     3.8 +
     3.9 +#include "dynamic_api.h"
    3.10 +#include "stringpair.h"
    3.11 +
    3.12 +#ifdef __cplusplus
    3.13 +extern "C" {
    3.14 +#endif
    3.15 +
    3.16 +typedef struct _labeled_int_list_t {
    3.17 +    int value;
    3.18 +    char* label;                                // UTF-8 string, null-terminated
    3.19 +    struct _labeled_int_list_t *next;           // this is a single linked list
    3.20 +} labeled_int_list_t;
    3.21 +
    3.22 +labeled_int_list_t *new_labeled_int_list(int value, const char* label);
    3.23 +
    3.24 +void free_labeled_int_list(labeled_int_list_t *labeled_int_list);
    3.25 +
    3.26 +labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src);
    3.27 +
    3.28 +labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label);
    3.29 +
    3.30 +int labeled_int_list_length(const labeled_int_list_t *labeled_int_list);
    3.31 +
    3.32 +#ifdef __cplusplus
    3.33 +}
    3.34 +#endif
     4.1 --- a/src/pEpEngine.c	Wed Oct 03 16:39:05 2018 +0200
     4.2 +++ b/src/pEpEngine.c	Fri Oct 05 08:51:46 2018 +0200
     4.3 @@ -123,6 +123,15 @@
     4.4      "          end) = 1 "
     4.5      "   order by is_own desc, "
     4.6      "   timestamp desc; ";
     4.7 +    
     4.8 +static const char* sql_get_identities_by_userid =
     4.9 +    "select address, identity.main_key_id, username, lang,"
    4.10 +    "   identity.flags, is_own"
    4.11 +    "   from identity"
    4.12 +    "   join person on id = identity.user_id"
    4.13 +    "   where identity.user_id = ?1 "
    4.14 +    "   order by is_own desc, "
    4.15 +    "   timestamp desc; ";
    4.16  
    4.17  static const char *sql_replace_identities_fpr =  
    4.18      "update identity"
    4.19 @@ -151,7 +160,11 @@
    4.20      "       device_group = "
    4.21      "           (select device_group from person where id = ?1)"
    4.22      "   where id = ?1 ;";
    4.23 -    
    4.24 +
    4.25 +// Will cascade.
    4.26 +static const char *sql_delete_person = 
    4.27 +     "delete from person where id = ?1 ;";
    4.28 +
    4.29  static const char *sql_set_as_pep_user =
    4.30      "update person set is_pep_user = 1 "
    4.31      "   where id = ?1 ; ";
    4.32 @@ -305,6 +318,9 @@
    4.33      "select comm_type from trust where user_id = ?1 "
    4.34      "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
    4.35  
    4.36 +static const char *sql_get_trust_by_userid = 
    4.37 +    "select pgp_keypair_fpr, comm_type from trust where user_id = ?1 ";
    4.38 +
    4.39  static const char *sql_least_trust = 
    4.40      "select min(comm_type) from trust where"
    4.41      " pgp_keypair_fpr = upper(replace(?1,' ',''))"
    4.42 @@ -1069,6 +1085,11 @@
    4.43              (int)strlen(sql_get_identities_by_address), 
    4.44              &_session->get_identities_by_address, NULL);
    4.45      assert(int_result == SQLITE_OK);
    4.46 +    
    4.47 +    int_result = sqlite3_prepare_v2(_session->db, sql_get_identities_by_userid,
    4.48 +            (int)strlen(sql_get_identities_by_userid), 
    4.49 +            &_session->get_identities_by_userid, NULL);
    4.50 +    assert(int_result == SQLITE_OK);
    4.51  
    4.52      int_result = sqlite3_prepare_v2(_session->db, sql_get_user_default_key,
    4.53              (int)strlen(sql_get_user_default_key), &_session->get_user_default_key, NULL);
    4.54 @@ -1120,6 +1141,10 @@
    4.55              (int)strlen(sql_update_person), &_session->update_person, NULL);
    4.56      assert(int_result == SQLITE_OK);
    4.57  
    4.58 +    int_result = sqlite3_prepare_v2(_session->db, sql_delete_person,
    4.59 +            (int)strlen(sql_delete_person), &_session->delete_person, NULL);
    4.60 +    assert(int_result == SQLITE_OK);
    4.61 +
    4.62      int_result = sqlite3_prepare_v2(_session->db, sql_exists_person,
    4.63              (int)strlen(sql_exists_person), &_session->exists_person, NULL);
    4.64      assert(int_result == SQLITE_OK);
    4.65 @@ -1191,6 +1216,10 @@
    4.66              (int)strlen(sql_get_trust), &_session->get_trust, NULL);
    4.67      assert(int_result == SQLITE_OK);
    4.68  
    4.69 +    int_result = sqlite3_prepare_v2(_session->db, sql_get_trust_by_userid,
    4.70 +            (int)strlen(sql_get_trust_by_userid), &_session->get_trust_by_userid, NULL);
    4.71 +    assert(int_result == SQLITE_OK);
    4.72 +
    4.73      int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
    4.74              (int)strlen(sql_least_trust), &_session->least_trust, NULL);
    4.75      assert(int_result == SQLITE_OK);
    4.76 @@ -1378,6 +1407,8 @@
    4.77                  sqlite3_finalize(session->get_identity_without_trust_check);
    4.78              if (session->get_identities_by_address)
    4.79                  sqlite3_finalize(session->get_identities_by_address);            
    4.80 +            if (session->get_identities_by_userid)
    4.81 +                sqlite3_finalize(session->get_identities_by_userid);                            
    4.82              if (session->get_user_default_key)
    4.83                  sqlite3_finalize(session->get_user_default_key);    
    4.84              if (session->get_default_own_userid)
    4.85 @@ -1392,6 +1423,8 @@
    4.86                  sqlite3_finalize(session->remove_fpr_as_default);            
    4.87              if (session->set_person)
    4.88                  sqlite3_finalize(session->set_person);
    4.89 +            if (session->delete_person)
    4.90 +                sqlite3_finalize(session->delete_person);                
    4.91              if (session->set_as_pep_user)
    4.92                  sqlite3_finalize(session->set_as_pep_user);
    4.93              if (session->is_pep_user)
    4.94 @@ -1426,6 +1459,8 @@
    4.95                  sqlite3_finalize(session->update_trust_for_fpr);
    4.96              if (session->get_trust)
    4.97                  sqlite3_finalize(session->get_trust);
    4.98 +            if (session->get_trust_by_userid)
    4.99 +                sqlite3_finalize(session->get_trust_by_userid);                
   4.100              if (session->least_trust)
   4.101                  sqlite3_finalize(session->least_trust);
   4.102              if (session->mark_compromised)
   4.103 @@ -2117,6 +2152,76 @@
   4.104      return PEP_STATUS_OK;
   4.105  }
   4.106  
   4.107 +PEP_STATUS get_identities_by_userid(
   4.108 +        PEP_SESSION session,
   4.109 +        const char *user_id,
   4.110 +        identity_list** id_list
   4.111 +    )
   4.112 +{
   4.113 +    pEp_identity* ident;
   4.114 +
   4.115 +    assert(session);
   4.116 +    assert(user_id);
   4.117 +    assert(user_id[0]);
   4.118 +    assert(id_list);
   4.119 +
   4.120 +    if (!(session && user_id && user_id[0] && id_list))
   4.121 +        return PEP_ILLEGAL_VALUE;
   4.122 +
   4.123 +    *id_list = NULL;
   4.124 +    identity_list* ident_list = NULL;
   4.125 +
   4.126 +    sqlite3_reset(session->get_identities_by_userid);
   4.127 +    sqlite3_bind_text(session->get_identities_by_userid, 1, user_id, -1, SQLITE_STATIC);
   4.128 +    int result;
   4.129 +
   4.130 +    while ((result = sqlite3_step(session->get_identities_by_userid)) == SQLITE_ROW) {
   4.131 +        ident = new_identity(
   4.132 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 0),
   4.133 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 1),
   4.134 +                user_id,
   4.135 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 2)
   4.136 +                );
   4.137 +        assert(ident);
   4.138 +        if (ident == NULL) {
   4.139 +            sqlite3_reset(session->get_identities_by_userid);
   4.140 +            return PEP_OUT_OF_MEMORY;
   4.141 +        }
   4.142 +
   4.143 +        ident->comm_type = PEP_ct_unknown;
   4.144 +        
   4.145 +        const char* const _lang = (const char *)
   4.146 +            sqlite3_column_text(session->get_identities_by_userid, 3);
   4.147 +        if (_lang && _lang[0]) {
   4.148 +            assert(_lang[0] >= 'a' && _lang[0] <= 'z');
   4.149 +            assert(_lang[1] >= 'a' && _lang[1] <= 'z');
   4.150 +            assert(_lang[2] == 0);
   4.151 +            ident->lang[0] = _lang[0];
   4.152 +            ident->lang[1] = _lang[1];
   4.153 +            ident->lang[2] = 0;
   4.154 +        }
   4.155 +        ident->flags = (unsigned int)
   4.156 +            sqlite3_column_int(session->get_identities_by_userid, 4);
   4.157 +        ident->me = (unsigned int)
   4.158 +            sqlite3_column_int(session->get_identities_by_userid, 5);
   4.159 +    
   4.160 +        if (ident_list)
   4.161 +            identity_list_add(ident_list, ident);
   4.162 +        else
   4.163 +            ident_list = new_identity_list(ident);
   4.164 +    }
   4.165 +
   4.166 +    sqlite3_reset(session->get_identities_by_userid);
   4.167 +    
   4.168 +    *id_list = ident_list;
   4.169 +    
   4.170 +    if (!ident_list)
   4.171 +        return PEP_CANNOT_FIND_IDENTITY;
   4.172 +    
   4.173 +    return PEP_STATUS_OK;
   4.174 +}
   4.175 +
   4.176 +
   4.177  PEP_STATUS exists_identity_entry(PEP_SESSION session, pEp_identity* identity,
   4.178                                   bool* exists) {
   4.179      assert(session);
   4.180 @@ -2548,6 +2653,27 @@
   4.181      return status;
   4.182  }
   4.183  
   4.184 +PEP_STATUS delete_person(PEP_SESSION session, const char* user_id) {
   4.185 +    assert(session);
   4.186 +    assert(!EMPTYSTR(user_id));        
   4.187 +    if (!session || EMPTYSTR(user_id))
   4.188 +        return PEP_ILLEGAL_VALUE;
   4.189 +        
   4.190 +    PEP_STATUS status = PEP_STATUS_OK;
   4.191 +    
   4.192 +    sqlite3_reset(session->delete_person);
   4.193 +    sqlite3_bind_text(session->delete_person, 1, user_id, -1,
   4.194 +                      SQLITE_STATIC);
   4.195 +                      
   4.196 +    int result = sqlite3_step(session->delete_person);
   4.197 +    
   4.198 +    if (result != SQLITE_DONE)
   4.199 +        status = PEP_UNKNOWN_ERROR;
   4.200 +        
   4.201 +    sqlite3_reset(session->delete_person);
   4.202 +    return status;
   4.203 +}
   4.204 +
   4.205  DYNAMIC_API PEP_STATUS is_pep_user(PEP_SESSION session, pEp_identity *identity, bool* is_pep)
   4.206  {
   4.207      assert(session);
   4.208 @@ -2815,9 +2941,327 @@
   4.209      return PEP_STATUS_OK;
   4.210  }
   4.211  
   4.212 +PEP_STATUS get_trust_by_userid(PEP_SESSION session, const char* user_id,
   4.213 +                                           labeled_int_list_t** trust_list)
   4.214 +{
   4.215 +    int result;
   4.216 +
   4.217 +    if (!(session && user_id && user_id[0]))
   4.218 +        return PEP_ILLEGAL_VALUE;
   4.219 +
   4.220 +    *trust_list = NULL;
   4.221 +    labeled_int_list_t* t_list = NULL;
   4.222 +
   4.223 +    sqlite3_reset(session->get_trust_by_userid);
   4.224 +    sqlite3_bind_text(session->get_trust_by_userid, 1, user_id, -1, SQLITE_STATIC);
   4.225 +
   4.226 +    while ((result = sqlite3_step(session->get_trust_by_userid)) == SQLITE_ROW) {
   4.227 +        if (!t_list)
   4.228 +            t_list = new_labeled_int_list(sqlite3_column_int(session->get_trust_by_userid, 1),
   4.229 +                                         (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
   4.230 +        else
   4.231 +            labeled_int_list_add(t_list, sqlite3_column_int(session->get_trust_by_userid, 1),
   4.232 +                                (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
   4.233 +    }
   4.234 +
   4.235 +    sqlite3_reset(session->get_trust_by_userid);
   4.236 +
   4.237 +    *trust_list = t_list;
   4.238 +        
   4.239 +    return PEP_STATUS_OK;
   4.240 +}
   4.241 +
   4.242 +PEP_comm_type reconcile_trust(PEP_comm_type t_old, PEP_comm_type t_new) {
   4.243 +    switch (t_new) {
   4.244 +        case PEP_ct_mistrusted:
   4.245 +        case PEP_ct_key_revoked:
   4.246 +        case PEP_ct_compromised:
   4.247 +        case PEP_ct_key_b0rken:
   4.248 +            return t_new;
   4.249 +        default:
   4.250 +            break;
   4.251 +    }
   4.252 +    switch (t_old) {
   4.253 +        case PEP_ct_mistrusted:
   4.254 +        case PEP_ct_key_revoked:
   4.255 +        case PEP_ct_compromised:
   4.256 +        case PEP_ct_key_b0rken:
   4.257 +            return t_old;
   4.258 +        default:
   4.259 +            break;
   4.260 +    }
   4.261 +    if (t_old < PEP_ct_strong_but_unconfirmed && t_new >= PEP_ct_strong_but_unconfirmed)
   4.262 +        return t_new;
   4.263 +    
   4.264 +    bool confirmed = (t_old & PEP_ct_confirmed) || (t_new & PEP_ct_confirmed);
   4.265 +    PEP_comm_type result = _MAX(t_old, t_new);
   4.266 +    if (confirmed)
   4.267 +        result |= PEP_ct_confirmed;
   4.268 +    return result;
   4.269 +}
   4.270 +
   4.271 +PEP_STATUS reconcile_pEp_status(PEP_SESSION session, const char* old_uid, 
   4.272 +                                const char* new_uid) {
   4.273 +    PEP_STATUS status = PEP_STATUS_OK;
   4.274 +    // We'll make this easy - if the old one has a pEp status, we set no matter
   4.275 +    // what.
   4.276 +    pEp_identity* ident = new_identity(NULL, NULL, old_uid, NULL);
   4.277 +    bool is_pEp_peep = false;
   4.278 +    status = is_pep_user(session, ident, &is_pEp_peep);
   4.279 +    if (is_pEp_peep) {
   4.280 +        free(ident->user_id);
   4.281 +        ident->user_id = strdup(new_uid);
   4.282 +        if (!ident->user_id) {
   4.283 +            status = PEP_OUT_OF_MEMORY;
   4.284 +            goto pEp_free;
   4.285 +        }
   4.286 +        status = set_as_pep_user(session, ident);
   4.287 +    }
   4.288 +pEp_free:
   4.289 +    free_identity(ident);
   4.290 +    return status;
   4.291 +}
   4.292 +
   4.293 +const char* reconcile_usernames(const char* old_name, const char* new_name, 
   4.294 +                                const char* address) {
   4.295 +    if (EMPTYSTR(old_name)) {
   4.296 +        if (EMPTYSTR(new_name))
   4.297 +            return address;
   4.298 +        else
   4.299 +            return new_name;
   4.300 +    }
   4.301 +    if (EMPTYSTR(new_name))
   4.302 +        return old_name;        
   4.303 +    if (strcmp(new_name, address) == 0)
   4.304 +        return old_name;
   4.305 +    return new_name;        
   4.306 +}
   4.307 +
   4.308 +PEP_STATUS reconcile_default_keys(PEP_SESSION session, pEp_identity* old_ident,
   4.309 +                                  pEp_identity* new_ident) {
   4.310 +    PEP_STATUS status = PEP_STATUS_OK;
   4.311 +                                      
   4.312 +    const char* old_fpr = old_ident->fpr;
   4.313 +    const char* new_fpr = new_ident->fpr;
   4.314 +    if (!old_fpr)
   4.315 +        return status;
   4.316 +
   4.317 +    PEP_comm_type old_ct = old_ident->comm_type;    
   4.318 +    PEP_comm_type new_ct = new_ident->comm_type;
   4.319 +    
   4.320 +    if (!new_fpr) {
   4.321 +        new_ident->fpr = strdup(old_fpr);
   4.322 +        if (!new_ident->fpr)
   4.323 +            status = PEP_OUT_OF_MEMORY;
   4.324 +        else    
   4.325 +            new_ident->comm_type = old_ct;
   4.326 +        return status;
   4.327 +    }        
   4.328 +    
   4.329 +    if (strcmp(old_fpr, new_fpr) == 0) {
   4.330 +        new_ident->comm_type = reconcile_trust(old_ct, new_ct);
   4.331 +        return status;
   4.332 +    }
   4.333 +    
   4.334 +    bool old_confirmed = old_ct & PEP_ct_confirmed;
   4.335 +    bool new_confirmed = new_ct & PEP_ct_confirmed;
   4.336 +    
   4.337 +    if (new_confirmed)
   4.338 +        return status;
   4.339 +    else if (old_confirmed) {
   4.340 +        free(new_ident->fpr);
   4.341 +        new_ident->fpr = strdup(old_fpr);
   4.342 +        if (!new_ident->fpr)
   4.343 +            status = PEP_OUT_OF_MEMORY;
   4.344 +        else    
   4.345 +            new_ident->comm_type = old_ct;
   4.346 +        return status;
   4.347 +    }
   4.348 +    
   4.349 +    if (old_ct > new_ct) {
   4.350 +        free(new_ident->fpr);
   4.351 +        new_ident->fpr = strdup(old_fpr);
   4.352 +        if (!new_ident->fpr)
   4.353 +            status = PEP_OUT_OF_MEMORY;
   4.354 +        else    
   4.355 +            new_ident->comm_type = old_ct;
   4.356 +    }
   4.357 +    return status;
   4.358 +}
   4.359 +
   4.360 +void reconcile_language(pEp_identity* old_ident,
   4.361 +                        pEp_identity* new_ident) {
   4.362 +    if (new_ident->lang[0] == 0) {
   4.363 +        if (old_ident->lang[0] != 0) {
   4.364 +            new_ident->lang[0] = old_ident->lang[0];
   4.365 +            new_ident->lang[1] = old_ident->lang[1];
   4.366 +            new_ident->lang[2] = old_ident->lang[2];
   4.367 +        }
   4.368 +    }
   4.369 +}
   4.370 +
   4.371 +// ONLY CALL THIS IF BOTH IDs ARE IN THE PERSON DB, FOOL! </Mr_T>
   4.372 +PEP_STATUS merge_records(PEP_SESSION session, const char* old_uid,
   4.373 +                         const char* new_uid) {
   4.374 +    PEP_STATUS status = PEP_STATUS_OK;
   4.375 +    
   4.376 +    status = reconcile_pEp_status(session, old_uid, new_uid);
   4.377 +    if (status != PEP_STATUS_OK)
   4.378 +        goto pEp_free;
   4.379 +        
   4.380 +    pEp_identity* new_ident = NULL;
   4.381 +    identity_list* old_identities = NULL;
   4.382 +    labeled_int_list_t* trust_list = NULL;
   4.383 +    stringlist_t* touched_keys = new_stringlist(NULL);
   4.384 +    char* main_user_fpr = NULL;
   4.385 +                
   4.386 +    bool new_is_pep = false;
   4.387 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
   4.388 +    status = is_pep_user(session, new_ident, &new_is_pep);
   4.389 +    if (status != PEP_STATUS_OK)
   4.390 +        goto pEp_free;
   4.391 +    free(new_ident);
   4.392 +    new_ident = NULL;
   4.393 +        
   4.394 +    status = get_identities_by_userid(session, old_uid, &old_identities);
   4.395 +    if (status == PEP_STATUS_OK && old_identities) {
   4.396 +        identity_list* curr_old = old_identities;
   4.397 +        for (; curr_old && curr_old->ident; curr_old = curr_old->next) {
   4.398 +            pEp_identity* old_ident = curr_old->ident;
   4.399 +            const char* address = old_ident->address;
   4.400 +            status = get_identity(session, address, new_uid, &new_ident);
   4.401 +            if (status == PEP_CANNOT_FIND_IDENTITY) {
   4.402 +                // No new identity matching the old one, so we just set one w. new user_id
   4.403 +                free(old_ident->user_id);
   4.404 +                old_ident->user_id = strdup(new_uid);
   4.405 +                if (!old_ident->user_id) {
   4.406 +                    status = PEP_OUT_OF_MEMORY;
   4.407 +                    goto pEp_free;
   4.408 +                }
   4.409 +                if (new_is_pep) {
   4.410 +                    PEP_comm_type confirmed_bit = old_ident->comm_type & PEP_ct_confirmed;
   4.411 +                    if ((old_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
   4.412 +                        old_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
   4.413 +                }
   4.414 +                
   4.415 +                status = set_identity(session, old_ident);
   4.416 +                if (status != PEP_STATUS_OK)
   4.417 +                    goto pEp_free;
   4.418 +            }
   4.419 +            else if (status != PEP_STATUS_OK)
   4.420 +                goto pEp_free;
   4.421 +            else {
   4.422 +                // Ok, so we have two idents which might be in conflict. Have to merge them.
   4.423 +                const char* username = reconcile_usernames(old_ident->username,
   4.424 +                                                           new_ident->username,
   4.425 +                                                           address);
   4.426 +                                                           
   4.427 +                if (!new_ident->username || strcmp(username, new_ident->username) != 0) {
   4.428 +                    free(new_ident->username);
   4.429 +                    new_ident->username = strdup(username);
   4.430 +                    if (!new_ident->username) {
   4.431 +                        status = PEP_OUT_OF_MEMORY;
   4.432 +                        goto pEp_free;
   4.433 +                    }
   4.434 +                }
   4.435 +        
   4.436 +                // Reconcile default keys if they differ, trust if they don't
   4.437 +                status = reconcile_default_keys(session, old_ident, new_ident);
   4.438 +                if (status != PEP_STATUS_OK)
   4.439 +                    goto pEp_free;
   4.440 +                    
   4.441 +                // reconcile languages
   4.442 +                reconcile_language(old_ident, new_ident);
   4.443 +
   4.444 +                // reconcile flags - FIXME - is this right?
   4.445 +                new_ident->flags |= old_ident->flags;
   4.446 +                
   4.447 +                // NOTE: In principle, this is only called from update_identity,
   4.448 +                // which would never have me flags set. So I am ignoring them here.
   4.449 +                // if this function is ever USED for that, though, you'll have
   4.450 +                // to go through making sure that the user ids are appropriately
   4.451 +                // aliased, etc. So be careful.
   4.452 +                
   4.453 +                // Set the reconciled record
   4.454 +                    
   4.455 +                status = set_identity(session, new_ident);
   4.456 +                if (status != PEP_STATUS_OK)
   4.457 +                    goto pEp_free;
   4.458 +
   4.459 +                if (new_ident->fpr)
   4.460 +                    stringlist_add(touched_keys, new_ident->fpr);
   4.461 +                        
   4.462 +                free_identity(new_ident);
   4.463 +                new_ident = NULL;    
   4.464 +            }
   4.465 +        }
   4.466 +    }
   4.467 +    // otherwise, no need to reconcile identity records. But maybe trust...    
   4.468 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
   4.469 +    if (!new_ident) {
   4.470 +        status = PEP_OUT_OF_MEMORY;
   4.471 +        goto pEp_free;
   4.472 +    }
   4.473 +    status = get_trust_by_userid(session, old_uid, &trust_list);
   4.474 +
   4.475 +    labeled_int_list_t* trust_curr = trust_list;
   4.476 +    for (; trust_curr && trust_curr->label; trust_curr = trust_curr->next) {
   4.477 +        const char* curr_fpr = trust_curr->label;
   4.478 +        new_ident->fpr = strdup(curr_fpr); 
   4.479 +        status = get_trust(session, new_ident);
   4.480 +        switch (status) {
   4.481 +            case PEP_STATUS_OK:
   4.482 +                new_ident->comm_type = reconcile_trust(trust_curr->value,
   4.483 +                                                       new_ident->comm_type);
   4.484 +                break;
   4.485 +            case PEP_CANNOT_FIND_IDENTITY:
   4.486 +                new_ident->comm_type = trust_curr->value;
   4.487 +                break;
   4.488 +            default:
   4.489 +                goto pEp_free;
   4.490 +        }
   4.491 +        new_ident->comm_type = reconcile_trust(trust_curr->value,
   4.492 +                                               new_ident->comm_type);
   4.493 +        if (new_is_pep) {
   4.494 +            PEP_comm_type confirmed_bit = new_ident->comm_type & PEP_ct_confirmed;
   4.495 +            if ((new_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
   4.496 +                new_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
   4.497 +        }
   4.498 +
   4.499 +        status = set_trust(session, new_ident);
   4.500 +        if (status != PEP_STATUS_OK) {
   4.501 +            goto pEp_free;
   4.502 +        }                  
   4.503 +                              
   4.504 +        free(new_ident->fpr);
   4.505 +        new_ident->fpr = NULL;
   4.506 +        new_ident->comm_type = 0;
   4.507 +    }
   4.508 +
   4.509 +    // reconcile the default keys if the new id doesn't have one?
   4.510 +    status = get_main_user_fpr(session, new_uid, &main_user_fpr);
   4.511 +    if (status == PEP_KEY_NOT_FOUND || (status == PEP_STATUS_OK && !main_user_fpr)) {
   4.512 +        status = get_main_user_fpr(session, old_uid, &main_user_fpr);
   4.513 +        if (status == PEP_STATUS_OK && main_user_fpr)
   4.514 +            status = replace_main_user_fpr(session, new_uid, main_user_fpr);
   4.515 +        if (status != PEP_STATUS_OK)
   4.516 +            goto pEp_free;
   4.517 +    }
   4.518 +    
   4.519 +    // delete the old user
   4.520 +    status = delete_person(session, old_uid);
   4.521 +    
   4.522 +pEp_free:
   4.523 +    free_identity(new_ident);
   4.524 +    free_identity_list(old_identities);
   4.525 +    free_labeled_int_list(trust_list);
   4.526 +    free_stringlist(touched_keys);
   4.527 +    free(main_user_fpr);
   4.528 +    return status;
   4.529 +}
   4.530  
   4.531  PEP_STATUS replace_userid(PEP_SESSION session, const char* old_uid,
   4.532 -                              const char* new_uid) {
   4.533 +                          const char* new_uid) {
   4.534      assert(session);
   4.535      assert(old_uid);
   4.536      assert(new_uid);
   4.537 @@ -2825,6 +3269,15 @@
   4.538      if (!session || !old_uid || !new_uid)
   4.539          return PEP_ILLEGAL_VALUE;
   4.540  
   4.541 +    pEp_identity* temp_ident = new_identity(NULL, NULL, new_uid, NULL);
   4.542 +    bool new_exists = false;
   4.543 +    PEP_STATUS status = exists_person(session, temp_ident, &new_exists);
   4.544 +    free_identity(temp_ident);
   4.545 +    if (status != PEP_STATUS_OK) // DB error
   4.546 +        return status;
   4.547 +        
   4.548 +    if (new_exists)
   4.549 +        return merge_records(session, old_uid, new_uid);
   4.550  
   4.551      int result;
   4.552  
   4.553 @@ -2992,8 +3445,8 @@
   4.554          return PEP_ILLEGAL_VALUE;
   4.555  
   4.556      identity->comm_type = PEP_ct_unknown;
   4.557 -
   4.558      sqlite3_reset(session->get_trust);
   4.559 +
   4.560      sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
   4.561              SQLITE_STATIC);
   4.562      sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
   4.563 @@ -3015,6 +3468,7 @@
   4.564      return status;
   4.565  }
   4.566  
   4.567 +
   4.568  DYNAMIC_API PEP_STATUS least_trust(
   4.569          PEP_SESSION session,
   4.570          const char *fpr,
     5.1 --- a/src/pEpEngine.h	Wed Oct 03 16:39:05 2018 +0200
     5.2 +++ b/src/pEpEngine.h	Fri Oct 05 08:51:46 2018 +0200
     5.3 @@ -13,7 +13,8 @@
     5.4  
     5.5  #include "dynamic_api.h"
     5.6  #include "stringlist.h"
     5.7 -#include "stringpair.h"    
     5.8 +#include "stringpair.h"
     5.9 +#include "labeled_int_list.h"    
    5.10  #include "timestamp.h"
    5.11  
    5.12  #define PEP_VERSION "2.0" // protocol version
    5.13 @@ -1280,6 +1281,10 @@
    5.14  
    5.15  PEP_STATUS set_pgp_keypair(PEP_SESSION session, const char* fpr);
    5.16  
    5.17 +// exposed for testing
    5.18 +PEP_STATUS set_person(PEP_SESSION session, pEp_identity* identity,
    5.19 +                      bool guard_transaction);
    5.20 +
    5.21  #ifdef __cplusplus
    5.22  }
    5.23  #endif
     6.1 --- a/src/pEp_internal.h	Wed Oct 03 16:39:05 2018 +0200
     6.2 +++ b/src/pEp_internal.h	Fri Oct 05 08:51:46 2018 +0200
     6.3 @@ -131,6 +131,7 @@
     6.4      sqlite3_stmt *get_identity;
     6.5      sqlite3_stmt *get_identity_without_trust_check;
     6.6      sqlite3_stmt *get_identities_by_address;
     6.7 +    sqlite3_stmt *get_identities_by_userid;
     6.8      sqlite3_stmt *replace_identities_fpr;
     6.9      sqlite3_stmt *replace_main_user_fpr;
    6.10      sqlite3_stmt *get_main_user_fpr;
    6.11 @@ -138,6 +139,7 @@
    6.12      sqlite3_stmt *remove_fpr_as_default;
    6.13      sqlite3_stmt *set_person;
    6.14      sqlite3_stmt *update_person;
    6.15 +    sqlite3_stmt *delete_person;
    6.16      sqlite3_stmt *exists_person;    
    6.17      sqlite3_stmt *set_as_pep_user;
    6.18      sqlite3_stmt *is_pep_user;
    6.19 @@ -155,6 +157,7 @@
    6.20      sqlite3_stmt *exists_trust_entry;
    6.21      sqlite3_stmt *update_trust_for_fpr;
    6.22      sqlite3_stmt *get_trust;
    6.23 +    sqlite3_stmt *get_trust_by_userid;
    6.24      sqlite3_stmt *least_trust;
    6.25      sqlite3_stmt *mark_compromised;
    6.26      sqlite3_stmt *reset_trust;
     7.1 --- a/src/stringlist.c	Wed Oct 03 16:39:05 2018 +0200
     7.2 +++ b/src/stringlist.c	Fri Oct 05 08:51:46 2018 +0200
     7.3 @@ -113,6 +113,17 @@
     7.4      return list_curr->next;
     7.5  }
     7.6  
     7.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value) {
     7.8 +    if (!head || !value || !head->value)
     7.9 +        return NULL;
    7.10 +    stringlist_t* retval = head;
    7.11 +    for (; retval ; retval = retval->next) {
    7.12 +        if (strcmp(retval->value, value) == 0)
    7.13 +            break;
    7.14 +    }
    7.15 +    return retval;
    7.16 +}
    7.17 +
    7.18  DYNAMIC_API stringlist_t *stringlist_add_unique(
    7.19          stringlist_t *stringlist,
    7.20          const char *value
     8.1 --- a/src/stringlist.h	Wed Oct 03 16:39:05 2018 +0200
     8.2 +++ b/src/stringlist.h	Fri Oct 05 08:51:46 2018 +0200
     8.3 @@ -133,6 +133,7 @@
     8.4  
     8.5  DYNAMIC_API void free_stringlist(stringlist_t *stringlist);
     8.6  
     8.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value);
     8.8  
     8.9  #ifdef __cplusplus
    8.10  }
     9.1 --- a/test/convenience_scripts/keygen_for_test.py	Wed Oct 03 16:39:05 2018 +0200
     9.2 +++ b/test/convenience_scripts/keygen_for_test.py	Fri Oct 05 08:51:46 2018 +0200
     9.3 @@ -1,5 +1,5 @@
     9.4  import argparse
     9.5 -import gnupg
     9.6 +from pretty_bad_protocol import gnupg
     9.7  import os
     9.8  import subprocess
     9.9  
    9.10 @@ -19,10 +19,11 @@
    9.11  homedir = os.path.join(os.path.expanduser('~'),"gnupg")
    9.12  print("GNUPGHOME=" + homedir + "\n")
    9.13  
    9.14 +
    9.15  try:
    9.16 -    gpg = gnupg.GPG(gnupghome=homedir) 
    9.17 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', gnupghome=homedir) 
    9.18  except TypeError:
    9.19 -    gpg = gnupg.GPG(homedir=homedir)
    9.20 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', homedir=homedir)
    9.21  
    9.22  name = args.real_name_prefix
    9.23  email = args.email_address_prefix
    9.24 @@ -61,7 +62,7 @@
    9.25              email = e_split[0] + "_" + i_str + "@" + e_split[1]
    9.26  
    9.27      print("Generating key data for " + name + " " + email + "\n")
    9.28 -    input_data = gpg.gen_key_input(key_type="RSA", key_length=2048, subkey_type="RSA", subkey_length=2048, expire_date=0, name_real=name, name_email=email, password="")
    9.29 +    input_data = gpg.gen_key_input(key_type="RSA", key_length=2048, expire_date=0, name_real=name, name_email=email)
    9.30      if not input_data:
    9.31          raise Exception('Input data not created in iteration ' + str(i))
    9.32      
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/test/include/UserIdCollisionTests.h	Fri Oct 05 08:51:46 2018 +0200
    10.3 @@ -0,0 +1,112 @@
    10.4 +// This file is under GNU General Public License 3.0
    10.5 +// see LICENSE.txt
    10.6 +
    10.7 +#ifndef USER_ID_COLLISION_H
    10.8 +#define USER_ID_COLLISION_H
    10.9 +
   10.10 +#include <string>
   10.11 +#include "EngineTestIndividualSuite.h"
   10.12 +
   10.13 +using namespace std;
   10.14 +
   10.15 +class UserIdCollisionTests : public EngineTestIndividualSuite {
   10.16 +    public:
   10.17 +        UserIdCollisionTests(string test_suite, string test_home_dir);
   10.18 +    
   10.19 +    protected:
   10.20 +        void setup();
   10.21 +        void tear_down();
   10.22 +        
   10.23 +        // own user
   10.24 +        pEp_identity* user_alice;
   10.25 +        // real ID, only minimal info w/ username
   10.26 +        pEp_identity* real_alex;
   10.27 +        // tofu ID, only minimal info w/ username        
   10.28 +        pEp_identity* tofu_alex;
   10.29 +        // real ID, only minimal info w/o username
   10.30 +        pEp_identity* real_alex_0;
   10.31 +        // tofu ID, only minimal info w/o username
   10.32 +        pEp_identity* tofu_alex_0;
   10.33 +        // real ID, only minimal info w/o username
   10.34 +        pEp_identity* real_alex_1;
   10.35 +        // tofu ID, only minimal info w/o username
   10.36 +        pEp_identity* tofu_alex_1;
   10.37 +        // real ID, various kinds of info
   10.38 +        pEp_identity* real_alex_2;
   10.39 +        // tofu ID, various kinds of info
   10.40 +        pEp_identity* tofu_alex_2;
   10.41 +        // real ID, various kinds of info
   10.42 +        pEp_identity* real_alex_3;
   10.43 +        // tofu ID, various kinds of info        
   10.44 +        pEp_identity* tofu_alex_3;
   10.45 +        // tofu ID, various kinds of info        
   10.46 +        pEp_identity* tofu_alex_4;
   10.47 +        // real ID, various kinds of info
   10.48 +        pEp_identity* real_alex_4;
   10.49 +        // tofu ID, various kinds of info        
   10.50 +        pEp_identity* tofu_alex_5;
   10.51 +        // real ID, various kinds of info
   10.52 +        pEp_identity* real_alex_5;
   10.53 +        // tofu ID, various kinds of info        
   10.54 +        pEp_identity* tofu_alex_6a;
   10.55 +        // real ID, various kinds of info
   10.56 +        pEp_identity* real_alex_6a;
   10.57 +        // tofu ID, various kinds of info        
   10.58 +        pEp_identity* tofu_alex_6b;
   10.59 +        // real ID, various kinds of info
   10.60 +        pEp_identity* real_alex_6b;
   10.61 +        // tofu ID, various kinds of info        
   10.62 +        pEp_identity* tofu_alex_6c;
   10.63 +        // real ID, various kinds of info
   10.64 +        pEp_identity* real_alex_6c;
   10.65 +        // tofu ID, various kinds of info        
   10.66 +        pEp_identity* tofu_alex_6d;
   10.67 +        // real ID, various kinds of info
   10.68 +        pEp_identity* real_alex_6d;
   10.69 +        
   10.70 +        const char* const alice_keyfile = "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc";
   10.71 +        const char* const alice_keyid = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   10.72 +        const char* const alice_email = "pep.test.alice@pep-project.org";
   10.73 +        const char* const alex_keyfile = "test_keys/pub/pep.test.alexander-0x26B54E4E_pub.asc";
   10.74 +        const char* const alex_keyid = "3AD9F60FAEB22675DB873A1362D6981326B54E4E";        
   10.75 +        const char* const alex_email = "pep.test.alexander@peptest.ch";        
   10.76 +        const char* const alex0_keyfile = "test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc";
   10.77 +        const char* const alex0_keyid = "F4598A17D4690EB3B5B0F6A344F04E963B7302DB";
   10.78 +        const char* const alex0_email = "pep.test.alexander0@darthmama.org";                
   10.79 +        const char* const alex1_keyfile = "test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc";
   10.80 +        const char* const alex1_keyid = "59AF4C51492283522F6904531C09730A541260F6";        
   10.81 +        const char* const alex1_email = "pep.test.alexander1@darthmama.org";                                
   10.82 +        const char* const alex2_keyfile = "test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc";
   10.83 +        const char* const alex2_keyid = "46A994F19077C05610870273C4B8AB0BA6512F30";
   10.84 +        const char* const alex2_email = "pep.test.alexander2@darthmama.org";                                
   10.85 +        const char* const alex3_keyfile = "test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc";
   10.86 +        const char* const alex3_keyid = "5F7076BBD92E14EA49F0DF7C2CE49419724B3975";        
   10.87 +        const char* const alex3_email = "pep.test.alexander3@darthmama.org";                
   10.88 +        const char* const alex4_keyfile = "test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc";
   10.89 +        const char* const alex4_keyid = "E95FFF95B8E2FDD4A12C3374395F1485844B9DCF";        
   10.90 +        const char* const alex4_email = "pep.test.alexander4@darthmama.org";                
   10.91 +        const char* const alex5_keyfile = "test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc";
   10.92 +        const char* const alex5_keyid = "58BCC2BF2AE1E3C4FBEAB89AD7838ACA0773CD29";        
   10.93 +        const char* const alex5_email = "pep.test.alexander5@darthmama.org";                
   10.94 +        const char* const alex6a_keyfile = "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc";
   10.95 +        const char* const alex6a_keyid = "B4CE2F6947B6947C500F0687AEFDE530BDA17020";        
   10.96 +        const char* const alex6_email = "pep.test.alexander6@darthmama.org";                
   10.97 +        const char* const alex6b_keyfile = "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc";
   10.98 +        const char* const alex6b_keyid = "2E21325D202A44BFD9C607FCF095B202503B14D8";        
   10.99 +        const char* const alex6c_keyfile = "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc";
  10.100 +        const char* const alex6c_keyid = "3C1E713D8519D7F907E3142D179EAA24A216E95A";        
  10.101 +        const char* const alex6d_keyfile = "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc";
  10.102 +        const char* const alex6d_keyid = "74D79B4496E289BD8A71B70BA8E2C4530019697D";        
  10.103 +        
  10.104 +    private:
  10.105 +        void simple_tofu_collision();        
  10.106 +        void simple_tofu_collision_different_usernames();
  10.107 +        void tofu_collision_two_tofus();        
  10.108 +        void tofu_collision_two_tofus_diff_usernames();
  10.109 +        void real_followed_by_explicit_tofu();
  10.110 +        void merge_records_normal();
  10.111 +        void merge_records_set();
  10.112 +        void merge_records_set_2();
  10.113 +};
  10.114 +
  10.115 +#endif
    11.1 --- a/test/include/test_util.h	Wed Oct 03 16:39:05 2018 +0200
    11.2 +++ b/test/include/test_util.h	Fri Oct 05 08:51:46 2018 +0200
    11.3 @@ -37,6 +37,8 @@
    11.4  // Grabs a new uuid for your randomish string needs.
    11.5  char* get_new_uuid();
    11.6  
    11.7 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename);
    11.8 +
    11.9  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename);
   11.10  
   11.11  int util_delete_filepath(const char *filepath, 
    12.1 --- a/test/src/SuiteMaker.cc	Wed Oct 03 16:39:05 2018 +0200
    12.2 +++ b/test/src/SuiteMaker.cc	Fri Oct 05 08:51:46 2018 +0200
    12.3 @@ -13,6 +13,7 @@
    12.4  
    12.5  // Begin where we generate stuff
    12.6  #include "DecorateTests.h"
    12.7 +#include "UserIdCollisionTests.h"
    12.8  #include "ReencryptPlusExtraKeysTests.h"
    12.9  #include "BlacklistTests.h"
   12.10  #include "AppleMailTests.h"
   12.11 @@ -54,6 +55,7 @@
   12.12  
   12.13  const char* SuiteMaker::all_suites[] = {
   12.14      "DecorateTests",
   12.15 +    "UserIdCollisionTests",
   12.16      "ReencryptPlusExtraKeysTests",
   12.17      "BlacklistTests",
   12.18      "AppleMailTests",
   12.19 @@ -94,11 +96,13 @@
   12.20  };
   12.21  
   12.22  // This file is generated, so magic constants are ok.
   12.23 -int SuiteMaker::num_suites = 38;
   12.24 +int SuiteMaker::num_suites = 39;
   12.25  
   12.26  void SuiteMaker::suitemaker_build(const char* test_class_name, const char* test_home, Test::Suite** test_suite) {
   12.27      if (strcmp(test_class_name, "DecorateTests") == 0)
   12.28          *test_suite = new DecorateTests(test_class_name, test_home);
   12.29 +    else if (strcmp(test_class_name, "UserIdCollisionTests") == 0)
   12.30 +        *test_suite = new UserIdCollisionTests(test_class_name, test_home);
   12.31      else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
   12.32          *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
   12.33      else if (strcmp(test_class_name, "BlacklistTests") == 0)
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/test/src/engine_tests/UserIdCollisionTests.cc	Fri Oct 05 08:51:46 2018 +0200
    13.3 @@ -0,0 +1,336 @@
    13.4 +// This file is under GNU General Public License 3.0
    13.5 +// see LICENSE.txt
    13.6 +
    13.7 +#include <stdlib.h>
    13.8 +#include <string>
    13.9 +#include <cstring>
   13.10 +
   13.11 +#include "pEpEngine.h"
   13.12 +
   13.13 +#include "test_util.h"
   13.14 +#include "EngineTestIndividualSuite.h"
   13.15 +#include "UserIdCollisionTests.h"
   13.16 +
   13.17 +using namespace std;
   13.18 +
   13.19 +UserIdCollisionTests::UserIdCollisionTests(string suitename, string test_home_dir) :
   13.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   13.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision"),
   13.22 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision)));                                                                  
   13.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision_different_usernames"),
   13.24 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision_different_usernames)));                                                                                                                                        
   13.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus"),
   13.26 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus)));                                                                                                                                                                                                              
   13.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames"),
   13.28 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames)));
   13.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::real_followed_by_explicit_tofu"),
   13.30 +                                                                      static_cast<Func>(&UserIdCollisionTests::real_followed_by_explicit_tofu)));
   13.31 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_normal"),
   13.32 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_normal)));                                                                  
   13.33 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set"),
   13.34 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set)));                                                                  
   13.35 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set_2"),
   13.36 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set_2)));                                                                                                                                        
   13.37 +}
   13.38 +
   13.39 +void UserIdCollisionTests::setup() {
   13.40 +    EngineTestIndividualSuite::setup();
   13.41 +    user_alice = new_identity(alice_email, alice_keyid, PEP_OWN_USERID, "Alice from Mel's Diner");
   13.42 +    slurp_and_import_key(session, alice_keyfile);    
   13.43 +    
   13.44 +    real_alex = new_identity(alex_email, alex_keyid, "AlexID", "Alexander the Mediocre");
   13.45 +    
   13.46 +    tofu_alex = new_identity(alex_email, alex_keyid, NULL, NULL);
   13.47 +
   13.48 +    real_alex_0 = new_identity(alex_email, alex_keyid, "Alex0", "Alexander the Mediocre");
   13.49 +    
   13.50 +    tofu_alex_0 = new_identity(alex_email, alex_keyid, NULL, NULL);
   13.51 +    
   13.52 +    real_alex_1 = new_identity(alex1_email, alex_keyid, "Alex1", NULL);
   13.53 +    
   13.54 +    tofu_alex_1 = new_identity(alex1_email, alex1_keyid, NULL, NULL);
   13.55 +
   13.56 +    real_alex_2 = new_identity(alex2_email, alex1_keyid, "Alex2", NULL);
   13.57 +
   13.58 +    tofu_alex_2 = new_identity(alex2_email, alex2_keyid, NULL, NULL);
   13.59 +
   13.60 +    real_alex_3 = new_identity(alex3_email, alex2_keyid, "Alex3", NULL);
   13.61 +
   13.62 +    tofu_alex_3 = new_identity(alex3_email, alex3_keyid, NULL, NULL);
   13.63 +
   13.64 +    real_alex_4 = new_identity(alex4_email, alex3_keyid, "Alex4", NULL);
   13.65 +
   13.66 +    tofu_alex_4 = new_identity(alex4_email, alex4_keyid, NULL, NULL);
   13.67 +
   13.68 +    real_alex_5 = new_identity(alex5_email, alex4_keyid, "Alex5", NULL);
   13.69 +
   13.70 +    tofu_alex_5 = new_identity(alex5_email, alex5_keyid, NULL, NULL);
   13.71 +
   13.72 +    real_alex_6a = new_identity(alex6_email, alex5_keyid, "Alex6", NULL);
   13.73 +
   13.74 +    tofu_alex_6a = new_identity(alex6_email, alex6a_keyid, NULL, NULL);
   13.75 +
   13.76 +    real_alex_6b = new_identity(alex6_email, alex6a_keyid, "Alex6", NULL);
   13.77 +
   13.78 +    tofu_alex_6b = new_identity(alex6_email, alex6b_keyid, NULL, NULL);
   13.79 +
   13.80 +    real_alex_6c = new_identity(alex6_email, alex6b_keyid, "Alex6", NULL);
   13.81 +
   13.82 +    tofu_alex_6c = new_identity(alex6_email, alex6c_keyid, NULL, NULL);
   13.83 +
   13.84 +    real_alex_6d = new_identity(alex6_email, alex6c_keyid, "Alex6", NULL);
   13.85 +
   13.86 +    tofu_alex_6d = new_identity(alex6_email, alex6d_keyid, NULL, NULL);
   13.87 +}
   13.88 +
   13.89 +void UserIdCollisionTests::tear_down() {
   13.90 +    free_identity(real_alex);
   13.91 +    free_identity(real_alex_0);
   13.92 +    free_identity(real_alex_1);
   13.93 +    free_identity(real_alex_2);
   13.94 +    free_identity(real_alex_3);
   13.95 +    free_identity(real_alex_4);
   13.96 +    free_identity(real_alex_5);
   13.97 +    free_identity(real_alex_6a);
   13.98 +    free_identity(real_alex_6b);
   13.99 +    free_identity(real_alex_6c);
  13.100 +    free_identity(real_alex_6d);
  13.101 +    free_identity(tofu_alex);
  13.102 +    free_identity(tofu_alex_0);
  13.103 +    free_identity(tofu_alex_1);
  13.104 +    free_identity(tofu_alex_2);
  13.105 +    free_identity(tofu_alex_3);
  13.106 +    free_identity(tofu_alex_4);
  13.107 +    free_identity(tofu_alex_5);
  13.108 +    free_identity(tofu_alex_6a);
  13.109 +    free_identity(tofu_alex_6b);
  13.110 +    free_identity(tofu_alex_6c);
  13.111 +    free_identity(tofu_alex_6d);
  13.112 +    EngineTestIndividualSuite::tear_down();    
  13.113 +}
  13.114 +
  13.115 +void UserIdCollisionTests::simple_tofu_collision() {
  13.116 +    slurp_and_import_key(session,alex_keyfile);
  13.117 +    tofu_alex->username = strdup("Alexander the Mediocre");
  13.118 +    PEP_STATUS status = update_identity(session, tofu_alex);
  13.119 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.120 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  13.121 +    string tofu_id = string("TOFU_") + alex_email;
  13.122 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  13.123 +    status = update_identity(session, real_alex);
  13.124 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.125 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  13.126 +    bool tofu_still_exists = false;
  13.127 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  13.128 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.129 +    TEST_ASSERT(!tofu_still_exists);    
  13.130 +}
  13.131 +
  13.132 +void UserIdCollisionTests::simple_tofu_collision_different_usernames() {
  13.133 +    slurp_and_import_key(session,alex_keyfile);
  13.134 +    tofu_alex->username = strdup("Alexander Hamilton");
  13.135 +    PEP_STATUS status = update_identity(session, tofu_alex);
  13.136 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.137 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  13.138 +    string tofu_id = string("TOFU_") + alex_email;
  13.139 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  13.140 +    status = update_identity(session, real_alex);
  13.141 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.142 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  13.143 +    bool tofu_still_exists = false;
  13.144 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  13.145 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.146 +    // SHOULD still exist, because we don't replace when usernames differ
  13.147 +    TEST_ASSERT(tofu_still_exists);    
  13.148 +}
  13.149 +
  13.150 +void UserIdCollisionTests::tofu_collision_two_tofus() {
  13.151 +    slurp_and_import_key(session,alex6a_keyfile);
  13.152 +    
  13.153 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  13.154 +    tofu_alex_6b->username = strdup("Alexander Hamilton");
  13.155 +
  13.156 +    tofu_alex_6a->lang[0] = 'j';
  13.157 +    tofu_alex_6a->lang[1] = 'p';
  13.158 +    
  13.159 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  13.160 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.161 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  13.162 +    string tofu_id = string("TOFU_") + alex6_email;
  13.163 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  13.164 +
  13.165 +    // Ok, NOW we put in an explicit TOFU
  13.166 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  13.167 +    status = update_identity(session, tofu_alex_6b);
  13.168 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.169 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  13.170 +    bool tofu_still_exists = false;
  13.171 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  13.172 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.173 +    // SHOULD still exist, because we don't replace when usernames differ
  13.174 +    TEST_ASSERT(tofu_still_exists);    
  13.175 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  13.176 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  13.177 +}
  13.178 +
  13.179 +void UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames() {
  13.180 +    slurp_and_import_key(session,alex6a_keyfile);
  13.181 +    
  13.182 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  13.183 +    tofu_alex_6b->username = strdup("Alexander the Not-Cool-At-All");
  13.184 +
  13.185 +    tofu_alex_6a->lang[0] = 'j';
  13.186 +    tofu_alex_6a->lang[1] = 'p';
  13.187 +    
  13.188 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  13.189 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.190 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  13.191 +    string tofu_id = string("TOFU_") + alex6_email;
  13.192 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  13.193 +
  13.194 +    // Ok, NOW we put in an explicit TOFU
  13.195 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  13.196 +    status = update_identity(session, tofu_alex_6b);
  13.197 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.198 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  13.199 +    bool tofu_still_exists = false;
  13.200 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  13.201 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.202 +    // SHOULD still exist, because we don't replace when usernames differ
  13.203 +    TEST_ASSERT(tofu_still_exists);    
  13.204 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  13.205 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  13.206 +    TEST_ASSERT(strcmp(tofu_alex_6b->username,"Alexander the Not-Cool-At-All") == 0);    
  13.207 +}
  13.208 +
  13.209 +void UserIdCollisionTests::real_followed_by_explicit_tofu() {
  13.210 +    slurp_and_import_key(session,alex_keyfile);
  13.211 +    real_alex->username = strdup("Alexander the Mediocre");
  13.212 +    PEP_STATUS status = update_identity(session, real_alex);
  13.213 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.214 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  13.215 +    string tofu_id = string("TOFU_") + alex_email;
  13.216 +    tofu_alex->username = strdup(real_alex->username);
  13.217 +    tofu_alex->user_id = strdup(tofu_id.c_str());
  13.218 +    status = update_identity(session, tofu_alex);
  13.219 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.220 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, "AlexID") == 0, tofu_alex->user_id);
  13.221 +    bool tofu_still_exists = false;
  13.222 +    free(tofu_alex->user_id);
  13.223 +    tofu_alex->user_id = strdup(tofu_id.c_str());    
  13.224 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  13.225 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.226 +    TEST_ASSERT(!tofu_still_exists);    
  13.227 +}
  13.228 +
  13.229 +void UserIdCollisionTests::merge_records_normal() {
  13.230 +    // Tofu 6a has lots of stuff.
  13.231 +    slurp_and_import_key(session,alex6a_keyfile);    
  13.232 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  13.233 +    tofu_alex_6a->lang[0] = 'e';
  13.234 +    tofu_alex_6a->lang[1] = 's';
  13.235 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  13.236 +    slurp_and_import_key(session,alex6c_keyfile);
  13.237 +    free(tofu_alex_6a->fpr);
  13.238 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  13.239 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;    
  13.240 +    status = set_identity(session, tofu_alex_6a);
  13.241 +    slurp_and_import_key(session,alex6d_keyfile);
  13.242 +    free(tofu_alex_6a->fpr);
  13.243 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  13.244 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed; // ???
  13.245 +    status = set_identity(session, tofu_alex_6a);
  13.246 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  13.247 +    status = update_identity(session, real_alex_6a);                        
  13.248 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.249 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  13.250 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed, tl_ct_string(real_alex_6a->comm_type));
  13.251 +    free(real_alex_6a->fpr);
  13.252 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  13.253 +    status = get_trust(session, real_alex_6a);
  13.254 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.255 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_OpenPGP, tl_ct_string(real_alex_6a->comm_type));    
  13.256 +}
  13.257 +
  13.258 +void UserIdCollisionTests::merge_records_set() {
  13.259 +    // Tofu 6a has lots of stuff.
  13.260 +    slurp_and_import_key(session,alex6a_keyfile);    
  13.261 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  13.262 +    tofu_alex_6a->lang[0] = 'e';
  13.263 +    tofu_alex_6a->lang[1] = 's';
  13.264 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  13.265 +    slurp_and_import_key(session,alex6b_keyfile);        
  13.266 +    slurp_and_import_key(session,alex6c_keyfile);
  13.267 +    free(tofu_alex_6a->fpr);
  13.268 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  13.269 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed;    
  13.270 +    status = set_identity(session, tofu_alex_6a);
  13.271 +    status = set_as_pep_user(session, tofu_alex_6a);     
  13.272 +    slurp_and_import_key(session,alex6d_keyfile);
  13.273 +    free(tofu_alex_6a->fpr);
  13.274 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  13.275 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  13.276 +    status = set_identity(session, tofu_alex_6a);    
  13.277 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  13.278 +    free(real_alex_6a->fpr);
  13.279 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  13.280 +    status = set_person(session, real_alex_6a, true); // NOT identit
  13.281 +    TEST_ASSERT(status == PEP_STATUS_OK);   
  13.282 +    status = update_identity(session, real_alex_6a);
  13.283 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.284 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  13.285 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  13.286 +    bool pEp_peep = false;
  13.287 +    status = is_pep_user(session, real_alex_6a, &pEp_peep);
  13.288 +    TEST_ASSERT(pEp_peep);
  13.289 +    free(real_alex_6a->fpr);
  13.290 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  13.291 +    status = get_trust(session, real_alex_6a);
  13.292 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  13.293 +    free(real_alex_6a->fpr);
  13.294 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  13.295 +    status = get_trust(session, real_alex_6a);
  13.296 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  13.297 +}
  13.298 +
  13.299 +void UserIdCollisionTests::merge_records_set_2() {
  13.300 +    // Tofu 6a has lots of stuff.
  13.301 +    slurp_and_import_key(session,alex6a_keyfile);    
  13.302 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  13.303 +    tofu_alex_6a->lang[0] = 'e';
  13.304 +    tofu_alex_6a->lang[1] = 's';
  13.305 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  13.306 +    slurp_and_import_key(session,alex6b_keyfile);        
  13.307 +    slurp_and_import_key(session,alex6c_keyfile);
  13.308 +    free(tofu_alex_6a->fpr);
  13.309 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  13.310 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP_unconfirmed;    
  13.311 +    status = set_identity(session, tofu_alex_6a);
  13.312 +    slurp_and_import_key(session,alex6d_keyfile);
  13.313 +    free(tofu_alex_6a->fpr);
  13.314 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  13.315 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  13.316 +    status = set_identity(session, tofu_alex_6a);    
  13.317 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  13.318 +    free(real_alex_6a->fpr);
  13.319 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  13.320 +    status = set_person(session, real_alex_6a, true); // NOT identity   
  13.321 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.322 +    status = set_as_pep_user(session, real_alex_6a);     
  13.323 +    TEST_ASSERT(status == PEP_STATUS_OK);    
  13.324 +    status = update_identity(session, real_alex_6a);
  13.325 +    TEST_ASSERT(status == PEP_STATUS_OK);
  13.326 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  13.327 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  13.328 +    bool pEp_peep = false;
  13.329 +    status = is_pep_user(session, real_alex_6a, &pEp_peep);
  13.330 +    TEST_ASSERT(pEp_peep);
  13.331 +    free(real_alex_6a->fpr);
  13.332 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  13.333 +    status = get_trust(session, real_alex_6a);
  13.334 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  13.335 +    free(real_alex_6a->fpr);
  13.336 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  13.337 +    status = get_trust(session, real_alex_6a);
  13.338 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  13.339 +}
    14.1 --- a/test/src/util/test_util.cc	Wed Oct 03 16:39:05 2018 +0200
    14.2 +++ b/test/src/util/test_util.cc	Fri Oct 05 08:51:46 2018 +0200
    14.3 @@ -336,14 +336,19 @@
    14.4      }
    14.5  }
    14.6  
    14.7 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename) {
    14.8 +    std::string keyfile = slurp(key_filename);
    14.9 +    if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   14.10 +        return false;
   14.11 +    return true;
   14.12 +}
   14.13 +
   14.14  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename) {
   14.15 +    bool ok = true;
   14.16      message = slurp(message_fname);
   14.17 -    if (key_filename) {
   14.18 -        std::string keyfile = slurp(key_filename);
   14.19 -        if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   14.20 -            return false;
   14.21 -    }
   14.22 -    return true;
   14.23 +    if (key_filename)
   14.24 +        ok = slurp_and_import_key(session, key_filename);
   14.25 +    return ok;
   14.26  }
   14.27  
   14.28  
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/test/test_keys/priv/pep.test.alexander0-0x3B7302DB_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    15.3 @@ -0,0 +1,82 @@
    15.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    15.5 +
    15.6 +lQVYBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    15.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    15.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    15.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   15.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   15.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   15.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   15.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   15.14 +WuW5oqY0+BRGOL0AEQEAAQAL/R6Xe6O4dbKUkpjneEdW+HDDtxzmbtlo/0dxcVHd
   15.15 +oQ+Ont4Hm8SUnGF/Zh0zbmpGiU9Oxe6MZrefmK9YbgdpZFfYPoWMKJT71npD/0ZM
   15.16 +d075rZlvGdTUgA9yRv//vIJnOvHzBH9/SrL4qT8GlpzpwLog7xLEqHq0UI4XAS1R
   15.17 +q592Fx35IQgxJNmQOJK31+VbxtpJ6FN9fqjGBaRRa5PuqicBEDKwa63JDg4LzKOz
   15.18 +rv1ARn0DyYiagVD8gydX0FlTdqn/RHmDRpSvV7oD2PdbbzTaOyI79FGvGze0OUiC
   15.19 +rTkkyzalW0LrnzXnE41iXhZdCiWZg7XMra741zmiDBRoMEOm2laIjgK9w7nLNRBh
   15.20 +uC37CYlu5doB7xQEr0FtbFTn4B8rPxHjmRUavqTXYkllsoaESGvlL7twKHmMUSbl
   15.21 +8MpUb7MaOZmCmZc8x4ufJlwFtEiwncSKVCGqqPlHNCwaNwEzzE1bzYjg8lWp5/+A
   15.22 +7LSs9TIZ1oV8HORVokc6oh6puwYAwTxs4frgbKJe3o0zz+xdqHfv2gSRnMjoKWi5
   15.23 +6hib/kEbC4T1T27UyJdNahAb7GODRKW8RZlkvXzu1l5i82pfR4a/4AA0yH3JKcq+
   15.24 +iTCYBDpEmJ4MTmdiOiYGIKupX5nqeDM13TZ90Al1HeyEzvS/uQAnmS5jj8N+GuTy
   15.25 +7gRRnddWb078B+1FFu3nADKr6OHkWgFBo/0GxcGcrmDgfpFLHPBM7OdNqS0Y4+O+
   15.26 +yQkPmSxeX8DjHtMnngiv5r7qcmCbBgDu6RkDWcqncdOisIjcpweeyQ0yPg28zall
   15.27 +xh6VwzCbHK6t0yV6J23+imvcbcv/fsg687u/CDSZx1z5XT80ZOyw8+6szG0azuGu
   15.28 +Io4C4jxrtFTdLN2UkTubsYvMED8YrsZSlxyBG3ycK3mO5RSdUDkQjduLvHJhahfW
   15.29 +Wcpsmdz80v1zXNcWlOwtQiJDdJvgG+4N3PJfmMrXwLhi40Jeo3SU/o2I/xREVsvu
   15.30 +wzVeQLcGPG1aUSwC70YVAO9phge6xYcF/1tqi80q6M28HuN20iiIYLZuM9YUz1Go
   15.31 +VQVhmY5vjWnbrKC9WjWAVlGia7LSZBlBi+JfCUKYMn8TnCnveOIf4ToBPJ/Ah1ty
   15.32 +GOh/ruBlBQJOBGMpj9RF76rWdOBbjbxsC6GQtpK6jQ3z6X85pxKKdp/AJsTU6XG7
   15.33 +Bf5TLo38QVhxN73MbDUlNo484Fux6U25IArUFZ4R9IInq6YJLIJ4dBWnAADwNC2L
   15.34 +cLagmoAWoXaLi5zku0EtQt493DWUhV3x8OKGtDRBbGV4IEFsdGVybmF0ZSAwIDxw
   15.35 +ZXAudGVzdC5hbGV4YW5kZXIwQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEE9FmK
   15.36 +F9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   15.37 +F4AACgkQRPBOljtzAttDxAv/bjfjnSS1/qJfRoug2i0t1Mx23AgZZZ1z1z5siG7n
   15.38 +zcRl7C2HGBauCovCbVN2Q4XHDFwm8a+LRfYCuIuWUZIMNOm+TFHDUtzbPABISzzd
   15.39 +6M0bisxLYruZdrsKh/ZB3PWYPl7Q+smttsfQe6EFaIVi4iFpr8qLMiVkE3CnsENj
   15.40 +V+JskEa8AWTDgW9YHYAP/DQ9KYcdIFGf6InPn3UUjOi6Ncyq1V7aiDELTt9WEycY
   15.41 +QgVYrFeRHNe7LSKtckn+MUgAjWi2XbsdUi/mum6GgfK6PFmq5b4C2+pwryNiapqo
   15.42 +Tpw8mFkS9u0U1nHcgxB0x5xltstkerK5EJtFROEDmN2hTeZxVar0QoTHQV5su2Ah
   15.43 +02Fxf4hFMxEMx9dDv3W/wXSGJl/CbZ1piiQTKGxjKzxqluRpbABFwnqtE+yO7l83
   15.44 +uKNwX42cc782SwPfmafaFYGeXiA4l03TvMvP1YDIFdN93CiTCYXtL+rlKeEjVfhT
   15.45 +0cpvn76ZE/T6R/FnapbSKBmInQVYBFu2SaMBDADjDIr65ms2y1ZoexVjdn5+lgaH
   15.46 +CAYitjm0c/6yDdXJ++B+EicxucC3u/luA5/BItn0t02oZkr5zrgvFva89cUKCqzg
   15.47 +6jKzEIaKKT58oE2VYKsvynvtMPdnYqOgkFmuH6Cv4pRjpO8ygOEqThQ8KNMCzzHb
   15.48 +xSiXO4VO3lNI0TfXAmN+JAyhCC/1WnzEqEvFFRr5LEjVmhq0we+ciQR29kg57aa1
   15.49 +Shku8ucusbSra2BlnygmRlyMBGg3AsxG00q+AcgNsqHB9z2sByG1UsWTdmY6qLJ7
   15.50 +PFr3PTdGXqJGE8CZ+Ev/pzwdWZ/bXHmpRT+vr3FPpu9rUjJadFTzCkgQRuLnzC5y
   15.51 +YjU9d6MA/fIJZV3UJnzmRaFguX5HDxrCc9JIWc1W2wi0BvVC6XIxJxdPlXRvk4FB
   15.52 +6xVfpUcEXkvxfOS2mYSV9ZxsTsGDdAdLfLnqhtfE7Uiv1lmSN77eNzxRyKUjywdY
   15.53 +9mvyJyy0KYwYhabz7HQLDSzMApnU6nOfqt7j7Z0AEQEAAQAL/iZVEUe/zB0RolJ8
   15.54 +aUWEFWIYwRxeCe8lVcO2C6uS82Oo/yM5vF1ET5mVhkyBFyEb2bFbmyRRtNnNAUKN
   15.55 +/XU0hyIlYD+OuqWJpjVANlkDFWYhTnWAmYCXkkVlnVt303Q2ycG4HrZd+7ZKlPk3
   15.56 ++mmXuNxSD8hbVnmF5oFEvsnd7LADqrl6q5kqUTJ6pvLquPQalpW32MobPOQElAgZ
   15.57 +B+RvuwzwpwMXcf3/q3EyNl70f29YugYQPgKzocab1dIlTQqcMRFSQPw4Y3Dyzzv1
   15.58 +3nGWE27Q89WBXW2n7uKO0mpzEjL19LxVqMmL7LMR3RUiVJ5c8r1fDbu+PbvVTSn1
   15.59 +9XRcLzr0A7nJXGOdym4bb9ZxoqGmqilPwaoxBBiFPOftoCFqkMr9iZGdbj1eGXzw
   15.60 +9jYdKkWAEk4oDn/otoPWWSgxMfMJGJgrLrTuO/q+dDmdNRWfBTJmkPTU1NS9nqeQ
   15.61 +lchugRpMYmIKD0m5NeXSQBBGIAeCWQqu6CHQkbMbVw8YRpRyzwYA6ktbzaOqgX+8
   15.62 +lxRyNbn7PW4h10KlB0X0mqwao2xj9R21/+YjTAFGJ6hj5pTiDZzl3PcDbepHySRy
   15.63 +ZRZkcllD2Dy0YGv3xs3HRRmssSoafO5xooUVBlep8dhFmm0gDkpgdsqGxkrZOhdB
   15.64 +vqJjCf8TqjAcxTBz362HtHD6/COFyUr2OZW14muQvngpjZvUVD/Q9Re3DQBTebMS
   15.65 +iHzBY/C9ExvjfBlq+JsWWjyE8V2bNJaAZDqh/4av6H2YVW4Ko/EHBgD4FVlyrk2Y
   15.66 +xWvVTS6OXqGkMzQ1fcpGPE/h1VQdSsORhO2Q6ys65y5smhBYszejN1eCbNhW8mpO
   15.67 +PKWGQbxYj2HKaOFM/nwA5z1oz0CL5a1k9JqTfvSKWke0eSsVY3Z/XN8ryNDkVGC7
   15.68 +qaUXhX+22J8/tLlKdJRtoHD9+oz/hXGR8voC7pEIctPUEhz5RdzDop5uSzxX+yHE
   15.69 +GpSjZN1yQAi3VEDmylkHI+jut4ayCEKXOAvCftwV8IYy4GwhJme+VzsGAO9aUeuV
   15.70 +fH2cWhSJH+ibgYwHJWtUa84ocnD+h0Z3wR4QJ+pFgL4otRNUCM1vj9LO+l6J+GAQ
   15.71 +iFKlWwwXiwRvNuNnRZ1tDmqk1mjZyvBobhMybS+cdh8rTDFpMGFqqrT98BT8Hw6O
   15.72 +gEgkUrrBHelsSZJ1Nc4wMqyjpHNdkGLntHV97xSe8X9+xX6DEnj349hnCluRsh5/
   15.73 +BhChQksZCMg+cJnlwCGDYziaFZRYN3eqIB0hjkRsUKxj43pfcM9XG72MKdImiQG2
   15.74 +BBgBCAAgFiEE9FmKF9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwwACgkQRPBOljtz
   15.75 +Atu2nAv+Mfphzz5D9Hrq/MgUo2d5DIFg/BzRmlTu5ASEFJx9eeiPUtRMyJ5fd38E
   15.76 +zFlDysoYIc1QIj+Gw34zltTh9CxD0zsVN7gTWrlgZ5+t8vKWDigJYQecZscKnZbi
   15.77 +QzDIh/ODf3pZVLKMDvz6FDeHMV7YjHFaMmWzRLNTvob3/gzg58Tdb++SCo/eD75W
   15.78 +fDYevMtPQxmIVjcJtlcIk9J3XYl/dkhdOFk/rnDrIxptpsO+oLzB1zwf0GvRT43s
   15.79 ++mDm1lwAytqwScp8DS2oW9y3hOSYBx6buzjU47R0D5heE4Ch+hZf0bHuuisCWXmC
   15.80 +oazEUmn5cG0Ze9I2PJnCsRbcBriBrgdbcpKWTInWdHJiLeXhnyfzV00APgCgSeWm
   15.81 +ObVuREvVAqFnBdKf+VRy/tpfnsc5HUOIf3Z9NNrSA2wspKi9AnMDc/7YoiqOoXgg
   15.82 +hMBuLPQqL4CKRerNjEVbykI3OaeRU97oSK/SEPYApK5lHwYrJt6Ov5iwn1t/XADE
   15.83 +N5P4s0bz
   15.84 +=gdrs
   15.85 +-----END PGP PRIVATE KEY BLOCK-----
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/test/test_keys/priv/pep.test.alexander1-0x541260F6_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    16.3 @@ -0,0 +1,82 @@
    16.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    16.5 +
    16.6 +lQVYBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    16.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    16.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    16.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   16.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   16.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   16.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   16.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   16.14 +MtOUJwMpAelnOeMAEQEAAQAL+QEepQLmRpOv4WGZ0kvevMeSebI5++7suisAyoag
   16.15 +Qc1nKbrKwPPtt4kgjtvaK+7eZv7EOLnZGJE6MOA3x0oOy7kJYenAjI+ODEOn8BtK
   16.16 +zKcImE+0ORhK8h10dDyX3TOCtApmtXZ2s5upoWTTw5Oy8ghUMF4yxESb4oTgW3sq
   16.17 +Iozk/3bhKB4NksbipHvklCtgY/vxNhBusjkd+XJ4jXAGAWeRwmDIvtx8KSqypUlH
   16.18 +LfsPdI3CUEzZCx+n9bJZyaZvAAprH5VwPzQw5fGirKE/yiWivTTGBgawivXgNgIv
   16.19 +B1Ncvi94y8uU3GmhkPXKRYpooQXIs7XXypnhI9g07t8RODjRtzmRLNO63EaXxayC
   16.20 +3Y3+LkE6Ewz2yQxZ0RqD2HyoHIsWd5tnU18CgBIWygw8kH3MfjMlAhMjLpP4hgYP
   16.21 +td1p+9MbFGnDK+CL3Gf8R5B+HwH1dIrNG3PoHGWaK1RURGDzwgKXSztiOREeHH/T
   16.22 +GbsrjDsu3YcdQqOqG/4nCJwiAQYA0b6qJzZB1tEX1UeHnc5q/JgJwGr0Z1QjKsTl
   16.23 +ptGIhjiBE/0mB4Cak+u/Qz2jw1RcqWfZkyYWY329r4bWBuPEQ1mEh3wrn0CIGmln
   16.24 +nQkOfMAuNfg8hJPNo/x+Dt4o+XnWKzxnz5sHMEEY1d7q1qUyVfZQjQVgfsWleyt9
   16.25 +QU53CW1uxvrnY1tNlAO7K94+aHWCdYb+PPzHyk/0HNuSgcMgxLt5a7cOwM8LMg2V
   16.26 +aJ5XQS/BlM06anXgMloJO2muIQhjBgDrlcdzXTgSvLid5Ten8Jgl7qwn10RRXq7g
   16.27 +Ewg6/Fl4kIjkBjnUPu/oT4b9xd5nPAJaVXev59AoTaddg3mCD0khRhw47nxzwa9k
   16.28 +LOzBkxAFTqMopoq/uOchQSbyVPQ6gwq56CazsANF6O1BWx2a+51OhH20i4EQ9GcN
   16.29 +Ec9jMSgVqqhwKLIwPq1DmX50VTcavpwD4yV2GBaQCiqg20BRcxEZP1rMEiyJwSxU
   16.30 +rpDGhKJOHlWE2yZG5GqeJN3Wf7jWAIEF/02P9NIEDkQ24LbPJX1I73X7padnfNNq
   16.31 +WQv/zOKGdCAhKGY/M1ChdR8ZNTV4KMb3m19vxyPhx1kkx5cn5dPOxq/7z2nHY5Vb
   16.32 +XhzZFXdigtuXnEsTiXBsgeyUhKCwailCjrXi9mrT+zsHXAkBDOpnFWfDrlK6sLgM
   16.33 +TmHkCtpmiHzaSddsFYM689SI66pJByGJqu189A0YTeh3s0TCmCNoB+v1KFyIGQ4U
   16.34 +8krUdnS3kJu96UvjouikL1pZ2OppPrR0NtSrtDRBbGV4IEFsdGVybmF0ZSAxIDxw
   16.35 +ZXAudGVzdC5hbGV4YW5kZXIxQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWa9M
   16.36 +UUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   16.37 +F4AACgkQHAlzClQSYPZz8Qv+PqWjOm3/GKj5c/qUter1v3LKR0mk4VbpnDy0Hryy
   16.38 +e+WIxCFVC6Lc1nP561vUqY7h4ZFjGSdFAp9gVl06yB9aSL4xNtN7KJdtLRO0CvLF
   16.39 +AQkHVKhTn8Wfe/4TbtYHtbgbnxt2dCdQujsDDJUlDjGrMGhCLbVmfxPVyeSrvUBD
   16.40 +h9fjimo+gso2lbK1/sHinoiXenwoJmWBM2jkuWQBxxXae88MQB/SkFJnpfO8paGD
   16.41 +XkiziUhwhTxNSEksem7NCwANgHG/wVFDhOp9A+o/Q8mdbCKrD0PXL8MV0pCfGicN
   16.42 ++aagcTDGuqBfTZdCZXfjcE0x9oL+pcTNsIe1N3cGDudbD/w1J1iMTYUMznHsFH2z
   16.43 +lPaqfJcNq/4o5YpEjIRoPRzn4TIhp8eCwI77MVJ2qCmDiFMouoZvB6ocYXmwhTT9
   16.44 +/OXsmm1zM8IQXTjnwUL2PN4j3zA5FRyEQejTqTLe/audnYVHEsR8MeRIDoISdmcN
   16.45 +RAQrKDm0oIW7NAWSlpW0R/ZSnQVYBFu2SgMBDAC04ZaOl5gpPbW6uh+ET2oHSkOS
   16.46 +wB6HGwczm5bIn32LZ9fQOQK692a8lpg0Ru1FOhERsrSVOlkk3YFilzX9P6Nvg2Qk
   16.47 +LFBe4IFLym2RsBac8vqF+27p5yjyM7s+W6EfOl74LqCocQ85RRrvMbRp+GCDCy7S
   16.48 +WKQpEeQoZhUfvDADkMc+HxoSja9g5uFV3dTpf9w7QMGW8mF42Oq6Nb4YqiqMQCSG
   16.49 +Y0t73WC4pgvV7gQJOA3sGVdDIa4FAKFycCl8jk7wdyasfSxns2cq2jO4HgCQFife
   16.50 +t+g9x7U4esnbkyFUc+yMMKQJ5mG00V7Lf07GyaQuOOtJOjbou8iMsAqrGjq2uQ3u
   16.51 +Eu2eVMYMj4J3XQttUb3fObwP9G7Bi/kSZFjy39SxfI432jcVT5xmzIY6Iyy+LgKh
   16.52 +agMeUDgANs7A3prTfRbQxq48DjM24EYHWKzt8GdOk8THJAt93/G4l5oefmeuelI3
   16.53 +D8lBFZo/rum1mIKaY2ULnAJfyKw9I3vsT3GtXg0AEQEAAQAL/1gsthOJs6u7ANln
   16.54 +PNDnU5T9L0ac7+TFmLOgL5daJD2uX+aJvBp/Wu4o7UZiouyBu2totZ4fRPBzKEzy
   16.55 +0GdFO/syzkDR91Xg1DapldMUx1k4G0bwBCfyvyOeczMZQMhz0HLka/3gq16sIM6k
   16.56 +aMHVydpnu6nfexroNVQ6Oybuumsqiu3uBGwx9GHk+si8bDttUGL0FMrsGfbqqzYd
   16.57 +1663WSloZUW7psLZbnpku1VMg1wpHqRO0BqSEv4uSgV6xsaIqgF+7Sa9CUSbo9bb
   16.58 +pILyiuVyyn1p0USSOmg+YR78NEHO9eb1tKw5+wublRGlVTL1Gkr3QfEqIIR/lvlQ
   16.59 +4c5D0ZImC1ESF8h03aA1ZPO4+m2hIIBB+yQhTgUN+ou3nvQI8PnoVzOQnB0Pd9J8
   16.60 +iviNKzipbRi32mql7leF83i3nh81GLNwfINNots84YeCcclASWdNXKun5BPlvtN8
   16.61 +bNLwXt3ckLlNQ+M6RAMrNOuzRgfksVPUnw65oYYDISv9b1kvgwYAzJnJq39OaNE1
   16.62 +vDoqWTfZB91cAA2E/FvXmvNDKDYT929oUfjaafqT2fbNSA7qtWGq/DcpdLH0NwI/
   16.63 +4MAMmL0/bgIYYZQ47K/74LvVexREJ95MEvZUmZR0rFuqweQiRPREI6kciTcJNd5r
   16.64 +KeiQ1p6JxZA4afad0LVG8xnFYqEWKnBwiRHfjmz0SeH1pRVeaPR5/N9TOEvQDC6d
   16.65 +T8fCcBMfZmuzv1gS20WdqdcyGZhrGg8OCY//Qt+j1skdVj3w/3gfBgDiUluqE1iq
   16.66 +8U1j1/YeTwL/Cg9oLkRB8TZu7DJIgW0KS9LlqY6j9WCt18lTwfEiEzhqHVCqSEtL
   16.67 +m7y5zSZ8H6yfjV8Ib1yhCQePL4qJOV0pDEQl3tYBwpDARwOtriz2Ud5QlkJB0wxd
   16.68 +TtlTc9rfWy2sDLCV3K/4OfReePm4mpWMqT06Ow1Ne6F9DEAvpu+Q7VZ9seVHmnDi
   16.69 +rvjZb0UDh3ZOn9pETix/4MOnBmvPTIkN403+NonwedMKBCurclOpFFMF/14eWyGu
   16.70 +pp5MQGXN6h2a2OpL3fhLnGZuHALD1lT7Pt0uyfzd3JRaMMGgsga93PlYwSxhqLtZ
   16.71 +6beTIbGNxvMHY5zoy0o43bkFHBzzPajVkkIs2DqWYOrdQXq9rbbyQeshZtS8HXUo
   16.72 +Yb6tGOMlrtdRD2X10dtZpnkas1zMlnLLjEd6BfphizVZAgqRxnVOTPoYojvcqChu
   16.73 +leP7a/z0yKvHV1Mw7efN/4RRr0ePm8YhMNj9zAKsR9alGiF25eUhQ5cXyutKiQG2
   16.74 +BBgBCAAgFiEEWa9MUUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwwACgkQHAlzClQS
   16.75 +YPY+BQv/W71XfM728hWfvjztPRssjJdj3aRyCpAA8IUZWViINu65a6yL+6JZYu+L
   16.76 +pQY2+AiUkJAin9U2S0ege0H241IXMPj77qCJlLvtvK+G+vZlz8kyCTUNjW6Oo1nb
   16.77 +tqbc5H8sCRv1uSTPVnn3AnkjLL6xDW9zfjM/fTqEjnLCUEpqt4TNNDRcWng1TuvF
   16.78 +mN/ZPG265gnki2RTuuX7iDwG49TkJLBuHDj2Io0glNGj+4WHTwLvsv+Tz2/UZgdf
   16.79 +JCCYAzj9SaCHqjwd2STZfH1ayylHVSaBDYf6gkgRafR5AoZjT64R47QDJj188G4a
   16.80 +DOke7cbusp+ywrctZzHko2r90ix6BLr6g64tKTAvH6Km3s2+yt9RMEAyXDc350rM
   16.81 +32H+oi1lCwQetKrTAXFZnTtqswg3Kk1b4fJJ62tBrnIVhF1FDkREQc4ncc+Ql8uk
   16.82 +3YyxBuyNh53vTHrlMKX3leA79JoBvtJ+ReCAZZnIbf3CGTpe2nyT+R3MRSjrlkEa
   16.83 +QdZkrcqd
   16.84 +=IsNS
   16.85 +-----END PGP PRIVATE KEY BLOCK-----
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/test/test_keys/priv/pep.test.alexander2-0xA6512F30_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    17.3 @@ -0,0 +1,82 @@
    17.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    17.5 +
    17.6 +lQVYBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    17.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    17.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    17.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   17.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   17.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   17.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   17.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   17.14 +Ln0EZR49Fm5yAWEAEQEAAQAL/RM4d+1OX8AyTYdCAU7mdHAdHRIVgRVCpw5pCpDC
   17.15 +IgTkL83LrUPQC00MREztcoqg0Z0YLbtrYMnwYaEEE/QfcTNvczjg1V5+FGOfrGJa
   17.16 +Qqp0vVfY64lfyoFDMbgU7Cb0D3hRjENNH0UwWQNKicDLLt4hEjAKJ1njH1s8PkrC
   17.17 +RPW4wDYexxwafdsp/Y7fB0OYSvVqieOJ5ag9r/+MU2xoaKZ/H8ey3p+zDBfAA2RP
   17.18 +8h2ucn6ERyUtQLO5uH9QaJ5+rnh0yRwEhl1A2JaHvk8EcS/6e25qpEA2GWHXro1U
   17.19 +4u8OCIyGj4mvqLTCpFRzZrBdoyhC9oM9tDnyERQ36XIJffLVEIp5/Bb02JqDAw1t
   17.20 +ktxgdAAsH8HjriKGZEyqTkd7GQdVAGwe4jJLxXlW4ueJ2rbC93E9B7/soDXkx9Ua
   17.21 +jnGjQpotWl2f5aBNQVClJFIxm2dOCaE78au8kJltWqzn8t+MLYzgvf5ictRsQ1qR
   17.22 +yY1Z1Fsidp9kJk4S9Pv5n3uJ4QYAx3vCYewjry4wgnDBjOeIiUKWI/39Ni2OSHtX
   17.23 +MOfrRsxMibVMlL9CfNzO8wNqrGCfvaEeFyG2m0KaEU2iBeG6QlYFJBFKL+wGTp+k
   17.24 +rpAZO6aCHpBdy8ljA36arh+KNQJQYDQAfVfeOxlh0d2w0untmla1c3xXCpaxp53c
   17.25 +w76s5bFyo4JPvnbnfX0Gk3JkuSDJGw910J1xh3S+4xQEG+USoj9UphqUX42WAI/a
   17.26 +y/k3Xau4uPpFYGyU1G+rMEytHllJBgD/riq+ITq6TXq1MP7QTbK8MXMZV88FlD0s
   17.27 +OeXUwU0CNcYVau0gU9o2H15jZt9pg6pFlVlBTizvlqWOTsKP5Z01F4Oc3s6mqya/
   17.28 +QXiw/Kj7xkew0IS4+66qXmdEcjQkGreAeLYlQAioAFwOvT9CZO10IQvOTpg8nTuv
   17.29 +KdGgzL/C+3fidZLP/cmeK8WLxpp6+EDkhcdntTBThvSgOrGzOalX2Y/WNEcIUE2U
   17.30 +duT7DWjtz8Vb4vz3eLFLLYvfjluMP1kGAPhm4wo58TOIxSzOPpQyDPLp1xJPKACa
   17.31 +oAjzTVRKN35ZMeMlIpHj0ytLQjAC+66OJSb+gNxsA8ACSZlCZZzQ7QV+fdoYhBmB
   17.32 +SD38NbRfUwDA9Ba3M0wsY2UVwivab5SF0JlktcybfHfj3kYaU8g99QQlmwWxcnMN
   17.33 +GmRGJYYVlzG+lf7X2dz9Ufqfawao2br4yXaevwzTR0x8qaGTjUdXopO6QDooKaOR
   17.34 +wDp+O996uBDyGF84vzD6bZfYAOY5HbBZJNGQtDRBbGV4IEFsdGVybmF0ZSAyIDxw
   17.35 +ZXAudGVzdC5hbGV4YW5kZXIyQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEERqmU
   17.36 +8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   17.37 +F4AACgkQxLirC6ZRLzBpqAwAkVAGd2KEKpTxxslZ3nRKIMokqSrxhEw1INmK08ql
   17.38 +FHj3b7eb7zJFVNQpq7s5Wsl89SkEV98dl9pmy2M41RAaU+M/jOYk3mqxqSu1yiA8
   17.39 +qkKyWcF3l3+b7iq+D3hfKHW+tmHMyoitbme7otEH+C+hqpY/Ne+qD+wZAyekvscL
   17.40 +65MBPXVvm7xseuBFR9h8/Cbq5YFoW2b7bisMVHoJuIPek+siVy7CxHBzX4m5O+Z9
   17.41 +N+4vOo4adIxMGiZsbyP8Sn+6tKca8Ca2NEfgII/Q3WsDctNMy9M76q0Ek32be3F/
   17.42 +3eIf4sUWVtc4LrukFrlDPQnsO+t/bfktR0/OHdLcxwjMbn0z5xpB8sJIqr5xqvSz
   17.43 +fwFDhfA87nBxt7V1s/QKQeeuI9vOHpSHgwv6ASJCb8QiilPhev18ONBg0KzmTt4x
   17.44 +ieOKG5KNgY7wcnvUf7Sbqvmqxc7tq0K3gAFqoZS9i6ttx04lSqzdkUoQOVlI9hXR
   17.45 +7+IpgM9yhPd+6YytB/yEBUKrnQVYBFu2Sh0BDADAqureldCVAODg9A2elgQrWDdo
   17.46 +Kliyg4++Z9sOMGv56B9vbd0jzWPV7kJokIwSM2BIaNStjBdRYWRjenUqjwFgjz/+
   17.47 +nxWV593PHYO3grLKEvI+aVVgHZXYoaR9P8RnK6jPxSgpjRlPFgf0gUsuVOav9eO2
   17.48 +EFFL227ktUMCLQf/wKDT2is6qOjlogOIQuoOGN2tnWLmFs9CVkiX8Bg3d9VwWcrn
   17.49 +vprPJu7pf42wCme3R60B82rgX7b1W+nbnfBCPKlQfEMqrm3rCKNLCffo25Wyu0G9
   17.50 +U0sfg61SkFi8JLzmi4NM2KcjgHw7AkUrXAE8Jbi/yChLbmVVCqE3W5WguCNadvn/
   17.51 +GQoPoOBmWQplkLC1SulKYjVYzwsnAKdAh1VI3ClDYwr/mD1O39TGv6Tdx1LbI1rn
   17.52 +5cI6KzOemMd3dzq3dNR8tUg38DKYxbb6zMD24Eg50+9nuAF7ASSL0XwjJUg2kPlJ
   17.53 +K2m8lIUyniLEJuFwHhDskYqSct1NwjpoXOCZY0MAEQEAAQAL+gILP+vOqZYv03VI
   17.54 +XykPr0AVSD2jsc/cfNkote9lySVjV7DYkH3MJmHzzsFv5MMJtKPu1AgbmBAtsfRH
   17.55 +eVXYBonJ7QkPOHjiWpwMLqDNF+9JnCr0vXwqEdCYTYOckgPxcLQjkfo+3pabTycJ
   17.56 +VSTGKv2H7h8X5KFXKioBfiB+JyOSQ0hymIMazKrAnM8z7HPibPstDNrzvMX2pdoP
   17.57 +rbR1+bss4PwbzrtMdM8PtZPoq+fSJyL4YkPNnvV9eZ2AUHlhC6V5zm9pteQ0yUPZ
   17.58 +A03wvDLlS5DlABRjrlwBELrhqQjJJCM6q1+zdiDQYaV+8lgGej+6ZPvzXo9KwCHw
   17.59 +lFbwdbvrEfX6wz3Ye6koplAxTEFH3+v+haDmdHbvi2lte7wDKD9KXX3lrFht8ceD
   17.60 +guJkXHcyHOJ80UKJdB8PRc0HwjaVkXXwygeD7vZuGt5tKlBl5ZAH/z2eldpQXLAq
   17.61 +iZBTre75eTAWpanPvw/LTjpBUXXekkdMT1qPu13HfSPo15+sQQYA0eDvjoBBKsQc
   17.62 +iQ3NtSK1ec0BRHQZDO2IjhLjedV7WvoI4yoXq106WFIv+QPyKdO8khQo1RTUS1NI
   17.63 +1R412AJ46cbkGyNqKTSr2i2VwRrgLfqEwQXZuqalT4W4+bWcx5wprp11hxJ1SPXj
   17.64 +qK+4WevMga7gYBMgQjgFAj7p4evvTwk174wn8dMX0oB0v3gUMcDFh1AVbffUkteI
   17.65 +7dzphiGZcS9jZJoDSJDFN+SqL4r+O4NQLi9GR4OWVMe7ghAa7s37BgDrAb+a7Tec
   17.66 +GPH8jOx0rQPCxbAlh7i78PAiXPL10vgYDM0xAgtZzP72Dl2MBduE5hE9nOEkZUwy
   17.67 +2tm9ISavNqUsXmNKkrakMSx4QQiK9xhnBxJu/IRqTiJly8gBwejwgJkp4AZmgF+a
   17.68 +6u2+c/UIeNRMxwlkcrgGqTdeK3RbJci3wtPBFNhEBvj02Cw3ZADa3X45OR09X8NL
   17.69 +qcjOvCG7imfOmagxG11yg4Kd7+42151aqxAwM9nKpN8LkKGmnrajpVkGAJb6o54g
   17.70 +X855XTP7Yg+3EqcAoUU2+Jm6s0xGWZzXQ8YUT/QpwMnQe6rcyzfc3MmODqaofZnu
   17.71 +8GKVpNsxGg3PqdBd9FRqoxZb/9FAfugAX1DA+f198JJWxg629WOWa4s4DRDJgek9
   17.72 +V0p3PCgzXTNHM2D+eBeO2sGmP28zGfcCzlMCnBBRSIB4AjAS78GHtNw9rV0J+oYx
   17.73 +AUoSXRFvLJWfAuyIa20oeJTwxCHL3lf9XOJ40QXoAT+mun5rgY0J+gt3leSyiQG2
   17.74 +BBgBCAAgFiEERqmU8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwwACgkQxLirC6ZR
   17.75 +LzCpvQv/VH/mnI27WZAS8d14QHwv4HRvWxd88RXyeB1pmJIErOjADsz1ZG2pHrv4
   17.76 +Op9CgPoWxnzdhy+DFwKCYptJUXpU9F4kVDDWpxWoNy9nNIznHFaxLyXt2c7JFGLo
   17.77 +5T+Va5UXaIYr9g6kPYBwFY6wTKvLTWgrPL+lacilLdB0xS1FVd5To7o2ZJCgC/tG
   17.78 +Og4nPH2BieewjPgAdPcpDjFCugy76UlpjbpJ/UYDhgz/g7+kLt6XHPz5sgHXqvO+
   17.79 +juiqdxGFlOQn4xiKJBjSLPaU2QIIYjmHnbJH1+OmnFym2EmRn4fhH0yhBpE0OHuv
   17.80 +0+iWYvfr/pjtlCZF6hdtKiMfv5cmxZWzb3CK33YXdNccw4CW6uqmq2kyn9cDSXw7
   17.81 +OQMIn7nZpc19L72bz+9ZRF2zpWmYogSSN8vSwlsE+jTqEICxlXNoaqQci0FXwLUA
   17.82 +4WnxeLITl+PkzVghRDM1/+C1XkbO4b6ueSLIx3506ZZ4qlht8XFf3KTwkPDr5JzY
   17.83 +04c8TRWq
   17.84 +=R4L1
   17.85 +-----END PGP PRIVATE KEY BLOCK-----
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/test/test_keys/priv/pep.test.alexander3-0x724B3975_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    18.3 @@ -0,0 +1,82 @@
    18.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    18.5 +
    18.6 +lQVYBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    18.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    18.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    18.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   18.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   18.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   18.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   18.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   18.14 +2VVBJm5CGF0GJpcAEQEAAQAL+gNxbUm7mvCghTwd3pChWW90OI4OlTbhYu6vpg32
   18.15 +EMZa2voffPoBssWEmTJp5OPmDO7YiRjBjognVmpcEbzA3r237dnkDqMrVGSQjIJR
   18.16 +5KCflbyQhe6g1pghMpv0LV7SaX1J/Nb3S0HWY3UWIGkeeA5Kt72HTM36a3h1oa9d
   18.17 +0C/rjUFXxyHFgV1TG4n387hNpXOGL0wCKZUr4UvlNGYZiLiNv9Api+qAOoKQCJYN
   18.18 +HXpHZl+0UXGTlbnW8Y6q/M91CCvHFMX1UQC6j0c8clK8eR9s4idRftyOuh0aLxvm
   18.19 +5XdaFfKg1Q/6pfiCSEPZkdd7ssKt2SqPe5e4AgDeSUy2ljHGc3yzcgqmP2k3ZaAQ
   18.20 +EINq8OjDL/hQOv8T0zxy89pRNJBeYczsjwskJzGNtnX8in29Kf746SZvexKP5gaE
   18.21 +6jGAmdTk4ogR3YrJTvHDiy1F4EVEtl5l2ACQ6VynF8Yr4Gmqxg74VWIJrqcD3Xys
   18.22 +xwvi6wZ+4FRorKCekv8ZAD+qKQYA152qE/AAGn+aKv4N9tb4WJK9IdBt+B0ssiNC
   18.23 +e1/YOew2+U/6E5DP8saVH3BNYay0DBwSLfT7/5xdRQyk8hQvGx0pXknUHt82p/K0
   18.24 +SlSNC3UrBmizVBOpEUwcGEz4Bygcslq3PhHbIKZFXXaMxC3LPLiNZIM7Dp8tOI65
   18.25 +WKPl9CMx6/AfYx/8fAwJXkxMo6DSTJ6aQUr0+e5j12k9tsle9n2wN20ukzlGuDS7
   18.26 +TP+SOWHcjr416sIRURxJX6g978PTBgDnzED+ds1SOm0hDkmUl02XNN0R/oQEcuPC
   18.27 +ydTRncxdw5eq33AVD676bCww5aeeMI2sh4jTa0vxenY3MlykyOMUwviBGuRIlk6j
   18.28 +PK9H7ftIXNAhTDmfr5m67YrRxufjsZ5pal5y3QQHg7k7Kq4Zdm77SOXlT4s50aJ5
   18.29 +EhPkA5Nu6BnoMailnC4WjwYJlpkTM7IrqH02CIz3uhtQLVpk2KSKCRlfKSRWHsM7
   18.30 +rdoqrgXTI3JyDVyT9cSPKKl/bongS60GAIoFxnATgz5tTPXecWPGtqQOf9tzP7Wb
   18.31 +hZKnIYweIpAcFqAiFYgsbKRvCDM/NwB8aftKnOuNEyYRPI27VPwGxYcQSVjUzFI8
   18.32 +RlgLZSO3cpRsO0E1NXBrx2wihJZtGgWdjLOUNeM17OCEqRdo/Sb3Z33uUlkYRCCo
   18.33 +Jg4d4+SXvGFBG8TSqg72eS5A8i3astvVvZkweUqMtM6+Tg6mkrDmbn4WomJ04Wim
   18.34 +LYL229FuKHCJcMizP62VoFw9+KDE2tqe+drztDRBbGV4IEFsdGVybmF0ZSAzIDxw
   18.35 +ZXAudGVzdC5hbGV4YW5kZXIzQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEX3B2
   18.36 +u9kuFOpJ8N98LOSUGXJLOXUFAlu2SjsCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   18.37 +F4AACgkQLOSUGXJLOXVwkAwAk/wmbjPQQIeQEtBrTh5kQw5BCeUaH1zZNghQemdE
   18.38 ++O4KVv/OM2pHybNw9LNihWCHTZsdl8MRcOUMHFzwHETsPuBuO0b/jRb+bNLp8q/M
   18.39 +2lBSUxjiDPzGljmpet9Wi4y4UNHzu55nvu8kS5lSHxObKqISRUffvYtxjy4RyM61
   18.40 +OQT6fvB9gWI1Axh26Qomsf6wVbx9fPkiT+S0+yb6coqxlv8as5elbCksViObkv+d
   18.41 +u6CvK26G50bzjZdhI9uopk+e5/UJgAY4uXLtDsB68jdfrR7jknNEyYa0heMRxQEj
   18.42 +oQMDRJ6xRrfat+q941tXnd5SwQuCKaORi9OscBo8G2vOeuel2szePdmisqWudQX4
   18.43 +8/zcYIGKu4cAERX6fRksFH6IKykifXnpyPT4NqQ+oOUR5bHvxgNVsw3Pmtay8RIZ
   18.44 +KlklXO8H7PdLdL2ChGgL4+4JczwLMkpQzMqouFHfvELSHqTfeVypa9PR8v3TyLH2
   18.45 +o+MADxTLPSYyT6LwsxalQXZ0nQVXBFu2SjsBDADlVNQcjd7ufAjlM6VjG+qRPfYo
   18.46 +UuX44OL1vuHXlk4nzgEgiWXTebk53kH37KGcUZw/j6v7ihvSvVakED43aoT6kyiq
   18.47 +o91fpktLdMRUFFI63fNPFrt9bpFY4mg+cUxpYzImsUNqasSb62IIHxvrnh9JN+a8
   18.48 +RTMHdTsKeXUkS3xdAEjqY4C6JCeQN9TddHMBn9HhqjZd6VZ/XzoAkYdCo06J5lvA
   18.49 +tStteUmqHNJYKsQJwrNXULVxcAzX2okKexvOwA1NkfVlH9ynnuJMYbbW/efPjX6Y
   18.50 +M89H1iJ9kZLUmSg+hc/vj4Wmw3NZpmHSkUY0dFk/tGs3tWmWO1TTgS3pGCTSKtGq
   18.51 +8OlDO2cUKbruvmnor2oD953bew08FXsaFu3otInKDAAoFlQIne6UdzycR92XE+6I
   18.52 +uqcMbcEtzwO1cRXgMDY7mrjJUOQlrEzHKmMWiZ1OqXMjakieQ9fk2mNrw1dNd3/Q
   18.53 +Tr+nI+Jmh9qL5IdZv4zo0yWpvB1qK9ZWEEIsuPUAEQEAAQAL9iM8OrAocW2IS9WW
   18.54 +GdMgdunZ8KLsGb7OJBDzQxUyAtAa1rwpCtFzN60BznZJOot0qTfFhfx1O9ElRiqZ
   18.55 +qaAvaD8Xsn0wBX4CDuTeYUvfKMM4AX96qVPxqQ3/EK/cuIt4sjvqVcauoNv+o7vx
   18.56 +C659R6ai8CX9JoSpfmjIQIyoYciS7UvAqLFGMiNLxhOV0MBvIyWJAXwXCIiJbl/9
   18.57 +UXWWTHrjlIqx9foxUyAlTYGTuzXEtHQLR9V7YdMdwJsw+b91F6EHIysKg/7byBrF
   18.58 +auIht84Bcbd2EXBJC2elmXd9WLerWk8FC39ESQG9nyxwA+qZQ0hpf6rq/O4IaNLH
   18.59 +bLMToo/rRXy8ML7m1giKZjWdRpTplBk6bPH3opvMhl5DuIOiIgeGwCGLjnN1j84J
   18.60 +1PC2QiUn1bDP5oztjCNwGPNvZUOTUF8lARmiljzdEYJ1HIxijBGZEX6+CMxYwDNS
   18.61 +eQ4w6Fu8pTpBKVSjMUU3xOnh5yF7JE4/6GcQKwXNeCW922QBBgDuszLrpY0g878c
   18.62 +V4s2cnDqm7aZjKBJ5+EL9gVobioY322SYGGiEZEHvYiGrgtOzrHe+chgNDGICKM/
   18.63 +kmklbkuSB3Vw6yinJXfQquYM6nMBmZXSISqF8WgPZirkjhtjVFluJQkHB1Icy1zA
   18.64 +QAlgNy/JdK3+6BEV6nxV7ljHzHsAbfRkehEWH6uc6i6sCjthNGQZT0FxCDbGxep7
   18.65 +jsSwPm+E8alpbQOzgBiv802LcOUdWWSswto6dGmR0GU3UQbjxHUGAPXzzjc7SMd8
   18.66 +29Wpe/pCIIdJHD4vF8eP/glPl4fKlKnirEUQotLwC+3xxlQt7tSiUV6Be0WbUxSS
   18.67 +HNGfDZUCyj6zoSz2fpCjgQrOdOG9SBFALRKNnZhnfrbgV8yZmWKHXfGlJL+tPrEk
   18.68 +7WYBKIagvet4VRB1ydcWKDVC7dJP6MO+fu4tZQXPdhuFjH2rTI04ZfwAWk/Rm1cu
   18.69 +bAUGJx9VardPk2EGQNI8lj7B2j92/3AjTFW4ICOJaYYbfnZSumySgQX9HkWEcxzF
   18.70 +AB362I2rvWYxtwDfe8emhz8dF+LrezflysVvNbpmsmCAtz/H8cojNpilLfLjs1w0
   18.71 +1v6nL0Z/hXbZhHXQyy6cD9A4B/vm9H8uSLNeI2ril+BZrgnvUGXkgABlDJvqckm2
   18.72 +4EgNpSxoWpo9+9W8d5inR16YmZbbG7PSKwIQFe+OHdmk2/FLIr7uT4cUoiu2Vwfo
   18.73 +P4ElqmPV8eZ5q+Q/+PYtDP0Qa/KrqPSyS4I9M5nGnp8JuafRIm1N03zk0iCJAbYE
   18.74 +GAEIACAWIQRfcHa72S4U6knw33ws5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5
   18.75 +dQFJDACOMW6qkDazVjjFenLdCxkog+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQ
   18.76 +iy4kl70+pEz0eA6pOHEfmsK2ITClDCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLe
   18.77 +RQN4lB0FmVys+lC9ad73Vl5BzhyoYTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEg
   18.78 +girJTup7niIQfwm8bOuogt36+90JsZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9r
   18.79 +zxHpxKlQDLS/OGtBUz7AZWmZZnhIZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw
   18.80 +0B9PLMSafP/i+Awf2vA0pO94uCGDYG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0Ia
   18.81 +EH4EDChvYdfSNpghcdUu6+zBS4aAB3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9
   18.82 +SNZZYVcV9pTdbU6DtaQWmI3xMMavXNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCV
   18.83 +LqdCUc8=
   18.84 +=pxqa
   18.85 +-----END PGP PRIVATE KEY BLOCK-----
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/test/test_keys/priv/pep.test.alexander4-0x844B9DCF_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    19.3 @@ -0,0 +1,82 @@
    19.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    19.5 +
    19.6 +lQVXBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    19.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    19.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    19.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   19.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   19.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   19.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   19.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   19.14 ++rKeexgmSicMiekAEQEAAQAL+Kj/5AMNjgUt7zNBEXCBQlaSLqreChxZmI3VjrAz
   19.15 +k0nrfhb+Mnue33UaBK16DYNEeC+Od8Hqi50z9n2/Dt2IegKoLiqAjkigZT6AtpY6
   19.16 +GZqgVVxovWMGwQPhFVAV4NncL+9v/vnlCSGHmHEOTmVDneYiKFFCR1qYLGJOUp3x
   19.17 +7DzaNPICeasAV15QpffwjVEGtWVnptHO2yzsUepKg9oVnEni14ArL0ixA1DhAGC3
   19.18 +x6XWi0dmKzsr8VYprWE75mbXnhb9Amm0kS9vUA6VjPu78/6aGxMdjZmdKRhQhATo
   19.19 +oARV7C13CSiKArWzwZPvUvkDgh+nZDNXZ74Ekpe+Odd5rwMul2VqKgkm4HS/4tza
   19.20 +RwXyc6fyMY1cNTn27Dzijdso+tvz1RGTc9hnj1QKCL2vPnfmTUhrEmIwP93e2Q/2
   19.21 +UXvUH361aEg9rV2POG+qvwflU2AV1XK/pKad+OEqffT3SgyCQExjk+oLbpdap33x
   19.22 +EVm+u9SqhK62CHnV686j8VZhBgDLiCoYk7Vps3h5OqtjI1OHz/xuP+bF9piLJMmN
   19.23 +4lY3LSQYuT5wm3ZWHgWn3rYcNloo4K86ezh3rVCGPWDFkBBNgul7J8iASk4WFP+W
   19.24 +Y93xrjgpJr8xavqo+OYFGyQNhZxO7ogWdraKIwmp2QlDB4k2oe85Ocu/+m3YT663
   19.25 +DLMGU8A0ylwey/HiAc3DFele1/KuhAryzjbp5ANzKf/ITKwt2AX7s4WUcYMl9hXi
   19.26 +bct9a0Wmr7Bk/rEJxfgz54nr7WEGANBlmtI3sTxo7nRryqtkHKGr+IM921FkGMT+
   19.27 +qJP2JJMGFkRsT43vhy9hqVfPyx7Itm9UZCVUTAxr1DGc0sIXHQjNulpAst5Aa1Ps
   19.28 +zOmskRaDtsTR6m5va72jLIr5SD8g8oFouBRfKmbaRtcPT7t7S8hdcNw9WF+zreyp
   19.29 +EZayqnWHV8VvoHBTU5K4rGln9EjYIJQPdvbpRky3qvznRKGeJ7GUwdHgZzV93eXJ
   19.30 +e1JP7IGv2C3VGuGJ8u/jbQLeYtEhiQX/XhE72pi14LoYtqeww0HLFG6l6AmUJceS
   19.31 +h6QQDlZRf7VpZ2TaCRhF3AMa2Dp3vD2C91DpeQbSt7RB83BHXnrEhxFCl576HlGr
   19.32 +PQ+KR6iAgO4LbcsmrDyeg9KkKgbvkblG39B1MLkcjKsE24s2Aw9B57rfp1ucKl7I
   19.33 +Ifc+/nLf5uywqVHFXdNgJXplqPinxmGIZzFjPUJueww4JEQTLjKJ5Z03witx8G1t
   19.34 +fjmoQrtorHDr26VBUDM5p9j1xprjsJW74VK0NEFsZXggQWx0ZXJuYXRlIDQgPHBl
   19.35 +cC50ZXN0LmFsZXhhbmRlcjRAZGFydGhtYW1hLm9yZz6JAc4EEwEIADgWIQTpX/+V
   19.36 +uOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX
   19.37 +gAAKCRA5XxSFhEudz1yODACUd3XckWuAXM87H7Jt7tVI4NXGMAb/MvpmWkPTEsBv
   19.38 +ScaUlWR9wXnfVhvIfdLS3omZT5u+rOqAC44lKowO1/+/zvjaO7zpOp8jNZUVOdnl
   19.39 +3wJd6zLNT6cCRW+DJGmnMK2iWcw7ovUTxonpvNvopAllxm+WF1RDiIv6nLBiNBMM
   19.40 +V+tiMIjj8h7vGZ2Zqpzk4VCp1Z2+OE/N/mYELqgyEzgAgfrsxwoBTsFLRoI3+Bgm
   19.41 +x/L4i2RTgE6xB1FGfeiUEG2kQS28fWTHpOtYp4RgozCx68m6WvZ+FdsmkR4UaGDA
   19.42 +kfWA2eB4Nk2QjTjzKvRfQrjSvnIUDHPFGNQgsKbMJNLmGVoeh9bdK4UfiAtRSvln
   19.43 +wzs3u/rIDbAf5YZrfj9nQxu46pOVE5FFti4EZW9IdNyZtY3gn0ki30szhCynMxiR
   19.44 +ooVyrY+wl7wAD0lpqtdAZeJBRhDpdBoMaqpDtbo7Vy1FNInTivcORjxB3dedzv87
   19.45 +8D3GlmrBrlaohTFcRrvFhVadBVgEW7ZKSQEMANQGsISHhvaoq59z9dpNiXwZkXdH
   19.46 +gdlsqR4vfO5Jg8oImMg2ctf/A/TLLsOkLLxoU7t2172x4nwbrvvyT3m1GyescojX
   19.47 +YBjCQHOkVSYjc2vVJ94fbDND+JUXywsdG96nQmn8nOdmBTumyAGLRivtFgDNsmt6
   19.48 +2rrTyZqP39mqZ/fD6QjHaW4bCe7x1aBhuvq2pEdDgg3tdviRmENIpaV9XZNEcB9R
   19.49 +K86RyJAYK5nAcxfoKRA7xT2KVqyjiM6LiiZV4uCjEn41tzWsiTuPQWVH/cpOBjlU
   19.50 +/7hvUZT3iveepvpAx9KREqqW4CW1t+sSFIAn+f32ZK47lVx6ZefA1VKybKtURY7S
   19.51 +YFcsnflaWbGjfnpsniie1XbvVWYrW8WoyobBD5s8ZW/GD9FLyrXK+ANlpx+w7Ntv
   19.52 +49YaMvtV02p12TAp6nOPopR7dqM+JDNzZJ+24s7MGj9+tOjvV6IE5BwOpF+qrRkl
   19.53 +NQCzCdnwzyY2B479O7CbjPQxXIgM4p9ogt+GRQARAQABAAv6ArL74TuXAbqwd/bF
   19.54 +3kSqXrQn2HJNn66aTf98mVulnbdI6YWVCaOBmNv+F40dhebU4PD8LGTZTj0bphVH
   19.55 +osle2xmUYSIyxq0GK2nRuyBQBPwaKcyKqccwbzE8/RCXm1Ga8ohomGL6da/qxUrt
   19.56 +kx9qA5mMi6we9f+h8MGjoZWovgGIKUoWmFCLo2kqyOdtmZPdmOhRdnJQ+vBGAAkO
   19.57 +Th7G3QvxWq/RxF0/6VuxabwjGSzXk22ieaUrLFv1J+ykcoFSUeQ87BEmVYFqreNj
   19.58 +eJqKZkxocu4Qmx+IsDbdtXUtbKDMOeERnXqlHzkftA+tRvSAYmnlPgiwhp93rex8
   19.59 +SV5NwC+aD6Kkqc1vm44NSLetiAp+qL4hyfYJAM6K77u1wzruS4Yn96ZGc/uQ3K05
   19.60 +H/bK2WdDNm6wIv22e8sAHjhVL6wximDRysTj4lIRFak/Ic1IK/Az0xvsl7M2aRsR
   19.61 +gC8LYtzOZG8hNqUfTYE4TiFQAQqal4ALTVWT8zMzSBmRop+pBgDnU4aKobRfP6dG
   19.62 +3YA37QlkJOH/un5PQLm8Lfur2WE6EAi9cFxeo9qdXLYMI5Pc/LNR6/jm2EHgA9JA
   19.63 +vdWw1M76BGviM5N4KrRBOgB+Z8fIT544J2I0elKvUpZJ2WE5vq0PDKZc4yVdKmJ+
   19.64 +nhteLgzRgBYp+ZizH1kSuL56bcrcI8Oc1Jqgdt0Oi0LOS/tKSO5TyytI9+JGrjAv
   19.65 +I+qvEIVMNHYOSbR/Y/62q4ujbHFL8h/9PfAaLGlNyvhJD81x7Z0GAOqkKhYKr+II
   19.66 +sXMMwmX9V17zBM5vShiVo5wRK9kW1bpTjK46aW9i7aOu+KA173pINgjrX6M8UmBC
   19.67 +5oQb5iZKnFLTAlW2evpfBkRSPh2JLt446YBHFC2exxT7Z223/YYbmRGKmY3FNuXC
   19.68 +LigQDdg4knJLr5IZ1g44cMMogCdjkPbtBN49ckOJUl8X3E4QkpSfbKKkVwPDiown
   19.69 +S1Y6yWVTJXRZB4k36x3ZPaAdPIz4izNjC7aC/0764cnmDlDv+lTuyQYAzij4LQQR
   19.70 ++hT2rg5jhCOE5bFoXfJkShwk39LVH6bL3loVcWsmHjrr+dymivIMDrihES8d0cCJ
   19.71 +p+Z6o/0pPmSnOsaMG/yd/tfDBf+pNgONAdFSs+RAobmvog6oGoQxQOIDuSvsU80e
   19.72 +NyCPtIeb6sgYgEqwSFOI399zszlUl8bUktnjQI5CvVBLVaPWj/tmDq9XsA5BnGTe
   19.73 +jPkcZoWGPe7BUVINVBSerHTpu6fp5NJors1NqaxhgAJb1BqZuOPlCRH52+OJAbYE
   19.74 +GAEIACAWIQTpX/+VuOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEud
   19.75 +z7Q7C/9k0vPVUQ7mP5B5Mi8yQLECcFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m
   19.76 +2ptPhrreFVPcmIINpluQEWUsS1rqe6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oG
   19.77 +XR0G+ujZnjWuDIhqfkGUxhZCic/ztoboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOK
   19.78 +Ikx4iaf+bd+hwGkdo+Y87jHkCctW9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAww
   19.79 +ZflB98agOQWbzZ7HHq7jI/SXlewGPRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOy
   19.80 +mamqLVerp72RRSkGfPpYcgCQu5qYX9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+
   19.81 +UgWImfUr8E0ZVgjXcEAHOUXjuIiZq01TQAnprcdREzJas5rX8jEttddKeT4WlBY5
   19.82 +mu0oNrBiTOiQK2ZIG8M3Zch5L4I7P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWK
   19.83 +vVrZVl8=
   19.84 +=IhsO
   19.85 +-----END PGP PRIVATE KEY BLOCK-----
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/test/test_keys/priv/pep.test.alexander5-0x0773CD29_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    20.3 @@ -0,0 +1,82 @@
    20.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    20.5 +
    20.6 +lQVYBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    20.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    20.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    20.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   20.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   20.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   20.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   20.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   20.14 +YncgyLU1Gn3bDIMAEQEAAQAL/jm95VDio51tPzgqXnDPMyOjZyIjv32DOyQjRsQi
   20.15 +wz66D/fS10mh/K++dfAKiu5OtY8iAQE5gADr7V6uwRRFFVxL4eXdvNi6vsK7jUd8
   20.16 +OYLAqrlt3JpAI7HpdqJQzmabYQVm6pHz2NKATR1RTqDe9HFK24Bh3aT6CK4BIwQ9
   20.17 +wTqYdS8kEzPrtneOu9z5AjKtzJZq9OJuFqsRInoESy+R9e7MCj0HB9KxjhuyecLc
   20.18 +ilURaOHxjCwpmO7/Hp+DjxA/Tw97701t9bo6AN8w8QVMVl16PmroX9tR5HCaYPrd
   20.19 +N8pqi9Olmeu4QTQQgscSx6WUR/Je1QHsMsaMOpGi9eluOwP0uOXgGqJf7vMHFoAy
   20.20 +Cf4YF71GQPIi3GjeQDUc3KsyOGuZs6NVAo57J5AGJEBUkJF5Y4JD2J3hUAkMuBZT
   20.21 +MEwY08VoCh/O4w1s2gUY5gwZCkws1WwirWV35wz5KW/XJCu5866bGFPFrcLDfGnr
   20.22 +ph8+KaTQGRrqzC54T7QjyuaQgQYAwjvLPWUKBjx9h/1XFeUusAOaskBZiMAO6hWl
   20.23 +1HmyAjAfBbMiWcFm6UzYewfzXa+2tOfC0znF8Wz9OKBbBGe4L+UqluVKRLe0iDt3
   20.24 +mQHYkUKWXvmuNhlf9ZsOP5YEK9J10Fvprtk47YMxJ3m5qdZW2n7Jf/0W//7OaUyD
   20.25 +upLRxISiLC9CCBPqxTp39vzZlzw82CMA5iUWw5/qZ5f//0EgPXASYiB8uaLP6IvK
   20.26 +1X0tX14UxYMUcunWUy/vO9wmfK+dBgDu3sMC7GRXi3MOt7j/ywD0g9xYviqCR4Gs
   20.27 +V7mAwL3aGTaQJh5M3+G3C7QgOaz3hblL+Bl6B5H/phZZja4I7WW8tD7jx7lxJQ+L
   20.28 +O5pCAKM8lYoQqt2uTVqIMKJf9eDcoz3gsp6zFH9qbF1ucMK2KtzRXDmTXKGucy7b
   20.29 +uBm0Uy1t98M2VBSbAxMDd5KdyrSa459AgZ92eg00n7Z8l46huMGWlvVXyTSsZFxR
   20.30 +gV8F5ke7XawDIsy7tfEeXPbc888Zwp8GAKs2dwvbXEwS8TPUx9Bvsra1BtjrCu6i
   20.31 +LXP6NV0jrwr/OjRLpYGq9ZgMqqznRd8Tqps+IxuXfTSDfaPhAyUZ70QHfRPaZXYF
   20.32 +WnA7Fn6JorMEwCExuAgfgh4+XcNe1UTl9sOeF3fWZ4tdj1P2P8hohZE8zRaCuGtJ
   20.33 +GVEMcF7Y52qc6vAsw53AYA7OiAoROBpg7jRk5LFT353/CknbmlKTXTIS02rWbScj
   20.34 +IH4XPujYpxAo2rJAdRP5jdjAsjzUfhTETdtctDRBbGV4IEFsdGVybmF0ZSA1IDxw
   20.35 +ZXAudGVzdC5hbGV4YW5kZXI1QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWLzC
   20.36 +vyrh48T76ria14OKygdzzSkFAlu2SocCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   20.37 +F4AACgkQ14OKygdzzSlkqgwAhqu4nwrRZtI61LnG06iVBGa6D66yduTksCUo6APz
   20.38 +bapaM2ahw7j5d144w5QpxlL8/LxJt+0xCSmje6twK0ffElis6PXqATNlTntyDJ8Q
   20.39 +VU4TbBioYfEAzTLShsmkfB+jLrIXEYKRrxwqN68bD/sidFFa7r52DZUse8qYgrHD
   20.40 +g+k68Zr8nrSc5syndcurlh2c2BtwYXBPTNYDPIPWq10Waf7YFDh7ThZSdNh1KcNa
   20.41 +lplDYZX8tgtOYiUggKEph6bqM7FJeGRJ83zkKYHkxPWA0Ek+1ln+Euo82FEXPxy1
   20.42 +4oC3S1GE5gQIbYOcAe58kEy4MaQG2nMlDkQlYSaCVS/UqHekVqbiVaxIVt0sHT/P
   20.43 +NOmXcCfEQtuNysZ4elOBhf9ifyQBx1b91aHv2DytsRgSHKeIksiCq8ArBkXUkPqC
   20.44 +de64Fck6tQY5l3VT40UfCpGw+6N3Li9YVG9Tg6VJunZQl6fZEyFdqkpVAl3U1fvK
   20.45 +My9bQ8qKJosir5rfrPFRLicJnQVYBFu2SocBDADBZ0xM3TBp64QqRuUUT2SNI6h2
   20.46 +ABl7nejdvc0zAjxDbTTh0jW+bDq/x72zuYETY5CauL6KhSZ3ByNQYlVkkDuLRGX0
   20.47 +lsFaI7POZXlgqmssY1RYCEGeMHbyGYf/onNjTAPEdlyZnj8aIw+DQfGrIt2T+B+Y
   20.48 +JAKIEv/4NI9cHVW/yS0ZS9VMBL9EDntMRj9F9+amVnDcpo6RUVd9P5c3jqYZ0kqn
   20.49 +spxZ1tMmo2TkDcZryK+I/sVW+XK9/FmTrj67a+nnenbzAHPKK9xrm0o9KJQWwcSe
   20.50 +Mdm1C7E+lF1Djf+2F0EOBQRqpolR/u4OqCsQPjxBzQ5fK287P4ylqJ/BFAW5lt7R
   20.51 +kO9KN7hmM89jPangducYd2OAsvKCQvJh1kg9RB+C0adQGBZQDPCiRT2jSeY1KeRs
   20.52 +KuOiV8deHx51poAMGhmNv194LOio6Wbqq3rUjel+UECOPqBRK0XCFJbmPCArRqN4
   20.53 +DxBCZWb/Zj58QDs5xgE1kjftVzeS2645SOsdansAEQEAAQAL/1mzS1QrEpVNwpLJ
   20.54 +Jt5wpDZB35Q7H5aR+rs9mLqbws+TCv/hu0OCdw0T2wxMcW1ItHzOSrF8aAa0rNBP
   20.55 +i0OFEdjZ9F+ovCzOekq0DcOjxuljeG8MBUMVP1WyOb163wGi8+xe6TvmhWXd9Qfv
   20.56 +weKZ3SMP5bdunC34gffgiM00Xd0BtYUSAu+rE/rArLcHrbkJ7VQgq1/rcBw+GdHh
   20.57 +eIUwCCHZwv5cfN++H1jAV77eFLVQ8vkbEPPx5iHvtKwmGLpcpeUgZ2FOn+t1qyn/
   20.58 +k+k9ZRHwFmkQ50rjpcw7hibkbiJ0w4qWJA2d8sfMfkizBF7Za2VYrJvoCKh3xKpi
   20.59 +LPevjnCjyXAKIp1UZzFsMYoVYDhlLFDnK2/dUVrGmXdfX/N6/coW0tXKBvAz18jA
   20.60 +K9ahgspzGb1uoNWcGEfOT5FHX+5f0jOlXNwsbmdOKLSBq4r1L9+Yb86LuoBus/+v
   20.61 +733LEVf8B+VvUkFYmE4LxvHMrYejakxEIFgEU8hX/tDXQREEoQYA0v5iAC7iWg6I
   20.62 +6UBetxWPgrt+yTVBAQ5GkH/k4d4CLw20l8/7WZUwItIRdQ0zkY9PPW/xR4NE1W+4
   20.63 +YNci6KLZfkOJr4+Bn16fEMukrPcrRbirVQyZHbabrTEm8eUWkrTPwkQcvmsXpz/1
   20.64 +wUf5mqeEBq8jAEiqKvlRAUKnK3oJY8maD0bxWbGkaAZVQc2lf1vUONQfzxc0dtql
   20.65 +Ll5g5qoiX2jpqcdQgHxAC5+lA3Lvt0YNWcLwonDXiHYF3dXgrWu1BgDqqGDNCWne
   20.66 +s3RTIl/X/ntnV/b9p5jW7xff07NZnTeVGED4kWvPZElV/ZzZ30/gzaGH/BLp3l2q
   20.67 +51WU1q5iw2OL/bZTds+a0g26trzM7FuniHXb2IL5kUzTc+162aa+ceyhjd7RteqH
   20.68 +Sm/GAU2tw8HKTqfQRdKc4+u8HGDshzXkpyPuysLMpBNW+2RgYdvUVJcRMo6UirFi
   20.69 +ggt8EBlh0YkSvEYj7GNYCXq2spSBoax/KBwnJpgk5Lnh8Fxh3dFVO28F/3cTq+e1
   20.70 +V9OljGEbdXkjEr4HZHagm7YrC/l4Vx8V6f0uiujc2P8gGSYX0ZMjqgbu+WzBGfJW
   20.71 +Lmh91Xvm/yJZHMqOwwzE5ioYWm+NjahVFqyq7+v7OK0riKgla/GWvODxpuqExApU
   20.72 +SwMoDTRjGCP2qh4Gbx3bEtw0czU7SywgmRzoHefAFq/WqY56tlIqE7Tl9KhSrPoN
   20.73 +XN2ejyyZ65bbnJIHnE2ikcujq6cM/uRduONVSfYILNQMnICnPEfS+OwPCPJWiQG2
   20.74 +BBgBCAAgFiEEWLzCvyrh48T76ria14OKygdzzSkFAlu2SocCGwwACgkQ14OKygdz
   20.75 +zSn6NQv+JEXdv3I2T0zTOpkaV9XXM0w4uh+3iM7LfGQWklSQhfuIIed+sr+dvi4P
   20.76 +VGr4M+ZmZB5g2ejDEzToPTRu2jmlW3jn75XY3x0f4J4QlMIZYC1hk5Z/4AApUR/o
   20.77 +vwEixe81bXXS0H5jxUdDa4+QbOPT2jcjbFcZMBD8HwSzm/JGwMM8IJHy9k0am1g9
   20.78 +QQR++oYUwUB2n9+uJSI3QW6xnYC1s+O7YROZgyv245P4FL0QmMqr6k2zEY0aELLz
   20.79 +lzJerU6rLT0mtlDNSMwyYYOSTgwkpHZ1jqYzwIjI9MTwjAQ67bVf1En7T0r2uHHe
   20.80 +mINL/Igta/J6rSIl8MV9IKegqzuAwm+0G1HtG+vok2lnGjYLNg9PgF8/bpmOxV93
   20.81 +l93y3YBVKGIod1UTYq+BDC+xSR+QLkxMLlN96YIhxNI/73I+SViwvfW8T+1ndiMs
   20.82 +tQHoWwDLs+/h8Zxc6L+078jII555fUbiKBm5DGoaHW3wuF1ELlfh/5gkFVwILRfj
   20.83 +Q433qaLY
   20.84 +=TSYZ
   20.85 +-----END PGP PRIVATE KEY BLOCK-----
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    21.3 @@ -0,0 +1,82 @@
    21.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    21.5 +
    21.6 +lQVYBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    21.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    21.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    21.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   21.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   21.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   21.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   21.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   21.14 +wOxN0vPiTwdHIycAEQEAAQAL/RNzvxT0XdbntBSUXfj4aeadOP4x2pqaR8n6GXHs
   21.15 +FgTDutbTqT13aCHlS3N68UXHXWzxNWnVjlfrKQ6Sziol0sZGrBJafw7Fd8mkYdRU
   21.16 +nxljDimOEnbKeqOjZFSvu1v/i3nMVuPiGmps4Yr1YnD1bplc7DUbNwYcIK3mSFHM
   21.17 +7kx1bOnlPPca+Hu65NT+kjetLlbgLVxC84Px2AFaNytFjDDt1ELAGqyZdvp8US4U
   21.18 +jqtc+Kpg1LEq0facmFQQ+j5LY3s5aZT8VjL4lNkOuaSP+DxQKEQ0nfkySRHSd/9+
   21.19 +9G50y2O7QBMbwv7hyLDPH5Myyb/DTe1X7YfZPF4kvM5FXA0/Hcw1tOEr3fXVyV3d
   21.20 +QrbkDlcfm8kpL1BkRzNtskYlN2fpkR4w9WLMoRQv4BLCskfQxxEXoyYnIog5iYH/
   21.21 +nB/i91jqCZg3E5at4Dr3LCFTegPTP+WXFusy8d9cos/iWOTRfR8dBftRmHkv2wfP
   21.22 +dpKeRwGuiCQm0t7EIOLtjzyu3QYA5aIv6lVlOhHDT8reBJE/7KwjAxyDI3mOMRuC
   21.23 +5gDNVf1ryoTPsobmOySWj4pkJYNhCsVXoruPqMq08Qj3310l990B2wx+D3NEvBMT
   21.24 +odoe4yPo8lTEYW5hc20ogO81TWOhLIRgPpSpWh854LCBssxNEQazW8LKZs9vezsS
   21.25 +Ms51b+zGujBr2yg7zPWT5HeZpKC4db2pABBp9zs+6Zt7xvJlZCoRiKCY4O5phe5+
   21.26 +/1sSxnfHuOz7SbpmwAkJOOYD5NezBgDrl6Iy6+ZiQ8fMQ91MT5puRzry+6pNTGbf
   21.27 +rF6QlH1Qw10Z08/ajR852L4MoAKKBSuJp/rmbk7nOqMHhEnuOQooz8kXYKdyAy5R
   21.28 +2+sHy/UJH2veMfBigEOBmosLjgT8bOBZ2byOYgG1QwKjEoUA9HzJ//UEVt6AlXE/
   21.29 ++EDrCdXojLhQerCQe7ILT9cbzxPVCiAbXLtbxU/ISCmRQFxSXA7zPWfurk/oYrSF
   21.30 +3uXJihVrasukb6T+/aFYnZBPuOoqjL0GAI00hAqN/h+7RIoH/H5gYDwT3XYpd6sR
   21.31 +y8Ag0jDooKXNLTsq3C2lwiJrd2QMZD5fkv6vXct1jHhyqG8uj80qgp7AfvWgbQtQ
   21.32 +3MCUDkXZZ6PzdA/Ugyu0lcdJ65Hz0DuBowN4EeJKyVWikGDZ40Oz+H9u3oryOaO4
   21.33 +1xvRmlQXVM0aGtWZOolPK60TWQvkMDCPUwxrORV07NdTkOqzQg436W0Sj41g3cIQ
   21.34 +kq0O+hjuqmik5lr8SCI9TQAydI36K24euOabtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   21.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEdNeb
   21.36 +RJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   21.37 +F4AACgkQqOLEUwAZaX01cwv/S/iFtnO1aSxHnnQeG6GOw+/yx4XJmJegWJpJZVIf
   21.38 +2I4MXkJ7CL2JmsdoP1iRp7eTut2KRAU/464VbLhdqq0ZrijAFFOnHJhDy9M1bY7E
   21.39 +khbwLU5GDgCl/FEGACltw2fAUbfO8mFp0x1LDHE9K8FdnTVRasmS9Tk8dlympP1q
   21.40 +djU8BpswqWekqhpU4777gUMrSubdaXjZIlgX6XHeGgGT0vD8tT9BGdwW/y/NeMjR
   21.41 +RgnEZNMnwvd4MkewgqbsKPKqKUJfv8BVD3QAuL9j8aK1ve22BjRGQNNkdPy1f20M
   21.42 +DTFdY7bXe9mTILnBDuVv1uvFMMDjIV/IU9bVz3mWg5gqoJ7OCDzV6urvBn8RxQcc
   21.43 +bYAYcEaXLF14ZpX41Eo0eY7khYJLumdSEzAG9l90X6s9MAwX05g/U7PPE7nwO15d
   21.44 +HZXg6iAxHo4JwDMru4k355MDy6mZFf6ia/aAQWHpoGg4me95F1ekoV3wjJuvcamP
   21.45 +rQ50DbAddbVtt7j+JfyaedrNnQVYBFu2SsUBDADNRou3spids1sdWqcMQpxGncDk
   21.46 +fsm9Da18AlPsxyQVEkfBIEau+dQvA69SsFETKQSSLM3yRVHAMKfTBSnTb9DYWkEL
   21.47 +i9drRug6k/UtZog1aza5oeyS8xZPJmOYtgTYeEstzziNSCj9GjAJJUYbqdWnRRH6
   21.48 +4RCJZJyDD9G4iB0fKFpdOGlOco27WBBo+6xOcUocF7R23IiGqLhiLprnWMNYCh2a
   21.49 +stpdgJhkYcOpOcjYpmq+saf4S+iOv2pa7jlfQTgUlcxCNC/Igtt/tN9c4bYuSxFH
   21.50 +kWONOEToO2WzvyY2vxxhGdjzHYE1xLAkK30Gcga36XvWABgZ35JbpTBctD2EiqlE
   21.51 +z2LUlClLQGwLlHij5PkPcReInPeCEvpm20oPYB9g2D2F4Pgto6CRj2OQHkgZI6G4
   21.52 +RoI3bmrhujj6KjiKZHZur35Q/Tf/6PsES2pQF435Zq2gnprxLqm8b4HqY1Fqeqav
   21.53 +Nk6aMsTLd4uHigeLOPUDsN20ngbLtZQgF7XoEbsAEQEAAQAL/Ag6yqqc+vXzAtnZ
   21.54 +R2ky/eDtvZX91iQdC7HHWGYCUUgCaVKahTrunbsbp0hTq5EBFR75apYBpgQ/pfrM
   21.55 +X+jmuGwq8iU1gFMks3Yu48stBt2B9t6O6+dqlTJilDAw2/DffS0+srAAfJsNp29b
   21.56 +AFf5SoipFDwHNVOoOGKx5WDWQd3F6qvPzN/bsP5i7yoPdhohRS0PuIR0jBuHqmXg
   21.57 +timyhnSm172RtO0tAqXoLqEbV/VzCNbQ5kDBilJuwP8Y1L9uCCcpbDmGVoRAj/sO
   21.58 +4qetAnblKkFFcwObKRkWBFJMLEK8qxbUlyIuO5ETNdPnTDonNPQdplupEkIurSwD
   21.59 +qyZMa5LPUnxPGsYzRjsrj5JyFuva5R1zfnv7CYUrYBqZUyfESPo2Ia7HIbW78f7U
   21.60 +CdoxM062zklEMMfoX0TvAOr9ovqYHzGu9hFESRo3xBKtu+3g0a2o3wXqpRaOpK7o
   21.61 +y1RUq8dghHPCTq5BzIAHrc6jCInN1kViAv4ZLLWjV63PH/+YAQYA42A0YENpsg0p
   21.62 +VbEmWsKgg6bg1H/RLhkUI9EEU3Sojmandq3pA4HRcjbDdpcp/yijC9xL9z6KAYdF
   21.63 +kyBzYVhA60MgI5wv8kMe9jkTa9Uaqof4hcSSyWmHEyH/OZxFx3F7Q4aySwU8Onx9
   21.64 +SgLyZyuyEI5Ys5eqMackab5kRI6qh8vlhguvyEXhjPMcG9l61Gya0y/MPWYEre/l
   21.65 +AJ6QTihhvz5CAW9NvSlnq/xH7cNUKngqxUDc71p6qsZuj2zjd2WBBgDnHhoZ0Agz
   21.66 +nNBSb0ohOLW+1RKJXjXYkBbajLT4r0tSLei3OwdwlqwoHR6mgptEMjQif/kt+8XJ
   21.67 +3IngYKFJPKAjvirLTa2+/DQErhuvglLtfok+yRY5im0vGsgKXWmBcdp9ZDStBuQ7
   21.68 +F6+l1U/QrnWG370KdGgovgB3tOLEq3QK3jXB9R5aDYQ/4FLPjHYzt3bqnWzrWrPD
   21.69 +8IF+CdmBD2L4UZ9j9cGr4h8k3VqXlB2VIsXr5ccUQJnw0x/ioMqMLTsF/1ksnvRQ
   21.70 +n4vVQqb1sQ1l8CZ/QGMFkd3LLiDijt3HP95sRxEB3lkpfM04RBTD0tFnisOBOkzY
   21.71 +NXZTfkzlKjHrhzSidfautwo1jM07TAf88vrffHxUU5sdorAvna0x0Xi9Y+AD0Dcc
   21.72 +WycE7i11EcnZ1edkOtZzHthtXKMyMqe/X38bds39vZ9YuzLkRiURfhofOHCUhfTO
   21.73 +g5ybnWRXbywcKXned+kAqCHdLUHq7esQwZOxCCW8z18kkyjB0f6l+ZyRctb/iQG2
   21.74 +BBgBCAAgFiEEdNebRJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwwACgkQqOLEUwAZ
   21.75 +aX16RQv8Cep8jDIr2xEB0O+3aa9xDR3miq4Rsz9Pc2oZhjYmTCn+CNLaLyTMbZsj
   21.76 +CZOAO+NFIKKcKy5WW2HgJ2pEDxm1fFV3xLDClT9xT6tDj8CJVpkL/wJiVRcLrBut
   21.77 +auV6qTxt13U1dxFNAemPNl7XJlT1ivl4Ur3bs2gkt/4MkPcuu4xAygWpKCEu0AWQ
   21.78 +m8aDbnpCG3vMLKMUo1VXBkhm16bXKDqOc40g+vLoKW1fYcgozSzFLPDoz3hY4Mwg
   21.79 +X6AlOW4soa4tvrB2mxG4AcQBVHFUrwcm3MtoXSJUiFKz+s0geySqoYG8j2G3lrpN
   21.80 +6YpB+K8qAkoEJmpPLE+J+GYVl4RhiBVJoiVHc2TTRirFTDa+s/kj+xSXwDJ+b9gT
   21.81 +dLd6wINV2djC+YZedO+bj02UQ4z58in/PSl2GYynQeEuSX04iwjeRcI/saFpvVo4
   21.82 +S84RZ8OlVWTDDZKeJMfeCJrUoc3MtMlU0V9/kwxtmEcMd65tZWuMR/AVyHh7G2vm
   21.83 +Q6EcubXn
   21.84 +=2cF7
   21.85 +-----END PGP PRIVATE KEY BLOCK-----
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    22.3 @@ -0,0 +1,82 @@
    22.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    22.5 +
    22.6 +lQVYBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    22.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    22.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    22.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   22.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   22.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   22.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   22.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   22.14 +ii3YZy2mWMv3nQkAEQEAAQAL/1KR16CAO20srjubKxhKuDnZykptn4obke03C6Br
   22.15 +ZOFANeYW1aPqZ70hXBMZPYJlsmNn2jeXbhblKm60CUkiv7qKhLVlNhe5Pl+EvFxv
   22.16 +aC8pBHBfamTY4MyT87C/gY2MPMIBNedilPiT/9oGg0yIK6j3T7UhayVBjhFpjoWh
   22.17 +47sPj+VLEidfpVUzFXZQ3ufaSmeO3GNf1UsGSz0l2DWFWZCMZnhYFfKJodDmakKT
   22.18 +z4YwYW/wOWteMooCa0UHnF/3t7C7PdIxjImcN9mrkDRUrf27RmOIapJoG1dlJd/p
   22.19 +LdM1/rR/M68/+314GsrdMPhBne+0qzZEjFAwKC55dMF4aN+qtNFKHVcfxy4liVue
   22.20 +936V+4CgI89rlvusKC/KbX8SPQ5i5ci0njKPOLi7nTkJRQ/XqJz1Z2/Xci0/vHSY
   22.21 +WfhFafBrAlQaLuUzGjkCHp6qDAvhBBO7TVNylGY0oqJZ2QQ4u5Hu8iWlApwAmgBL
   22.22 +Jn7pytWN88ko1hAojRupbIkPBQYA65Xbfl7J+Pkv2tcX2qPqdSc7WwRhkDm7FvoQ
   22.23 +lyRLjPdlzofJ49thnQD6VJxjhis8Tx75fQylEW4gJaUlxZzS8QFLq4ZQkRNF7zGK
   22.24 +5LpmrgdPaRuX3C4fhPZoaTbcbCu7LkOj58wQJh+/HmBJx9xiescrXAWwgggCP2DB
   22.25 +mgIjp1RRvlueHBQJfk7Au9mvYQjdLe5me0VlN1X7S/yxO7rjt4csljmp04rwjzQG
   22.26 +zIYsDZKy4vHfLQAOd0e8JrImEXiPBgDtmN6H2jzGE88TEJ+k3uJqgzolRT02edXs
   22.27 +btQjLBaWaf9I+Zp9Ftp84FxePLKxHqVgtKw4ucr96r0nYakrNyG3/5zOd+HiTo7n
   22.28 +qFOFEl0A4seMEyCZfsPZEN9ObnAMUTRghQFj2OawVHA25WvaG9MQvYt+1FdMvTBF
   22.29 +j+zvDQzpyqB3Db9k9/p3xPM7BSgeeiKqsAxvrk1t+0rLAoJaMcN7UkpOdTPa41yt
   22.30 +5aWzKHoL84wgB5zPh7Mm1tZMGh/w7OcF/1g2HYkJgx5tjChGArEr0Vmv1XYM5pp7
   22.31 +0MinHlCNR/52WFPOcbEFrxlEAv1yhNTcwfAewvqNTQJMkXs8hxAKOwlhLCAIj3My
   22.32 +jnreBqjq8Cy6HlM0J2ioMUtRcLZypvQXZYo6XG8+chfIZ+t/nXgrdJnv8YqmP9Rs
   22.33 +T67cIS4AfBC+XKExjEmaBZpmsuZwUe4NadCR1ON6fAbfIn4R0PARjmaLE6oDKLkj
   22.34 +ITTWGmIdimfFOSCNoKYqTXCCcrSIkJZMjsi9tDRBbGV4IEFsdGVybmF0ZSA2IDxw
   22.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEELiEy
   22.36 +XSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   22.37 +F4AACgkQ8JWyAlA7FNjU6Qv/VWgdluLNPHO9yck3IEvoBN6Aa+q0r8UyylLj6hEL
   22.38 +/KUdUVXgS09F1WxbFnc17RiO6fxNQPedVLNMd9I8x6bEG/x/9BOb3y0rzQSpL9sh
   22.39 +uvkbIti/051wtoxDOSsgNzkRI5SYHVdsKdUU1SARAs2H/GE0C9pDxleF6CWbRQ+X
   22.40 +X7POQy6nUd5CHNlMyLk4S7vFlYa30DptgmIosjlJTVh8t2FaHcU9sdffHzazD/90
   22.41 +e1R4dgVMjTPIKM2wwmoau7iRk6VZZ4SIpQkbqyPIIpYcgDIP8AnaFouz43PhJt7U
   22.42 +HcwsfnC4cDToCZiRIooBuJ0FFCaJQJ5U2uaNH2J6Ueb3LCFS5futhS4lD+/6RO0U
   22.43 +4bKBrlrxfOuluZuKKX5WyYn6SPcMQjfXeEyScnucPvyAHFptqnKM/0TU9xi9mxXE
   22.44 +K4kvuPZQj1vXIUR9rm2MjR6OA8qoI+d/8PkfBLnE2hq16d8Uu8DDUERil2rywptz
   22.45 +3q7mxtYiqMbGWZu5hQCBaHiInQVYBFu2SrcBDACt2bUNSzhBoYbWbrLCRfauPdhg
   22.46 +y0HlNPObu1sbcXaX1rR8eN3GGP8oEEDAehf+0CEauHa8BkOqSRamCsHYJTOQkocr
   22.47 +8h0Ole1RvjY987ZnOKcD3keG3HxDcLKkGUHimPI5DXNKqDvXjL3UCPDq9aesROQ6
   22.48 +x2AS6qEbbJCTsiIx+LeN/PgYTlVNjaG9BGoF9U4zR2bjH1TZooDAcLvx/v6KeZpv
   22.49 +kAppxswz71gVsvXNGeTTeiIErF2I2XiaEA/0g0J3RxNsgD3fz1PBZcmt4Egte264
   22.50 +vV+LmxNC6zK++Q/ZZqR4lYjF2OWzrxYJfvWP0R4TEaOPldq1SkR24y79Iz9Lbf1O
   22.51 +X5vrr7gxYn8ZeucAIN3/hAPOO5ngm22mB/XNZKKL0gX8jLSnTteFm87wUggngNK9
   22.52 +rk5CJUQFpEiRA+dogyUKNT+PQDYyURg6s87vkCW3d3tabvi7vko4xrTdGVtbT1/9
   22.53 +sqTnJ7n6Nio6dbdnEV462i31LM8vj0GfWZGsLLUAEQEAAQAL/0I55GgPhvstcqWe
   22.54 +Hte1+j4vDg31cAFGFiT1jsPaCcDWyAOAsY8Et7KF2nzYJerqUyoQKh7/TeiBFjEj
   22.55 +eOuDZGzG/NonTZ1gTLrueFBKVmpk4O6uztWXiXjRZiPwATK2a9ODBa/jfYRjt26e
   22.56 +B1SiRwDvb3fauoUKP1wok7zHx5H8usPKoaH0uTclZH8SPudNJsCPCykrJtIPPvfQ
   22.57 +GjCaIFIU99lW6DiaQ/Dm1MnTViKPIiXTaUEZfjojCfe6dbGCDH+FWGXygKZEVO/9
   22.58 +tigvPKZ3hbtv/RpMupiSh6GMA+03TnZrtEYUXUk9FcCgqvkjKysgYHBF5IdnKgKw
   22.59 +2L7jKZFM8+ggzT/BsVfoeygcacSVCrawLqn0EKTlsHS30B6POUIJe9F9y1Y0UJkp
   22.60 +Wkpgx/qJyP7DZtFyZs/aF9/5ysMSQCEFUnd4xIkvRGWa6XcB3KdiQDP0b+xaqH69
   22.61 +tK/0gMQ/tcvNeh0vqXsi6CAWbjy8oxWP2I6a4ayEAut4hldaswYAzXnxR2ChMcrM
   22.62 +zQDRP3zd9/SmsEi5ouifDgVYzNagbtWK1BH/xdkrNdZhKrwIxO62fqpgv1E9tSFO
   22.63 +uySj8BWwdmcIpYNGEECGTTEAWEyEWER8tM8Gsq7gLj2Brri7nge8sI7wa2fSqB9q
   22.64 +6A829ocBSFGXfMAaAMJRRy8XWijDLj67U0RVXWMvdqF/gzme5yOWhvnjOYfN6U3E
   22.65 ++QJ+BJU6NwUXeTWPF1pbrUoIRzU3tRHvW3D4unA0oIgajfSqa5G7BgDYmQR6DKQP
   22.66 +WvuiIlPCx/Vhp0j1eRPUnGX4hScSV19fDIr9W/O/d9jT0uHbql2AxWR5jBp+IP4N
   22.67 +mekGXC+eEW85XnPGPJekXsL3UGKV5IAVzXzspZAW1ziFPXVnRERrgp1Q4or7fRx8
   22.68 +i7qiZmB+SUW0usekiQU8j0eFz0hrMQXQsLxZm7k1Kv5gYo5oT+THTT3TSVaU9pH8
   22.69 +bfAhDu/daRjlFCVhrZfjmvO9zR3C7b6WYSgwVRKbV3rFmo/TFIshXE8GAK65kS2Q
   22.70 +qW+K8m/wujBf4rhFsomNP8c4PI8Xm0EtLH95tifBNIUglnUIT951XFd1oZxPi8XM
   22.71 +zh/w9m5TgKM7AMaWerihrMu46RRzFXMVbtQRehh472IgOwevm138GzajkN4Qk5Bj
   22.72 ++ZLU1wfeMq+Qteg8TP9OhKO9Q0SVcm75BOoVVwlAKe5e29cUnoNRrW3IlMPqiN/0
   22.73 +TBq++yT9+7If2ssRrewJYBVNdoSvwfC2aiSYX1/4sEo6xWWwi2s+flHHDd7aiQG2
   22.74 +BBgBCAAgFiEELiEyXSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwwACgkQ8JWyAlA7
   22.75 +FNiVrwv+IxhA7UmVxTgcSQeihaeA6cVJPLF8fMZb6dpR49RC2kD6xeuwLdv10RsA
   22.76 +2OopdY4FMXhfW0grI9gwRokyC07re9lF7rdBdaJD1M135CXfNoR11kutdrVxnijL
   22.77 +54pUPZcuYIUhmGfy5zMiZKqt3hnPnzeQie4Cw5T91E0VQESd5D3gUSVqxiIxNS1M
   22.78 +PjZc6zy+tcgKCfUuS8kIOFJlk/dN4uHZhSJPDo3tdgOLW/YXa8JSGdHPRYIijk9f
   22.79 +RyFVlxDetLybjQ1pjkO3auiFT9fZifK81hkbfz1SCcRmGFe4FkXexQVBTFChLSQC
   22.80 +BLaw8v/ZBZ6lBV/BEt3kFCHZ60BmeBrdv0YGimcYH/DJgrJZMYGcYvzmupZiDJFB
   22.81 +O0Ky+y9QS365buP0f3/L0zbaEYBxIaU2rUL5pjmQf0zfZMUiSuaAydTJ976tbnzk
   22.82 +yRdgI1paKCNWh1yxoKvKVyEJffC8VkGe3ae9PsNONu+nOs75CqAbQRkd4qU/7UHU
   22.83 +tfgygNHJ
   22.84 +=BSKH
   22.85 +-----END PGP PRIVATE KEY BLOCK-----
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    23.3 @@ -0,0 +1,82 @@
    23.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    23.5 +
    23.6 +lQVYBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    23.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    23.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    23.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   23.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   23.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   23.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   23.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   23.14 +WGRPrdsWtFU7pwcAEQEAAQAL/A4uF3B+jvYKSw0gjmt4EgwNlgtBnKk1KVyOgQbG
   23.15 +1pwFPPOR999q5PQ8IEv87nCxQza6+SxjKNeCwARAY0tOpMWbGHM+UiKu4oZtDJdu
   23.16 +SWiXU5kQaEDsR51hsNpGvt5LGCUCQDYlKq2SR/wSjIt2LUB8Jed/o5kHyRQc2TXf
   23.17 +SVaSsW1r95v61CxJ5lYt5U4A0ySmS85fCQeJflvkfe+rwf7Z27W/vodw+1yC6aRY
   23.18 +OrAvnYz3fV+mZ7Y57tOFIpEWujQ1mR5ENOx1/uDqRYFFrZ26jJlkWva1Emoe6O9t
   23.19 +Zd8q99Umclk1O53CVZvUE3OzzOG/CH7fES9iVX2ATCNi5tcGtfpS7pCkEDrmmll7
   23.20 +MkXiRznUg26deOvQkPi5d5kIX3QEH9qG+kHjtoNMIO8vge8vkYtw/iYtQC2/F3E6
   23.21 +Kf/5fVTCjAxOYvohgC14kVSyQ+9dswkXyHbRxxYKKd10MK2bFZN2sJjEe6qEJR8b
   23.22 +2hqc3ue6QCqIKxAon6wNvAwvVQYA0d1U7ZPXG9NmyC9t1JL7pKhQzCFYHeDVowxx
   23.23 +tdBQU0VcGrk8UC6CjQuf4RN0X+boVU50YN2K9pH6kkbm7xYlI3KRT8bh6k93NR37
   23.24 +lmVasiJoQRsrIf9IiBAuasffbK1zRKS866lhE7fr1Xuld13Smnjua7/n+6mOXUNH
   23.25 +C54Pc20cYN4CsFYk+8RSWaKBa1X4OJ0Q6Ol5Wd2m8F2cULhH9081GUAYUUVW6BtX
   23.26 +DXKy+a+F8VNv8bzgF8LS7Bc6L+xdBgDY4ieEXvpl+QFBy9jkGHZD5ENfeYMAvVqb
   23.27 +0LtzHjfcIbar4cZHIlpYmvO4uBGLQGDVeVm/AVrmJvmkcsUfecEI7pWVfbuKeckb
   23.28 +dcAyXOjkPLK3nwKQ2rCqvSxkjuR+7y7kly4Qqg2BPso0D8nhVQ+sFBFh2X24lwRf
   23.29 +HRqLlVXYKQ3j3TPR8ricmiWDAuRzVahQ+n+7oYA//WgrAMBt8a4bYyOncarN+Nt/
   23.30 +wQRXtBQq5BUK4zs54wclKqu6YpaYyrMF/23QSSA5Qt2gUh1K97bwk+6ntYt9sAqT
   23.31 +FG5MUI9k1S+ZoZjgOl9Qalr/nGdBe8cUyhEBUwdc9GxMD3xlqEa3e0umNIrZHHY4
   23.32 +0OFtn6rmEMAwOfAjql1P0YdGvCs/w+SWp5JlBo8X0Sudwo0vDFSFlbk+OvwMWBKP
   23.33 +6UDstBu73Q7vuJNxPpG5FNdsWgJPWUt1hPEkUJuD5L24nk8km/ravRNgnyOYuBZJ
   23.34 +NRiK3I9p3lUHFv5bwAd9HAJvNaEFJ++JRtbjtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   23.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEPB5x
   23.36 +PYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   23.37 +F4AACgkQF56qJKIW6Vr3Ggv+JdIeNU+98rzlj8gvJsj1DzJs8dgOc5SbAzYblHpL
   23.38 +pt8dHMjUNx8jEVxXUedro2IDWAWMfyVXkG3ZA5Z8/KNdEuuH4G/THn0LBzgkLUGk
   23.39 +/gYQPlc0zXhMAaZDc7N78d/059dVcMmU75oqW3FEQmsS209nsobpdQZM1kOr48ml
   23.40 +F+2y1rgbPQ7RhtwRtEjxyDtncdNPujx4P/QKejKTZR6Edc13XwERD98MwDDjP08m
   23.41 +3oNdsO23bK9QNKqnZ50ybIchx5aASBYZF5FJyKdorGE3tvhPFGHhvF8rRcaeXvhr
   23.42 +pghg+5SzQ4qlEE+5G5oiyvPA0WtDadZiXQ+QfKLS66eS1Pvfn1mO9lWOxJXKHhj+
   23.43 +VO57gUxW0FcXlkC7KDQc0DuiDAyc8Dt7fePBiXzMbVYFE/UbChBmnY1KQkoe+uNE
   23.44 +tVKWctBVSpuU3/mGUNfKdVBxbKGe17wYeJ4nz4BrKc8M7mNpqzGslMmtMEz6yW9C
   23.45 +Zw97Uf2jVQW2upzkvX1+7xbnnQVYBFu2Sr0BDADCoGWh9r6YwoBMmHKMDBHOuqQf
   23.46 +69i34kzGI8alUDVv5mO/As19JdwsBbFlzU4IyfwpCiUS3a9eLvwEoQYSXxvraomr
   23.47 +e0gdHhExLrkaxhjdY802pJK4ZGnSJ5pNx6nz6VWVN1B8p4FUDfdMOVCPOzo1AHZh
   23.48 +pULkx9s9d+rEq15npB9R9C07KTmNZmd/SMm85f/gmmd6iCkdJQ8G+BfUPdFOTA/l
   23.49 +0rm5szCp51rC3EaEK5hc2PULuXRYh+365CM4aWu6iVgVibIXLIOg/Pd9wwTMrH4O
   23.50 +8v/zjkPd5DF/HprJevKhWnMHjiex8IMX+p9UTHqhyEeTjpZTHkep7jEuu6JCenmN
   23.51 +l6pw/gQSqHldMfbiSbCTz/Ywmk1MlrUjQ+6BCLsjZQ0KKQb8pSflfUWEFjYYhVvC
   23.52 +RQhmiwcCERxUDjVZZUwxoeAio6xcuUnEct51NI4FgXg9Z8iTZpF5UUJMkA2s3hyo
   23.53 +dwPNh0e6TvGksNbaO5W9cxETuPZrHj0dU2SWrHsAEQEAAQAL/0VicVkgYiqLjLnB
   23.54 +z3RmCSMuHrzSk9xabQxmTLc6tRJDjGPYV/G5wZhgHzIv0xYHDEKFP1pOdeqZzXbJ
   23.55 +ASUjiwyOWq4rsTXQNkjWY19MKCklH0/PtA7QnXkybSw1dj1ifgRISAVoog6ZPASM
   23.56 +mk+1ybaDh7Cf/g0ZwutTCPs8LNe+BvxslIN22vGyBEu4Y1NYm7Qy15kzWZTuVUEi
   23.57 +yTv9HdVQAIrqaRPu8fZgaFb3uJv9/r97CUE4yGWXcBv1oSjHS+RAKcmeekOA9Glr
   23.58 +hKWargCsATScR2MuNo8hKx9ZX9WiRD0WjHk+sNiJBUWpcE4ky0hLBhblMM3LB/mr
   23.59 +jNOB7fsUYhMwRo1LIPxivIEo+VOXEVfiYR8OiZI+QuJeOkpD3NIxIYjwOgzPOKqw
   23.60 +LgT5T8Ugx3e/hAbmrEJPgt3bOoeKkgCgsLvWOvbVKp4HEpxPXcDc1tyMhRxnaDxn
   23.61 +MKqyEXxZRuaX7IOiWVi4oY+FV/bXzN7a2L5jCw+apTtul6orIQYAxTbcRYoBM0pi
   23.62 +e2HQcstBeoSf3/BYgPH7qUZJFG6wUuKPfBt4LGftce6Yx8UyOqWide2oNqtPVIAG
   23.63 +IcjiPTZC1PLZJItcq8qmPcGxOhKVa6Cj27H+sTVE2QeTTuuNsczxXj5DO8BCStbJ
   23.64 +6G9kULga/ncNsvdh/uNZDmNgJcy8w28uays6cKtCRP0RJj3VjlRwZrhVjl4x+fv1
   23.65 +yvccsoatNyDTAI/j1I0IgCusAwzc340VVSoMN6AKFGj8RkTnT5xNBgD8pBG6m5a/
   23.66 +NS9HAPyEbEMstFw5/rWnZ+NuFBZuO1eP8t8vpYVEejkedWHvRmjw7GJOO9naM0RV
   23.67 +DI1NjYEX1yPESJbREft83ahYQeQDVLxxyoYtqsaGoUovXUmH5ZXK08APxPeKR/PB
   23.68 +LQUKUyoHxBXyeRuFKxJ1Yy90AoeSbIGKSoMokKqN6UNWRsouE4sIxtkdSf4/U41M
   23.69 +L4VUr6TQZbh77scjHdUIBeT+xdlrCu8yCgSQWOOf4T7hwYQX7JOIr+cF/2DGgvJ2
   23.70 +EIAaeJ8oKjb+MLr/QpnyMAC0cqXVYov0RyVhNKYDuMZlaaU61S/wBrMTnB5tX30U
   23.71 +XxhhVSDWVq6ulZyqj89MR6F4kTMpAN+AbIBetY8NgEgy7RrigcgIU5vseT5j2kxY
   23.72 +xx+7xCQ4WRS3LMVz89PNG23f4OwFg0xJV93HoBkS3Z5BEwCQGmIisCHjWiBAnvyu
   23.73 +5nDGKUTzcsso7v0eIZBNmEXRS8s+/sFK2t76gIBYgdtJeTd9s7PwvWWcE861iQG2
   23.74 +BBgBCAAgFiEEPB5xPYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwwACgkQF56qJKIW
   23.75 +6Vq3pQv/Q3Cya7L5MDbn0y0Xq6pD8bXIfiRk+370v8vO8jWuLwwII//pH/nYWYxz
   23.76 +tfLgyEvwNBdROWeOLEyHWBehXsXbO86wIgypPcAyLfBSNPR3R/axEAfo4nWIEPRS
   23.77 +0hun6I4Ytyc9ENhM5V8+j3JkmB5A+oJ3H/0b5ZUIKzHfgwOghPoh6GrywMroDxDH
   23.78 +V3S21foTXfk6rpkj0SlNyOyOD673QsdpjwZmSkyfi0aQHKkAUitXryqGERT27KcN
   23.79 ++ja2tCWtBVLMfBVUMctXib0oC1PXwpPa/iT9r8CoNo4NgmuLGh/snMzpPUWFRFLp
   23.80 +O4VSK1uDuZwfzedQ/uCuyPXs4hMytUEmUPFV8Fuj+8n5Q/3QTkQonOfGONIvb9M5
   23.81 +D60eXl/oex0oSG/ptjGxgieC4/cMp32NZK3s0/vHEt9grYRtfi9jYOqRh61vt1N6
   23.82 +a4XZxK91mU1M1hrAGz25CN1CzNN+4UZ8UrMN7Gm/pgxycvTOh4+cloA0IlM42utR
   23.83 +u2uFhQAD
   23.84 +=CwuW
   23.85 +-----END PGP PRIVATE KEY BLOCK-----
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_priv.asc	Fri Oct 05 08:51:46 2018 +0200
    24.3 @@ -0,0 +1,82 @@
    24.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    24.5 +
    24.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    24.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    24.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    24.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   24.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   24.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   24.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   24.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   24.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   24.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   24.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   24.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   24.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   24.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   24.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   24.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   24.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   24.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   24.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   24.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   24.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   24.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   24.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   24.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   24.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   24.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   24.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   24.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   24.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   24.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   24.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   24.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   24.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   24.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   24.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   24.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   24.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   24.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   24.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   24.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   24.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   24.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   24.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   24.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   24.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   24.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   24.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   24.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   24.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   24.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   24.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   24.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   24.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   24.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   24.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   24.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   24.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   24.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   24.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   24.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   24.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   24.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   24.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   24.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   24.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   24.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   24.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   24.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   24.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   24.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   24.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   24.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   24.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   24.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   24.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   24.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   24.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   24.83 +Xfa30xD/
   24.84 +=lDJV
   24.85 +-----END PGP PRIVATE KEY BLOCK-----
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    25.3 @@ -0,0 +1,82 @@
    25.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    25.5 +
    25.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    25.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    25.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    25.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   25.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   25.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   25.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   25.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   25.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   25.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   25.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   25.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   25.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   25.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   25.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   25.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   25.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   25.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   25.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   25.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   25.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   25.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   25.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   25.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   25.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   25.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   25.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   25.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   25.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   25.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   25.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   25.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   25.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   25.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   25.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   25.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   25.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   25.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   25.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   25.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   25.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   25.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   25.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   25.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   25.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   25.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   25.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   25.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   25.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   25.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   25.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   25.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   25.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   25.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   25.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   25.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   25.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   25.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   25.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   25.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   25.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   25.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   25.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   25.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   25.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   25.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   25.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   25.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   25.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   25.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   25.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   25.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   25.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   25.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   25.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   25.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   25.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   25.83 +Xfa30xD/
   25.84 +=lDJV
   25.85 +-----END PGP PRIVATE KEY BLOCK-----
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/test/test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    26.3 @@ -0,0 +1,41 @@
    26.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    26.5 +
    26.6 +mQGNBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    26.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    26.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    26.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   26.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   26.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   26.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   26.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   26.14 +WuW5oqY0+BRGOL0AEQEAAbQ0QWxleCBBbHRlcm5hdGUgMCA8cGVwLnRlc3QuYWxl
   26.15 +eGFuZGVyMEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBPRZihfUaQ6ztbD2o0Tw
   26.16 +TpY7cwLbBQJbtkmjAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEETwTpY7
   26.17 +cwLbQ8QL/243450ktf6iX0aLoNotLdTMdtwIGWWdc9c+bIhu583EZewthxgWrgqL
   26.18 +wm1TdkOFxwxcJvGvi0X2AriLllGSDDTpvkxRw1Lc2zwASEs83ejNG4rMS2K7mXa7
   26.19 +Cof2Qdz1mD5e0PrJrbbH0HuhBWiFYuIhaa/KizIlZBNwp7BDY1fibJBGvAFkw4Fv
   26.20 +WB2AD/w0PSmHHSBRn+iJz591FIzoujXMqtVe2ogxC07fVhMnGEIFWKxXkRzXuy0i
   26.21 +rXJJ/jFIAI1otl27HVIv5rpuhoHyujxZquW+AtvqcK8jYmqaqE6cPJhZEvbtFNZx
   26.22 +3IMQdMecZbbLZHqyuRCbRUThA5jdoU3mcVWq9EKEx0FebLtgIdNhcX+IRTMRDMfX
   26.23 +Q791v8F0hiZfwm2daYokEyhsYys8apbkaWwARcJ6rRPsju5fN7ijcF+NnHO/NksD
   26.24 +35mn2hWBnl4gOJdN07zLz9WAyBXTfdwokwmF7S/q5SnhI1X4U9HKb5++mRP0+kfx
   26.25 +Z2qW0igZiLkBjQRbtkmjAQwA4wyK+uZrNstWaHsVY3Z+fpYGhwgGIrY5tHP+sg3V
   26.26 +yfvgfhInMbnAt7v5bgOfwSLZ9LdNqGZK+c64Lxb2vPXFCgqs4OoysxCGiik+fKBN
   26.27 +lWCrL8p77TD3Z2KjoJBZrh+gr+KUY6TvMoDhKk4UPCjTAs8x28UolzuFTt5TSNE3
   26.28 +1wJjfiQMoQgv9Vp8xKhLxRUa+SxI1ZoatMHvnIkEdvZIOe2mtUoZLvLnLrG0q2tg
   26.29 +ZZ8oJkZcjARoNwLMRtNKvgHIDbKhwfc9rAchtVLFk3ZmOqiyezxa9z03Rl6iRhPA
   26.30 +mfhL/6c8HVmf21x5qUU/r69xT6bva1IyWnRU8wpIEEbi58wucmI1PXejAP3yCWVd
   26.31 +1CZ85kWhYLl+Rw8awnPSSFnNVtsItAb1QulyMScXT5V0b5OBQesVX6VHBF5L8Xzk
   26.32 +tpmElfWcbE7Bg3QHS3y56obXxO1Ir9ZZkje+3jc8UcilI8sHWPZr8icstCmMGIWm
   26.33 +8+x0Cw0szAKZ1Opzn6re4+2dABEBAAGJAbYEGAEIACAWIQT0WYoX1GkOs7Ww9qNE
   26.34 +8E6WO3MC2wUCW7ZJowIbDAAKCRBE8E6WO3MC27acC/4x+mHPPkP0eur8yBSjZ3kM
   26.35 +gWD8HNGaVO7kBIQUnH156I9S1EzInl93fwTMWUPKyhghzVAiP4bDfjOW1OH0LEPT
   26.36 +OxU3uBNauWBnn63y8pYOKAlhB5xmxwqdluJDMMiH84N/ellUsowO/PoUN4cxXtiM
   26.37 +cVoyZbNEs1O+hvf+DODnxN1v75IKj94PvlZ8Nh68y09DGYhWNwm2VwiT0nddiX92
   26.38 +SF04WT+ucOsjGm2mw76gvMHXPB/Qa9FPjez6YObWXADK2rBJynwNLahb3LeE5JgH
   26.39 +Hpu7ONTjtHQPmF4TgKH6Fl/Rse66KwJZeYKhrMRSaflwbRl70jY8mcKxFtwGuIGu
   26.40 +B1tykpZMidZ0cmIt5eGfJ/NXTQA+AKBJ5aY5tW5ES9UCoWcF0p/5VHL+2l+exzkd
   26.41 +Q4h/dn002tIDbCykqL0CcwNz/tiiKo6heCCEwG4s9CovgIpF6s2MRVvKQjc5p5FT
   26.42 +3uhIr9IQ9gCkrmUfBism3o6/mLCfW39cAMQ3k/izRvM=
   26.43 +=txtS
   26.44 +-----END PGP PUBLIC KEY BLOCK-----
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/test/test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    27.3 @@ -0,0 +1,41 @@
    27.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    27.5 +
    27.6 +mQGNBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    27.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    27.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    27.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   27.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   27.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   27.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   27.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   27.14 +MtOUJwMpAelnOeMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMSA8cGVwLnRlc3QuYWxl
   27.15 +eGFuZGVyMUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFmvTFFJIoNSL2kEUxwJ
   27.16 +cwpUEmD2BQJbtkoDAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBwJcwpU
   27.17 +EmD2c/EL/j6lozpt/xio+XP6lLXq9b9yykdJpOFW6Zw8tB68snvliMQhVQui3NZz
   27.18 ++etb1KmO4eGRYxknRQKfYFZdOsgfWki+MTbTeyiXbS0TtAryxQEJB1SoU5/Fn3v+
   27.19 +E27WB7W4G58bdnQnULo7AwyVJQ4xqzBoQi21Zn8T1cnkq71AQ4fX44pqPoLKNpWy
   27.20 +tf7B4p6Il3p8KCZlgTNo5LlkAccV2nvPDEAf0pBSZ6XzvKWhg15Is4lIcIU8TUhJ
   27.21 +LHpuzQsADYBxv8FRQ4TqfQPqP0PJnWwiqw9D1y/DFdKQnxonDfmmoHEwxrqgX02X
   27.22 +QmV343BNMfaC/qXEzbCHtTd3Bg7nWw/8NSdYjE2FDM5x7BR9s5T2qnyXDav+KOWK
   27.23 +RIyEaD0c5+EyIafHgsCO+zFSdqgpg4hTKLqGbweqHGF5sIU0/fzl7JptczPCEF04
   27.24 +58FC9jzeI98wORUchEHo06ky3v2rnZ2FRxLEfDHkSA6CEnZnDUQEKyg5tKCFuzQF
   27.25 +kpaVtEf2UrkBjQRbtkoDAQwAtOGWjpeYKT21urofhE9qB0pDksAehxsHM5uWyJ99
   27.26 +i2fX0DkCuvdmvJaYNEbtRToREbK0lTpZJN2BYpc1/T+jb4NkJCxQXuCBS8ptkbAW
   27.27 +nPL6hftu6eco8jO7PluhHzpe+C6gqHEPOUUa7zG0afhggwsu0likKRHkKGYVH7ww
   27.28 +A5DHPh8aEo2vYObhVd3U6X/cO0DBlvJheNjqujW+GKoqjEAkhmNLe91guKYL1e4E
   27.29 +CTgN7BlXQyGuBQChcnApfI5O8HcmrH0sZ7NnKtozuB4AkBYn3rfoPce1OHrJ25Mh
   27.30 +VHPsjDCkCeZhtNFey39OxsmkLjjrSTo26LvIjLAKqxo6trkN7hLtnlTGDI+Cd10L
   27.31 +bVG93zm8D/RuwYv5EmRY8t/UsXyON9o3FU+cZsyGOiMsvi4CoWoDHlA4ADbOwN6a
   27.32 +030W0MauPA4zNuBGB1is7fBnTpPExyQLfd/xuJeaHn5nrnpSNw/JQRWaP67ptZiC
   27.33 +mmNlC5wCX8isPSN77E9xrV4NABEBAAGJAbYEGAEIACAWIQRZr0xRSSKDUi9pBFMc
   27.34 +CXMKVBJg9gUCW7ZKAwIbDAAKCRAcCXMKVBJg9j4FC/9bvVd8zvbyFZ++PO09GyyM
   27.35 +l2PdpHIKkADwhRlZWIg27rlrrIv7olli74ulBjb4CJSQkCKf1TZLR6B7QfbjUhcw
   27.36 ++PvuoImUu+28r4b69mXPyTIJNQ2Nbo6jWdu2ptzkfywJG/W5JM9WefcCeSMsvrEN
   27.37 +b3N+Mz99OoSOcsJQSmq3hM00NFxaeDVO68WY39k8bbrmCeSLZFO65fuIPAbj1OQk
   27.38 +sG4cOPYijSCU0aP7hYdPAu+y/5PPb9RmB18kIJgDOP1JoIeqPB3ZJNl8fVrLKUdV
   27.39 +JoENh/qCSBFp9HkChmNPrhHjtAMmPXzwbhoM6R7txu6yn7LCty1nMeSjav3SLHoE
   27.40 +uvqDri0pMC8foqbezb7K31EwQDJcNzfnSszfYf6iLWULBB60qtMBcVmdO2qzCDcq
   27.41 +TVvh8knra0GuchWEXUUORERBzidxz5CXy6TdjLEG7I2Hne9MeuUwpfeV4Dv0mgG+
   27.42 +0n5F4IBlmcht/cIZOl7afJP5HcxFKOuWQRpB1mStyp0=
   27.43 +=reOr
   27.44 +-----END PGP PUBLIC KEY BLOCK-----
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/test/test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    28.3 @@ -0,0 +1,41 @@
    28.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    28.5 +
    28.6 +mQGNBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    28.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    28.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    28.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   28.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   28.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   28.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   28.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   28.14 +Ln0EZR49Fm5yAWEAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMiA8cGVwLnRlc3QuYWxl
   28.15 +eGFuZGVyMkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBEaplPGQd8BWEIcCc8S4
   28.16 +qwumUS8wBQJbtkodAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMS4qwum
   28.17 +US8waagMAJFQBndihCqU8cbJWd50SiDKJKkq8YRMNSDZitPKpRR492+3m+8yRVTU
   28.18 +Kau7OVrJfPUpBFffHZfaZstjONUQGlPjP4zmJN5qsakrtcogPKpCslnBd5d/m+4q
   28.19 +vg94Xyh1vrZhzMqIrW5nu6LRB/gvoaqWPzXvqg/sGQMnpL7HC+uTAT11b5u8bHrg
   28.20 +RUfYfPwm6uWBaFtm+24rDFR6CbiD3pPrIlcuwsRwc1+JuTvmfTfuLzqOGnSMTBom
   28.21 +bG8j/Ep/urSnGvAmtjRH4CCP0N1rA3LTTMvTO+qtBJN9m3txf93iH+LFFlbXOC67
   28.22 +pBa5Qz0J7Dvrf235LUdPzh3S3McIzG59M+caQfLCSKq+car0s38BQ4XwPO5wcbe1
   28.23 +dbP0CkHnriPbzh6Uh4ML+gEiQm/EIopT4Xr9fDjQYNCs5k7eMYnjihuSjYGO8HJ7
   28.24 +1H+0m6r5qsXO7atCt4ABaqGUvYurbcdOJUqs3ZFKEDlZSPYV0e/iKYDPcoT3fumM
   28.25 +rQf8hAVCq7kBjQRbtkodAQwAwKrq3pXQlQDg4PQNnpYEK1g3aCpYsoOPvmfbDjBr
   28.26 ++egfb23dI81j1e5CaJCMEjNgSGjUrYwXUWFkY3p1Ko8BYI8//p8Vlefdzx2Dt4Ky
   28.27 +yhLyPmlVYB2V2KGkfT/EZyuoz8UoKY0ZTxYH9IFLLlTmr/XjthBRS9tu5LVDAi0H
   28.28 +/8Cg09orOqjo5aIDiELqDhjdrZ1i5hbPQlZIl/AYN3fVcFnK576azybu6X+NsApn
   28.29 +t0etAfNq4F+29Vvp253wQjypUHxDKq5t6wijSwn36NuVsrtBvVNLH4OtUpBYvCS8
   28.30 +5ouDTNinI4B8OwJFK1wBPCW4v8goS25lVQqhN1uVoLgjWnb5/xkKD6DgZlkKZZCw
   28.31 +tUrpSmI1WM8LJwCnQIdVSNwpQ2MK/5g9Tt/Uxr+k3cdS2yNa5+XCOisznpjHd3c6
   28.32 +t3TUfLVIN/AymMW2+szA9uBIOdPvZ7gBewEki9F8IyVINpD5SStpvJSFMp4ixCbh
   28.33 +cB4Q7JGKknLdTcI6aFzgmWNDABEBAAGJAbYEGAEIACAWIQRGqZTxkHfAVhCHAnPE
   28.34 +uKsLplEvMAUCW7ZKHQIbDAAKCRDEuKsLplEvMKm9C/9Uf+acjbtZkBLx3XhAfC/g
   28.35 +dG9bF3zxFfJ4HWmYkgSs6MAOzPVkbakeu/g6n0KA+hbGfN2HL4MXAoJim0lRelT0
   28.36 +XiRUMNanFag3L2c0jOccVrEvJe3ZzskUYujlP5VrlRdohiv2DqQ9gHAVjrBMq8tN
   28.37 +aCs8v6VpyKUt0HTFLUVV3lOjujZkkKAL+0Y6Dic8fYGJ57CM+AB09ykOMUK6DLvp
   28.38 +SWmNukn9RgOGDP+Dv6Qu3pcc/PmyAdeq876O6Kp3EYWU5CfjGIokGNIs9pTZAghi
   28.39 +OYedskfX46acXKbYSZGfh+EfTKEGkTQ4e6/T6JZi9+v+mO2UJkXqF20qIx+/lybF
   28.40 +lbNvcIrfdhd01xzDgJbq6qaraTKf1wNJfDs5AwifudmlzX0vvZvP71lEXbOlaZii
   28.41 +BJI3y9LCWwT6NOoQgLGVc2hqpByLQVfAtQDhafF4shOX4+TNWCFEMzX/4LVeRs7h
   28.42 +vq55IsjHfnTplniqWG3xcV/cpPCQ8OvknNjThzxNFao=
   28.43 +=Jo1Q
   28.44 +-----END PGP PUBLIC KEY BLOCK-----
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/test/test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    29.3 @@ -0,0 +1,41 @@
    29.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    29.5 +
    29.6 +mQGNBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    29.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    29.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    29.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   29.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   29.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   29.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   29.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   29.14 +2VVBJm5CGF0GJpcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMyA8cGVwLnRlc3QuYWxl
   29.15 +eGFuZGVyM0BkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBF9wdrvZLhTqSfDffCzk
   29.16 +lBlySzl1BQJbtko7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJECzklBly
   29.17 +Szl1cJAMAJP8Jm4z0ECHkBLQa04eZEMOQQnlGh9c2TYIUHpnRPjuClb/zjNqR8mz
   29.18 +cPSzYoVgh02bHZfDEXDlDBxc8BxE7D7gbjtG/40W/mzS6fKvzNpQUlMY4gz8xpY5
   29.19 +qXrfVouMuFDR87ueZ77vJEuZUh8TmyqiEkVH372LcY8uEcjOtTkE+n7wfYFiNQMY
   29.20 +dukKJrH+sFW8fXz5Ik/ktPsm+nKKsZb/GrOXpWwpLFYjm5L/nbugrytuhudG842X
   29.21 +YSPbqKZPnuf1CYAGOLly7Q7AevI3X60e45JzRMmGtIXjEcUBI6EDA0SesUa32rfq
   29.22 +veNbV53eUsELgimjkYvTrHAaPBtrznrnpdrM3j3ZorKlrnUF+PP83GCBiruHABEV
   29.23 ++n0ZLBR+iCspIn156cj0+DakPqDlEeWx78YDVbMNz5rWsvESGSpZJVzvB+z3S3S9
   29.24 +goRoC+PuCXM8CzJKUMzKqLhR37xC0h6k33lcqWvT0fL908ix9qPjAA8Uyz0mMk+i
   29.25 +8LMWpUF2dLkBjQRbtko7AQwA5VTUHI3e7nwI5TOlYxvqkT32KFLl+ODi9b7h15ZO
   29.26 +J84BIIll03m5Od5B9+yhnFGcP4+r+4ob0r1WpBA+N2qE+pMoqqPdX6ZLS3TEVBRS
   29.27 +Ot3zTxa7fW6RWOJoPnFMaWMyJrFDamrEm+tiCB8b654fSTfmvEUzB3U7Cnl1JEt8
   29.28 +XQBI6mOAuiQnkDfU3XRzAZ/R4ao2XelWf186AJGHQqNOieZbwLUrbXlJqhzSWCrE
   29.29 +CcKzV1C1cXAM19qJCnsbzsANTZH1ZR/cp57iTGG21v3nz41+mDPPR9YifZGS1Jko
   29.30 +PoXP74+FpsNzWaZh0pFGNHRZP7RrN7VpljtU04Et6Rgk0irRqvDpQztnFCm67r5p
   29.31 +6K9qA/ed23sNPBV7Ghbt6LSJygwAKBZUCJ3ulHc8nEfdlxPuiLqnDG3BLc8DtXEV
   29.32 +4DA2O5q4yVDkJaxMxypjFomdTqlzI2pInkPX5Npja8NXTXd/0E6/pyPiZofai+SH
   29.33 +Wb+M6NMlqbwdaivWVhBCLLj1ABEBAAGJAbYEGAEIACAWIQRfcHa72S4U6knw33ws
   29.34 +5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5dQFJDACOMW6qkDazVjjFenLdCxko
   29.35 +g+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQiy4kl70+pEz0eA6pOHEfmsK2ITCl
   29.36 +DCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLeRQN4lB0FmVys+lC9ad73Vl5Bzhyo
   29.37 +YTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEggirJTup7niIQfwm8bOuogt36+90J
   29.38 +sZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9rzxHpxKlQDLS/OGtBUz7AZWmZZnhI
   29.39 +ZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw0B9PLMSafP/i+Awf2vA0pO94uCGD
   29.40 +YG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0IaEH4EDChvYdfSNpghcdUu6+zBS4aA
   29.41 +B3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9SNZZYVcV9pTdbU6DtaQWmI3xMMav
   29.42 +XNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCVLqdCUc8=
   29.43 +=LncY
   29.44 +-----END PGP PUBLIC KEY BLOCK-----
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/test/test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    30.3 @@ -0,0 +1,41 @@
    30.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    30.5 +
    30.6 +mQGNBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    30.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    30.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    30.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   30.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   30.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   30.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   30.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   30.14 ++rKeexgmSicMiekAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNCA8cGVwLnRlc3QuYWxl
   30.15 +eGFuZGVyNEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBOlf/5W44v3UoSwzdDlf
   30.16 +FIWES53PBQJbtkpJAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEDlfFIWE
   30.17 +S53PXI4MAJR3ddyRa4Bczzsfsm3u1Ujg1cYwBv8y+mZaQ9MSwG9JxpSVZH3Bed9W
   30.18 +G8h90tLeiZlPm76s6oALjiUqjA7X/7/O+No7vOk6nyM1lRU52eXfAl3rMs1PpwJF
   30.19 +b4MkaacwraJZzDui9RPGiem82+ikCWXGb5YXVEOIi/qcsGI0EwxX62IwiOPyHu8Z
   30.20 +nZmqnOThUKnVnb44T83+ZgQuqDITOACB+uzHCgFOwUtGgjf4GCbH8viLZFOATrEH
   30.21 +UUZ96JQQbaRBLbx9ZMek61inhGCjMLHrybpa9n4V2yaRHhRoYMCR9YDZ4Hg2TZCN
   30.22 +OPMq9F9CuNK+chQMc8UY1CCwpswk0uYZWh6H1t0rhR+IC1FK+WfDOze7+sgNsB/l
   30.23 +hmt+P2dDG7jqk5UTkUW2LgRlb0h03Jm1jeCfSSLfSzOELKczGJGihXKtj7CXvAAP
   30.24 +SWmq10Bl4kFGEOl0GgxqqkO1ujtXLUU0idOK9w5GPEHd153O/zvwPcaWasGuVqiF
   30.25 +MVxGu8WFVrkBjQRbtkpJAQwA1AawhIeG9qirn3P12k2JfBmRd0eB2WypHi987kmD
   30.26 +ygiYyDZy1/8D9Msuw6QsvGhTu3bXvbHifBuu+/JPebUbJ6xyiNdgGMJAc6RVJiNz
   30.27 +a9Un3h9sM0P4lRfLCx0b3qdCafyc52YFO6bIAYtGK+0WAM2ya3rautPJmo/f2apn
   30.28 +98PpCMdpbhsJ7vHVoGG6+rakR0OCDe12+JGYQ0ilpX1dk0RwH1ErzpHIkBgrmcBz
   30.29 +F+gpEDvFPYpWrKOIzouKJlXi4KMSfjW3NayJO49BZUf9yk4GOVT/uG9RlPeK956m
   30.30 ++kDH0pESqpbgJbW36xIUgCf5/fZkrjuVXHpl58DVUrJsq1RFjtJgVyyd+VpZsaN+
   30.31 +emyeKJ7Vdu9VZitbxajKhsEPmzxlb8YP0UvKtcr4A2WnH7Ds22/j1hoy+1XTanXZ
   30.32 +MCnqc4+ilHt2oz4kM3Nkn7bizswaP3606O9XogTkHA6kX6qtGSU1ALMJ2fDPJjYH
   30.33 +jv07sJuM9DFciAzin2iC34ZFABEBAAGJAbYEGAEIACAWIQTpX/+VuOL91KEsM3Q5
   30.34 +XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEudz7Q7C/9k0vPVUQ7mP5B5Mi8yQLEC
   30.35 +cFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m2ptPhrreFVPcmIINpluQEWUsS1rq
   30.36 +e6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oGXR0G+ujZnjWuDIhqfkGUxhZCic/z
   30.37 +toboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOKIkx4iaf+bd+hwGkdo+Y87jHkCctW
   30.38 +9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAwwZflB98agOQWbzZ7HHq7jI/SXlewG
   30.39 +PRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOymamqLVerp72RRSkGfPpYcgCQu5qY
   30.40 +X9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+UgWImfUr8E0ZVgjXcEAHOUXjuIiZ
   30.41 +q01TQAnprcdREzJas5rX8jEttddKeT4WlBY5mu0oNrBiTOiQK2ZIG8M3Zch5L4I7
   30.42 +P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWKvVrZVl8=
   30.43 +=W5LX
   30.44 +-----END PGP PUBLIC KEY BLOCK-----
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/test/test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    31.3 @@ -0,0 +1,41 @@
    31.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    31.5 +
    31.6 +mQGNBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    31.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    31.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    31.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   31.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   31.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   31.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   31.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   31.14 +YncgyLU1Gn3bDIMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNSA8cGVwLnRlc3QuYWxl
   31.15 +eGFuZGVyNUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFi8wr8q4ePE++q4mteD
   31.16 +isoHc80pBQJbtkqHAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJENeDisoH
   31.17 +c80pZKoMAIaruJ8K0WbSOtS5xtOolQRmug+usnbk5LAlKOgD822qWjNmocO4+Xde
   31.18 +OMOUKcZS/Py8SbftMQkpo3urcCtH3xJYrOj16gEzZU57cgyfEFVOE2wYqGHxAM0y
   31.19 +0obJpHwfoy6yFxGCka8cKjevGw/7InRRWu6+dg2VLHvKmIKxw4PpOvGa/J60nObM
   31.20 +p3XLq5YdnNgbcGFwT0zWAzyD1qtdFmn+2BQ4e04WUnTYdSnDWpaZQ2GV/LYLTmIl
   31.21 +IIChKYem6jOxSXhkSfN85CmB5MT1gNBJPtZZ/hLqPNhRFz8cteKAt0tRhOYECG2D
   31.22 +nAHufJBMuDGkBtpzJQ5EJWEmglUv1Kh3pFam4lWsSFbdLB0/zzTpl3AnxELbjcrG
   31.23 +eHpTgYX/Yn8kAcdW/dWh79g8rbEYEhyniJLIgqvAKwZF1JD6gnXuuBXJOrUGOZd1
   31.24 +U+NFHwqRsPujdy4vWFRvU4OlSbp2UJen2RMhXapKVQJd1NX7yjMvW0PKiiaLIq+a
   31.25 +36zxUS4nCbkBjQRbtkqHAQwAwWdMTN0waeuEKkblFE9kjSOodgAZe53o3b3NMwI8
   31.26 +Q2004dI1vmw6v8e9s7mBE2OQmri+ioUmdwcjUGJVZJA7i0Rl9JbBWiOzzmV5YKpr
   31.27 +LGNUWAhBnjB28hmH/6JzY0wDxHZcmZ4/GiMPg0HxqyLdk/gfmCQCiBL/+DSPXB1V
   31.28 +v8ktGUvVTAS/RA57TEY/RffmplZw3KaOkVFXfT+XN46mGdJKp7KcWdbTJqNk5A3G
   31.29 +a8iviP7FVvlyvfxZk64+u2vp53p28wBzyivca5tKPSiUFsHEnjHZtQuxPpRdQ43/
   31.30 +thdBDgUEaqaJUf7uDqgrED48Qc0OXytvOz+MpaifwRQFuZbe0ZDvSje4ZjPPYz2p
   31.31 +4HbnGHdjgLLygkLyYdZIPUQfgtGnUBgWUAzwokU9o0nmNSnkbCrjolfHXh8edaaA
   31.32 +DBoZjb9feCzoqOlm6qt61I3pflBAjj6gUStFwhSW5jwgK0ajeA8QQmVm/2Y+fEA7
   31.33 +OcYBNZI37Vc3ktuuOUjrHWp7ABEBAAGJAbYEGAEIACAWIQRYvMK/KuHjxPvquJrX
   31.34 +g4rKB3PNKQUCW7ZKhwIbDAAKCRDXg4rKB3PNKfo1C/4kRd2/cjZPTNM6mRpX1dcz
   31.35 +TDi6H7eIzst8ZBaSVJCF+4gh536yv52+Lg9Uavgz5mZkHmDZ6MMTNOg9NG7aOaVb
   31.36 +eOfvldjfHR/gnhCUwhlgLWGTln/gAClRH+i/ASLF7zVtddLQfmPFR0Nrj5Bs49Pa
   31.37 +NyNsVxkwEPwfBLOb8kbAwzwgkfL2TRqbWD1BBH76hhTBQHaf364lIjdBbrGdgLWz
   31.38 +47thE5mDK/bjk/gUvRCYyqvqTbMRjRoQsvOXMl6tTqstPSa2UM1IzDJhg5JODCSk
   31.39 +dnWOpjPAiMj0xPCMBDrttV/USftPSva4cd6Yg0v8iC1r8nqtIiXwxX0gp6CrO4DC
   31.40 +b7QbUe0b6+iTaWcaNgs2D0+AXz9umY7FX3eX3fLdgFUoYih3VRNir4EML7FJH5Au
   31.41 +TEwuU33pgiHE0j/vcj5JWLC99bxP7Wd2Iyy1AehbAMuz7+HxnFzov7TvyMgjnnl9
   31.42 +RuIoGbkMahodbfC4XUQuV+H/mCQVXAgtF+NDjfepotg=
   31.43 +=059J
   31.44 +-----END PGP PUBLIC KEY BLOCK-----
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    32.3 @@ -0,0 +1,41 @@
    32.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    32.5 +
    32.6 +mQGNBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    32.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    32.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    32.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   32.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   32.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   32.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   32.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   32.14 +wOxN0vPiTwdHIycAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   32.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBHTXm0SW4om9inG3C6ji
   32.16 +xFMAGWl9BQJbtkrFAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEKjixFMA
   32.17 +GWl9NXML/0v4hbZztWksR550HhuhjsPv8seFyZiXoFiaSWVSH9iODF5Cewi9iZrH
   32.18 +aD9Ykae3k7rdikQFP+OuFWy4XaqtGa4owBRTpxyYQ8vTNW2OxJIW8C1ORg4ApfxR
   32.19 +BgApbcNnwFG3zvJhadMdSwxxPSvBXZ01UWrJkvU5PHZcpqT9anY1PAabMKlnpKoa
   32.20 +VOO++4FDK0rm3Wl42SJYF+lx3hoBk9Lw/LU/QRncFv8vzXjI0UYJxGTTJ8L3eDJH
   32.21 +sIKm7CjyqilCX7/AVQ90ALi/Y/Gitb3ttgY0RkDTZHT8tX9tDA0xXWO213vZkyC5
   32.22 +wQ7lb9brxTDA4yFfyFPW1c95loOYKqCezgg81erq7wZ/EcUHHG2AGHBGlyxdeGaV
   32.23 ++NRKNHmO5IWCS7pnUhMwBvZfdF+rPTAMF9OYP1OzzxO58DteXR2V4OogMR6OCcAz
   32.24 +K7uJN+eTA8upmRX+omv2gEFh6aBoOJnveRdXpKFd8Iybr3Gpj60OdA2wHXW1bbe4
   32.25 +/iX8mnnazbkBjQRbtkrFAQwAzUaLt7KYnbNbHVqnDEKcRp3A5H7JvQ2tfAJT7Mck
   32.26 +FRJHwSBGrvnULwOvUrBREykEkizN8kVRwDCn0wUp02/Q2FpBC4vXa0boOpP1LWaI
   32.27 +NWs2uaHskvMWTyZjmLYE2HhLLc84jUgo/RowCSVGG6nVp0UR+uEQiWScgw/RuIgd
   32.28 +HyhaXThpTnKNu1gQaPusTnFKHBe0dtyIhqi4Yi6a51jDWAodmrLaXYCYZGHDqTnI
   32.29 +2KZqvrGn+Evojr9qWu45X0E4FJXMQjQvyILbf7TfXOG2LksRR5FjjThE6Dtls78m
   32.30 +Nr8cYRnY8x2BNcSwJCt9BnIGt+l71gAYGd+SW6UwXLQ9hIqpRM9i1JQpS0BsC5R4
   32.31 +o+T5D3EXiJz3ghL6ZttKD2AfYNg9heD4LaOgkY9jkB5IGSOhuEaCN25q4bo4+io4
   32.32 +imR2bq9+UP03/+j7BEtqUBeN+WatoJ6a8S6pvG+B6mNRanqmrzZOmjLEy3eLh4oH
   32.33 +izj1A7DdtJ4Gy7WUIBe16BG7ABEBAAGJAbYEGAEIACAWIQR015tEluKJvYpxtwuo
   32.34 +4sRTABlpfQUCW7ZKxQIbDAAKCRCo4sRTABlpfXpFC/wJ6nyMMivbEQHQ77dpr3EN
   32.35 +HeaKrhGzP09zahmGNiZMKf4I0tovJMxtmyMJk4A740UgopwrLlZbYeAnakQPGbV8
   32.36 +VXfEsMKVP3FPq0OPwIlWmQv/AmJVFwusG61q5XqpPG3XdTV3EU0B6Y82XtcmVPWK
   32.37 ++XhSvduzaCS3/gyQ9y67jEDKBakoIS7QBZCbxoNuekIbe8wsoxSjVVcGSGbXptco
   32.38 +Oo5zjSD68ugpbV9hyCjNLMUs8OjPeFjgzCBfoCU5biyhri2+sHabEbgBxAFUcVSv
   32.39 +Bybcy2hdIlSIUrP6zSB7JKqhgbyPYbeWuk3pikH4ryoCSgQmak8sT4n4ZhWXhGGI
   32.40 +FUmiJUdzZNNGKsVMNr6z+SP7FJfAMn5v2BN0t3rAg1XZ2ML5hl5075uPTZRDjPny
   32.41 +Kf89KXYZjKdB4S5JfTiLCN5Fwj+xoWm9WjhLzhFnw6VVZMMNkp4kx94ImtShzcy0
   32.42 +yVTRX3+TDG2YRwx3rm1la4xH8BXIeHsba+ZDoRy5tec=
   32.43 +=mv2X
   32.44 +-----END PGP PUBLIC KEY BLOCK-----
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    33.3 @@ -0,0 +1,41 @@
    33.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    33.5 +
    33.6 +mQGNBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    33.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    33.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    33.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   33.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   33.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   33.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   33.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   33.14 +ii3YZy2mWMv3nQkAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   33.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBC4hMl0gKkS/2cYH/PCV
   33.16 +sgJQOxTYBQJbtkq3AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEPCVsgJQ
   33.17 +OxTY1OkL/1VoHZbizTxzvcnJNyBL6ATegGvqtK/FMspS4+oRC/ylHVFV4EtPRdVs
   33.18 +WxZ3Ne0Yjun8TUD3nVSzTHfSPMemxBv8f/QTm98tK80EqS/bIbr5GyLYv9OdcLaM
   33.19 +QzkrIDc5ESOUmB1XbCnVFNUgEQLNh/xhNAvaQ8ZXheglm0UPl1+zzkMup1HeQhzZ
   33.20 +TMi5OEu7xZWGt9A6bYJiKLI5SU1YfLdhWh3FPbHX3x82sw//dHtUeHYFTI0zyCjN
   33.21 +sMJqGru4kZOlWWeEiKUJG6sjyCKWHIAyD/AJ2haLs+Nz4Sbe1B3MLH5wuHA06AmY
   33.22 +kSKKAbidBRQmiUCeVNrmjR9ielHm9ywhUuX7rYUuJQ/v+kTtFOGyga5a8Xzrpbmb
   33.23 +iil+VsmJ+kj3DEI313hMknJ7nD78gBxabapyjP9E1PcYvZsVxCuJL7j2UI9b1yFE
   33.24 +fa5tjI0ejgPKqCPnf/D5HwS5xNoatenfFLvAw1BEYpdq8sKbc96u5sbWIqjGxlmb
   33.25 +uYUAgWh4iLkBjQRbtkq3AQwArdm1DUs4QaGG1m6ywkX2rj3YYMtB5TTzm7tbG3F2
   33.26 +l9a0fHjdxhj/KBBAwHoX/tAhGrh2vAZDqkkWpgrB2CUzkJKHK/IdDpXtUb42PfO2
   33.27 +ZzinA95Hhtx8Q3CypBlB4pjyOQ1zSqg714y91Ajw6vWnrETkOsdgEuqhG2yQk7Ii
   33.28 +Mfi3jfz4GE5VTY2hvQRqBfVOM0dm4x9U2aKAwHC78f7+inmab5AKacbMM+9YFbL1
   33.29 +zRnk03oiBKxdiNl4mhAP9INCd0cTbIA9389TwWXJreBILXtuuL1fi5sTQusyvvkP
   33.30 +2WakeJWIxdjls68WCX71j9EeExGjj5XatUpEduMu/SM/S239Tl+b66+4MWJ/GXrn
   33.31 +ACDd/4QDzjuZ4Jttpgf1zWSii9IF/Iy0p07XhZvO8FIIJ4DSva5OQiVEBaRIkQPn
   33.32 +aIMlCjU/j0A2MlEYOrPO75Alt3d7Wm74u75KOMa03RlbW09f/bKk5ye5+jYqOnW3
   33.33 +ZxFeOtot9SzPL49Bn1mRrCy1ABEBAAGJAbYEGAEIACAWIQQuITJdICpEv9nGB/zw
   33.34 +lbICUDsU2AUCW7ZKtwIbDAAKCRDwlbICUDsU2JWvC/4jGEDtSZXFOBxJB6KFp4Dp
   33.35 +xUk8sXx8xlvp2lHj1ELaQPrF67At2/XRGwDY6il1jgUxeF9bSCsj2DBGiTILTut7
   33.36 +2UXut0F1okPUzXfkJd82hHXWS612tXGeKMvnilQ9ly5ghSGYZ/LnMyJkqq3eGc+f
   33.37 +N5CJ7gLDlP3UTRVARJ3kPeBRJWrGIjE1LUw+NlzrPL61yAoJ9S5LyQg4UmWT903i
   33.38 +4dmFIk8Oje12A4tb9hdrwlIZ0c9FgiKOT19HIVWXEN60vJuNDWmOQ7dq6IVP19mJ
   33.39 +8rzWGRt/PVIJxGYYV7gWRd7FBUFMUKEtJAIEtrDy/9kFnqUFX8ES3eQUIdnrQGZ4
   33.40 +Gt2/RgaKZxgf8MmCslkxgZxi/Oa6lmIMkUE7QrL7L1BLfrlu4/R/f8vTNtoRgHEh
   33.41 +pTatQvmmOZB/TN9kxSJK5oDJ1Mn3vq1ufOTJF2AjWlooI1aHXLGgq8pXIQl98LxW
   33.42 +QZ7dp70+w04276c6zvkKoBtBGR3ipT/tQdS1+DKA0ck=
   33.43 +=tYCn
   33.44 +-----END PGP PUBLIC KEY BLOCK-----
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    34.3 @@ -0,0 +1,41 @@
    34.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    34.5 +
    34.6 +mQGNBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    34.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    34.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    34.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   34.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   34.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   34.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   34.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   34.14 +WGRPrdsWtFU7pwcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   34.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBDwecT2FGdf5B+MULRee
   34.16 +qiSiFulaBQJbtkq9AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBeeqiSi
   34.17 +Fula9xoL/iXSHjVPvfK85Y/ILybI9Q8ybPHYDnOUmwM2G5R6S6bfHRzI1DcfIxFc
   34.18 +V1Hna6NiA1gFjH8lV5Bt2QOWfPyjXRLrh+Bv0x59Cwc4JC1BpP4GED5XNM14TAGm
   34.19 +Q3Oze/Hf9OfXVXDJlO+aKltxREJrEttPZ7KG6XUGTNZDq+PJpRftsta4Gz0O0Ybc
   34.20 +EbRI8cg7Z3HTT7o8eD/0Cnoyk2UehHXNd18BEQ/fDMAw4z9PJt6DXbDtt2yvUDSq
   34.21 +p2edMmyHIceWgEgWGReRScinaKxhN7b4TxRh4bxfK0XGnl74a6YIYPuUs0OKpRBP
   34.22 +uRuaIsrzwNFrQ2nWYl0PkHyi0uunktT7359ZjvZVjsSVyh4Y/lTue4FMVtBXF5ZA
   34.23 +uyg0HNA7ogwMnPA7e33jwYl8zG1WBRP1GwoQZp2NSkJKHvrjRLVSlnLQVUqblN/5
   34.24 +hlDXynVQcWyhnte8GHieJ8+AaynPDO5jaasxrJTJrTBM+slvQmcPe1H9o1UFtrqc
   34.25 +5L19fu8W57kBjQRbtkq9AQwAwqBlofa+mMKATJhyjAwRzrqkH+vYt+JMxiPGpVA1
   34.26 +b+ZjvwLNfSXcLAWxZc1OCMn8KQolEt2vXi78BKEGEl8b62qJq3tIHR4RMS65GsYY
   34.27 +3WPNNqSSuGRp0ieaTcep8+lVlTdQfKeBVA33TDlQjzs6NQB2YaVC5MfbPXfqxKte
   34.28 +Z6QfUfQtOyk5jWZnf0jJvOX/4JpneogpHSUPBvgX1D3RTkwP5dK5ubMwqedawtxG
   34.29 +hCuYXNj1C7l0WIft+uQjOGlruolYFYmyFyyDoPz3fcMEzKx+DvL/845D3eQxfx6a
   34.30 +yXryoVpzB44nsfCDF/qfVEx6ochHk46WUx5Hqe4xLruiQnp5jZeqcP4EEqh5XTH2
   34.31 +4kmwk8/2MJpNTJa1I0PugQi7I2UNCikG/KUn5X1FhBY2GIVbwkUIZosHAhEcVA41
   34.32 +WWVMMaHgIqOsXLlJxHLedTSOBYF4PWfIk2aReVFCTJANrN4cqHcDzYdHuk7xpLDW
   34.33 +2juVvXMRE7j2ax49HVNklqx7ABEBAAGJAbYEGAEIACAWIQQ8HnE9hRnX+QfjFC0X
   34.34 +nqokohbpWgUCW7ZKvQIbDAAKCRAXnqokohbpWrelC/9DcLJrsvkwNufTLRerqkPx
   34.35 +tch+JGT7fvS/y87yNa4vDAgj/+kf+dhZjHO18uDIS/A0F1E5Z44sTIdYF6Fexds7
   34.36 +zrAiDKk9wDIt8FI09HdH9rEQB+jidYgQ9FLSG6fojhi3Jz0Q2EzlXz6PcmSYHkD6
   34.37 +gncf/RvllQgrMd+DA6CE+iHoavLAyugPEMdXdLbV+hNd+TqumSPRKU3I7I4PrvdC
   34.38 +x2mPBmZKTJ+LRpAcqQBSK1evKoYRFPbspw36Nra0Ja0FUsx8FVQxy1eJvSgLU9fC
   34.39 +k9r+JP2vwKg2jg2Ca4saH+yczOk9RYVEUuk7hVIrW4O5nB/N51D+4K7I9eziEzK1
   34.40 +QSZQ8VXwW6P7yflD/dBORCic58Y40i9v0zkPrR5eX+h7HShIb+m2MbGCJ4Lj9wyn
   34.41 +fY1krezT+8cS32CthG1+L2Ng6pGHrW+3U3prhdnEr3WZTUzWGsAbPbkI3ULM037h
   34.42 +RnxSsw3sab+mDHJy9M6Hj5yWgDQiUzja61G7a4WFAAM=
   34.43 +=BKiI
   34.44 +-----END PGP PUBLIC KEY BLOCK-----
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc	Fri Oct 05 08:51:46 2018 +0200
    35.3 @@ -0,0 +1,41 @@
    35.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    35.5 +
    35.6 +mQGNBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    35.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    35.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    35.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   35.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   35.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   35.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   35.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   35.14 +FYLRGY3NIn8ZUQcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   35.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBLTOL2lHtpR8UA8Gh679
   35.16 +5TC9oXAgBQJbtkqtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK795TC9
   35.17 +oXAgtFML/3EOu0mP3lRBiU72xImVtBEFiPdwLcZf00etQbizwsCf5RDp2rUMOdvg
   35.18 +JMpO9nECw1FHLYNWjDuKLm6yvI4UScVFu8hEGMZsXFHygSfJnzZP9wWAkBCE4T/5
   35.19 +KGrMjp0xYp1UpjIwUDhoj3zhix36CEn+dhzEvmXRipafHTLwfHIJzaK9qPiXHv1y
   35.20 +VUFYiIjIcM+1IS2sqtUXDMdIh3BI58KBtumQMhwGrVmIYS82BcImFSCy2fGqAcEp
   35.21 +XRmLVhFAxhepCwH24h+6Q/oXWM8pC0pyoCGAWkbFexpuhbBKruIbDOKcO0fhDozV
   35.22 +dr9Xsb9bjV9bmYatIS3hjYuFRxGZeDcvp/qUQgmjXiFXW6Wjhtt6uCg7aztxBfaX
   35.23 +eKzPeFnXlOEm6FuSmVpBL4HTSDYcMtvaB2NGds4kOSsAb/dEmIrRM88kwzem0b2R
   35.24 +yOQp28tgMV3/KZbx4Pwdm9Ao3Ei64hOIC6csX535i4YAt0chqRpjeXIu9kPcOXQd
   35.25 +2YpERB9X/rkBjQRbtkqtAQwAtivotreDp76B7oCpTHE2sIusp2rtivy3kFpnP7zx
   35.26 +cJNGMADhEZLK2xj/xg6c7NzImblcfsdak+3VJnoa7/lG04D5Z01pKhMjTImRuATi
   35.27 +/jSNm/nbOwxFD4kbC3HuQSFxvX6HWNYy7zEE6nJWgI1DwNYhxQwcKYHeR6qlFmPO
   35.28 +yJIN5S7dimq1kg8FQohQicH1aFji2Ap/p+X3hv7kYJpHfZDEzKGpO2CRhr8FqfhR
   35.29 +OgBJHnHYda1jZf1hJsg+kozQUdQDJsxZ5kIbm6fHMc4PdQkDGb3NFi6pf+iZDKSB
   35.30 +RpCqf11SHkko+eIRJnPHGvG12TSPoGxdYNMY39yJ6jIfKvuMTrC8z6VmJga1Kh8I
   35.31 +dkWQknVQo7xXPKDpgIwpuQP24L1bM4HntvqU7jhI9UYS0EXa+kPH6JlgppGsnc0j
   35.32 +XUuLJQvLFl+LhKATUu7V3g57+10gyfABBOmf4/c6gmCfc72s/L1/cYfQ5uFC65wB
   35.33 +N9TgDfXno3D6B9G3+MDtLx0/ABEBAAGJAbYEGAEIACAWIQS0zi9pR7aUfFAPBoeu
   35.34 +/eUwvaFwIAUCW7ZKrQIbDAAKCRCu/eUwvaFwIO4HDAClDsWl8lefbrxItGhcS9iJ
   35.35 +jwDZYNx9i/vu/nIzMBGNe67SxdVD6s6UwvB3Zpy7gts+pjTXZd1iMb0bNN6xbw7h
   35.36 +e025jVwX42zXnf7dEG5Aj13AT4gV/zToAkkxjKAOBUjmF9SBqhuiKadrn6GPPkPp
   35.37 +WfQErVLhH8Q8yoDqW3Paa4f+J3hl0OZ0aFd9x24ljDy/LcMqirDzyHgHU61yeEMg
   35.38 +WrtSJ3M4Lli4wdPzNhC4AW1EQSj9RNGOHwH13fjqqeiXUnaM/3CCtCWFy+JBwYIK
   35.39 +9wHl3/TiP7lyCMhOh3Rf9dPhJEMywWcRscAGGWWM+HzxwwjflCsVkQ6/UeieVGTw
   35.40 +VqvPdQPa3yfvRpjbySCRu+Vdu9ghW4lFrjBlbJNx0Ox7wtMuPjohKRNtQ9YPakHT
   35.41 +0gwhj88ZYoWaUc9/sXTOgMQx1HXC+QDkhdgFh6Wh49tIJdSbM5cgyO74VGpPeVXj
   35.42 +WYvXTzbesQJeuUEDqh0qzwrpOEn2u3zc3QRd9rfTEP8=
   35.43 +=8DKL
   35.44 +-----END PGP PUBLIC KEY BLOCK-----