IOSAD-103 merge in sync, which has the latest default IOSAD-103
authorDirk Zimmermann <dirk@pep-project.org>
Fri, 05 Oct 2018 11:53:18 +0200
branchIOSAD-103
changeset 30092f4afc6fb3a4
parent 3005 3b56b96961f0
parent 3008 b2d7141a42e9
child 3015 ff8ca007ef19
IOSAD-103 merge in sync, which has the latest default
     1.1 --- a/build-windows/pEpEngine.vcxproj	Fri Oct 05 11:19:25 2018 +0200
     1.2 +++ b/build-windows/pEpEngine.vcxproj	Fri Oct 05 11:53:18 2018 +0200
     1.3 @@ -115,6 +115,7 @@
     1.4      <ClCompile Include="..\src\etpan_mime.c" />
     1.5      <ClCompile Include="..\src\identity_list.c" />
     1.6      <ClCompile Include="..\src\keymanagement.c" />
     1.7 +    <ClCompile Include="..\src\labeled_int_list.c" />
     1.8      <ClCompile Include="..\src\map_asn1.c" />
     1.9      <ClCompile Include="..\src\message.c" />
    1.10      <ClCompile Include="..\src\message_api.c" />
    1.11 @@ -149,6 +150,7 @@
    1.12      <ClInclude Include="..\src\etpan_mime.h" />
    1.13      <ClInclude Include="..\src\identity_list.h" />
    1.14      <ClInclude Include="..\src\keymanagement.h" />
    1.15 +    <ClInclude Include="..\src\labeled_int_list.h" />
    1.16      <ClInclude Include="..\src\map_asn1.h" />
    1.17      <ClInclude Include="..\src\message.h" />
    1.18      <ClInclude Include="..\src\message_api.h" />
     2.1 --- a/build-windows/pEpEngine.vcxproj.filters	Fri Oct 05 11:19:25 2018 +0200
     2.2 +++ b/build-windows/pEpEngine.vcxproj.filters	Fri Oct 05 11:53:18 2018 +0200
     2.3 @@ -108,6 +108,9 @@
     2.4      <ClCompile Include="..\src\pEp_string.c">
     2.5        <Filter>Quelldateien</Filter>
     2.6      </ClCompile>
     2.7 +    <ClCompile Include="..\src\labeled_int_list.c">
     2.8 +      <Filter>Quelldateien</Filter>
     2.9 +    </ClCompile>
    2.10    </ItemGroup>
    2.11    <ItemGroup>
    2.12      <ClInclude Include="..\src\keymanagement.h">
    2.13 @@ -212,6 +215,9 @@
    2.14      <ClInclude Include="..\src\pEp_string.h">
    2.15        <Filter>Headerdateien</Filter>
    2.16      </ClInclude>
    2.17 +    <ClInclude Include="..\src\labeled_int_list.h">
    2.18 +      <Filter>Headerdateien</Filter>
    2.19 +    </ClInclude>
    2.20    </ItemGroup>
    2.21    <ItemGroup>
    2.22      <Text Include="..\LICENSE.txt" />
     3.1 --- a/default.conf	Fri Oct 05 11:19:25 2018 +0200
     3.2 +++ b/default.conf	Fri Oct 05 11:53:18 2018 +0200
     3.3 @@ -237,6 +237,16 @@
     3.4  #NETPGP_INC=-I$(PREFIX)/include
     3.5  
     3.6  
     3.7 +######### OpenPGP #########
     3.8 +# CppUnit library search flag
     3.9 +CPPUNIT_LIB=
    3.10 +#CPPUNIT_LIB=-L$(HOME)/local/lib
    3.11 +
    3.12 +# CppUnit include search flag
    3.13 +CPPUNIT_INC=
    3.14 +#CPPUNIT_INC=-I$(HOME)/local/inc
    3.15 +
    3.16 +
    3.17  ######### Engine internals #########
    3.18  # C macros (not environment variables) that can be overridden:
    3.19  # DEFAULT_KEYSERVER - string with default keyserver
     4.1 --- a/src/cryptotech.h	Fri Oct 05 11:19:25 2018 +0200
     4.2 +++ b/src/cryptotech.h	Fri Oct 05 11:53:18 2018 +0200
     4.3 @@ -19,7 +19,8 @@
     4.4  typedef PEP_STATUS (*decrypt_and_verify_t)(
     4.5          PEP_SESSION session, const char *ctext, size_t csize,
     4.6          const char *dsigtext, size_t dsigsize,
     4.7 -        char **ptext, size_t *psize, stringlist_t **keylist
     4.8 +        char **ptext, size_t *psize, stringlist_t **keylist,
     4.9 +        char **filename_ptr 
    4.10      );
    4.11  
    4.12  typedef PEP_STATUS (*verify_text_t)(
     5.1 --- a/src/keymanagement.c	Fri Oct 05 11:19:25 2018 +0200
     5.2 +++ b/src/keymanagement.c	Fri Oct 05 11:53:18 2018 +0200
     5.3 @@ -568,40 +568,53 @@
     5.4  
     5.5              if (id_list) {
     5.6                  identity_list* id_curr = id_list;
     5.7 +                bool input_is_TOFU = strstr(identity->user_id, "TOFU_") == identity->user_id;
     5.8                  while (id_curr) {
     5.9                      pEp_identity* this_id = id_curr->ident;
    5.10                      if (this_id) {
    5.11                          char* this_uid = this_id->user_id;
    5.12 -                        if (this_uid && (strstr(this_uid, "TOFU_") == this_uid)) {
    5.13 -                            // FIXME: should we also be fixing pEp_own_userId in this
    5.14 -                            // function here?
    5.15 -                            
    5.16 -                            // if usernames match, we replace the userid. Or if the temp username
    5.17 -                            // is anonymous.
    5.18 -                            // FIXME: do we need to create an address match function which
    5.19 -                            // matches the whole dot-and-case rigamarole from 
    5.20 -                            if (EMPTYSTR(this_id->username) ||
    5.21 -                                strcasecmp(this_id->username, this_id->address) == 0 ||
    5.22 -                                (identity->username && 
    5.23 -                                 strcasecmp(identity->username, 
    5.24 -                                            this_id->username) == 0)) {
    5.25 +                        bool curr_is_TOFU = strstr(this_uid, "TOFU_") == this_uid;
    5.26 +                        if (this_uid) {
    5.27 +                            if (curr_is_TOFU && !input_is_TOFU) {
    5.28 +                                // FIXME: should we also be fixing pEp_own_userId in this
    5.29 +                                // function here?
    5.30                                  
    5.31 -                                // Ok, we have a temp ID. We have to replace this
    5.32 -                                // with the real ID.
    5.33 -                                status = replace_userid(session, 
    5.34 -                                                        this_uid, 
    5.35 -                                                        identity->user_id);
    5.36 -                                if (status != PEP_STATUS_OK) {
    5.37 -                                    free_identity_list(id_list);
    5.38 -                                    free(default_own_id);
    5.39 -                                    return status;
    5.40 +                                // if usernames match, we replace the userid. Or if the temp username
    5.41 +                                // is anonymous.
    5.42 +                                // FIXME: do we need to create an address match function which
    5.43 +                                // matches the whole dot-and-case rigamarole from 
    5.44 +                                if (EMPTYSTR(this_id->username) ||
    5.45 +                                    strcasecmp(this_id->username, this_id->address) == 0 ||
    5.46 +                                    (identity->username && 
    5.47 +                                     strcasecmp(identity->username, 
    5.48 +                                                this_id->username) == 0)) {
    5.49 +                                    
    5.50 +                                    // Ok, we have a temp ID. We have to replace this
    5.51 +                                    // with the real ID.
    5.52 +                                    status = replace_userid(session, 
    5.53 +                                                            this_uid, 
    5.54 +                                                            identity->user_id);
    5.55 +                                    if (status != PEP_STATUS_OK) {
    5.56 +                                        free_identity_list(id_list);
    5.57 +                                        free(default_own_id);
    5.58 +                                        return status;
    5.59 +                                    }
    5.60 +                                        
    5.61 +                                    free(this_uid);
    5.62 +                                    this_uid = NULL;
    5.63 +                                    
    5.64 +                                    // Reflect the change we just made to the DB
    5.65 +                                    this_id->user_id = strdup(identity->user_id);
    5.66 +                                    stored_ident = this_id;
    5.67 +                                    // FIXME: free list.
    5.68 +                                    break;                                
    5.69                                  }
    5.70 -                                    
    5.71 -                                free(this_uid);
    5.72 -                                this_uid = NULL;
    5.73 -                                
    5.74 -                                // Reflect the change we just made to the DB
    5.75 -                                this_id->user_id = strdup(identity->user_id);
    5.76 +                            }
    5.77 +                            else if (input_is_TOFU && !curr_is_TOFU) {
    5.78 +                                // Replace ruthlessly - this is NOT supposed to happen.
    5.79 +                                // BAD APP BEHAVIOUR.
    5.80 +                                free(identity->user_id);
    5.81 +                                identity->user_id = strdup(this_id->user_id);
    5.82                                  stored_ident = this_id;
    5.83                                  // FIXME: free list.
    5.84                                  break;                                
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/labeled_int_list.c	Fri Oct 05 11:53:18 2018 +0200
     6.3 @@ -0,0 +1,121 @@
     6.4 +// This file is under GNU General Public License 3.0
     6.5 +// see LICENSE.txt
     6.6 +
     6.7 +#include <stdbool.h>
     6.8 +#include <stdlib.h>
     6.9 +#include <assert.h>
    6.10 +#include <string.h>
    6.11 +
    6.12 +#include "platform.h"
    6.13 +#include "labeled_int_list.h"
    6.14 +
    6.15 +DYNAMIC_API labeled_int_list_t *new_labeled_int_list(int value, const char* label)
    6.16 +{
    6.17 +    assert(label);
    6.18 +    if (!label)
    6.19 +        return NULL;
    6.20 +        
    6.21 +    labeled_int_list_t * labeled_int_list = calloc(1, sizeof(labeled_int_list_t));
    6.22 +    assert(labeled_int_list);
    6.23 +    if (labeled_int_list == NULL)
    6.24 +        return NULL;
    6.25 +
    6.26 +    labeled_int_list->value = value;
    6.27 +    labeled_int_list->label = strdup(label);
    6.28 +    if (!labeled_int_list->label) {
    6.29 +        free(labeled_int_list);
    6.30 +        labeled_int_list = NULL;
    6.31 +    }
    6.32 +    return labeled_int_list;
    6.33 +}
    6.34 +
    6.35 +DYNAMIC_API void free_labeled_int_list(labeled_int_list_t *labeled_int_list)
    6.36 +{
    6.37 +    labeled_int_list_t *curr = labeled_int_list;
    6.38 +
    6.39 +    while (curr) {
    6.40 +        labeled_int_list_t *next = curr->next;
    6.41 +        free(curr->label);
    6.42 +        free(curr);
    6.43 +        curr = next;
    6.44 +    }
    6.45 +}
    6.46 +
    6.47 +DYNAMIC_API labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src)
    6.48 +{
    6.49 +    assert(src);
    6.50 +    if (src == NULL)
    6.51 +        return NULL;
    6.52 +    
    6.53 +    labeled_int_list_t *labeled_int_list = NULL;
    6.54 +
    6.55 +    labeled_int_list = new_labeled_int_list(src->value, src->label);
    6.56 +    if (labeled_int_list == NULL)
    6.57 +        goto enomem;
    6.58 +
    6.59 +    labeled_int_list_t* src_curr = src->next;
    6.60 +    labeled_int_list_t** dst_curr_ptr = &labeled_int_list->next;
    6.61 +
    6.62 +    // list
    6.63 +    while (src_curr) {
    6.64 +        *dst_curr_ptr = new_labeled_int_list(src_curr->value, src_curr->label);
    6.65 +        if (*dst_curr_ptr == NULL)
    6.66 +            goto enomem;
    6.67 +
    6.68 +        src_curr = src_curr->next;
    6.69 +        dst_curr_ptr = &((*dst_curr_ptr)->next);
    6.70 +    }
    6.71 +
    6.72 +    return labeled_int_list;
    6.73 +
    6.74 +enomem:
    6.75 +    free_labeled_int_list(labeled_int_list);
    6.76 +    return NULL;
    6.77 +}
    6.78 +
    6.79 +DYNAMIC_API labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label)
    6.80 +{
    6.81 +    if (!label)
    6.82 +        return NULL;
    6.83 +        
    6.84 +    if (!labeled_int_list)
    6.85 +        return new_labeled_int_list(value, label);
    6.86 +
    6.87 +    if (!labeled_int_list->label) { // empty list
    6.88 +        assert(!labeled_int_list->next);
    6.89 +        if (labeled_int_list->next)
    6.90 +            return NULL; // invalid list
    6.91 +
    6.92 +        labeled_int_list->value = value;
    6.93 +        labeled_int_list->label = strdup(label);
    6.94 +        if (!labeled_int_list->label) {
    6.95 +            free(labeled_int_list);
    6.96 +            labeled_int_list = NULL;
    6.97 +        }
    6.98 +
    6.99 +        return labeled_int_list;
   6.100 +    }
   6.101 +
   6.102 +    labeled_int_list_t* list_curr = labeled_int_list;
   6.103 +
   6.104 +    while (list_curr->next)
   6.105 +        list_curr = list_curr->next;
   6.106 +
   6.107 +    list_curr->next = new_labeled_int_list(value, label);
   6.108 +
   6.109 +    assert(list_curr->next);
   6.110 +    if (!list_curr->next)
   6.111 +        return NULL;
   6.112 +
   6.113 +    return list_curr->next;
   6.114 +}
   6.115 +
   6.116 +DYNAMIC_API int labeled_int_list_length(const labeled_int_list_t *labeled_int_list)
   6.117 +{
   6.118 +    int len = 0;
   6.119 +
   6.120 +    for (const labeled_int_list_t *_li = labeled_int_list; _li && _li->label; _li = _li->next)
   6.121 +        len++;
   6.122 +
   6.123 +    return len;
   6.124 +}
   6.125 \ No newline at end of file
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/labeled_int_list.h	Fri Oct 05 11:53:18 2018 +0200
     7.3 @@ -0,0 +1,31 @@
     7.4 +// This file is under GNU General Public License 3.0
     7.5 +// see LICENSE.txt
     7.6 +
     7.7 +#pragma once
     7.8 +
     7.9 +#include "dynamic_api.h"
    7.10 +#include "stringpair.h"
    7.11 +
    7.12 +#ifdef __cplusplus
    7.13 +extern "C" {
    7.14 +#endif
    7.15 +
    7.16 +typedef struct _labeled_int_list_t {
    7.17 +    int value;
    7.18 +    char* label;                                // UTF-8 string, null-terminated
    7.19 +    struct _labeled_int_list_t *next;           // this is a single linked list
    7.20 +} labeled_int_list_t;
    7.21 +
    7.22 +DYNAMIC_API labeled_int_list_t *new_labeled_int_list(int value, const char* label);
    7.23 +
    7.24 +DYNAMIC_API void free_labeled_int_list(labeled_int_list_t *labeled_int_list);
    7.25 +
    7.26 +DYNAMIC_API labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src);
    7.27 +
    7.28 +DYNAMIC_API labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label);
    7.29 +
    7.30 +DYNAMIC_API int labeled_int_list_length(const labeled_int_list_t *labeled_int_list);
    7.31 +
    7.32 +#ifdef __cplusplus
    7.33 +}
    7.34 +#endif
     8.1 --- a/src/message_api.c	Fri Oct 05 11:19:25 2018 +0200
     8.2 +++ b/src/message_api.c	Fri Oct 05 11:53:18 2018 +0200
     8.3 @@ -1458,7 +1458,8 @@
     8.4                                                          blob_value, blob_size,
     8.5                                                          NULL, 0,
     8.6                                                          &bl_ptext, &bl_psize, 
     8.7 -                                                        &bl_keylist);
     8.8 +                                                        &bl_keylist,
     8.9 +                                                        NULL);
    8.10                  free_stringlist(bl_keylist); // we don't care about key encryption as long as we decrypt
    8.11                  if (_status == PEP_DECRYPTED || _status == PEP_DECRYPTED_AND_VERIFIED) {
    8.12                      free_blobval = true;
    8.13 @@ -2711,7 +2712,8 @@
    8.14          free_stringlist(*keylist);
    8.15          *decrypt_status = decrypt_and_verify(session, ctext, csize,
    8.16                                               NULL, 0,
    8.17 -                                             &ptext, &psize, keylist);
    8.18 +                                             &ptext, &psize, keylist,
    8.19 +                                             NULL);
    8.20          
    8.21      }
    8.22  
    8.23 @@ -2761,9 +2763,12 @@
    8.24              free(ptext);
    8.25              ptext = NULL;
    8.26  
    8.27 +            char* pgp_filename = NULL;
    8.28              status = decrypt_and_verify(session, attctext, attcsize,
    8.29                                          NULL, 0,
    8.30 -                                        &ptext, &psize, &_keylist);
    8.31 +                                        &ptext, &psize, &_keylist,
    8.32 +                                        &pgp_filename);
    8.33 +                                        
    8.34              free_stringlist(_keylist);
    8.35  
    8.36              if (ptext) {
    8.37 @@ -2773,17 +2778,25 @@
    8.38                  }
    8.39                  else {
    8.40                      static const char * const mime_type = "application/octet-stream";
    8.41 -                    char * const filename =
    8.42 -                        without_double_ending(_s->filename);
    8.43 -                    if (filename == NULL)
    8.44 -                        return PEP_OUT_OF_MEMORY;
    8.45 -
    8.46 -                    _m = bloblist_add(_m, ptext, psize, mime_type,
    8.47 -                        filename);
    8.48 -                    free(filename);
    8.49 -                    if (_m == NULL)
    8.50 -                        return PEP_OUT_OF_MEMORY;
    8.51 -
    8.52 +                    if (pgp_filename) {
    8.53 +                        _m = bloblist_add(_m, ptext, psize, mime_type,
    8.54 +                             pgp_filename);
    8.55 +                        free(pgp_filename);                        
    8.56 +                        if (_m == NULL)
    8.57 +                            return PEP_OUT_OF_MEMORY;
    8.58 +                    }
    8.59 +                    else {
    8.60 +                        char * const filename =
    8.61 +                            without_double_ending(_s->filename);
    8.62 +                        if (filename == NULL)
    8.63 +                            return PEP_OUT_OF_MEMORY;
    8.64 +
    8.65 +                        _m = bloblist_add(_m, ptext, psize, mime_type,
    8.66 +                            filename);
    8.67 +                        free(filename);
    8.68 +                        if (_m == NULL)
    8.69 +                            return PEP_OUT_OF_MEMORY;
    8.70 +                    }
    8.71                      ptext = NULL;
    8.72  
    8.73                      if (msg->attachments == NULL)
    8.74 @@ -2812,6 +2825,7 @@
    8.75                  return PEP_OUT_OF_MEMORY;
    8.76          }
    8.77      }
    8.78 +
    8.79      return status;
    8.80  }
    8.81  
    8.82 @@ -3273,7 +3287,8 @@
    8.83      /** Ok, we should be ready to decrypt. Try decrypt and verify first! **/
    8.84      status = cryptotech[crypto].decrypt_and_verify(session, ctext,
    8.85                                                     csize, dsig_text, dsig_size,
    8.86 -                                                   &ptext, &psize, &_keylist);
    8.87 +                                                   &ptext, &psize, &_keylist,
    8.88 +                                                   NULL);
    8.89  
    8.90      if (status > PEP_CANNOT_DECRYPT_UNKNOWN)
    8.91          goto pEp_error;
     9.1 --- a/src/pEpEngine.c	Fri Oct 05 11:19:25 2018 +0200
     9.2 +++ b/src/pEpEngine.c	Fri Oct 05 11:53:18 2018 +0200
     9.3 @@ -98,19 +98,6 @@
     9.4      "   order by is_own desc, "
     9.5      "   timestamp desc; ";
     9.6  
     9.7 -static const char *sql_get_identities_by_userid =  
     9.8 -    "select address, fpr, username, comm_type, lang,"
     9.9 -    "   identity.flags | pgp_keypair.flags,"
    9.10 -    "   is_own"
    9.11 -    "   from identity"
    9.12 -    "   join person on id = identity.user_id"
    9.13 -    "   join pgp_keypair on fpr = identity.main_key_id"
    9.14 -    "   join trust on id = trust.user_id"
    9.15 -    "       and pgp_keypair_fpr = identity.main_key_id"    
    9.16 -    "   where identity.user_id = ?1" 
    9.17 -    "   order by is_own desc, "
    9.18 -    "   timestamp desc; ";
    9.19 -
    9.20  static const char *sql_get_identities_by_main_key_id =  
    9.21      "select address, identity.user_id, username, comm_type, lang,"
    9.22      "   identity.flags | pgp_keypair.flags,"
    9.23 @@ -150,6 +137,19 @@
    9.24      "          end) = 1 "
    9.25      "   order by is_own desc, "
    9.26      "   timestamp desc; ";
    9.27 +    
    9.28 +static const char *sql_get_identities_by_userid =  
    9.29 +    "select address, fpr, username, comm_type, lang,"
    9.30 +    "   identity.flags | pgp_keypair.flags,"
    9.31 +    "   is_own"
    9.32 +    "   from identity"
    9.33 +    "   join person on id = identity.user_id"
    9.34 +    "   join pgp_keypair on fpr = identity.main_key_id"
    9.35 +    "   join trust on id = trust.user_id"
    9.36 +    "       and pgp_keypair_fpr = identity.main_key_id"    
    9.37 +    "   where identity.user_id = ?1" 
    9.38 +    "   order by is_own desc, "
    9.39 +    "   timestamp desc; ";
    9.40  
    9.41  static const char *sql_replace_identities_fpr =  
    9.42      "update identity"
    9.43 @@ -178,7 +178,11 @@
    9.44      "       device_group = "
    9.45      "           (select device_group from person where id = ?1)"
    9.46      "   where id = ?1 ;";
    9.47 -    
    9.48 +
    9.49 +// Will cascade.
    9.50 +static const char *sql_delete_person = 
    9.51 +     "delete from person where id = ?1 ;";
    9.52 +
    9.53  static const char *sql_set_as_pEp_user =
    9.54      "update person set is_pEp_user = 1 "
    9.55      "   where id = ?1 ; ";
    9.56 @@ -337,6 +341,9 @@
    9.57      "select comm_type from trust where user_id = ?1 "
    9.58      "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
    9.59  
    9.60 +static const char *sql_get_trust_by_userid = 
    9.61 +    "select pgp_keypair_fpr, comm_type from trust where user_id = ?1 ";
    9.62 +
    9.63  static const char *sql_least_trust = 
    9.64      "select min(comm_type) from trust where"
    9.65      " pgp_keypair_fpr = upper(replace(?1,' ',''))"
    9.66 @@ -1157,7 +1164,7 @@
    9.67              (int)strlen(sql_get_identities_by_address), 
    9.68              &_session->get_identities_by_address, NULL);
    9.69      assert(int_result == SQLITE_OK);
    9.70 -
    9.71 +    
    9.72      int_result = sqlite3_prepare_v2(_session->db, sql_get_identities_by_userid,
    9.73              (int)strlen(sql_get_identities_by_userid), 
    9.74              &_session->get_identities_by_userid, NULL);
    9.75 @@ -1226,6 +1233,10 @@
    9.76              (int)strlen(sql_update_person), &_session->update_person, NULL);
    9.77      assert(int_result == SQLITE_OK);
    9.78  
    9.79 +    int_result = sqlite3_prepare_v2(_session->db, sql_delete_person,
    9.80 +            (int)strlen(sql_delete_person), &_session->delete_person, NULL);
    9.81 +    assert(int_result == SQLITE_OK);
    9.82 +
    9.83      int_result = sqlite3_prepare_v2(_session->db, sql_exists_person,
    9.84              (int)strlen(sql_exists_person), &_session->exists_person, NULL);
    9.85      assert(int_result == SQLITE_OK);
    9.86 @@ -1337,6 +1348,10 @@
    9.87              (int)strlen(sql_get_trust), &_session->get_trust, NULL);
    9.88      assert(int_result == SQLITE_OK);
    9.89  
    9.90 +    int_result = sqlite3_prepare_v2(_session->db, sql_get_trust_by_userid,
    9.91 +            (int)strlen(sql_get_trust_by_userid), &_session->get_trust_by_userid, NULL);
    9.92 +    assert(int_result == SQLITE_OK);
    9.93 +
    9.94      int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
    9.95              (int)strlen(sql_least_trust), &_session->least_trust, NULL);
    9.96      assert(int_result == SQLITE_OK);
    9.97 @@ -1539,6 +1554,8 @@
    9.98                  sqlite3_finalize(session->remove_fpr_as_default);            
    9.99              if (session->set_person)
   9.100                  sqlite3_finalize(session->set_person);
   9.101 +            if (session->delete_person)
   9.102 +                sqlite3_finalize(session->delete_person);                
   9.103              if (session->set_as_pEp_user)
   9.104                  sqlite3_finalize(session->set_as_pEp_user);
   9.105              if (session->is_pEp_user)
   9.106 @@ -1585,6 +1602,8 @@
   9.107                  sqlite3_finalize(session->update_trust_for_fpr);
   9.108              if (session->get_trust)
   9.109                  sqlite3_finalize(session->get_trust);
   9.110 +            if (session->get_trust_by_userid)
   9.111 +                sqlite3_finalize(session->get_trust_by_userid);                
   9.112              if (session->least_trust)
   9.113                  sqlite3_finalize(session->least_trust);
   9.114              if (session->mark_compromised)
   9.115 @@ -2853,6 +2872,27 @@
   9.116      return status;
   9.117  }
   9.118  
   9.119 +PEP_STATUS delete_person(PEP_SESSION session, const char* user_id) {
   9.120 +    assert(session);
   9.121 +    assert(!EMPTYSTR(user_id));        
   9.122 +    if (!session || EMPTYSTR(user_id))
   9.123 +        return PEP_ILLEGAL_VALUE;
   9.124 +        
   9.125 +    PEP_STATUS status = PEP_STATUS_OK;
   9.126 +    
   9.127 +    sqlite3_reset(session->delete_person);
   9.128 +    sqlite3_bind_text(session->delete_person, 1, user_id, -1,
   9.129 +                      SQLITE_STATIC);
   9.130 +                      
   9.131 +    int result = sqlite3_step(session->delete_person);
   9.132 +    
   9.133 +    if (result != SQLITE_DONE)
   9.134 +        status = PEP_UNKNOWN_ERROR;
   9.135 +        
   9.136 +    sqlite3_reset(session->delete_person);
   9.137 +    return status;
   9.138 +}
   9.139 +
   9.140  DYNAMIC_API PEP_STATUS is_pEp_user(PEP_SESSION session, pEp_identity *identity, bool* is_pEp)
   9.141  {
   9.142      assert(session);
   9.143 @@ -3184,9 +3224,327 @@
   9.144      return PEP_STATUS_OK;
   9.145  }
   9.146  
   9.147 +PEP_STATUS get_trust_by_userid(PEP_SESSION session, const char* user_id,
   9.148 +                                           labeled_int_list_t** trust_list)
   9.149 +{
   9.150 +    int result;
   9.151 +
   9.152 +    if (!(session && user_id && user_id[0]))
   9.153 +        return PEP_ILLEGAL_VALUE;
   9.154 +
   9.155 +    *trust_list = NULL;
   9.156 +    labeled_int_list_t* t_list = NULL;
   9.157 +
   9.158 +    sqlite3_reset(session->get_trust_by_userid);
   9.159 +    sqlite3_bind_text(session->get_trust_by_userid, 1, user_id, -1, SQLITE_STATIC);
   9.160 +
   9.161 +    while ((result = sqlite3_step(session->get_trust_by_userid)) == SQLITE_ROW) {
   9.162 +        if (!t_list)
   9.163 +            t_list = new_labeled_int_list(sqlite3_column_int(session->get_trust_by_userid, 1),
   9.164 +                                         (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
   9.165 +        else
   9.166 +            labeled_int_list_add(t_list, sqlite3_column_int(session->get_trust_by_userid, 1),
   9.167 +                                (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
   9.168 +    }
   9.169 +
   9.170 +    sqlite3_reset(session->get_trust_by_userid);
   9.171 +
   9.172 +    *trust_list = t_list;
   9.173 +        
   9.174 +    return PEP_STATUS_OK;
   9.175 +}
   9.176 +
   9.177 +PEP_comm_type reconcile_trust(PEP_comm_type t_old, PEP_comm_type t_new) {
   9.178 +    switch (t_new) {
   9.179 +        case PEP_ct_mistrusted:
   9.180 +        case PEP_ct_key_revoked:
   9.181 +        case PEP_ct_compromised:
   9.182 +        case PEP_ct_key_b0rken:
   9.183 +            return t_new;
   9.184 +        default:
   9.185 +            break;
   9.186 +    }
   9.187 +    switch (t_old) {
   9.188 +        case PEP_ct_mistrusted:
   9.189 +        case PEP_ct_key_revoked:
   9.190 +        case PEP_ct_compromised:
   9.191 +        case PEP_ct_key_b0rken:
   9.192 +            return t_old;
   9.193 +        default:
   9.194 +            break;
   9.195 +    }
   9.196 +    if (t_old < PEP_ct_strong_but_unconfirmed && t_new >= PEP_ct_strong_but_unconfirmed)
   9.197 +        return t_new;
   9.198 +    
   9.199 +    bool confirmed = (t_old & PEP_ct_confirmed) || (t_new & PEP_ct_confirmed);
   9.200 +    PEP_comm_type result = _MAX(t_old, t_new);
   9.201 +    if (confirmed)
   9.202 +        result |= PEP_ct_confirmed;
   9.203 +    return result;
   9.204 +}
   9.205 +
   9.206 +PEP_STATUS reconcile_pEp_status(PEP_SESSION session, const char* old_uid, 
   9.207 +                                const char* new_uid) {
   9.208 +    PEP_STATUS status = PEP_STATUS_OK;
   9.209 +    // We'll make this easy - if the old one has a pEp status, we set no matter
   9.210 +    // what.
   9.211 +    pEp_identity* ident = new_identity(NULL, NULL, old_uid, NULL);
   9.212 +    bool is_pEp_peep = false;
   9.213 +    status = is_pEp_user(session, ident, &is_pEp_peep);
   9.214 +    if (is_pEp_peep) {
   9.215 +        free(ident->user_id);
   9.216 +        ident->user_id = strdup(new_uid);
   9.217 +        if (!ident->user_id) {
   9.218 +            status = PEP_OUT_OF_MEMORY;
   9.219 +            goto pEp_free;
   9.220 +        }
   9.221 +        status = set_as_pEp_user(session, ident);
   9.222 +    }
   9.223 +pEp_free:
   9.224 +    free_identity(ident);
   9.225 +    return status;
   9.226 +}
   9.227 +
   9.228 +const char* reconcile_usernames(const char* old_name, const char* new_name, 
   9.229 +                                const char* address) {
   9.230 +    if (EMPTYSTR(old_name)) {
   9.231 +        if (EMPTYSTR(new_name))
   9.232 +            return address;
   9.233 +        else
   9.234 +            return new_name;
   9.235 +    }
   9.236 +    if (EMPTYSTR(new_name))
   9.237 +        return old_name;        
   9.238 +    if (strcmp(new_name, address) == 0)
   9.239 +        return old_name;
   9.240 +    return new_name;        
   9.241 +}
   9.242 +
   9.243 +PEP_STATUS reconcile_default_keys(PEP_SESSION session, pEp_identity* old_ident,
   9.244 +                                  pEp_identity* new_ident) {
   9.245 +    PEP_STATUS status = PEP_STATUS_OK;
   9.246 +                                      
   9.247 +    const char* old_fpr = old_ident->fpr;
   9.248 +    const char* new_fpr = new_ident->fpr;
   9.249 +    if (!old_fpr)
   9.250 +        return status;
   9.251 +
   9.252 +    PEP_comm_type old_ct = old_ident->comm_type;    
   9.253 +    PEP_comm_type new_ct = new_ident->comm_type;
   9.254 +    
   9.255 +    if (!new_fpr) {
   9.256 +        new_ident->fpr = strdup(old_fpr);
   9.257 +        if (!new_ident->fpr)
   9.258 +            status = PEP_OUT_OF_MEMORY;
   9.259 +        else    
   9.260 +            new_ident->comm_type = old_ct;
   9.261 +        return status;
   9.262 +    }        
   9.263 +    
   9.264 +    if (strcmp(old_fpr, new_fpr) == 0) {
   9.265 +        new_ident->comm_type = reconcile_trust(old_ct, new_ct);
   9.266 +        return status;
   9.267 +    }
   9.268 +    
   9.269 +    bool old_confirmed = old_ct & PEP_ct_confirmed;
   9.270 +    bool new_confirmed = new_ct & PEP_ct_confirmed;
   9.271 +    
   9.272 +    if (new_confirmed)
   9.273 +        return status;
   9.274 +    else if (old_confirmed) {
   9.275 +        free(new_ident->fpr);
   9.276 +        new_ident->fpr = strdup(old_fpr);
   9.277 +        if (!new_ident->fpr)
   9.278 +            status = PEP_OUT_OF_MEMORY;
   9.279 +        else    
   9.280 +            new_ident->comm_type = old_ct;
   9.281 +        return status;
   9.282 +    }
   9.283 +    
   9.284 +    if (old_ct > new_ct) {
   9.285 +        free(new_ident->fpr);
   9.286 +        new_ident->fpr = strdup(old_fpr);
   9.287 +        if (!new_ident->fpr)
   9.288 +            status = PEP_OUT_OF_MEMORY;
   9.289 +        else    
   9.290 +            new_ident->comm_type = old_ct;
   9.291 +    }
   9.292 +    return status;
   9.293 +}
   9.294 +
   9.295 +void reconcile_language(pEp_identity* old_ident,
   9.296 +                        pEp_identity* new_ident) {
   9.297 +    if (new_ident->lang[0] == 0) {
   9.298 +        if (old_ident->lang[0] != 0) {
   9.299 +            new_ident->lang[0] = old_ident->lang[0];
   9.300 +            new_ident->lang[1] = old_ident->lang[1];
   9.301 +            new_ident->lang[2] = old_ident->lang[2];
   9.302 +        }
   9.303 +    }
   9.304 +}
   9.305 +
   9.306 +// ONLY CALL THIS IF BOTH IDs ARE IN THE PERSON DB, FOOL! </Mr_T>
   9.307 +PEP_STATUS merge_records(PEP_SESSION session, const char* old_uid,
   9.308 +                         const char* new_uid) {
   9.309 +    PEP_STATUS status = PEP_STATUS_OK;
   9.310 +    
   9.311 +    pEp_identity* new_ident = NULL;
   9.312 +    identity_list* old_identities = NULL;
   9.313 +    labeled_int_list_t* trust_list = NULL;
   9.314 +    stringlist_t* touched_keys = new_stringlist(NULL);
   9.315 +    char* main_user_fpr = NULL;
   9.316 +
   9.317 +    status = reconcile_pEp_status(session, old_uid, new_uid);
   9.318 +    if (status != PEP_STATUS_OK)
   9.319 +        goto pEp_free;
   9.320 +                        
   9.321 +    bool new_is_pEp = false;
   9.322 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
   9.323 +    status = is_pEp_user(session, new_ident, &new_is_pEp);
   9.324 +    if (status != PEP_STATUS_OK)
   9.325 +        goto pEp_free;
   9.326 +    free(new_ident);
   9.327 +    new_ident = NULL;
   9.328 +        
   9.329 +    status = get_identities_by_userid(session, old_uid, &old_identities);
   9.330 +    if (status == PEP_STATUS_OK && old_identities) {
   9.331 +        identity_list* curr_old = old_identities;
   9.332 +        for (; curr_old && curr_old->ident; curr_old = curr_old->next) {
   9.333 +            pEp_identity* old_ident = curr_old->ident;
   9.334 +            const char* address = old_ident->address;
   9.335 +            status = get_identity(session, address, new_uid, &new_ident);
   9.336 +            if (status == PEP_CANNOT_FIND_IDENTITY) {
   9.337 +                // No new identity matching the old one, so we just set one w. new user_id
   9.338 +                free(old_ident->user_id);
   9.339 +                old_ident->user_id = strdup(new_uid);
   9.340 +                if (!old_ident->user_id) {
   9.341 +                    status = PEP_OUT_OF_MEMORY;
   9.342 +                    goto pEp_free;
   9.343 +                }
   9.344 +                if (new_is_pEp) {
   9.345 +                    PEP_comm_type confirmed_bit = old_ident->comm_type & PEP_ct_confirmed;
   9.346 +                    if ((old_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
   9.347 +                        old_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
   9.348 +                }
   9.349 +                
   9.350 +                status = set_identity(session, old_ident);
   9.351 +                if (status != PEP_STATUS_OK)
   9.352 +                    goto pEp_free;
   9.353 +            }
   9.354 +            else if (status != PEP_STATUS_OK)
   9.355 +                goto pEp_free;
   9.356 +            else {
   9.357 +                // Ok, so we have two idents which might be in conflict. Have to merge them.
   9.358 +                const char* username = reconcile_usernames(old_ident->username,
   9.359 +                                                           new_ident->username,
   9.360 +                                                           address);
   9.361 +                                                           
   9.362 +                if (!new_ident->username || strcmp(username, new_ident->username) != 0) {
   9.363 +                    free(new_ident->username);
   9.364 +                    new_ident->username = strdup(username);
   9.365 +                    if (!new_ident->username) {
   9.366 +                        status = PEP_OUT_OF_MEMORY;
   9.367 +                        goto pEp_free;
   9.368 +                    }
   9.369 +                }
   9.370 +        
   9.371 +                // Reconcile default keys if they differ, trust if they don't
   9.372 +                status = reconcile_default_keys(session, old_ident, new_ident);
   9.373 +                if (status != PEP_STATUS_OK)
   9.374 +                    goto pEp_free;
   9.375 +                    
   9.376 +                // reconcile languages
   9.377 +                reconcile_language(old_ident, new_ident);
   9.378 +
   9.379 +                // reconcile flags - FIXME - is this right?
   9.380 +                new_ident->flags |= old_ident->flags;
   9.381 +                
   9.382 +                // NOTE: In principle, this is only called from update_identity,
   9.383 +                // which would never have me flags set. So I am ignoring them here.
   9.384 +                // if this function is ever USED for that, though, you'll have
   9.385 +                // to go through making sure that the user ids are appropriately
   9.386 +                // aliased, etc. So be careful.
   9.387 +                
   9.388 +                // Set the reconciled record
   9.389 +                    
   9.390 +                status = set_identity(session, new_ident);
   9.391 +                if (status != PEP_STATUS_OK)
   9.392 +                    goto pEp_free;
   9.393 +
   9.394 +                if (new_ident->fpr)
   9.395 +                    stringlist_add(touched_keys, new_ident->fpr);
   9.396 +                        
   9.397 +                free_identity(new_ident);
   9.398 +                new_ident = NULL;    
   9.399 +            }
   9.400 +        }
   9.401 +    }
   9.402 +    // otherwise, no need to reconcile identity records. But maybe trust...    
   9.403 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
   9.404 +    if (!new_ident) {
   9.405 +        status = PEP_OUT_OF_MEMORY;
   9.406 +        goto pEp_free;
   9.407 +    }
   9.408 +    status = get_trust_by_userid(session, old_uid, &trust_list);
   9.409 +
   9.410 +    labeled_int_list_t* trust_curr = trust_list;
   9.411 +    for (; trust_curr && trust_curr->label; trust_curr = trust_curr->next) {
   9.412 +        const char* curr_fpr = trust_curr->label;
   9.413 +        new_ident->fpr = strdup(curr_fpr); 
   9.414 +        status = get_trust(session, new_ident);
   9.415 +        switch (status) {
   9.416 +            case PEP_STATUS_OK:
   9.417 +                new_ident->comm_type = reconcile_trust(trust_curr->value,
   9.418 +                                                       new_ident->comm_type);
   9.419 +                break;
   9.420 +            case PEP_CANNOT_FIND_IDENTITY:
   9.421 +                new_ident->comm_type = trust_curr->value;
   9.422 +                break;
   9.423 +            default:
   9.424 +                goto pEp_free;
   9.425 +        }
   9.426 +        new_ident->comm_type = reconcile_trust(trust_curr->value,
   9.427 +                                               new_ident->comm_type);
   9.428 +        if (new_is_pEp) {
   9.429 +            PEP_comm_type confirmed_bit = new_ident->comm_type & PEP_ct_confirmed;
   9.430 +            if ((new_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
   9.431 +                new_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
   9.432 +        }
   9.433 +
   9.434 +        status = set_trust(session, new_ident);
   9.435 +        if (status != PEP_STATUS_OK) {
   9.436 +            goto pEp_free;
   9.437 +        }                  
   9.438 +                              
   9.439 +        free(new_ident->fpr);
   9.440 +        new_ident->fpr = NULL;
   9.441 +        new_ident->comm_type = 0;
   9.442 +    }
   9.443 +
   9.444 +    // reconcile the default keys if the new id doesn't have one?
   9.445 +    status = get_main_user_fpr(session, new_uid, &main_user_fpr);
   9.446 +    if (status == PEP_KEY_NOT_FOUND || (status == PEP_STATUS_OK && !main_user_fpr)) {
   9.447 +        status = get_main_user_fpr(session, old_uid, &main_user_fpr);
   9.448 +        if (status == PEP_STATUS_OK && main_user_fpr)
   9.449 +            status = replace_main_user_fpr(session, new_uid, main_user_fpr);
   9.450 +        if (status != PEP_STATUS_OK)
   9.451 +            goto pEp_free;
   9.452 +    }
   9.453 +    
   9.454 +    // delete the old user
   9.455 +    status = delete_person(session, old_uid);
   9.456 +    
   9.457 +pEp_free:
   9.458 +    free_identity(new_ident);
   9.459 +    free_identity_list(old_identities);
   9.460 +    free_labeled_int_list(trust_list);
   9.461 +    free_stringlist(touched_keys);
   9.462 +    free(main_user_fpr);
   9.463 +    return status;
   9.464 +}
   9.465  
   9.466  PEP_STATUS replace_userid(PEP_SESSION session, const char* old_uid,
   9.467 -                              const char* new_uid) {
   9.468 +                          const char* new_uid) {
   9.469      assert(session);
   9.470      assert(old_uid);
   9.471      assert(new_uid);
   9.472 @@ -3194,6 +3552,15 @@
   9.473      if (!session || !old_uid || !new_uid)
   9.474          return PEP_ILLEGAL_VALUE;
   9.475  
   9.476 +    pEp_identity* temp_ident = new_identity(NULL, NULL, new_uid, NULL);
   9.477 +    bool new_exists = false;
   9.478 +    PEP_STATUS status = exists_person(session, temp_ident, &new_exists);
   9.479 +    free_identity(temp_ident);
   9.480 +    if (status != PEP_STATUS_OK) // DB error
   9.481 +        return status;
   9.482 +        
   9.483 +    if (new_exists)
   9.484 +        return merge_records(session, old_uid, new_uid);
   9.485  
   9.486      int result;
   9.487  
   9.488 @@ -3203,6 +3570,12 @@
   9.489      sqlite3_bind_text(session->replace_userid, 2, old_uid, -1,
   9.490              SQLITE_STATIC);
   9.491      result = sqlite3_step(session->replace_userid);
   9.492 +#ifndef NDEBUG
   9.493 +    if (result) {
   9.494 +        const char *errmsg = sqlite3_errmsg(session->db);
   9.495 +        log_event(session, "SQLite3 error", "replace_userid", errmsg, NULL);
   9.496 +    }
   9.497 +#endif // !NDEBUG
   9.498      sqlite3_reset(session->replace_userid);
   9.499      if (result != SQLITE_DONE)
   9.500          return PEP_CANNOT_SET_PERSON; // May need clearer retval
   9.501 @@ -3376,8 +3749,8 @@
   9.502          return PEP_ILLEGAL_VALUE;
   9.503  
   9.504      identity->comm_type = PEP_ct_unknown;
   9.505 -
   9.506      sqlite3_reset(session->get_trust);
   9.507 +
   9.508      sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
   9.509              SQLITE_STATIC);
   9.510      sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
   9.511 @@ -3399,6 +3772,7 @@
   9.512      return status;
   9.513  }
   9.514  
   9.515 +
   9.516  DYNAMIC_API PEP_STATUS least_trust(
   9.517          PEP_SESSION session,
   9.518          const char *fpr,
   9.519 @@ -3439,7 +3813,8 @@
   9.520  DYNAMIC_API PEP_STATUS decrypt_and_verify(
   9.521      PEP_SESSION session, const char *ctext, size_t csize,
   9.522      const char *dsigtext, size_t dsigsize,
   9.523 -    char **ptext, size_t *psize, stringlist_t **keylist
   9.524 +    char **ptext, size_t *psize, stringlist_t **keylist,
   9.525 +    char** filename_ptr
   9.526      )
   9.527  {
   9.528      assert(session);
   9.529 @@ -3453,8 +3828,8 @@
   9.530          return PEP_ILLEGAL_VALUE;
   9.531  
   9.532      PEP_STATUS status = session->cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify(
   9.533 -            session, ctext, csize, dsigtext, dsigsize, ptext, psize, keylist);
   9.534 -    if (status == PEP_DECRYPT_NO_KEY)
   9.535 +            session, ctext, csize, dsigtext, dsigsize, ptext, psize, keylist,
   9.536 +            filename_ptr);
   9.537          signal_Sync_event(session, Sync_PR_keysync, CannotDecrypt);
   9.538  
   9.539      return status;
    10.1 --- a/src/pEpEngine.h	Fri Oct 05 11:19:25 2018 +0200
    10.2 +++ b/src/pEpEngine.h	Fri Oct 05 11:53:18 2018 +0200
    10.3 @@ -13,7 +13,8 @@
    10.4  
    10.5  #include "dynamic_api.h"
    10.6  #include "stringlist.h"
    10.7 -#include "stringpair.h"    
    10.8 +#include "stringpair.h"
    10.9 +#include "labeled_int_list.h"    
   10.10  #include "timestamp.h"
   10.11  
   10.12  #define PEP_VERSION "2.0" // protocol version
   10.13 @@ -282,16 +283,20 @@
   10.14  // decrypt_and_verify() - decrypt and/or verify a message
   10.15  //
   10.16  //    parameters:
   10.17 -//        session (in)    session handle
   10.18 -//        ctext (in)      cipher text to decrypt and/or verify
   10.19 -//        csize (in)      size of cipher text
   10.20 -//        dsigtext (in)   if extant, *detached* signature text for this
   10.21 -//                        message (or NULL if not)
   10.22 -//        dsize (in)      size of *detached* signature text for this
   10.23 -//                        message (0, if no detached sig exists)
   10.24 -//        ptext (out)     pointer to internal buffer with plain text
   10.25 -//        psize (out)     size of plain text
   10.26 -//        keylist (out)   list of key ids which where used to encrypt
   10.27 +//        session (in)          session handle
   10.28 +//        ctext (in)            cipher text to decrypt and/or verify
   10.29 +//        csize (in)            size of cipher text
   10.30 +//        dsigtext (in)         if extant, *detached* signature text for this
   10.31 +//                              message (or NULL if not)
   10.32 +//        dsize (in)            size of *detached* signature text for this
   10.33 +//                              message (0, if no detached sig exists)
   10.34 +//        ptext (out)           pointer to internal buffer with plain text
   10.35 +//        psize (out)           size of plain text
   10.36 +//        keylist (out)         list of key ids which where used to encrypt
   10.37 +//        filename_ptr (out)    mails produced by certain PGP implementations 
   10.38 +//                              may return a decrypted filename here for attachments. 
   10.39 +//                              Externally, this can generally be NULL, and is an optional
   10.40 +//                              parameter.
   10.41  //
   10.42  //    return value:
   10.43  //        PEP_UNENCRYPTED               message was unencrypted and not signed
   10.44 @@ -313,7 +318,8 @@
   10.45  DYNAMIC_API PEP_STATUS decrypt_and_verify(
   10.46          PEP_SESSION session, const char *ctext, size_t csize,
   10.47          const char *dsigtext, size_t dsigsize,
   10.48 -        char **ptext, size_t *psize, stringlist_t **keylist
   10.49 +        char **ptext, size_t *psize, stringlist_t **keylist,
   10.50 +        char ** filename_ptr
   10.51      );
   10.52  
   10.53  
   10.54 @@ -1338,6 +1344,9 @@
   10.55  
   10.56  PEP_STATUS set_pgp_keypair(PEP_SESSION session, const char* fpr);
   10.57  
   10.58 +// exposed for testing
   10.59 +PEP_STATUS set_person(PEP_SESSION session, pEp_identity* identity,
   10.60 +                      bool guard_transaction);
   10.61  PEP_STATUS bind_own_ident_with_contact_ident(PEP_SESSION session,
   10.62                                               pEp_identity* own_ident, 
   10.63                                               pEp_identity* contact_ident);
    11.1 --- a/src/pEp_internal.h	Fri Oct 05 11:19:25 2018 +0200
    11.2 +++ b/src/pEp_internal.h	Fri Oct 05 11:53:18 2018 +0200
    11.3 @@ -146,6 +146,7 @@
    11.4      sqlite3_stmt *remove_fpr_as_default;
    11.5      sqlite3_stmt *set_person;
    11.6      sqlite3_stmt *update_person;
    11.7 +    sqlite3_stmt *delete_person;
    11.8      sqlite3_stmt *exists_person;    
    11.9      sqlite3_stmt *set_as_pEp_user;
   11.10      sqlite3_stmt *is_pEp_user;
   11.11 @@ -169,6 +170,7 @@
   11.12      sqlite3_stmt *update_trust_to_pEp;
   11.13      sqlite3_stmt *update_trust_for_fpr;
   11.14      sqlite3_stmt *get_trust;
   11.15 +    sqlite3_stmt *get_trust_by_userid;
   11.16      sqlite3_stmt *least_trust;
   11.17      sqlite3_stmt *mark_compromised;
   11.18      sqlite3_stmt *reset_trust;
    12.1 --- a/src/pgp_gpg.c	Fri Oct 05 11:19:25 2018 +0200
    12.2 +++ b/src/pgp_gpg.c	Fri Oct 05 11:53:18 2018 +0200
    12.3 @@ -575,7 +575,8 @@
    12.4  PEP_STATUS pgp_decrypt_and_verify(
    12.5      PEP_SESSION session, const char *ctext, size_t csize,
    12.6      const char *dsigtext, size_t dsigsize,
    12.7 -    char **ptext, size_t *psize, stringlist_t **keylist
    12.8 +    char **ptext, size_t *psize, stringlist_t **keylist,
    12.9 +    char** filename_ptr
   12.10      )
   12.11  {
   12.12      PEP_STATUS result;
   12.13 @@ -691,6 +692,15 @@
   12.14                          *keylist = NULL;
   12.15                          result = PEP_OUT_OF_MEMORY;
   12.16                      }
   12.17 +                    // Get filename, if desired
   12.18 +                    if (filename_ptr) {
   12.19 +                        const char* fname = gpgme_decrypt_result->file_name;
   12.20 +                        if (fname) {
   12.21 +                            *filename_ptr = strdup(fname);
   12.22 +                            if (!(*filename_ptr))
   12.23 +                                result = PEP_OUT_OF_MEMORY;
   12.24 +                        }
   12.25 +                    }
   12.26                  } /* Ok, so now we have any recipients it was encrypted for
   12.27                       in recipient_keylist */
   12.28              
   12.29 @@ -809,7 +819,7 @@
   12.30                          }
   12.31                          case GPG_ERR_CERT_REVOKED:
   12.32                          case GPG_ERR_BAD_SIGNATURE:
   12.33 -			    result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   12.34 +                            result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   12.35                              //result = PEP_DECRYPT_BAD_SIGNATURE;
   12.36                              break;
   12.37                          case GPG_ERR_SIG_EXPIRED:
    13.1 --- a/src/pgp_gpg.h	Fri Oct 05 11:19:25 2018 +0200
    13.2 +++ b/src/pgp_gpg.h	Fri Oct 05 11:53:18 2018 +0200
    13.3 @@ -41,7 +41,8 @@
    13.4  //      psize (out)         size of cyphertext in bytes
    13.5  //      keylist (out)       list of keys being used; first is the key being
    13.6  //                          used for signing
    13.7 -//
    13.8 +//	filename (out)	    PGP filename, when rendered (Optional, only necessary for some PGP implementations (e.g. Symantec),
    13.9 +//                          *** Mostly internal ***
   13.10  //  return value:
   13.11  //      PEP_DECRYPTED_AND_VERIFIED      data could be decryped and verified
   13.12  //      PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH
   13.13 @@ -64,7 +65,8 @@
   13.14          size_t dsigsize,
   13.15          char **ptext,
   13.16          size_t *psize,
   13.17 -        stringlist_t **keylist
   13.18 +        stringlist_t **keylist,
   13.19 +        char** filename_ptr
   13.20      );
   13.21  
   13.22  
   13.23 @@ -115,7 +117,7 @@
   13.24  //      PEP_GET_KEY_FAILED              access to keyring failed
   13.25  //      PEP_ILLEGAL_VALUE               parameters wrong
   13.26  //      PEP_OUT_OF_MEMORY               out of memory error
   13.27 -//      PEP_UNKOWN_ERROR                internal error
   13.28 +//      PEP_UNKNOWN_ERROR                internal error
   13.29  
   13.30  PEP_STATUS pgp_encrypt_only(
   13.31          PEP_SESSION session,
    14.1 --- a/src/pgp_netpgp.c	Fri Oct 05 11:19:25 2018 +0200
    14.2 +++ b/src/pgp_netpgp.c	Fri Oct 05 11:53:18 2018 +0200
    14.3 @@ -373,7 +373,8 @@
    14.4  PEP_STATUS pgp_decrypt_and_verify(
    14.5      PEP_SESSION session, const char *ctext, size_t csize,
    14.6      const char *dsigtext, size_t dsigsize,
    14.7 -    char **ptext, size_t *psize, stringlist_t **keylist
    14.8 +    char **ptext, size_t *psize, stringlist_t **keylist,
    14.9 +    char** filename_ptr // will be ignored
   14.10      )
   14.11  {
   14.12      char *_ptext = NULL;
    15.1 --- a/src/pgp_netpgp.h	Fri Oct 05 11:19:25 2018 +0200
    15.2 +++ b/src/pgp_netpgp.h	Fri Oct 05 11:53:18 2018 +0200
    15.3 @@ -10,7 +10,8 @@
    15.4  PEP_STATUS pgp_decrypt_and_verify(
    15.5          PEP_SESSION session, const char *ctext, size_t csize,
    15.6          const char *dsigtext, size_t dsigsize,
    15.7 -        char **ptext, size_t *psize, stringlist_t **keylist
    15.8 +        char **ptext, size_t *psize, stringlist_t **keylist,
    15.9 +        char** filename_ptr // will be ignored
   15.10      );
   15.11  
   15.12  PEP_STATUS pgp_encrypt_and_sign(
    16.1 --- a/src/stringlist.c	Fri Oct 05 11:19:25 2018 +0200
    16.2 +++ b/src/stringlist.c	Fri Oct 05 11:53:18 2018 +0200
    16.3 @@ -113,6 +113,17 @@
    16.4      return list_curr->next;
    16.5  }
    16.6  
    16.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value) {
    16.8 +    if (!head || !value || !head->value)
    16.9 +        return NULL;
   16.10 +    stringlist_t* retval = head;
   16.11 +    for (; retval ; retval = retval->next) {
   16.12 +        if (strcmp(retval->value, value) == 0)
   16.13 +            break;
   16.14 +    }
   16.15 +    return retval;
   16.16 +}
   16.17 +
   16.18  DYNAMIC_API stringlist_t *stringlist_add_unique(
   16.19          stringlist_t *stringlist,
   16.20          const char *value
    17.1 --- a/src/stringlist.h	Fri Oct 05 11:19:25 2018 +0200
    17.2 +++ b/src/stringlist.h	Fri Oct 05 11:53:18 2018 +0200
    17.3 @@ -133,6 +133,7 @@
    17.4  
    17.5  DYNAMIC_API void free_stringlist(stringlist_t *stringlist);
    17.6  
    17.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value);
    17.8  
    17.9  #ifdef __cplusplus
   17.10  }
    18.1 --- a/test/Makefile	Fri Oct 05 11:19:25 2018 +0200
    18.2 +++ b/test/Makefile	Fri Oct 05 11:53:18 2018 +0200
    18.3 @@ -18,14 +18,14 @@
    18.4  DEPS := $(OBJS:.o=.d)
    18.5  
    18.6  INC_DIRS := ./include /usr/local/include 
    18.7 -INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(GPGME_INC)
    18.8 +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(GPGME_INC) $(CPPUNIT_INC)
    18.9  
   18.10  LDFLAGS += -L/usr/local/lib
   18.11  
   18.12  CFLAGS += -Wno-deprecated
   18.13  CXXFLAGS += -Wno-deprecated
   18.14  
   18.15 -LDFLAGS+= $(ETPAN_LIB) -L../asn.1 -L../src
   18.16 +LDFLAGS+= $(ETPAN_LIB) $(CPPUNIT_LIB) -L../asn.1 -L../src
   18.17  LDLIBS+= -letpan -lpEpEngine -lstdc++ -lasn1
   18.18  
   18.19  ifeq ($(BUILD_FOR),Linux)
    19.1 --- a/test/convenience_scripts/keygen_for_test.py	Fri Oct 05 11:19:25 2018 +0200
    19.2 +++ b/test/convenience_scripts/keygen_for_test.py	Fri Oct 05 11:53:18 2018 +0200
    19.3 @@ -1,5 +1,5 @@
    19.4  import argparse
    19.5 -import gnupg
    19.6 +from pretty_bad_protocol import gnupg
    19.7  import os
    19.8  import subprocess
    19.9  
   19.10 @@ -19,10 +19,11 @@
   19.11  homedir = os.path.join(os.path.expanduser('~'),"gnupg")
   19.12  print("GNUPGHOME=" + homedir + "\n")
   19.13  
   19.14 +
   19.15  try:
   19.16 -    gpg = gnupg.GPG(gnupghome=homedir) 
   19.17 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', gnupghome=homedir) 
   19.18  except TypeError:
   19.19 -    gpg = gnupg.GPG(homedir=homedir)
   19.20 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', homedir=homedir)
   19.21  
   19.22  name = args.real_name_prefix
   19.23  email = args.email_address_prefix
   19.24 @@ -61,7 +62,7 @@
   19.25              email = e_split[0] + "_" + i_str + "@" + e_split[1]
   19.26  
   19.27      print("Generating key data for " + name + " " + email + "\n")
   19.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="")
   19.29 +    input_data = gpg.gen_key_input(key_type="RSA", key_length=2048, expire_date=0, name_real=name, name_email=email)
   19.30      if not input_data:
   19.31          raise Exception('Input data not created in iteration ' + str(i))
   19.32      
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/test/include/Engine463Tests.h	Fri Oct 05 11:53:18 2018 +0200
    20.3 @@ -0,0 +1,20 @@
    20.4 +// This file is under GNU General Public License 3.0
    20.5 +// see LICENSE.txt
    20.6 +
    20.7 +#ifndef ENGINE463_H
    20.8 +#define ENGINE463_H
    20.9 +
   20.10 +#include <string>
   20.11 +#include "EngineTestIndividualSuite.h"
   20.12 +
   20.13 +using namespace std;
   20.14 +
   20.15 +class Engine463Tests : public EngineTestIndividualSuite {
   20.16 +    public:
   20.17 +        Engine463Tests(string test_suite, string test_home_dir);
   20.18 +    private:
   20.19 +        void check_engine_463_no_own_key();
   20.20 +        void check_engine_463_own_key();
   20.21 +};
   20.22 +
   20.23 +#endif
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/test/include/UserIdCollisionTests.h	Fri Oct 05 11:53:18 2018 +0200
    21.3 @@ -0,0 +1,112 @@
    21.4 +// This file is under GNU General Public License 3.0
    21.5 +// see LICENSE.txt
    21.6 +
    21.7 +#ifndef USER_ID_COLLISION_H
    21.8 +#define USER_ID_COLLISION_H
    21.9 +
   21.10 +#include <string>
   21.11 +#include "EngineTestIndividualSuite.h"
   21.12 +
   21.13 +using namespace std;
   21.14 +
   21.15 +class UserIdCollisionTests : public EngineTestIndividualSuite {
   21.16 +    public:
   21.17 +        UserIdCollisionTests(string test_suite, string test_home_dir);
   21.18 +    
   21.19 +    protected:
   21.20 +        void setup();
   21.21 +        void tear_down();
   21.22 +        
   21.23 +        // own user
   21.24 +        pEp_identity* user_alice;
   21.25 +        // real ID, only minimal info w/ username
   21.26 +        pEp_identity* real_alex;
   21.27 +        // tofu ID, only minimal info w/ username        
   21.28 +        pEp_identity* tofu_alex;
   21.29 +        // real ID, only minimal info w/o username
   21.30 +        pEp_identity* real_alex_0;
   21.31 +        // tofu ID, only minimal info w/o username
   21.32 +        pEp_identity* tofu_alex_0;
   21.33 +        // real ID, only minimal info w/o username
   21.34 +        pEp_identity* real_alex_1;
   21.35 +        // tofu ID, only minimal info w/o username
   21.36 +        pEp_identity* tofu_alex_1;
   21.37 +        // real ID, various kinds of info
   21.38 +        pEp_identity* real_alex_2;
   21.39 +        // tofu ID, various kinds of info
   21.40 +        pEp_identity* tofu_alex_2;
   21.41 +        // real ID, various kinds of info
   21.42 +        pEp_identity* real_alex_3;
   21.43 +        // tofu ID, various kinds of info        
   21.44 +        pEp_identity* tofu_alex_3;
   21.45 +        // tofu ID, various kinds of info        
   21.46 +        pEp_identity* tofu_alex_4;
   21.47 +        // real ID, various kinds of info
   21.48 +        pEp_identity* real_alex_4;
   21.49 +        // tofu ID, various kinds of info        
   21.50 +        pEp_identity* tofu_alex_5;
   21.51 +        // real ID, various kinds of info
   21.52 +        pEp_identity* real_alex_5;
   21.53 +        // tofu ID, various kinds of info        
   21.54 +        pEp_identity* tofu_alex_6a;
   21.55 +        // real ID, various kinds of info
   21.56 +        pEp_identity* real_alex_6a;
   21.57 +        // tofu ID, various kinds of info        
   21.58 +        pEp_identity* tofu_alex_6b;
   21.59 +        // real ID, various kinds of info
   21.60 +        pEp_identity* real_alex_6b;
   21.61 +        // tofu ID, various kinds of info        
   21.62 +        pEp_identity* tofu_alex_6c;
   21.63 +        // real ID, various kinds of info
   21.64 +        pEp_identity* real_alex_6c;
   21.65 +        // tofu ID, various kinds of info        
   21.66 +        pEp_identity* tofu_alex_6d;
   21.67 +        // real ID, various kinds of info
   21.68 +        pEp_identity* real_alex_6d;
   21.69 +        
   21.70 +        const char* const alice_keyfile = "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc";
   21.71 +        const char* const alice_keyid = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   21.72 +        const char* const alice_email = "pep.test.alice@pep-project.org";
   21.73 +        const char* const alex_keyfile = "test_keys/pub/pep.test.alexander-0x26B54E4E_pub.asc";
   21.74 +        const char* const alex_keyid = "3AD9F60FAEB22675DB873A1362D6981326B54E4E";        
   21.75 +        const char* const alex_email = "pep.test.alexander@peptest.ch";        
   21.76 +        const char* const alex0_keyfile = "test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc";
   21.77 +        const char* const alex0_keyid = "F4598A17D4690EB3B5B0F6A344F04E963B7302DB";
   21.78 +        const char* const alex0_email = "pep.test.alexander0@darthmama.org";                
   21.79 +        const char* const alex1_keyfile = "test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc";
   21.80 +        const char* const alex1_keyid = "59AF4C51492283522F6904531C09730A541260F6";        
   21.81 +        const char* const alex1_email = "pep.test.alexander1@darthmama.org";                                
   21.82 +        const char* const alex2_keyfile = "test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc";
   21.83 +        const char* const alex2_keyid = "46A994F19077C05610870273C4B8AB0BA6512F30";
   21.84 +        const char* const alex2_email = "pep.test.alexander2@darthmama.org";                                
   21.85 +        const char* const alex3_keyfile = "test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc";
   21.86 +        const char* const alex3_keyid = "5F7076BBD92E14EA49F0DF7C2CE49419724B3975";        
   21.87 +        const char* const alex3_email = "pep.test.alexander3@darthmama.org";                
   21.88 +        const char* const alex4_keyfile = "test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc";
   21.89 +        const char* const alex4_keyid = "E95FFF95B8E2FDD4A12C3374395F1485844B9DCF";        
   21.90 +        const char* const alex4_email = "pep.test.alexander4@darthmama.org";                
   21.91 +        const char* const alex5_keyfile = "test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc";
   21.92 +        const char* const alex5_keyid = "58BCC2BF2AE1E3C4FBEAB89AD7838ACA0773CD29";        
   21.93 +        const char* const alex5_email = "pep.test.alexander5@darthmama.org";                
   21.94 +        const char* const alex6a_keyfile = "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc";
   21.95 +        const char* const alex6a_keyid = "B4CE2F6947B6947C500F0687AEFDE530BDA17020";        
   21.96 +        const char* const alex6_email = "pep.test.alexander6@darthmama.org";                
   21.97 +        const char* const alex6b_keyfile = "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc";
   21.98 +        const char* const alex6b_keyid = "2E21325D202A44BFD9C607FCF095B202503B14D8";        
   21.99 +        const char* const alex6c_keyfile = "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc";
  21.100 +        const char* const alex6c_keyid = "3C1E713D8519D7F907E3142D179EAA24A216E95A";        
  21.101 +        const char* const alex6d_keyfile = "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc";
  21.102 +        const char* const alex6d_keyid = "74D79B4496E289BD8A71B70BA8E2C4530019697D";        
  21.103 +        
  21.104 +    private:
  21.105 +        void simple_tofu_collision();        
  21.106 +        void simple_tofu_collision_different_usernames();
  21.107 +        void tofu_collision_two_tofus();        
  21.108 +        void tofu_collision_two_tofus_diff_usernames();
  21.109 +        void real_followed_by_explicit_tofu();
  21.110 +        void merge_records_normal();
  21.111 +        void merge_records_set();
  21.112 +        void merge_records_set_2();
  21.113 +};
  21.114 +
  21.115 +#endif
    22.1 --- a/test/include/test_util.h	Fri Oct 05 11:19:25 2018 +0200
    22.2 +++ b/test/include/test_util.h	Fri Oct 05 11:53:18 2018 +0200
    22.3 @@ -47,6 +47,8 @@
    22.4  // Grabs a new uuid for your randomish string needs.
    22.5  char* get_new_uuid();
    22.6  
    22.7 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename);
    22.8 +
    22.9  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename);
   22.10  
   22.11  int util_delete_filepath(const char *filepath, 
    23.1 --- a/test/src/SuiteMaker.cc	Fri Oct 05 11:19:25 2018 +0200
    23.2 +++ b/test/src/SuiteMaker.cc	Fri Oct 05 11:53:18 2018 +0200
    23.3 @@ -12,167 +12,175 @@
    23.4  #include "SuiteMaker.h"
    23.5  
    23.6  // Begin where we generate stuff
    23.7 -#include "MimeTests.h"
    23.8 -#include "BloblistTests.h"
    23.9 -#include "NewUpdateIdAndMyselfTests.h"
   23.10 +#include "DecorateTests.h"
   23.11 +#include "UserIdCollisionTests.h"
   23.12 +#include "ReencryptPlusExtraKeysTests.h"
   23.13 +#include "BlacklistTests.h"
   23.14 +#include "AppleMailTests.h"
   23.15 +#include "MessageTwoPointOhTests.h"
   23.16 +#include "IdentityListTests.h"
   23.17  #include "I18nTests.h"
   23.18 -#include "IdentityListTests.h"
   23.19 -#include "PgpBinaryTests.h"
   23.20 -#include "MessageNullFromTests.h"
   23.21 -#include "LeastCommonDenomColorTests.h"
   23.22 +#include "Engine463Tests.h"
   23.23 +#include "DecryptAttachPrivateKeyUntrustedTests.h"
   23.24 +#include "BCCTests.h"
   23.25 +#include "LeastColorGroupTests.h"
   23.26 +#include "BlacklistAcceptNewKeyTests.h"
   23.27 +#include "MessageApiTests.h"
   23.28  #include "StringlistTests.h"
   23.29 -#include "PgpListKeysTests.h"
   23.30 -#include "MessageApiTests.h"
   23.31 -#include "EncryptMissingPrivateKeyTests.h"
   23.32 -#include "CaseAndDotAddressTests.h"
   23.33 -#include "UserIDAliasTests.h"
   23.34 -#include "BCCTests.h"
   23.35 -#include "BlacklistAcceptNewKeyTests.h"
   23.36 -#include "DecryptAttachPrivateKeyUntrustedTests.h"
   23.37 -#include "BlacklistTests.h"
   23.38 -#include "RevokeRegenAttachTests.h"
   23.39 -#include "PepSubjectReceivedTests.h"
   23.40 -#include "SequenceTests.h"
   23.41 -#include "EncryptAttachPrivateKeyTests.h"
   23.42 -#include "ExternalRevokeTests.h"
   23.43 -#include "KeyeditTests.h"
   23.44 -#include "LeastColorGroupTests.h"
   23.45 -#include "DecryptAttachPrivateKeyTrustedTests.h"
   23.46 -#include "TrustwordsTests.h"
   23.47 -#include "ReencryptPlusExtraKeysTests.h"
   23.48 -#include "MapAsn1Tests.h"
   23.49 -#include "DecorateTests.h"
   23.50 -#include "MessageTwoPointOhTests.h"
   23.51 -#include "CrashdumpTests.h"
   23.52  #include "StringpairListTests.h"
   23.53 -#include "EncryptForIdentityTests.h"
   23.54 -#include "KeyResetMessageTests.h"
   23.55  #include "TrustManipulationTests.h"
   23.56  #include "SyncTests.h"
   23.57 -#include "AppleMailTests.h"
   23.58 +#include "EncryptAttachPrivateKeyTests.h"
   23.59 +#include "BloblistTests.h"
   23.60 +#include "KeyResetMessageTests.h"
   23.61 +#include "SequenceTests.h"
   23.62 +#include "TrustwordsTests.h"
   23.63 +#include "RevokeRegenAttachTests.h"
   23.64 +#include "EncryptMissingPrivateKeyTests.h"
   23.65 +#include "PepSubjectReceivedTests.h"
   23.66 +#include "KeyeditTests.h"
   23.67 +#include "MapAsn1Tests.h"
   23.68 +#include "PgpBinaryTests.h"
   23.69 +#include "DecryptAttachPrivateKeyTrustedTests.h"
   23.70 +#include "MessageNullFromTests.h"
   23.71 +#include "MimeTests.h"
   23.72 +#include "PgpListKeysTests.h"
   23.73 +#include "NewUpdateIdAndMyselfTests.h"
   23.74 +#include "EncryptForIdentityTests.h"
   23.75 +#include "CrashdumpTests.h"
   23.76 +#include "CaseAndDotAddressTests.h"
   23.77 +#include "LeastCommonDenomColorTests.h"
   23.78 +#include "ExternalRevokeTests.h"
   23.79 +#include "UserIDAliasTests.h"
   23.80  
   23.81  
   23.82  const char* SuiteMaker::all_suites[] = {
   23.83 -    "MimeTests",
   23.84 -    "BloblistTests",
   23.85 -    "NewUpdateIdAndMyselfTests",
   23.86 +    "DecorateTests",
   23.87 +    "UserIdCollisionTests",
   23.88 +    "ReencryptPlusExtraKeysTests",
   23.89 +    "BlacklistTests",
   23.90 +    "AppleMailTests",
   23.91 +    "MessageTwoPointOhTests",
   23.92 +    "IdentityListTests",
   23.93      "I18nTests",
   23.94 -    "IdentityListTests",
   23.95 -    "PgpBinaryTests",
   23.96 -    "MessageNullFromTests",
   23.97 -    "LeastCommonDenomColorTests",
   23.98 +    "Engine463Tests",
   23.99 +    "DecryptAttachPrivateKeyUntrustedTests",
  23.100 +    "BCCTests",
  23.101 +    "LeastColorGroupTests",
  23.102 +    "BlacklistAcceptNewKeyTests",
  23.103 +    "MessageApiTests",
  23.104      "StringlistTests",
  23.105 -    "PgpListKeysTests",
  23.106 -    "MessageApiTests",
  23.107 -    "EncryptMissingPrivateKeyTests",
  23.108 -    "CaseAndDotAddressTests",
  23.109 -    "UserIDAliasTests",
  23.110 -    "BCCTests",
  23.111 -    "BlacklistAcceptNewKeyTests",
  23.112 -    "DecryptAttachPrivateKeyUntrustedTests",
  23.113 -    "BlacklistTests",
  23.114 -    "RevokeRegenAttachTests",
  23.115 -    "PepSubjectReceivedTests",
  23.116 -    "SequenceTests",
  23.117 -    "EncryptAttachPrivateKeyTests",
  23.118 -    "ExternalRevokeTests",
  23.119 -    "KeyeditTests",
  23.120 -    "LeastColorGroupTests",
  23.121 -    "DecryptAttachPrivateKeyTrustedTests",
  23.122 -    "TrustwordsTests",
  23.123 -    "ReencryptPlusExtraKeysTests",
  23.124 -    "MapAsn1Tests",
  23.125 -    "DecorateTests",
  23.126 -    "MessageTwoPointOhTests",
  23.127 -    "CrashdumpTests",
  23.128      "StringpairListTests",
  23.129 -    "EncryptForIdentityTests",
  23.130 -    "KeyResetMessageTests",
  23.131      "TrustManipulationTests",
  23.132      "SyncTests",
  23.133 -    "AppleMailTests",
  23.134 +    "EncryptAttachPrivateKeyTests",
  23.135 +    "BloblistTests",
  23.136 +    "KeyResetMessageTests",
  23.137 +    "SequenceTests",
  23.138 +    "TrustwordsTests",
  23.139 +    "RevokeRegenAttachTests",
  23.140 +    "EncryptMissingPrivateKeyTests",
  23.141 +    "PepSubjectReceivedTests",
  23.142 +    "KeyeditTests",
  23.143 +    "MapAsn1Tests",
  23.144 +    "PgpBinaryTests",
  23.145 +    "DecryptAttachPrivateKeyTrustedTests",
  23.146 +    "MessageNullFromTests",
  23.147 +    "MimeTests",
  23.148 +    "PgpListKeysTests",
  23.149 +    "NewUpdateIdAndMyselfTests",
  23.150 +    "EncryptForIdentityTests",
  23.151 +    "CrashdumpTests",
  23.152 +    "CaseAndDotAddressTests",
  23.153 +    "LeastCommonDenomColorTests",
  23.154 +    "ExternalRevokeTests",
  23.155 +    "UserIDAliasTests",
  23.156  };
  23.157  
  23.158  // This file is generated, so magic constants are ok.
  23.159 -int SuiteMaker::num_suites = 38;
  23.160 +int SuiteMaker::num_suites = 40;
  23.161  
  23.162  void SuiteMaker::suitemaker_build(const char* test_class_name, const char* test_home, Test::Suite** test_suite) {
  23.163 -    if (strcmp(test_class_name, "MimeTests") == 0)
  23.164 -        *test_suite = new MimeTests(test_class_name, test_home);
  23.165 -    else if (strcmp(test_class_name, "BloblistTests") == 0)
  23.166 -        *test_suite = new BloblistTests(test_class_name, test_home);
  23.167 -    else if (strcmp(test_class_name, "NewUpdateIdAndMyselfTests") == 0)
  23.168 -        *test_suite = new NewUpdateIdAndMyselfTests(test_class_name, test_home);
  23.169 +    if (strcmp(test_class_name, "DecorateTests") == 0)
  23.170 +        *test_suite = new DecorateTests(test_class_name, test_home);
  23.171 +    else if (strcmp(test_class_name, "UserIdCollisionTests") == 0)
  23.172 +        *test_suite = new UserIdCollisionTests(test_class_name, test_home);
  23.173 +    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  23.174 +        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  23.175 +    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  23.176 +        *test_suite = new BlacklistTests(test_class_name, test_home);
  23.177 +    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  23.178 +        *test_suite = new AppleMailTests(test_class_name, test_home);
  23.179 +    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  23.180 +        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  23.181 +    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  23.182 +        *test_suite = new IdentityListTests(test_class_name, test_home);
  23.183      else if (strcmp(test_class_name, "I18nTests") == 0)
  23.184          *test_suite = new I18nTests(test_class_name, test_home);
  23.185 -    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  23.186 -        *test_suite = new IdentityListTests(test_class_name, test_home);
  23.187 -    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  23.188 -        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  23.189 -    else if (strcmp(test_class_name, "MessageNullFromTests") == 0)
  23.190 -        *test_suite = new MessageNullFromTests(test_class_name, test_home);
  23.191 -    else if (strcmp(test_class_name, "LeastCommonDenomColorTests") == 0)
  23.192 -        *test_suite = new LeastCommonDenomColorTests(test_class_name, test_home);
  23.193 +    else if (strcmp(test_class_name, "Engine463Tests") == 0)
  23.194 +        *test_suite = new Engine463Tests(test_class_name, test_home);
  23.195 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  23.196 +        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  23.197 +    else if (strcmp(test_class_name, "BCCTests") == 0)
  23.198 +        *test_suite = new BCCTests(test_class_name, test_home);
  23.199 +    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  23.200 +        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  23.201 +    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  23.202 +        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  23.203 +    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  23.204 +        *test_suite = new MessageApiTests(test_class_name, test_home);
  23.205      else if (strcmp(test_class_name, "StringlistTests") == 0)
  23.206          *test_suite = new StringlistTests(test_class_name, test_home);
  23.207 -    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  23.208 -        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  23.209 -    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  23.210 -        *test_suite = new MessageApiTests(test_class_name, test_home);
  23.211 -    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  23.212 -        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  23.213 -    else if (strcmp(test_class_name, "CaseAndDotAddressTests") == 0)
  23.214 -        *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
  23.215 -    else if (strcmp(test_class_name, "UserIDAliasTests") == 0)
  23.216 -        *test_suite = new UserIDAliasTests(test_class_name, test_home);
  23.217 -    else if (strcmp(test_class_name, "BCCTests") == 0)
  23.218 -        *test_suite = new BCCTests(test_class_name, test_home);
  23.219 -    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  23.220 -        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  23.221 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  23.222 -        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  23.223 -    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  23.224 -        *test_suite = new BlacklistTests(test_class_name, test_home);
  23.225 -    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  23.226 -        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  23.227 -    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  23.228 -        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  23.229 -    else if (strcmp(test_class_name, "SequenceTests") == 0)
  23.230 -        *test_suite = new SequenceTests(test_class_name, test_home);
  23.231 -    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  23.232 -        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  23.233 -    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  23.234 -        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  23.235 -    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  23.236 -        *test_suite = new KeyeditTests(test_class_name, test_home);
  23.237 -    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  23.238 -        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  23.239 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  23.240 -        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  23.241 -    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  23.242 -        *test_suite = new TrustwordsTests(test_class_name, test_home);
  23.243 -    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  23.244 -        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  23.245 -    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  23.246 -        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  23.247 -    else if (strcmp(test_class_name, "DecorateTests") == 0)
  23.248 -        *test_suite = new DecorateTests(test_class_name, test_home);
  23.249 -    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  23.250 -        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  23.251 -    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  23.252 -        *test_suite = new CrashdumpTests(test_class_name, test_home);
  23.253      else if (strcmp(test_class_name, "StringpairListTests") == 0)
  23.254          *test_suite = new StringpairListTests(test_class_name, test_home);
  23.255 -    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  23.256 -        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  23.257 -    else if (strcmp(test_class_name, "KeyResetMessageTests") == 0)
  23.258 -        *test_suite = new KeyResetMessageTests(test_class_name, test_home);
  23.259      else if (strcmp(test_class_name, "TrustManipulationTests") == 0)
  23.260          *test_suite = new TrustManipulationTests(test_class_name, test_home);
  23.261      else if (strcmp(test_class_name, "SyncTests") == 0)
  23.262          *test_suite = new SyncTests(test_class_name, test_home);
  23.263 -    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  23.264 -        *test_suite = new AppleMailTests(test_class_name, test_home);
  23.265 +    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  23.266 +        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  23.267 +    else if (strcmp(test_class_name, "BloblistTests") == 0)
  23.268 +        *test_suite = new BloblistTests(test_class_name, test_home);
  23.269 +    else if (strcmp(test_class_name, "KeyResetMessageTests") == 0)
  23.270 +        *test_suite = new KeyResetMessageTests(test_class_name, test_home);
  23.271 +    else if (strcmp(test_class_name, "SequenceTests") == 0)
  23.272 +        *test_suite = new SequenceTests(test_class_name, test_home);
  23.273 +    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  23.274 +        *test_suite = new TrustwordsTests(test_class_name, test_home);
  23.275 +    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  23.276 +        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  23.277 +    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  23.278 +        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  23.279 +    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  23.280 +        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  23.281 +    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  23.282 +        *test_suite = new KeyeditTests(test_class_name, test_home);
  23.283 +    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  23.284 +        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  23.285 +    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  23.286 +        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  23.287 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  23.288 +        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  23.289 +    else if (strcmp(test_class_name, "MessageNullFromTests") == 0)
  23.290 +        *test_suite = new MessageNullFromTests(test_class_name, test_home);
  23.291 +    else if (strcmp(test_class_name, "MimeTests") == 0)
  23.292 +        *test_suite = new MimeTests(test_class_name, test_home);
  23.293 +    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  23.294 +        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  23.295 +    else if (strcmp(test_class_name, "NewUpdateIdAndMyselfTests") == 0)
  23.296 +        *test_suite = new NewUpdateIdAndMyselfTests(test_class_name, test_home);
  23.297 +    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  23.298 +        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  23.299 +    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  23.300 +        *test_suite = new CrashdumpTests(test_class_name, test_home);
  23.301 +    else if (strcmp(test_class_name, "CaseAndDotAddressTests") == 0)
  23.302 +        *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
  23.303 +    else if (strcmp(test_class_name, "LeastCommonDenomColorTests") == 0)
  23.304 +        *test_suite = new LeastCommonDenomColorTests(test_class_name, test_home);
  23.305 +    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  23.306 +        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  23.307 +    else if (strcmp(test_class_name, "UserIDAliasTests") == 0)
  23.308 +        *test_suite = new UserIDAliasTests(test_class_name, test_home);
  23.309  }
  23.310  
  23.311  void SuiteMaker::suitemaker_buildlist(const char** test_class_names, int num_to_run, const char* test_home, std::vector<Test::Suite*>& test_suites) {
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/test/src/engine_tests/Engine463Tests.cc	Fri Oct 05 11:53:18 2018 +0200
    24.3 @@ -0,0 +1,74 @@
    24.4 +// This file is under GNU General Public License 3.0
    24.5 +// see LICENSE.txt
    24.6 +
    24.7 +#include <stdlib.h>
    24.8 +#include <string>
    24.9 +
   24.10 +#include "pEpEngine.h"
   24.11 +#include "pEp_internal.h"
   24.12 +#include "test_util.h"
   24.13 +
   24.14 +#include "EngineTestIndividualSuite.h"
   24.15 +#include "Engine463Tests.h"
   24.16 +
   24.17 +using namespace std;
   24.18 +
   24.19 +Engine463Tests::Engine463Tests(string suitename, string test_home_dir) :
   24.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   24.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_no_own_key"),
   24.22 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_no_own_key)));
   24.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_own_key"),
   24.24 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_own_key)));                                                                  
   24.25 +}
   24.26 +
   24.27 +void Engine463Tests::check_engine_463_no_own_key() {
   24.28 +    const string claudio_keys = slurp("test_keys/priv/notfound-alt-pub_and_private.asc");
   24.29 +    const string fake_schleuder_key = slurp("test_keys/pub/fake-schleuder.asc");
   24.30 +    
   24.31 +    PEP_STATUS status = import_key(session, claudio_keys.c_str(), claudio_keys.length(), NULL);
   24.32 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   24.33 +    status = import_key(session, fake_schleuder_key.c_str(), fake_schleuder_key.length(), NULL);
   24.34 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   24.35 +
   24.36 +    // Ok, bring in message, decrypt, and see what happens.
   24.37 +    const string msg = slurp("test_mails/notfound-alt.msg");
   24.38 +
   24.39 +    char* decrypted_msg = NULL;
   24.40 +    stringlist_t* keylist_used = nullptr;
   24.41 +    char* modified_src = NULL;
   24.42 +    
   24.43 +    PEP_rating rating;
   24.44 +    PEP_decrypt_flags_t flags;
   24.45 +     
   24.46 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   24.47 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   24.48 +    cout << decrypted_msg << endl;        
   24.49 +}
   24.50 +
   24.51 +void Engine463Tests::check_engine_463_own_key() {
   24.52 +    const string claudio_keys = slurp("test_keys/priv/notfound-alt-pub_and_private.asc");
   24.53 +    const string fake_schleuder_key = slurp("test_keys/pub/fake-schleuder.asc");
   24.54 +    
   24.55 +    PEP_STATUS status = import_key(session, claudio_keys.c_str(), claudio_keys.length(), NULL);
   24.56 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   24.57 +    status = import_key(session, fake_schleuder_key.c_str(), fake_schleuder_key.length(), NULL);
   24.58 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   24.59 +
   24.60 +    pEp_identity* own_ident = new_identity("claudio+engine-463@pep.foundation", "A039BC60E43E0DFDDC9DE8663B48C38325210C88", PEP_OWN_USERID, "Not Actually Claudio");
   24.61 +    status = set_own_key(session, own_ident, "A039BC60E43E0DFDDC9DE8663B48C38325210C88");
   24.62 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   24.63 +
   24.64 +    // Ok, bring in message, decrypt, and see what happens.
   24.65 +    const string msg = slurp("test_mails/notfound-alt.msg");
   24.66 +
   24.67 +    char* decrypted_msg = NULL;
   24.68 +    stringlist_t* keylist_used = nullptr;
   24.69 +    char* modified_src = NULL;
   24.70 +    
   24.71 +    PEP_rating rating;
   24.72 +    PEP_decrypt_flags_t flags;
   24.73 +     
   24.74 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   24.75 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   24.76 +    cout << decrypted_msg << endl;        
   24.77 +}
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/test/src/engine_tests/UserIdCollisionTests.cc	Fri Oct 05 11:53:18 2018 +0200
    25.3 @@ -0,0 +1,336 @@
    25.4 +// This file is under GNU General Public License 3.0
    25.5 +// see LICENSE.txt
    25.6 +
    25.7 +#include <stdlib.h>
    25.8 +#include <string>
    25.9 +#include <cstring>
   25.10 +
   25.11 +#include "pEpEngine.h"
   25.12 +
   25.13 +#include "test_util.h"
   25.14 +#include "EngineTestIndividualSuite.h"
   25.15 +#include "UserIdCollisionTests.h"
   25.16 +
   25.17 +using namespace std;
   25.18 +
   25.19 +UserIdCollisionTests::UserIdCollisionTests(string suitename, string test_home_dir) :
   25.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   25.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision"),
   25.22 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision)));                                                                  
   25.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision_different_usernames"),
   25.24 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision_different_usernames)));                                                                                                                                        
   25.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus"),
   25.26 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus)));                                                                                                                                                                                                              
   25.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames"),
   25.28 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames)));
   25.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::real_followed_by_explicit_tofu"),
   25.30 +                                                                      static_cast<Func>(&UserIdCollisionTests::real_followed_by_explicit_tofu)));
   25.31 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_normal"),
   25.32 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_normal)));                                                                  
   25.33 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set"),
   25.34 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set)));                                                                  
   25.35 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set_2"),
   25.36 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set_2)));                                                                                                                                        
   25.37 +}
   25.38 +
   25.39 +void UserIdCollisionTests::setup() {
   25.40 +    EngineTestIndividualSuite::setup();
   25.41 +    user_alice = new_identity(alice_email, alice_keyid, PEP_OWN_USERID, "Alice from Mel's Diner");
   25.42 +    slurp_and_import_key(session, alice_keyfile);    
   25.43 +    
   25.44 +    real_alex = new_identity(alex_email, alex_keyid, "AlexID", "Alexander the Mediocre");
   25.45 +    
   25.46 +    tofu_alex = new_identity(alex_email, alex_keyid, NULL, NULL);
   25.47 +
   25.48 +    real_alex_0 = new_identity(alex_email, alex_keyid, "Alex0", "Alexander the Mediocre");
   25.49 +    
   25.50 +    tofu_alex_0 = new_identity(alex_email, alex_keyid, NULL, NULL);
   25.51 +    
   25.52 +    real_alex_1 = new_identity(alex1_email, alex_keyid, "Alex1", NULL);
   25.53 +    
   25.54 +    tofu_alex_1 = new_identity(alex1_email, alex1_keyid, NULL, NULL);
   25.55 +
   25.56 +    real_alex_2 = new_identity(alex2_email, alex1_keyid, "Alex2", NULL);
   25.57 +
   25.58 +    tofu_alex_2 = new_identity(alex2_email, alex2_keyid, NULL, NULL);
   25.59 +
   25.60 +    real_alex_3 = new_identity(alex3_email, alex2_keyid, "Alex3", NULL);
   25.61 +
   25.62 +    tofu_alex_3 = new_identity(alex3_email, alex3_keyid, NULL, NULL);
   25.63 +
   25.64 +    real_alex_4 = new_identity(alex4_email, alex3_keyid, "Alex4", NULL);
   25.65 +
   25.66 +    tofu_alex_4 = new_identity(alex4_email, alex4_keyid, NULL, NULL);
   25.67 +
   25.68 +    real_alex_5 = new_identity(alex5_email, alex4_keyid, "Alex5", NULL);
   25.69 +
   25.70 +    tofu_alex_5 = new_identity(alex5_email, alex5_keyid, NULL, NULL);
   25.71 +
   25.72 +    real_alex_6a = new_identity(alex6_email, alex5_keyid, "Alex6", NULL);
   25.73 +
   25.74 +    tofu_alex_6a = new_identity(alex6_email, alex6a_keyid, NULL, NULL);
   25.75 +
   25.76 +    real_alex_6b = new_identity(alex6_email, alex6a_keyid, "Alex6", NULL);
   25.77 +
   25.78 +    tofu_alex_6b = new_identity(alex6_email, alex6b_keyid, NULL, NULL);
   25.79 +
   25.80 +    real_alex_6c = new_identity(alex6_email, alex6b_keyid, "Alex6", NULL);
   25.81 +
   25.82 +    tofu_alex_6c = new_identity(alex6_email, alex6c_keyid, NULL, NULL);
   25.83 +
   25.84 +    real_alex_6d = new_identity(alex6_email, alex6c_keyid, "Alex6", NULL);
   25.85 +
   25.86 +    tofu_alex_6d = new_identity(alex6_email, alex6d_keyid, NULL, NULL);
   25.87 +}
   25.88 +
   25.89 +void UserIdCollisionTests::tear_down() {
   25.90 +    free_identity(real_alex);
   25.91 +    free_identity(real_alex_0);
   25.92 +    free_identity(real_alex_1);
   25.93 +    free_identity(real_alex_2);
   25.94 +    free_identity(real_alex_3);
   25.95 +    free_identity(real_alex_4);
   25.96 +    free_identity(real_alex_5);
   25.97 +    free_identity(real_alex_6a);
   25.98 +    free_identity(real_alex_6b);
   25.99 +    free_identity(real_alex_6c);
  25.100 +    free_identity(real_alex_6d);
  25.101 +    free_identity(tofu_alex);
  25.102 +    free_identity(tofu_alex_0);
  25.103 +    free_identity(tofu_alex_1);
  25.104 +    free_identity(tofu_alex_2);
  25.105 +    free_identity(tofu_alex_3);
  25.106 +    free_identity(tofu_alex_4);
  25.107 +    free_identity(tofu_alex_5);
  25.108 +    free_identity(tofu_alex_6a);
  25.109 +    free_identity(tofu_alex_6b);
  25.110 +    free_identity(tofu_alex_6c);
  25.111 +    free_identity(tofu_alex_6d);
  25.112 +    EngineTestIndividualSuite::tear_down();    
  25.113 +}
  25.114 +
  25.115 +void UserIdCollisionTests::simple_tofu_collision() {
  25.116 +    slurp_and_import_key(session,alex_keyfile);
  25.117 +    tofu_alex->username = strdup("Alexander the Mediocre");
  25.118 +    PEP_STATUS status = update_identity(session, tofu_alex);
  25.119 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.120 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  25.121 +    string tofu_id = string("TOFU_") + alex_email;
  25.122 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  25.123 +    status = update_identity(session, real_alex);
  25.124 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.125 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  25.126 +    bool tofu_still_exists = false;
  25.127 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  25.128 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.129 +    TEST_ASSERT(!tofu_still_exists);    
  25.130 +}
  25.131 +
  25.132 +void UserIdCollisionTests::simple_tofu_collision_different_usernames() {
  25.133 +    slurp_and_import_key(session,alex_keyfile);
  25.134 +    tofu_alex->username = strdup("Alexander Hamilton");
  25.135 +    PEP_STATUS status = update_identity(session, tofu_alex);
  25.136 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.137 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  25.138 +    string tofu_id = string("TOFU_") + alex_email;
  25.139 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  25.140 +    status = update_identity(session, real_alex);
  25.141 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.142 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  25.143 +    bool tofu_still_exists = false;
  25.144 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  25.145 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.146 +    // SHOULD still exist, because we don't replace when usernames differ
  25.147 +    TEST_ASSERT(tofu_still_exists);    
  25.148 +}
  25.149 +
  25.150 +void UserIdCollisionTests::tofu_collision_two_tofus() {
  25.151 +    slurp_and_import_key(session,alex6a_keyfile);
  25.152 +    
  25.153 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  25.154 +    tofu_alex_6b->username = strdup("Alexander Hamilton");
  25.155 +
  25.156 +    tofu_alex_6a->lang[0] = 'j';
  25.157 +    tofu_alex_6a->lang[1] = 'p';
  25.158 +    
  25.159 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  25.160 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.161 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  25.162 +    string tofu_id = string("TOFU_") + alex6_email;
  25.163 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  25.164 +
  25.165 +    // Ok, NOW we put in an explicit TOFU
  25.166 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  25.167 +    status = update_identity(session, tofu_alex_6b);
  25.168 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.169 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  25.170 +    bool tofu_still_exists = false;
  25.171 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  25.172 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.173 +    // SHOULD still exist, because we don't replace when usernames differ
  25.174 +    TEST_ASSERT(tofu_still_exists);    
  25.175 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  25.176 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  25.177 +}
  25.178 +
  25.179 +void UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames() {
  25.180 +    slurp_and_import_key(session,alex6a_keyfile);
  25.181 +    
  25.182 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  25.183 +    tofu_alex_6b->username = strdup("Alexander the Not-Cool-At-All");
  25.184 +
  25.185 +    tofu_alex_6a->lang[0] = 'j';
  25.186 +    tofu_alex_6a->lang[1] = 'p';
  25.187 +    
  25.188 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  25.189 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.190 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  25.191 +    string tofu_id = string("TOFU_") + alex6_email;
  25.192 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  25.193 +
  25.194 +    // Ok, NOW we put in an explicit TOFU
  25.195 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  25.196 +    status = update_identity(session, tofu_alex_6b);
  25.197 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.198 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  25.199 +    bool tofu_still_exists = false;
  25.200 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  25.201 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.202 +    // SHOULD still exist, because we don't replace when usernames differ
  25.203 +    TEST_ASSERT(tofu_still_exists);    
  25.204 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  25.205 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  25.206 +    TEST_ASSERT(strcmp(tofu_alex_6b->username,"Alexander the Not-Cool-At-All") == 0);    
  25.207 +}
  25.208 +
  25.209 +void UserIdCollisionTests::real_followed_by_explicit_tofu() {
  25.210 +    slurp_and_import_key(session,alex_keyfile);
  25.211 +    real_alex->username = strdup("Alexander the Mediocre");
  25.212 +    PEP_STATUS status = update_identity(session, real_alex);
  25.213 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.214 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  25.215 +    string tofu_id = string("TOFU_") + alex_email;
  25.216 +    tofu_alex->username = strdup(real_alex->username);
  25.217 +    tofu_alex->user_id = strdup(tofu_id.c_str());
  25.218 +    status = update_identity(session, tofu_alex);
  25.219 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.220 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, "AlexID") == 0, tofu_alex->user_id);
  25.221 +    bool tofu_still_exists = false;
  25.222 +    free(tofu_alex->user_id);
  25.223 +    tofu_alex->user_id = strdup(tofu_id.c_str());    
  25.224 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  25.225 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.226 +    TEST_ASSERT(!tofu_still_exists);    
  25.227 +}
  25.228 +
  25.229 +void UserIdCollisionTests::merge_records_normal() {
  25.230 +    // Tofu 6a has lots of stuff.
  25.231 +    slurp_and_import_key(session,alex6a_keyfile);    
  25.232 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  25.233 +    tofu_alex_6a->lang[0] = 'e';
  25.234 +    tofu_alex_6a->lang[1] = 's';
  25.235 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  25.236 +    slurp_and_import_key(session,alex6c_keyfile);
  25.237 +    free(tofu_alex_6a->fpr);
  25.238 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  25.239 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;    
  25.240 +    status = set_identity(session, tofu_alex_6a);
  25.241 +    slurp_and_import_key(session,alex6d_keyfile);
  25.242 +    free(tofu_alex_6a->fpr);
  25.243 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  25.244 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed; // ???
  25.245 +    status = set_identity(session, tofu_alex_6a);
  25.246 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  25.247 +    status = update_identity(session, real_alex_6a);                        
  25.248 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.249 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  25.250 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed, tl_ct_string(real_alex_6a->comm_type));
  25.251 +    free(real_alex_6a->fpr);
  25.252 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  25.253 +    status = get_trust(session, real_alex_6a);
  25.254 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.255 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_OpenPGP, tl_ct_string(real_alex_6a->comm_type));    
  25.256 +}
  25.257 +
  25.258 +void UserIdCollisionTests::merge_records_set() {
  25.259 +    // Tofu 6a has lots of stuff.
  25.260 +    slurp_and_import_key(session,alex6a_keyfile);    
  25.261 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  25.262 +    tofu_alex_6a->lang[0] = 'e';
  25.263 +    tofu_alex_6a->lang[1] = 's';
  25.264 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  25.265 +    slurp_and_import_key(session,alex6b_keyfile);        
  25.266 +    slurp_and_import_key(session,alex6c_keyfile);
  25.267 +    free(tofu_alex_6a->fpr);
  25.268 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  25.269 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed;    
  25.270 +    status = set_identity(session, tofu_alex_6a);
  25.271 +    status = set_as_pEp_user(session, tofu_alex_6a);     
  25.272 +    slurp_and_import_key(session,alex6d_keyfile);
  25.273 +    free(tofu_alex_6a->fpr);
  25.274 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  25.275 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  25.276 +    status = set_identity(session, tofu_alex_6a);    
  25.277 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  25.278 +    free(real_alex_6a->fpr);
  25.279 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  25.280 +    status = set_person(session, real_alex_6a, true); // NOT identit
  25.281 +    TEST_ASSERT(status == PEP_STATUS_OK);   
  25.282 +    status = update_identity(session, real_alex_6a);
  25.283 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.284 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  25.285 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  25.286 +    bool pEp_peep = false;
  25.287 +    status = is_pEp_user(session, real_alex_6a, &pEp_peep);
  25.288 +    TEST_ASSERT(pEp_peep);
  25.289 +    free(real_alex_6a->fpr);
  25.290 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  25.291 +    status = get_trust(session, real_alex_6a);
  25.292 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  25.293 +    free(real_alex_6a->fpr);
  25.294 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  25.295 +    status = get_trust(session, real_alex_6a);
  25.296 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  25.297 +}
  25.298 +
  25.299 +void UserIdCollisionTests::merge_records_set_2() {
  25.300 +    // Tofu 6a has lots of stuff.
  25.301 +    slurp_and_import_key(session,alex6a_keyfile);    
  25.302 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  25.303 +    tofu_alex_6a->lang[0] = 'e';
  25.304 +    tofu_alex_6a->lang[1] = 's';
  25.305 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  25.306 +    slurp_and_import_key(session,alex6b_keyfile);        
  25.307 +    slurp_and_import_key(session,alex6c_keyfile);
  25.308 +    free(tofu_alex_6a->fpr);
  25.309 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  25.310 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP_unconfirmed;    
  25.311 +    status = set_identity(session, tofu_alex_6a);
  25.312 +    slurp_and_import_key(session,alex6d_keyfile);
  25.313 +    free(tofu_alex_6a->fpr);
  25.314 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  25.315 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  25.316 +    status = set_identity(session, tofu_alex_6a);    
  25.317 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  25.318 +    free(real_alex_6a->fpr);
  25.319 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  25.320 +    status = set_person(session, real_alex_6a, true); // NOT identity   
  25.321 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.322 +    status = set_as_pEp_user(session, real_alex_6a);     
  25.323 +    TEST_ASSERT(status == PEP_STATUS_OK);    
  25.324 +    status = update_identity(session, real_alex_6a);
  25.325 +    TEST_ASSERT(status == PEP_STATUS_OK);
  25.326 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  25.327 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  25.328 +    bool pEp_peep = false;
  25.329 +    status = is_pEp_user(session, real_alex_6a, &pEp_peep);
  25.330 +    TEST_ASSERT(pEp_peep);
  25.331 +    free(real_alex_6a->fpr);
  25.332 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  25.333 +    status = get_trust(session, real_alex_6a);
  25.334 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  25.335 +    free(real_alex_6a->fpr);
  25.336 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  25.337 +    status = get_trust(session, real_alex_6a);
  25.338 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  25.339 +}
    26.1 --- a/test/src/util/test_util.cc	Fri Oct 05 11:19:25 2018 +0200
    26.2 +++ b/test/src/util/test_util.cc	Fri Oct 05 11:53:18 2018 +0200
    26.3 @@ -378,14 +378,19 @@
    26.4      }
    26.5  }
    26.6  
    26.7 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename) {
    26.8 +    std::string keyfile = slurp(key_filename);
    26.9 +    if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   26.10 +        return false;
   26.11 +    return true;
   26.12 +}
   26.13 +
   26.14  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename) {
   26.15 +    bool ok = true;
   26.16      message = slurp(message_fname);
   26.17 -    if (key_filename) {
   26.18 -        std::string keyfile = slurp(key_filename);
   26.19 -        if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   26.20 -            return false;
   26.21 -    }
   26.22 -    return true;
   26.23 +    if (key_filename)
   26.24 +        ok = slurp_and_import_key(session, key_filename);
   26.25 +    return ok;
   26.26  }
   26.27  
   26.28  
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/test/test_keys/priv/notfound-alt-pub_and_private.asc	Fri Oct 05 11:53:18 2018 +0200
    27.3 @@ -0,0 +1,89 @@
    27.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    27.5 +
    27.6 +lQOYBFuzOgEBCADJ+VeIS1gXMoom03AGEy0k/kRY/R8nF0ol/zCzdl6WeDsXLg+c
    27.7 +dEBCnpV/TILCt7071RaFOCWCoDo140/IlarhReCqDj5tFDlUFWhBH88XEa/S4iDw
    27.8 +bAt3B/bblYw1nwjpbJacFf8h3G9oqgqkXoDMKHvEMY7N2FKkGxpuTwy9PV4xGy0j
    27.9 +ZourltdnJpkCb6o/cDnfD/BazWqV93SutAWgtE+dsG8XuiE9+Sm5Hq6PEgUXjYQm
   27.10 +tiu0q+vNCquN8jXZAXX42f5jFFtnfbamCDNCcKPBIjMaU0C1HJX5jWUnt1EUeIlZ
   27.11 +w1HAFOnod4ekX09fxc8OUPXjMlaLIg64ea1hABEBAAEAB/0bgSvhKOeCYzTKlEUf
   27.12 +YqmlbcXne3LsWyDTG1Upv08ivRVI8xIXq4IbwGZZ61SsSSLJPNvAARUknIbI01+I
   27.13 +UI9wdZhieCWaq6Qh9fdYVQlZ2iQAOyCitQf7qfc9UHiDTdjEFvBMqbcwiIkYbv2b
   27.14 +hC4Uf1fZcClDEXgxlmpLRtMUiwJxWB3I29SBvqwExTv3B3h7vRbBuuwmDqX6wbf+
   27.15 +VQDBA33dojZT0MbWmE10wVnEklHg5t1HrtvshltHbiIO5KFSOTPqhlE08NOxQucp
   27.16 +f59olj3650dAZLVJoGR/9Vi7AZvHcZwL4l17sT/dLKtNb+enpBOwLp77ZMQnW/dS
   27.17 +2CoFBADPeuAt5hda9NSgffLsFgOdBKB4Ye3zuC9vWYKRFk4NS5zOkM2cx8AXygd9
   27.18 +si6TxtHweSKksr1wUgOt4N2JHXM8HrcggiSPDpNOy5nAMMjXMyK/yoCGIwnlDPk7
   27.19 +LXl7NEEHWaPqe3/iqkY/88xbY249FegsulAv/bSX1pNhE6b8DQQA+TTXVkSvYTPY
   27.20 +fMmZT7wvI+fj8Ugw13QtCTcdmlAMrGXAFcZT3+LuMW2Zy9YYGNV8T9EaUKWglQYD
   27.21 +ZiMJmiq3UdJBYV5KrgFIal4+x4MHf+i74rYifDDK4kUJMrrBw4wH+0qI6KFIfksa
   27.22 +aQfzYQeaYLPu/jQgPCd1OW8+2hTK3aUEAOPp+8f9Ylvu4HGqLhLMl3I9doOZUOIc
   27.23 +/jLhq0W0AYiu3Kd8eQJvLhSPI1/XvbrUD6qFGWlP1T5VknRa1nRLt+ffwZuFe74k
   27.24 +IVzPWT1qxtfqgmOhJwQpTfLltRqHvY5uQiQ0NwnD2u3vxMzpaqU5YNP9bYjCfvIx
   27.25 +fVo4RYhR3p54PW60LkVOR0lORS00NjMgPGNsYXVkaW8rZW5naW5lLTQ2M0BwZXAu
   27.26 +Zm91bmRhdGlvbj6JAVMEEwEKAD4WIQSgObxg5D4N/dyd6GY7SMODJSEMiAUCW7M6
   27.27 +AQIbAwUJA8JnAAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRA7SMODJSEMiLWD
   27.28 +B/dymMl7+CD+e8usiFv7lc93q1nCpyF55Xi37B6VsWbV0apASSv5Sb16PSFAwym2
   27.29 +TaiVDY6XGM2MAVo54QsfAyPwUYyDnExAiV/h7htufnPJ+fCzIQU4VJacnOM5p7AE
   27.30 +1ki0ntuIgG+RhMUm8QUfdw21mXeBG67Ghc9q/L85Wi9fmJ/4StuMHOP97mt9Q5xs
   27.31 +5Jw+8fdIokBDt04c85v8zIZPUjf8VhvGjNmlVfhF5cxwURx+KBjjm/tBVkGvQcQ2
   27.32 +6MZ5SkGwRpoyd6ySUWn2Kh7BQjgo1TEYNkuQ4RZqyVSGmAsZT79G8DCYXAi+CXsZ
   27.33 +GUwV+wlkvxfg5yJzFoKUK9udA5gEW7M6AQEIALD1ORZlN+PC5nL/GuWw6RoGbhy8
   27.34 +eGHYrQUVDsbrdQO4HEGZlWDyoJ/rVxD/jfeyw7mBymSUlYZgtJ7or2holybsQs7+
   27.35 +fcuBnervRk8SN/RR995oZb5QFTobTLry1OkJ09/DQ9X6jNXSlGTCzpgglqcoQNWT
   27.36 +s2TJgOXObUG+wBIqj1aiArc1y8lFVKutSKmeDVoLJMQwkSKzD7KLu42TMia04dP+
   27.37 +29XaiWtqxDqglt+49w061v48Nnow+WdCw2GYaEra28/Fp1QOqYRCxpGdzTD23CSK
   27.38 +AhThScJ6svovGyjlqKFekoPUMKAa0inAU9AstIbok+tlXdtVzqulGwTrjl0AEQEA
   27.39 +AQAH/jYhdWqX4N5fvt3bko9DrDKlV+abcpm/zcF5vRD1ctCF78LTZ+IFpkP1Gied
   27.40 +fQCR4xRqkw5sc0btayMXG50tLVufNxqZt8JaboOw2QmUEaC/uDqFJeZvGecx9alU
   27.41 +YfO9aV4QHb6li5JW/cTK4KahhWQxyI9sxJoml7L0j/BmGNwVPYOwTcqY7Tyu9skM
   27.42 +ucy5qGVKwBYAr8onG3QGjtF9DVeHZfxjTxXP6O4CMKXEreNqn6x7E8LhCnoWFBJh
   27.43 +xTSGFBOa7X6CQoAeivT1gRKy5KCswiEF+IZ3hM/rfcjVJHWBarONd467CNs3wOWW
   27.44 +qXr3xGrVyGofJ/eDLkGo3AEJDTMEAM2p2gANfNb1Y7Swgn6m8ySlJzaghuFezyjj
   27.45 +kMD42He/+Xwo+/I7TQ+UGfAR9omn1yk807A+XYSmcOAsKc+UZrXfv5av24g1TKAk
   27.46 +IkqJHuf5RJaIqbz7ChyBOtQPvO0d2pim5ug3WupOdLsIL4SpBewKaTh792pB9YQL
   27.47 +4whsLcv3BADcRMfwv5Z3s98g/I8T4JEWUg0dLfboThJ6RV/PZlUb94l69TFp4uSU
   27.48 +x50oT7+Ar9PR7LDhX1cQO1FvP3Q1rtMAjbzhuE+aHoImI5/rRgogFbsCRVQNSrjn
   27.49 +F7s+ChIvvvnSGnQMzSv0BYVffHC2NKo/lnZJmohaCqqyawFOVABbSwP9HNlKNtz2
   27.50 +yLk+7DxweukmfuW03DwbnrfbaH3AjMnxTkujgocC91r0+/wLm7KFy5Lon8XEw0uN
   27.51 +pFmVBa5MxDpTOni8ISJZKyRNa+fxmGka3MOAT+7R4hX8dwsE4oKMCwhYbjn76KIZ
   27.52 +dp3SibJMrXif/7pcOnLRwu3Cxr45ZNnBsgpJqYkBPAQYAQoAJhYhBKA5vGDkPg39
   27.53 +3J3oZjtIw4MlIQyIBQJbszoBAhsMBQkDwmcAAAoJEDtIw4MlIQyIClQH+gLknqQN
   27.54 +MbN/JL3Z+QUeHPBqAQzMhhiTR3gxIxPTLub6DBLmpIiQdPHlIJmy3fR6y8yvX/rt
   27.55 +9OJRV1cyPQOLYO9DzgIkizWbwgd51MbQcf9ecuwNrCUDx+86EK5cltjTG/+tSsza
   27.56 +hKAszDQeOJrSVGRL9j96+11AWCN2LFjzqc5Qs6+4aV7mON1hnzTUaTZtAEG5Froa
   27.57 +Ua3DgJo0b+WnFbmBMnhWjnHz2hZSuGqcT3qQnrqGLqTK+ePNQP+wGJ3ZQXMTheEa
   27.58 +AAMxbDtM1HAOkyBNwp2IriAzUUGGwmpRBT7H87iIRdml1KdKtH6qoFvcm6JJrLrm
   27.59 +aDJQe+sFsMLZLxM=
   27.60 +=KOJN
   27.61 +-----END PGP PRIVATE KEY BLOCK-----
   27.62 +-----BEGIN PGP PUBLIC KEY BLOCK-----
   27.63 +
   27.64 +mQENBFuzOgEBCADJ+VeIS1gXMoom03AGEy0k/kRY/R8nF0ol/zCzdl6WeDsXLg+c
   27.65 +dEBCnpV/TILCt7071RaFOCWCoDo140/IlarhReCqDj5tFDlUFWhBH88XEa/S4iDw
   27.66 +bAt3B/bblYw1nwjpbJacFf8h3G9oqgqkXoDMKHvEMY7N2FKkGxpuTwy9PV4xGy0j
   27.67 +ZourltdnJpkCb6o/cDnfD/BazWqV93SutAWgtE+dsG8XuiE9+Sm5Hq6PEgUXjYQm
   27.68 +tiu0q+vNCquN8jXZAXX42f5jFFtnfbamCDNCcKPBIjMaU0C1HJX5jWUnt1EUeIlZ
   27.69 +w1HAFOnod4ekX09fxc8OUPXjMlaLIg64ea1hABEBAAG0LkVOR0lORS00NjMgPGNs
   27.70 +YXVkaW8rZW5naW5lLTQ2M0BwZXAuZm91bmRhdGlvbj6JAVMEEwEKAD4WIQSgObxg
   27.71 +5D4N/dyd6GY7SMODJSEMiAUCW7M6AQIbAwUJA8JnAAULCQgHAwUVCgkICwUWAgMB
   27.72 +AAIeAQIXgAAKCRA7SMODJSEMiLWDB/dymMl7+CD+e8usiFv7lc93q1nCpyF55Xi3
   27.73 +7B6VsWbV0apASSv5Sb16PSFAwym2TaiVDY6XGM2MAVo54QsfAyPwUYyDnExAiV/h
   27.74 +7htufnPJ+fCzIQU4VJacnOM5p7AE1ki0ntuIgG+RhMUm8QUfdw21mXeBG67Ghc9q
   27.75 +/L85Wi9fmJ/4StuMHOP97mt9Q5xs5Jw+8fdIokBDt04c85v8zIZPUjf8VhvGjNml
   27.76 +VfhF5cxwURx+KBjjm/tBVkGvQcQ26MZ5SkGwRpoyd6ySUWn2Kh7BQjgo1TEYNkuQ
   27.77 +4RZqyVSGmAsZT79G8DCYXAi+CXsZGUwV+wlkvxfg5yJzFoKUK9u5AQ0EW7M6AQEI
   27.78 +ALD1ORZlN+PC5nL/GuWw6RoGbhy8eGHYrQUVDsbrdQO4HEGZlWDyoJ/rVxD/jfey
   27.79 +w7mBymSUlYZgtJ7or2holybsQs7+fcuBnervRk8SN/RR995oZb5QFTobTLry1OkJ
   27.80 +09/DQ9X6jNXSlGTCzpgglqcoQNWTs2TJgOXObUG+wBIqj1aiArc1y8lFVKutSKme
   27.81 +DVoLJMQwkSKzD7KLu42TMia04dP+29XaiWtqxDqglt+49w061v48Nnow+WdCw2GY
   27.82 +aEra28/Fp1QOqYRCxpGdzTD23CSKAhThScJ6svovGyjlqKFekoPUMKAa0inAU9As
   27.83 +tIbok+tlXdtVzqulGwTrjl0AEQEAAYkBPAQYAQoAJhYhBKA5vGDkPg393J3oZjtI
   27.84 +w4MlIQyIBQJbszoBAhsMBQkDwmcAAAoJEDtIw4MlIQyIClQH+gLknqQNMbN/JL3Z
   27.85 ++QUeHPBqAQzMhhiTR3gxIxPTLub6DBLmpIiQdPHlIJmy3fR6y8yvX/rt9OJRV1cy
   27.86 +PQOLYO9DzgIkizWbwgd51MbQcf9ecuwNrCUDx+86EK5cltjTG/+tSszahKAszDQe
   27.87 +OJrSVGRL9j96+11AWCN2LFjzqc5Qs6+4aV7mON1hnzTUaTZtAEG5FroaUa3DgJo0
   27.88 +b+WnFbmBMnhWjnHz2hZSuGqcT3qQnrqGLqTK+ePNQP+wGJ3ZQXMTheEaAAMxbDtM
   27.89 +1HAOkyBNwp2IriAzUUGGwmpRBT7H87iIRdml1KdKtH6qoFvcm6JJrLrmaDJQe+sF
   27.90 +sMLZLxM=
   27.91 +=6D5O
   27.92 +-----END PGP PUBLIC KEY BLOCK-----
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/test/test_keys/priv/pep.test.alexander0-0x3B7302DB_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    28.3 @@ -0,0 +1,82 @@
    28.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    28.5 +
    28.6 +lQVYBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    28.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    28.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    28.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   28.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   28.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   28.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   28.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   28.14 +WuW5oqY0+BRGOL0AEQEAAQAL/R6Xe6O4dbKUkpjneEdW+HDDtxzmbtlo/0dxcVHd
   28.15 +oQ+Ont4Hm8SUnGF/Zh0zbmpGiU9Oxe6MZrefmK9YbgdpZFfYPoWMKJT71npD/0ZM
   28.16 +d075rZlvGdTUgA9yRv//vIJnOvHzBH9/SrL4qT8GlpzpwLog7xLEqHq0UI4XAS1R
   28.17 +q592Fx35IQgxJNmQOJK31+VbxtpJ6FN9fqjGBaRRa5PuqicBEDKwa63JDg4LzKOz
   28.18 +rv1ARn0DyYiagVD8gydX0FlTdqn/RHmDRpSvV7oD2PdbbzTaOyI79FGvGze0OUiC
   28.19 +rTkkyzalW0LrnzXnE41iXhZdCiWZg7XMra741zmiDBRoMEOm2laIjgK9w7nLNRBh
   28.20 +uC37CYlu5doB7xQEr0FtbFTn4B8rPxHjmRUavqTXYkllsoaESGvlL7twKHmMUSbl
   28.21 +8MpUb7MaOZmCmZc8x4ufJlwFtEiwncSKVCGqqPlHNCwaNwEzzE1bzYjg8lWp5/+A
   28.22 +7LSs9TIZ1oV8HORVokc6oh6puwYAwTxs4frgbKJe3o0zz+xdqHfv2gSRnMjoKWi5
   28.23 +6hib/kEbC4T1T27UyJdNahAb7GODRKW8RZlkvXzu1l5i82pfR4a/4AA0yH3JKcq+
   28.24 +iTCYBDpEmJ4MTmdiOiYGIKupX5nqeDM13TZ90Al1HeyEzvS/uQAnmS5jj8N+GuTy
   28.25 +7gRRnddWb078B+1FFu3nADKr6OHkWgFBo/0GxcGcrmDgfpFLHPBM7OdNqS0Y4+O+
   28.26 +yQkPmSxeX8DjHtMnngiv5r7qcmCbBgDu6RkDWcqncdOisIjcpweeyQ0yPg28zall
   28.27 +xh6VwzCbHK6t0yV6J23+imvcbcv/fsg687u/CDSZx1z5XT80ZOyw8+6szG0azuGu
   28.28 +Io4C4jxrtFTdLN2UkTubsYvMED8YrsZSlxyBG3ycK3mO5RSdUDkQjduLvHJhahfW
   28.29 +Wcpsmdz80v1zXNcWlOwtQiJDdJvgG+4N3PJfmMrXwLhi40Jeo3SU/o2I/xREVsvu
   28.30 +wzVeQLcGPG1aUSwC70YVAO9phge6xYcF/1tqi80q6M28HuN20iiIYLZuM9YUz1Go
   28.31 +VQVhmY5vjWnbrKC9WjWAVlGia7LSZBlBi+JfCUKYMn8TnCnveOIf4ToBPJ/Ah1ty
   28.32 +GOh/ruBlBQJOBGMpj9RF76rWdOBbjbxsC6GQtpK6jQ3z6X85pxKKdp/AJsTU6XG7
   28.33 +Bf5TLo38QVhxN73MbDUlNo484Fux6U25IArUFZ4R9IInq6YJLIJ4dBWnAADwNC2L
   28.34 +cLagmoAWoXaLi5zku0EtQt493DWUhV3x8OKGtDRBbGV4IEFsdGVybmF0ZSAwIDxw
   28.35 +ZXAudGVzdC5hbGV4YW5kZXIwQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEE9FmK
   28.36 +F9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   28.37 +F4AACgkQRPBOljtzAttDxAv/bjfjnSS1/qJfRoug2i0t1Mx23AgZZZ1z1z5siG7n
   28.38 +zcRl7C2HGBauCovCbVN2Q4XHDFwm8a+LRfYCuIuWUZIMNOm+TFHDUtzbPABISzzd
   28.39 +6M0bisxLYruZdrsKh/ZB3PWYPl7Q+smttsfQe6EFaIVi4iFpr8qLMiVkE3CnsENj
   28.40 +V+JskEa8AWTDgW9YHYAP/DQ9KYcdIFGf6InPn3UUjOi6Ncyq1V7aiDELTt9WEycY
   28.41 +QgVYrFeRHNe7LSKtckn+MUgAjWi2XbsdUi/mum6GgfK6PFmq5b4C2+pwryNiapqo
   28.42 +Tpw8mFkS9u0U1nHcgxB0x5xltstkerK5EJtFROEDmN2hTeZxVar0QoTHQV5su2Ah
   28.43 +02Fxf4hFMxEMx9dDv3W/wXSGJl/CbZ1piiQTKGxjKzxqluRpbABFwnqtE+yO7l83
   28.44 +uKNwX42cc782SwPfmafaFYGeXiA4l03TvMvP1YDIFdN93CiTCYXtL+rlKeEjVfhT
   28.45 +0cpvn76ZE/T6R/FnapbSKBmInQVYBFu2SaMBDADjDIr65ms2y1ZoexVjdn5+lgaH
   28.46 +CAYitjm0c/6yDdXJ++B+EicxucC3u/luA5/BItn0t02oZkr5zrgvFva89cUKCqzg
   28.47 +6jKzEIaKKT58oE2VYKsvynvtMPdnYqOgkFmuH6Cv4pRjpO8ygOEqThQ8KNMCzzHb
   28.48 +xSiXO4VO3lNI0TfXAmN+JAyhCC/1WnzEqEvFFRr5LEjVmhq0we+ciQR29kg57aa1
   28.49 +Shku8ucusbSra2BlnygmRlyMBGg3AsxG00q+AcgNsqHB9z2sByG1UsWTdmY6qLJ7
   28.50 +PFr3PTdGXqJGE8CZ+Ev/pzwdWZ/bXHmpRT+vr3FPpu9rUjJadFTzCkgQRuLnzC5y
   28.51 +YjU9d6MA/fIJZV3UJnzmRaFguX5HDxrCc9JIWc1W2wi0BvVC6XIxJxdPlXRvk4FB
   28.52 +6xVfpUcEXkvxfOS2mYSV9ZxsTsGDdAdLfLnqhtfE7Uiv1lmSN77eNzxRyKUjywdY
   28.53 +9mvyJyy0KYwYhabz7HQLDSzMApnU6nOfqt7j7Z0AEQEAAQAL/iZVEUe/zB0RolJ8
   28.54 +aUWEFWIYwRxeCe8lVcO2C6uS82Oo/yM5vF1ET5mVhkyBFyEb2bFbmyRRtNnNAUKN
   28.55 +/XU0hyIlYD+OuqWJpjVANlkDFWYhTnWAmYCXkkVlnVt303Q2ycG4HrZd+7ZKlPk3
   28.56 ++mmXuNxSD8hbVnmF5oFEvsnd7LADqrl6q5kqUTJ6pvLquPQalpW32MobPOQElAgZ
   28.57 +B+RvuwzwpwMXcf3/q3EyNl70f29YugYQPgKzocab1dIlTQqcMRFSQPw4Y3Dyzzv1
   28.58 +3nGWE27Q89WBXW2n7uKO0mpzEjL19LxVqMmL7LMR3RUiVJ5c8r1fDbu+PbvVTSn1
   28.59 +9XRcLzr0A7nJXGOdym4bb9ZxoqGmqilPwaoxBBiFPOftoCFqkMr9iZGdbj1eGXzw
   28.60 +9jYdKkWAEk4oDn/otoPWWSgxMfMJGJgrLrTuO/q+dDmdNRWfBTJmkPTU1NS9nqeQ
   28.61 +lchugRpMYmIKD0m5NeXSQBBGIAeCWQqu6CHQkbMbVw8YRpRyzwYA6ktbzaOqgX+8
   28.62 +lxRyNbn7PW4h10KlB0X0mqwao2xj9R21/+YjTAFGJ6hj5pTiDZzl3PcDbepHySRy
   28.63 +ZRZkcllD2Dy0YGv3xs3HRRmssSoafO5xooUVBlep8dhFmm0gDkpgdsqGxkrZOhdB
   28.64 +vqJjCf8TqjAcxTBz362HtHD6/COFyUr2OZW14muQvngpjZvUVD/Q9Re3DQBTebMS
   28.65 +iHzBY/C9ExvjfBlq+JsWWjyE8V2bNJaAZDqh/4av6H2YVW4Ko/EHBgD4FVlyrk2Y
   28.66 +xWvVTS6OXqGkMzQ1fcpGPE/h1VQdSsORhO2Q6ys65y5smhBYszejN1eCbNhW8mpO
   28.67 +PKWGQbxYj2HKaOFM/nwA5z1oz0CL5a1k9JqTfvSKWke0eSsVY3Z/XN8ryNDkVGC7
   28.68 +qaUXhX+22J8/tLlKdJRtoHD9+oz/hXGR8voC7pEIctPUEhz5RdzDop5uSzxX+yHE
   28.69 +GpSjZN1yQAi3VEDmylkHI+jut4ayCEKXOAvCftwV8IYy4GwhJme+VzsGAO9aUeuV
   28.70 +fH2cWhSJH+ibgYwHJWtUa84ocnD+h0Z3wR4QJ+pFgL4otRNUCM1vj9LO+l6J+GAQ
   28.71 +iFKlWwwXiwRvNuNnRZ1tDmqk1mjZyvBobhMybS+cdh8rTDFpMGFqqrT98BT8Hw6O
   28.72 +gEgkUrrBHelsSZJ1Nc4wMqyjpHNdkGLntHV97xSe8X9+xX6DEnj349hnCluRsh5/
   28.73 +BhChQksZCMg+cJnlwCGDYziaFZRYN3eqIB0hjkRsUKxj43pfcM9XG72MKdImiQG2
   28.74 +BBgBCAAgFiEE9FmKF9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwwACgkQRPBOljtz
   28.75 +Atu2nAv+Mfphzz5D9Hrq/MgUo2d5DIFg/BzRmlTu5ASEFJx9eeiPUtRMyJ5fd38E
   28.76 +zFlDysoYIc1QIj+Gw34zltTh9CxD0zsVN7gTWrlgZ5+t8vKWDigJYQecZscKnZbi
   28.77 +QzDIh/ODf3pZVLKMDvz6FDeHMV7YjHFaMmWzRLNTvob3/gzg58Tdb++SCo/eD75W
   28.78 +fDYevMtPQxmIVjcJtlcIk9J3XYl/dkhdOFk/rnDrIxptpsO+oLzB1zwf0GvRT43s
   28.79 ++mDm1lwAytqwScp8DS2oW9y3hOSYBx6buzjU47R0D5heE4Ch+hZf0bHuuisCWXmC
   28.80 +oazEUmn5cG0Ze9I2PJnCsRbcBriBrgdbcpKWTInWdHJiLeXhnyfzV00APgCgSeWm
   28.81 +ObVuREvVAqFnBdKf+VRy/tpfnsc5HUOIf3Z9NNrSA2wspKi9AnMDc/7YoiqOoXgg
   28.82 +hMBuLPQqL4CKRerNjEVbykI3OaeRU97oSK/SEPYApK5lHwYrJt6Ov5iwn1t/XADE
   28.83 +N5P4s0bz
   28.84 +=gdrs
   28.85 +-----END PGP PRIVATE KEY BLOCK-----
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/test/test_keys/priv/pep.test.alexander1-0x541260F6_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    29.3 @@ -0,0 +1,82 @@
    29.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    29.5 +
    29.6 +lQVYBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    29.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    29.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    29.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   29.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   29.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   29.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   29.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   29.14 +MtOUJwMpAelnOeMAEQEAAQAL+QEepQLmRpOv4WGZ0kvevMeSebI5++7suisAyoag
   29.15 +Qc1nKbrKwPPtt4kgjtvaK+7eZv7EOLnZGJE6MOA3x0oOy7kJYenAjI+ODEOn8BtK
   29.16 +zKcImE+0ORhK8h10dDyX3TOCtApmtXZ2s5upoWTTw5Oy8ghUMF4yxESb4oTgW3sq
   29.17 +Iozk/3bhKB4NksbipHvklCtgY/vxNhBusjkd+XJ4jXAGAWeRwmDIvtx8KSqypUlH
   29.18 +LfsPdI3CUEzZCx+n9bJZyaZvAAprH5VwPzQw5fGirKE/yiWivTTGBgawivXgNgIv
   29.19 +B1Ncvi94y8uU3GmhkPXKRYpooQXIs7XXypnhI9g07t8RODjRtzmRLNO63EaXxayC
   29.20 +3Y3+LkE6Ewz2yQxZ0RqD2HyoHIsWd5tnU18CgBIWygw8kH3MfjMlAhMjLpP4hgYP
   29.21 +td1p+9MbFGnDK+CL3Gf8R5B+HwH1dIrNG3PoHGWaK1RURGDzwgKXSztiOREeHH/T
   29.22 +GbsrjDsu3YcdQqOqG/4nCJwiAQYA0b6qJzZB1tEX1UeHnc5q/JgJwGr0Z1QjKsTl
   29.23 +ptGIhjiBE/0mB4Cak+u/Qz2jw1RcqWfZkyYWY329r4bWBuPEQ1mEh3wrn0CIGmln
   29.24 +nQkOfMAuNfg8hJPNo/x+Dt4o+XnWKzxnz5sHMEEY1d7q1qUyVfZQjQVgfsWleyt9
   29.25 +QU53CW1uxvrnY1tNlAO7K94+aHWCdYb+PPzHyk/0HNuSgcMgxLt5a7cOwM8LMg2V
   29.26 +aJ5XQS/BlM06anXgMloJO2muIQhjBgDrlcdzXTgSvLid5Ten8Jgl7qwn10RRXq7g
   29.27 +Ewg6/Fl4kIjkBjnUPu/oT4b9xd5nPAJaVXev59AoTaddg3mCD0khRhw47nxzwa9k
   29.28 +LOzBkxAFTqMopoq/uOchQSbyVPQ6gwq56CazsANF6O1BWx2a+51OhH20i4EQ9GcN
   29.29 +Ec9jMSgVqqhwKLIwPq1DmX50VTcavpwD4yV2GBaQCiqg20BRcxEZP1rMEiyJwSxU
   29.30 +rpDGhKJOHlWE2yZG5GqeJN3Wf7jWAIEF/02P9NIEDkQ24LbPJX1I73X7padnfNNq
   29.31 +WQv/zOKGdCAhKGY/M1ChdR8ZNTV4KMb3m19vxyPhx1kkx5cn5dPOxq/7z2nHY5Vb
   29.32 +XhzZFXdigtuXnEsTiXBsgeyUhKCwailCjrXi9mrT+zsHXAkBDOpnFWfDrlK6sLgM
   29.33 +TmHkCtpmiHzaSddsFYM689SI66pJByGJqu189A0YTeh3s0TCmCNoB+v1KFyIGQ4U
   29.34 +8krUdnS3kJu96UvjouikL1pZ2OppPrR0NtSrtDRBbGV4IEFsdGVybmF0ZSAxIDxw
   29.35 +ZXAudGVzdC5hbGV4YW5kZXIxQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWa9M
   29.36 +UUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   29.37 +F4AACgkQHAlzClQSYPZz8Qv+PqWjOm3/GKj5c/qUter1v3LKR0mk4VbpnDy0Hryy
   29.38 +e+WIxCFVC6Lc1nP561vUqY7h4ZFjGSdFAp9gVl06yB9aSL4xNtN7KJdtLRO0CvLF
   29.39 +AQkHVKhTn8Wfe/4TbtYHtbgbnxt2dCdQujsDDJUlDjGrMGhCLbVmfxPVyeSrvUBD
   29.40 +h9fjimo+gso2lbK1/sHinoiXenwoJmWBM2jkuWQBxxXae88MQB/SkFJnpfO8paGD
   29.41 +XkiziUhwhTxNSEksem7NCwANgHG/wVFDhOp9A+o/Q8mdbCKrD0PXL8MV0pCfGicN
   29.42 ++aagcTDGuqBfTZdCZXfjcE0x9oL+pcTNsIe1N3cGDudbD/w1J1iMTYUMznHsFH2z
   29.43 +lPaqfJcNq/4o5YpEjIRoPRzn4TIhp8eCwI77MVJ2qCmDiFMouoZvB6ocYXmwhTT9
   29.44 +/OXsmm1zM8IQXTjnwUL2PN4j3zA5FRyEQejTqTLe/audnYVHEsR8MeRIDoISdmcN
   29.45 +RAQrKDm0oIW7NAWSlpW0R/ZSnQVYBFu2SgMBDAC04ZaOl5gpPbW6uh+ET2oHSkOS
   29.46 +wB6HGwczm5bIn32LZ9fQOQK692a8lpg0Ru1FOhERsrSVOlkk3YFilzX9P6Nvg2Qk
   29.47 +LFBe4IFLym2RsBac8vqF+27p5yjyM7s+W6EfOl74LqCocQ85RRrvMbRp+GCDCy7S
   29.48 +WKQpEeQoZhUfvDADkMc+HxoSja9g5uFV3dTpf9w7QMGW8mF42Oq6Nb4YqiqMQCSG
   29.49 +Y0t73WC4pgvV7gQJOA3sGVdDIa4FAKFycCl8jk7wdyasfSxns2cq2jO4HgCQFife
   29.50 +t+g9x7U4esnbkyFUc+yMMKQJ5mG00V7Lf07GyaQuOOtJOjbou8iMsAqrGjq2uQ3u
   29.51 +Eu2eVMYMj4J3XQttUb3fObwP9G7Bi/kSZFjy39SxfI432jcVT5xmzIY6Iyy+LgKh
   29.52 +agMeUDgANs7A3prTfRbQxq48DjM24EYHWKzt8GdOk8THJAt93/G4l5oefmeuelI3
   29.53 +D8lBFZo/rum1mIKaY2ULnAJfyKw9I3vsT3GtXg0AEQEAAQAL/1gsthOJs6u7ANln
   29.54 +PNDnU5T9L0ac7+TFmLOgL5daJD2uX+aJvBp/Wu4o7UZiouyBu2totZ4fRPBzKEzy
   29.55 +0GdFO/syzkDR91Xg1DapldMUx1k4G0bwBCfyvyOeczMZQMhz0HLka/3gq16sIM6k
   29.56 +aMHVydpnu6nfexroNVQ6Oybuumsqiu3uBGwx9GHk+si8bDttUGL0FMrsGfbqqzYd
   29.57 +1663WSloZUW7psLZbnpku1VMg1wpHqRO0BqSEv4uSgV6xsaIqgF+7Sa9CUSbo9bb
   29.58 +pILyiuVyyn1p0USSOmg+YR78NEHO9eb1tKw5+wublRGlVTL1Gkr3QfEqIIR/lvlQ
   29.59 +4c5D0ZImC1ESF8h03aA1ZPO4+m2hIIBB+yQhTgUN+ou3nvQI8PnoVzOQnB0Pd9J8
   29.60 +iviNKzipbRi32mql7leF83i3nh81GLNwfINNots84YeCcclASWdNXKun5BPlvtN8
   29.61 +bNLwXt3ckLlNQ+M6RAMrNOuzRgfksVPUnw65oYYDISv9b1kvgwYAzJnJq39OaNE1
   29.62 +vDoqWTfZB91cAA2E/FvXmvNDKDYT929oUfjaafqT2fbNSA7qtWGq/DcpdLH0NwI/
   29.63 +4MAMmL0/bgIYYZQ47K/74LvVexREJ95MEvZUmZR0rFuqweQiRPREI6kciTcJNd5r
   29.64 +KeiQ1p6JxZA4afad0LVG8xnFYqEWKnBwiRHfjmz0SeH1pRVeaPR5/N9TOEvQDC6d
   29.65 +T8fCcBMfZmuzv1gS20WdqdcyGZhrGg8OCY//Qt+j1skdVj3w/3gfBgDiUluqE1iq
   29.66 +8U1j1/YeTwL/Cg9oLkRB8TZu7DJIgW0KS9LlqY6j9WCt18lTwfEiEzhqHVCqSEtL
   29.67 +m7y5zSZ8H6yfjV8Ib1yhCQePL4qJOV0pDEQl3tYBwpDARwOtriz2Ud5QlkJB0wxd
   29.68 +TtlTc9rfWy2sDLCV3K/4OfReePm4mpWMqT06Ow1Ne6F9DEAvpu+Q7VZ9seVHmnDi
   29.69 +rvjZb0UDh3ZOn9pETix/4MOnBmvPTIkN403+NonwedMKBCurclOpFFMF/14eWyGu
   29.70 +pp5MQGXN6h2a2OpL3fhLnGZuHALD1lT7Pt0uyfzd3JRaMMGgsga93PlYwSxhqLtZ
   29.71 +6beTIbGNxvMHY5zoy0o43bkFHBzzPajVkkIs2DqWYOrdQXq9rbbyQeshZtS8HXUo
   29.72 +Yb6tGOMlrtdRD2X10dtZpnkas1zMlnLLjEd6BfphizVZAgqRxnVOTPoYojvcqChu
   29.73 +leP7a/z0yKvHV1Mw7efN/4RRr0ePm8YhMNj9zAKsR9alGiF25eUhQ5cXyutKiQG2
   29.74 +BBgBCAAgFiEEWa9MUUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwwACgkQHAlzClQS
   29.75 +YPY+BQv/W71XfM728hWfvjztPRssjJdj3aRyCpAA8IUZWViINu65a6yL+6JZYu+L
   29.76 +pQY2+AiUkJAin9U2S0ege0H241IXMPj77qCJlLvtvK+G+vZlz8kyCTUNjW6Oo1nb
   29.77 +tqbc5H8sCRv1uSTPVnn3AnkjLL6xDW9zfjM/fTqEjnLCUEpqt4TNNDRcWng1TuvF
   29.78 +mN/ZPG265gnki2RTuuX7iDwG49TkJLBuHDj2Io0glNGj+4WHTwLvsv+Tz2/UZgdf
   29.79 +JCCYAzj9SaCHqjwd2STZfH1ayylHVSaBDYf6gkgRafR5AoZjT64R47QDJj188G4a
   29.80 +DOke7cbusp+ywrctZzHko2r90ix6BLr6g64tKTAvH6Km3s2+yt9RMEAyXDc350rM
   29.81 +32H+oi1lCwQetKrTAXFZnTtqswg3Kk1b4fJJ62tBrnIVhF1FDkREQc4ncc+Ql8uk
   29.82 +3YyxBuyNh53vTHrlMKX3leA79JoBvtJ+ReCAZZnIbf3CGTpe2nyT+R3MRSjrlkEa
   29.83 +QdZkrcqd
   29.84 +=IsNS
   29.85 +-----END PGP PRIVATE KEY BLOCK-----
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/test/test_keys/priv/pep.test.alexander2-0xA6512F30_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    30.3 @@ -0,0 +1,82 @@
    30.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    30.5 +
    30.6 +lQVYBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    30.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    30.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    30.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   30.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   30.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   30.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   30.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   30.14 +Ln0EZR49Fm5yAWEAEQEAAQAL/RM4d+1OX8AyTYdCAU7mdHAdHRIVgRVCpw5pCpDC
   30.15 +IgTkL83LrUPQC00MREztcoqg0Z0YLbtrYMnwYaEEE/QfcTNvczjg1V5+FGOfrGJa
   30.16 +Qqp0vVfY64lfyoFDMbgU7Cb0D3hRjENNH0UwWQNKicDLLt4hEjAKJ1njH1s8PkrC
   30.17 +RPW4wDYexxwafdsp/Y7fB0OYSvVqieOJ5ag9r/+MU2xoaKZ/H8ey3p+zDBfAA2RP
   30.18 +8h2ucn6ERyUtQLO5uH9QaJ5+rnh0yRwEhl1A2JaHvk8EcS/6e25qpEA2GWHXro1U
   30.19 +4u8OCIyGj4mvqLTCpFRzZrBdoyhC9oM9tDnyERQ36XIJffLVEIp5/Bb02JqDAw1t
   30.20 +ktxgdAAsH8HjriKGZEyqTkd7GQdVAGwe4jJLxXlW4ueJ2rbC93E9B7/soDXkx9Ua
   30.21 +jnGjQpotWl2f5aBNQVClJFIxm2dOCaE78au8kJltWqzn8t+MLYzgvf5ictRsQ1qR
   30.22 +yY1Z1Fsidp9kJk4S9Pv5n3uJ4QYAx3vCYewjry4wgnDBjOeIiUKWI/39Ni2OSHtX
   30.23 +MOfrRsxMibVMlL9CfNzO8wNqrGCfvaEeFyG2m0KaEU2iBeG6QlYFJBFKL+wGTp+k
   30.24 +rpAZO6aCHpBdy8ljA36arh+KNQJQYDQAfVfeOxlh0d2w0untmla1c3xXCpaxp53c
   30.25 +w76s5bFyo4JPvnbnfX0Gk3JkuSDJGw910J1xh3S+4xQEG+USoj9UphqUX42WAI/a
   30.26 +y/k3Xau4uPpFYGyU1G+rMEytHllJBgD/riq+ITq6TXq1MP7QTbK8MXMZV88FlD0s
   30.27 +OeXUwU0CNcYVau0gU9o2H15jZt9pg6pFlVlBTizvlqWOTsKP5Z01F4Oc3s6mqya/
   30.28 +QXiw/Kj7xkew0IS4+66qXmdEcjQkGreAeLYlQAioAFwOvT9CZO10IQvOTpg8nTuv
   30.29 +KdGgzL/C+3fidZLP/cmeK8WLxpp6+EDkhcdntTBThvSgOrGzOalX2Y/WNEcIUE2U
   30.30 +duT7DWjtz8Vb4vz3eLFLLYvfjluMP1kGAPhm4wo58TOIxSzOPpQyDPLp1xJPKACa
   30.31 +oAjzTVRKN35ZMeMlIpHj0ytLQjAC+66OJSb+gNxsA8ACSZlCZZzQ7QV+fdoYhBmB
   30.32 +SD38NbRfUwDA9Ba3M0wsY2UVwivab5SF0JlktcybfHfj3kYaU8g99QQlmwWxcnMN
   30.33 +GmRGJYYVlzG+lf7X2dz9Ufqfawao2br4yXaevwzTR0x8qaGTjUdXopO6QDooKaOR
   30.34 +wDp+O996uBDyGF84vzD6bZfYAOY5HbBZJNGQtDRBbGV4IEFsdGVybmF0ZSAyIDxw
   30.35 +ZXAudGVzdC5hbGV4YW5kZXIyQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEERqmU
   30.36 +8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   30.37 +F4AACgkQxLirC6ZRLzBpqAwAkVAGd2KEKpTxxslZ3nRKIMokqSrxhEw1INmK08ql
   30.38 +FHj3b7eb7zJFVNQpq7s5Wsl89SkEV98dl9pmy2M41RAaU+M/jOYk3mqxqSu1yiA8
   30.39 +qkKyWcF3l3+b7iq+D3hfKHW+tmHMyoitbme7otEH+C+hqpY/Ne+qD+wZAyekvscL
   30.40 +65MBPXVvm7xseuBFR9h8/Cbq5YFoW2b7bisMVHoJuIPek+siVy7CxHBzX4m5O+Z9
   30.41 +N+4vOo4adIxMGiZsbyP8Sn+6tKca8Ca2NEfgII/Q3WsDctNMy9M76q0Ek32be3F/
   30.42 +3eIf4sUWVtc4LrukFrlDPQnsO+t/bfktR0/OHdLcxwjMbn0z5xpB8sJIqr5xqvSz
   30.43 +fwFDhfA87nBxt7V1s/QKQeeuI9vOHpSHgwv6ASJCb8QiilPhev18ONBg0KzmTt4x
   30.44 +ieOKG5KNgY7wcnvUf7Sbqvmqxc7tq0K3gAFqoZS9i6ttx04lSqzdkUoQOVlI9hXR
   30.45 +7+IpgM9yhPd+6YytB/yEBUKrnQVYBFu2Sh0BDADAqureldCVAODg9A2elgQrWDdo
   30.46 +Kliyg4++Z9sOMGv56B9vbd0jzWPV7kJokIwSM2BIaNStjBdRYWRjenUqjwFgjz/+
   30.47 +nxWV593PHYO3grLKEvI+aVVgHZXYoaR9P8RnK6jPxSgpjRlPFgf0gUsuVOav9eO2
   30.48 +EFFL227ktUMCLQf/wKDT2is6qOjlogOIQuoOGN2tnWLmFs9CVkiX8Bg3d9VwWcrn
   30.49 +vprPJu7pf42wCme3R60B82rgX7b1W+nbnfBCPKlQfEMqrm3rCKNLCffo25Wyu0G9
   30.50 +U0sfg61SkFi8JLzmi4NM2KcjgHw7AkUrXAE8Jbi/yChLbmVVCqE3W5WguCNadvn/
   30.51 +GQoPoOBmWQplkLC1SulKYjVYzwsnAKdAh1VI3ClDYwr/mD1O39TGv6Tdx1LbI1rn
   30.52 +5cI6KzOemMd3dzq3dNR8tUg38DKYxbb6zMD24Eg50+9nuAF7ASSL0XwjJUg2kPlJ
   30.53 +K2m8lIUyniLEJuFwHhDskYqSct1NwjpoXOCZY0MAEQEAAQAL+gILP+vOqZYv03VI
   30.54 +XykPr0AVSD2jsc/cfNkote9lySVjV7DYkH3MJmHzzsFv5MMJtKPu1AgbmBAtsfRH
   30.55 +eVXYBonJ7QkPOHjiWpwMLqDNF+9JnCr0vXwqEdCYTYOckgPxcLQjkfo+3pabTycJ
   30.56 +VSTGKv2H7h8X5KFXKioBfiB+JyOSQ0hymIMazKrAnM8z7HPibPstDNrzvMX2pdoP
   30.57 +rbR1+bss4PwbzrtMdM8PtZPoq+fSJyL4YkPNnvV9eZ2AUHlhC6V5zm9pteQ0yUPZ
   30.58 +A03wvDLlS5DlABRjrlwBELrhqQjJJCM6q1+zdiDQYaV+8lgGej+6ZPvzXo9KwCHw
   30.59 +lFbwdbvrEfX6wz3Ye6koplAxTEFH3+v+haDmdHbvi2lte7wDKD9KXX3lrFht8ceD
   30.60 +guJkXHcyHOJ80UKJdB8PRc0HwjaVkXXwygeD7vZuGt5tKlBl5ZAH/z2eldpQXLAq
   30.61 +iZBTre75eTAWpanPvw/LTjpBUXXekkdMT1qPu13HfSPo15+sQQYA0eDvjoBBKsQc
   30.62 +iQ3NtSK1ec0BRHQZDO2IjhLjedV7WvoI4yoXq106WFIv+QPyKdO8khQo1RTUS1NI
   30.63 +1R412AJ46cbkGyNqKTSr2i2VwRrgLfqEwQXZuqalT4W4+bWcx5wprp11hxJ1SPXj
   30.64 +qK+4WevMga7gYBMgQjgFAj7p4evvTwk174wn8dMX0oB0v3gUMcDFh1AVbffUkteI
   30.65 +7dzphiGZcS9jZJoDSJDFN+SqL4r+O4NQLi9GR4OWVMe7ghAa7s37BgDrAb+a7Tec
   30.66 +GPH8jOx0rQPCxbAlh7i78PAiXPL10vgYDM0xAgtZzP72Dl2MBduE5hE9nOEkZUwy
   30.67 +2tm9ISavNqUsXmNKkrakMSx4QQiK9xhnBxJu/IRqTiJly8gBwejwgJkp4AZmgF+a
   30.68 +6u2+c/UIeNRMxwlkcrgGqTdeK3RbJci3wtPBFNhEBvj02Cw3ZADa3X45OR09X8NL
   30.69 +qcjOvCG7imfOmagxG11yg4Kd7+42151aqxAwM9nKpN8LkKGmnrajpVkGAJb6o54g
   30.70 +X855XTP7Yg+3EqcAoUU2+Jm6s0xGWZzXQ8YUT/QpwMnQe6rcyzfc3MmODqaofZnu
   30.71 +8GKVpNsxGg3PqdBd9FRqoxZb/9FAfugAX1DA+f198JJWxg629WOWa4s4DRDJgek9
   30.72 +V0p3PCgzXTNHM2D+eBeO2sGmP28zGfcCzlMCnBBRSIB4AjAS78GHtNw9rV0J+oYx
   30.73 +AUoSXRFvLJWfAuyIa20oeJTwxCHL3lf9XOJ40QXoAT+mun5rgY0J+gt3leSyiQG2
   30.74 +BBgBCAAgFiEERqmU8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwwACgkQxLirC6ZR
   30.75 +LzCpvQv/VH/mnI27WZAS8d14QHwv4HRvWxd88RXyeB1pmJIErOjADsz1ZG2pHrv4
   30.76 +Op9CgPoWxnzdhy+DFwKCYptJUXpU9F4kVDDWpxWoNy9nNIznHFaxLyXt2c7JFGLo
   30.77 +5T+Va5UXaIYr9g6kPYBwFY6wTKvLTWgrPL+lacilLdB0xS1FVd5To7o2ZJCgC/tG
   30.78 +Og4nPH2BieewjPgAdPcpDjFCugy76UlpjbpJ/UYDhgz/g7+kLt6XHPz5sgHXqvO+
   30.79 +juiqdxGFlOQn4xiKJBjSLPaU2QIIYjmHnbJH1+OmnFym2EmRn4fhH0yhBpE0OHuv
   30.80 +0+iWYvfr/pjtlCZF6hdtKiMfv5cmxZWzb3CK33YXdNccw4CW6uqmq2kyn9cDSXw7
   30.81 +OQMIn7nZpc19L72bz+9ZRF2zpWmYogSSN8vSwlsE+jTqEICxlXNoaqQci0FXwLUA
   30.82 +4WnxeLITl+PkzVghRDM1/+C1XkbO4b6ueSLIx3506ZZ4qlht8XFf3KTwkPDr5JzY
   30.83 +04c8TRWq
   30.84 +=R4L1
   30.85 +-----END PGP PRIVATE KEY BLOCK-----
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/test/test_keys/priv/pep.test.alexander3-0x724B3975_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    31.3 @@ -0,0 +1,82 @@
    31.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    31.5 +
    31.6 +lQVYBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    31.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    31.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    31.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   31.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   31.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   31.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   31.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   31.14 +2VVBJm5CGF0GJpcAEQEAAQAL+gNxbUm7mvCghTwd3pChWW90OI4OlTbhYu6vpg32
   31.15 +EMZa2voffPoBssWEmTJp5OPmDO7YiRjBjognVmpcEbzA3r237dnkDqMrVGSQjIJR
   31.16 +5KCflbyQhe6g1pghMpv0LV7SaX1J/Nb3S0HWY3UWIGkeeA5Kt72HTM36a3h1oa9d
   31.17 +0C/rjUFXxyHFgV1TG4n387hNpXOGL0wCKZUr4UvlNGYZiLiNv9Api+qAOoKQCJYN
   31.18 +HXpHZl+0UXGTlbnW8Y6q/M91CCvHFMX1UQC6j0c8clK8eR9s4idRftyOuh0aLxvm
   31.19 +5XdaFfKg1Q/6pfiCSEPZkdd7ssKt2SqPe5e4AgDeSUy2ljHGc3yzcgqmP2k3ZaAQ
   31.20 +EINq8OjDL/hQOv8T0zxy89pRNJBeYczsjwskJzGNtnX8in29Kf746SZvexKP5gaE
   31.21 +6jGAmdTk4ogR3YrJTvHDiy1F4EVEtl5l2ACQ6VynF8Yr4Gmqxg74VWIJrqcD3Xys
   31.22 +xwvi6wZ+4FRorKCekv8ZAD+qKQYA152qE/AAGn+aKv4N9tb4WJK9IdBt+B0ssiNC
   31.23 +e1/YOew2+U/6E5DP8saVH3BNYay0DBwSLfT7/5xdRQyk8hQvGx0pXknUHt82p/K0
   31.24 +SlSNC3UrBmizVBOpEUwcGEz4Bygcslq3PhHbIKZFXXaMxC3LPLiNZIM7Dp8tOI65
   31.25 +WKPl9CMx6/AfYx/8fAwJXkxMo6DSTJ6aQUr0+e5j12k9tsle9n2wN20ukzlGuDS7
   31.26 +TP+SOWHcjr416sIRURxJX6g978PTBgDnzED+ds1SOm0hDkmUl02XNN0R/oQEcuPC
   31.27 +ydTRncxdw5eq33AVD676bCww5aeeMI2sh4jTa0vxenY3MlykyOMUwviBGuRIlk6j
   31.28 +PK9H7ftIXNAhTDmfr5m67YrRxufjsZ5pal5y3QQHg7k7Kq4Zdm77SOXlT4s50aJ5
   31.29 +EhPkA5Nu6BnoMailnC4WjwYJlpkTM7IrqH02CIz3uhtQLVpk2KSKCRlfKSRWHsM7
   31.30 +rdoqrgXTI3JyDVyT9cSPKKl/bongS60GAIoFxnATgz5tTPXecWPGtqQOf9tzP7Wb
   31.31 +hZKnIYweIpAcFqAiFYgsbKRvCDM/NwB8aftKnOuNEyYRPI27VPwGxYcQSVjUzFI8
   31.32 +RlgLZSO3cpRsO0E1NXBrx2wihJZtGgWdjLOUNeM17OCEqRdo/Sb3Z33uUlkYRCCo
   31.33 +Jg4d4+SXvGFBG8TSqg72eS5A8i3astvVvZkweUqMtM6+Tg6mkrDmbn4WomJ04Wim
   31.34 +LYL229FuKHCJcMizP62VoFw9+KDE2tqe+drztDRBbGV4IEFsdGVybmF0ZSAzIDxw
   31.35 +ZXAudGVzdC5hbGV4YW5kZXIzQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEX3B2
   31.36 +u9kuFOpJ8N98LOSUGXJLOXUFAlu2SjsCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   31.37 +F4AACgkQLOSUGXJLOXVwkAwAk/wmbjPQQIeQEtBrTh5kQw5BCeUaH1zZNghQemdE
   31.38 ++O4KVv/OM2pHybNw9LNihWCHTZsdl8MRcOUMHFzwHETsPuBuO0b/jRb+bNLp8q/M
   31.39 +2lBSUxjiDPzGljmpet9Wi4y4UNHzu55nvu8kS5lSHxObKqISRUffvYtxjy4RyM61
   31.40 +OQT6fvB9gWI1Axh26Qomsf6wVbx9fPkiT+S0+yb6coqxlv8as5elbCksViObkv+d
   31.41 +u6CvK26G50bzjZdhI9uopk+e5/UJgAY4uXLtDsB68jdfrR7jknNEyYa0heMRxQEj
   31.42 +oQMDRJ6xRrfat+q941tXnd5SwQuCKaORi9OscBo8G2vOeuel2szePdmisqWudQX4
   31.43 +8/zcYIGKu4cAERX6fRksFH6IKykifXnpyPT4NqQ+oOUR5bHvxgNVsw3Pmtay8RIZ
   31.44 +KlklXO8H7PdLdL2ChGgL4+4JczwLMkpQzMqouFHfvELSHqTfeVypa9PR8v3TyLH2
   31.45 +o+MADxTLPSYyT6LwsxalQXZ0nQVXBFu2SjsBDADlVNQcjd7ufAjlM6VjG+qRPfYo
   31.46 +UuX44OL1vuHXlk4nzgEgiWXTebk53kH37KGcUZw/j6v7ihvSvVakED43aoT6kyiq
   31.47 +o91fpktLdMRUFFI63fNPFrt9bpFY4mg+cUxpYzImsUNqasSb62IIHxvrnh9JN+a8
   31.48 +RTMHdTsKeXUkS3xdAEjqY4C6JCeQN9TddHMBn9HhqjZd6VZ/XzoAkYdCo06J5lvA
   31.49 +tStteUmqHNJYKsQJwrNXULVxcAzX2okKexvOwA1NkfVlH9ynnuJMYbbW/efPjX6Y
   31.50 +M89H1iJ9kZLUmSg+hc/vj4Wmw3NZpmHSkUY0dFk/tGs3tWmWO1TTgS3pGCTSKtGq
   31.51 +8OlDO2cUKbruvmnor2oD953bew08FXsaFu3otInKDAAoFlQIne6UdzycR92XE+6I
   31.52 +uqcMbcEtzwO1cRXgMDY7mrjJUOQlrEzHKmMWiZ1OqXMjakieQ9fk2mNrw1dNd3/Q
   31.53 +Tr+nI+Jmh9qL5IdZv4zo0yWpvB1qK9ZWEEIsuPUAEQEAAQAL9iM8OrAocW2IS9WW
   31.54 +GdMgdunZ8KLsGb7OJBDzQxUyAtAa1rwpCtFzN60BznZJOot0qTfFhfx1O9ElRiqZ
   31.55 +qaAvaD8Xsn0wBX4CDuTeYUvfKMM4AX96qVPxqQ3/EK/cuIt4sjvqVcauoNv+o7vx
   31.56 +C659R6ai8CX9JoSpfmjIQIyoYciS7UvAqLFGMiNLxhOV0MBvIyWJAXwXCIiJbl/9
   31.57 +UXWWTHrjlIqx9foxUyAlTYGTuzXEtHQLR9V7YdMdwJsw+b91F6EHIysKg/7byBrF
   31.58 +auIht84Bcbd2EXBJC2elmXd9WLerWk8FC39ESQG9nyxwA+qZQ0hpf6rq/O4IaNLH
   31.59 +bLMToo/rRXy8ML7m1giKZjWdRpTplBk6bPH3opvMhl5DuIOiIgeGwCGLjnN1j84J
   31.60 +1PC2QiUn1bDP5oztjCNwGPNvZUOTUF8lARmiljzdEYJ1HIxijBGZEX6+CMxYwDNS
   31.61 +eQ4w6Fu8pTpBKVSjMUU3xOnh5yF7JE4/6GcQKwXNeCW922QBBgDuszLrpY0g878c
   31.62 +V4s2cnDqm7aZjKBJ5+EL9gVobioY322SYGGiEZEHvYiGrgtOzrHe+chgNDGICKM/
   31.63 +kmklbkuSB3Vw6yinJXfQquYM6nMBmZXSISqF8WgPZirkjhtjVFluJQkHB1Icy1zA
   31.64 +QAlgNy/JdK3+6BEV6nxV7ljHzHsAbfRkehEWH6uc6i6sCjthNGQZT0FxCDbGxep7
   31.65 +jsSwPm+E8alpbQOzgBiv802LcOUdWWSswto6dGmR0GU3UQbjxHUGAPXzzjc7SMd8
   31.66 +29Wpe/pCIIdJHD4vF8eP/glPl4fKlKnirEUQotLwC+3xxlQt7tSiUV6Be0WbUxSS
   31.67 +HNGfDZUCyj6zoSz2fpCjgQrOdOG9SBFALRKNnZhnfrbgV8yZmWKHXfGlJL+tPrEk
   31.68 +7WYBKIagvet4VRB1ydcWKDVC7dJP6MO+fu4tZQXPdhuFjH2rTI04ZfwAWk/Rm1cu
   31.69 +bAUGJx9VardPk2EGQNI8lj7B2j92/3AjTFW4ICOJaYYbfnZSumySgQX9HkWEcxzF
   31.70 +AB362I2rvWYxtwDfe8emhz8dF+LrezflysVvNbpmsmCAtz/H8cojNpilLfLjs1w0
   31.71 +1v6nL0Z/hXbZhHXQyy6cD9A4B/vm9H8uSLNeI2ril+BZrgnvUGXkgABlDJvqckm2
   31.72 +4EgNpSxoWpo9+9W8d5inR16YmZbbG7PSKwIQFe+OHdmk2/FLIr7uT4cUoiu2Vwfo
   31.73 +P4ElqmPV8eZ5q+Q/+PYtDP0Qa/KrqPSyS4I9M5nGnp8JuafRIm1N03zk0iCJAbYE
   31.74 +GAEIACAWIQRfcHa72S4U6knw33ws5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5
   31.75 +dQFJDACOMW6qkDazVjjFenLdCxkog+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQ
   31.76 +iy4kl70+pEz0eA6pOHEfmsK2ITClDCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLe
   31.77 +RQN4lB0FmVys+lC9ad73Vl5BzhyoYTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEg
   31.78 +girJTup7niIQfwm8bOuogt36+90JsZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9r
   31.79 +zxHpxKlQDLS/OGtBUz7AZWmZZnhIZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw
   31.80 +0B9PLMSafP/i+Awf2vA0pO94uCGDYG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0Ia
   31.81 +EH4EDChvYdfSNpghcdUu6+zBS4aAB3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9
   31.82 +SNZZYVcV9pTdbU6DtaQWmI3xMMavXNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCV
   31.83 +LqdCUc8=
   31.84 +=pxqa
   31.85 +-----END PGP PRIVATE KEY BLOCK-----
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/test/test_keys/priv/pep.test.alexander4-0x844B9DCF_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    32.3 @@ -0,0 +1,82 @@
    32.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    32.5 +
    32.6 +lQVXBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    32.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    32.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    32.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   32.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   32.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   32.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   32.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   32.14 ++rKeexgmSicMiekAEQEAAQAL+Kj/5AMNjgUt7zNBEXCBQlaSLqreChxZmI3VjrAz
   32.15 +k0nrfhb+Mnue33UaBK16DYNEeC+Od8Hqi50z9n2/Dt2IegKoLiqAjkigZT6AtpY6
   32.16 +GZqgVVxovWMGwQPhFVAV4NncL+9v/vnlCSGHmHEOTmVDneYiKFFCR1qYLGJOUp3x
   32.17 +7DzaNPICeasAV15QpffwjVEGtWVnptHO2yzsUepKg9oVnEni14ArL0ixA1DhAGC3
   32.18 +x6XWi0dmKzsr8VYprWE75mbXnhb9Amm0kS9vUA6VjPu78/6aGxMdjZmdKRhQhATo
   32.19 +oARV7C13CSiKArWzwZPvUvkDgh+nZDNXZ74Ekpe+Odd5rwMul2VqKgkm4HS/4tza
   32.20 +RwXyc6fyMY1cNTn27Dzijdso+tvz1RGTc9hnj1QKCL2vPnfmTUhrEmIwP93e2Q/2
   32.21 +UXvUH361aEg9rV2POG+qvwflU2AV1XK/pKad+OEqffT3SgyCQExjk+oLbpdap33x
   32.22 +EVm+u9SqhK62CHnV686j8VZhBgDLiCoYk7Vps3h5OqtjI1OHz/xuP+bF9piLJMmN
   32.23 +4lY3LSQYuT5wm3ZWHgWn3rYcNloo4K86ezh3rVCGPWDFkBBNgul7J8iASk4WFP+W
   32.24 +Y93xrjgpJr8xavqo+OYFGyQNhZxO7ogWdraKIwmp2QlDB4k2oe85Ocu/+m3YT663
   32.25 +DLMGU8A0ylwey/HiAc3DFele1/KuhAryzjbp5ANzKf/ITKwt2AX7s4WUcYMl9hXi
   32.26 +bct9a0Wmr7Bk/rEJxfgz54nr7WEGANBlmtI3sTxo7nRryqtkHKGr+IM921FkGMT+
   32.27 +qJP2JJMGFkRsT43vhy9hqVfPyx7Itm9UZCVUTAxr1DGc0sIXHQjNulpAst5Aa1Ps
   32.28 +zOmskRaDtsTR6m5va72jLIr5SD8g8oFouBRfKmbaRtcPT7t7S8hdcNw9WF+zreyp
   32.29 +EZayqnWHV8VvoHBTU5K4rGln9EjYIJQPdvbpRky3qvznRKGeJ7GUwdHgZzV93eXJ
   32.30 +e1JP7IGv2C3VGuGJ8u/jbQLeYtEhiQX/XhE72pi14LoYtqeww0HLFG6l6AmUJceS
   32.31 +h6QQDlZRf7VpZ2TaCRhF3AMa2Dp3vD2C91DpeQbSt7RB83BHXnrEhxFCl576HlGr
   32.32 +PQ+KR6iAgO4LbcsmrDyeg9KkKgbvkblG39B1MLkcjKsE24s2Aw9B57rfp1ucKl7I
   32.33 +Ifc+/nLf5uywqVHFXdNgJXplqPinxmGIZzFjPUJueww4JEQTLjKJ5Z03witx8G1t
   32.34 +fjmoQrtorHDr26VBUDM5p9j1xprjsJW74VK0NEFsZXggQWx0ZXJuYXRlIDQgPHBl
   32.35 +cC50ZXN0LmFsZXhhbmRlcjRAZGFydGhtYW1hLm9yZz6JAc4EEwEIADgWIQTpX/+V
   32.36 +uOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX
   32.37 +gAAKCRA5XxSFhEudz1yODACUd3XckWuAXM87H7Jt7tVI4NXGMAb/MvpmWkPTEsBv
   32.38 +ScaUlWR9wXnfVhvIfdLS3omZT5u+rOqAC44lKowO1/+/zvjaO7zpOp8jNZUVOdnl
   32.39 +3wJd6zLNT6cCRW+DJGmnMK2iWcw7ovUTxonpvNvopAllxm+WF1RDiIv6nLBiNBMM
   32.40 +V+tiMIjj8h7vGZ2Zqpzk4VCp1Z2+OE/N/mYELqgyEzgAgfrsxwoBTsFLRoI3+Bgm
   32.41 +x/L4i2RTgE6xB1FGfeiUEG2kQS28fWTHpOtYp4RgozCx68m6WvZ+FdsmkR4UaGDA
   32.42 +kfWA2eB4Nk2QjTjzKvRfQrjSvnIUDHPFGNQgsKbMJNLmGVoeh9bdK4UfiAtRSvln
   32.43 +wzs3u/rIDbAf5YZrfj9nQxu46pOVE5FFti4EZW9IdNyZtY3gn0ki30szhCynMxiR
   32.44 +ooVyrY+wl7wAD0lpqtdAZeJBRhDpdBoMaqpDtbo7Vy1FNInTivcORjxB3dedzv87
   32.45 +8D3GlmrBrlaohTFcRrvFhVadBVgEW7ZKSQEMANQGsISHhvaoq59z9dpNiXwZkXdH
   32.46 +gdlsqR4vfO5Jg8oImMg2ctf/A/TLLsOkLLxoU7t2172x4nwbrvvyT3m1GyescojX
   32.47 +YBjCQHOkVSYjc2vVJ94fbDND+JUXywsdG96nQmn8nOdmBTumyAGLRivtFgDNsmt6
   32.48 +2rrTyZqP39mqZ/fD6QjHaW4bCe7x1aBhuvq2pEdDgg3tdviRmENIpaV9XZNEcB9R
   32.49 +K86RyJAYK5nAcxfoKRA7xT2KVqyjiM6LiiZV4uCjEn41tzWsiTuPQWVH/cpOBjlU
   32.50 +/7hvUZT3iveepvpAx9KREqqW4CW1t+sSFIAn+f32ZK47lVx6ZefA1VKybKtURY7S
   32.51 +YFcsnflaWbGjfnpsniie1XbvVWYrW8WoyobBD5s8ZW/GD9FLyrXK+ANlpx+w7Ntv
   32.52 +49YaMvtV02p12TAp6nOPopR7dqM+JDNzZJ+24s7MGj9+tOjvV6IE5BwOpF+qrRkl
   32.53 +NQCzCdnwzyY2B479O7CbjPQxXIgM4p9ogt+GRQARAQABAAv6ArL74TuXAbqwd/bF
   32.54 +3kSqXrQn2HJNn66aTf98mVulnbdI6YWVCaOBmNv+F40dhebU4PD8LGTZTj0bphVH
   32.55 +osle2xmUYSIyxq0GK2nRuyBQBPwaKcyKqccwbzE8/RCXm1Ga8ohomGL6da/qxUrt
   32.56 +kx9qA5mMi6we9f+h8MGjoZWovgGIKUoWmFCLo2kqyOdtmZPdmOhRdnJQ+vBGAAkO
   32.57 +Th7G3QvxWq/RxF0/6VuxabwjGSzXk22ieaUrLFv1J+ykcoFSUeQ87BEmVYFqreNj
   32.58 +eJqKZkxocu4Qmx+IsDbdtXUtbKDMOeERnXqlHzkftA+tRvSAYmnlPgiwhp93rex8
   32.59 +SV5NwC+aD6Kkqc1vm44NSLetiAp+qL4hyfYJAM6K77u1wzruS4Yn96ZGc/uQ3K05
   32.60 +H/bK2WdDNm6wIv22e8sAHjhVL6wximDRysTj4lIRFak/Ic1IK/Az0xvsl7M2aRsR
   32.61 +gC8LYtzOZG8hNqUfTYE4TiFQAQqal4ALTVWT8zMzSBmRop+pBgDnU4aKobRfP6dG
   32.62 +3YA37QlkJOH/un5PQLm8Lfur2WE6EAi9cFxeo9qdXLYMI5Pc/LNR6/jm2EHgA9JA
   32.63 +vdWw1M76BGviM5N4KrRBOgB+Z8fIT544J2I0elKvUpZJ2WE5vq0PDKZc4yVdKmJ+
   32.64 +nhteLgzRgBYp+ZizH1kSuL56bcrcI8Oc1Jqgdt0Oi0LOS/tKSO5TyytI9+JGrjAv
   32.65 +I+qvEIVMNHYOSbR/Y/62q4ujbHFL8h/9PfAaLGlNyvhJD81x7Z0GAOqkKhYKr+II
   32.66 +sXMMwmX9V17zBM5vShiVo5wRK9kW1bpTjK46aW9i7aOu+KA173pINgjrX6M8UmBC
   32.67 +5oQb5iZKnFLTAlW2evpfBkRSPh2JLt446YBHFC2exxT7Z223/YYbmRGKmY3FNuXC
   32.68 +LigQDdg4knJLr5IZ1g44cMMogCdjkPbtBN49ckOJUl8X3E4QkpSfbKKkVwPDiown
   32.69 +S1Y6yWVTJXRZB4k36x3ZPaAdPIz4izNjC7aC/0764cnmDlDv+lTuyQYAzij4LQQR
   32.70 ++hT2rg5jhCOE5bFoXfJkShwk39LVH6bL3loVcWsmHjrr+dymivIMDrihES8d0cCJ
   32.71 +p+Z6o/0pPmSnOsaMG/yd/tfDBf+pNgONAdFSs+RAobmvog6oGoQxQOIDuSvsU80e
   32.72 +NyCPtIeb6sgYgEqwSFOI399zszlUl8bUktnjQI5CvVBLVaPWj/tmDq9XsA5BnGTe
   32.73 +jPkcZoWGPe7BUVINVBSerHTpu6fp5NJors1NqaxhgAJb1BqZuOPlCRH52+OJAbYE
   32.74 +GAEIACAWIQTpX/+VuOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEud
   32.75 +z7Q7C/9k0vPVUQ7mP5B5Mi8yQLECcFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m
   32.76 +2ptPhrreFVPcmIINpluQEWUsS1rqe6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oG
   32.77 +XR0G+ujZnjWuDIhqfkGUxhZCic/ztoboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOK
   32.78 +Ikx4iaf+bd+hwGkdo+Y87jHkCctW9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAww
   32.79 +ZflB98agOQWbzZ7HHq7jI/SXlewGPRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOy
   32.80 +mamqLVerp72RRSkGfPpYcgCQu5qYX9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+
   32.81 +UgWImfUr8E0ZVgjXcEAHOUXjuIiZq01TQAnprcdREzJas5rX8jEttddKeT4WlBY5
   32.82 +mu0oNrBiTOiQK2ZIG8M3Zch5L4I7P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWK
   32.83 +vVrZVl8=
   32.84 +=IhsO
   32.85 +-----END PGP PRIVATE KEY BLOCK-----
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/test/test_keys/priv/pep.test.alexander5-0x0773CD29_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    33.3 @@ -0,0 +1,82 @@
    33.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    33.5 +
    33.6 +lQVYBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    33.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    33.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    33.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   33.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   33.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   33.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   33.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   33.14 +YncgyLU1Gn3bDIMAEQEAAQAL/jm95VDio51tPzgqXnDPMyOjZyIjv32DOyQjRsQi
   33.15 +wz66D/fS10mh/K++dfAKiu5OtY8iAQE5gADr7V6uwRRFFVxL4eXdvNi6vsK7jUd8
   33.16 +OYLAqrlt3JpAI7HpdqJQzmabYQVm6pHz2NKATR1RTqDe9HFK24Bh3aT6CK4BIwQ9
   33.17 +wTqYdS8kEzPrtneOu9z5AjKtzJZq9OJuFqsRInoESy+R9e7MCj0HB9KxjhuyecLc
   33.18 +ilURaOHxjCwpmO7/Hp+DjxA/Tw97701t9bo6AN8w8QVMVl16PmroX9tR5HCaYPrd
   33.19 +N8pqi9Olmeu4QTQQgscSx6WUR/Je1QHsMsaMOpGi9eluOwP0uOXgGqJf7vMHFoAy
   33.20 +Cf4YF71GQPIi3GjeQDUc3KsyOGuZs6NVAo57J5AGJEBUkJF5Y4JD2J3hUAkMuBZT
   33.21 +MEwY08VoCh/O4w1s2gUY5gwZCkws1WwirWV35wz5KW/XJCu5866bGFPFrcLDfGnr
   33.22 +ph8+KaTQGRrqzC54T7QjyuaQgQYAwjvLPWUKBjx9h/1XFeUusAOaskBZiMAO6hWl
   33.23 +1HmyAjAfBbMiWcFm6UzYewfzXa+2tOfC0znF8Wz9OKBbBGe4L+UqluVKRLe0iDt3
   33.24 +mQHYkUKWXvmuNhlf9ZsOP5YEK9J10Fvprtk47YMxJ3m5qdZW2n7Jf/0W//7OaUyD
   33.25 +upLRxISiLC9CCBPqxTp39vzZlzw82CMA5iUWw5/qZ5f//0EgPXASYiB8uaLP6IvK
   33.26 +1X0tX14UxYMUcunWUy/vO9wmfK+dBgDu3sMC7GRXi3MOt7j/ywD0g9xYviqCR4Gs
   33.27 +V7mAwL3aGTaQJh5M3+G3C7QgOaz3hblL+Bl6B5H/phZZja4I7WW8tD7jx7lxJQ+L
   33.28 +O5pCAKM8lYoQqt2uTVqIMKJf9eDcoz3gsp6zFH9qbF1ucMK2KtzRXDmTXKGucy7b
   33.29 +uBm0Uy1t98M2VBSbAxMDd5KdyrSa459AgZ92eg00n7Z8l46huMGWlvVXyTSsZFxR
   33.30 +gV8F5ke7XawDIsy7tfEeXPbc888Zwp8GAKs2dwvbXEwS8TPUx9Bvsra1BtjrCu6i
   33.31 +LXP6NV0jrwr/OjRLpYGq9ZgMqqznRd8Tqps+IxuXfTSDfaPhAyUZ70QHfRPaZXYF
   33.32 +WnA7Fn6JorMEwCExuAgfgh4+XcNe1UTl9sOeF3fWZ4tdj1P2P8hohZE8zRaCuGtJ
   33.33 +GVEMcF7Y52qc6vAsw53AYA7OiAoROBpg7jRk5LFT353/CknbmlKTXTIS02rWbScj
   33.34 +IH4XPujYpxAo2rJAdRP5jdjAsjzUfhTETdtctDRBbGV4IEFsdGVybmF0ZSA1IDxw
   33.35 +ZXAudGVzdC5hbGV4YW5kZXI1QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWLzC
   33.36 +vyrh48T76ria14OKygdzzSkFAlu2SocCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   33.37 +F4AACgkQ14OKygdzzSlkqgwAhqu4nwrRZtI61LnG06iVBGa6D66yduTksCUo6APz
   33.38 +bapaM2ahw7j5d144w5QpxlL8/LxJt+0xCSmje6twK0ffElis6PXqATNlTntyDJ8Q
   33.39 +VU4TbBioYfEAzTLShsmkfB+jLrIXEYKRrxwqN68bD/sidFFa7r52DZUse8qYgrHD
   33.40 +g+k68Zr8nrSc5syndcurlh2c2BtwYXBPTNYDPIPWq10Waf7YFDh7ThZSdNh1KcNa
   33.41 +lplDYZX8tgtOYiUggKEph6bqM7FJeGRJ83zkKYHkxPWA0Ek+1ln+Euo82FEXPxy1
   33.42 +4oC3S1GE5gQIbYOcAe58kEy4MaQG2nMlDkQlYSaCVS/UqHekVqbiVaxIVt0sHT/P
   33.43 +NOmXcCfEQtuNysZ4elOBhf9ifyQBx1b91aHv2DytsRgSHKeIksiCq8ArBkXUkPqC
   33.44 +de64Fck6tQY5l3VT40UfCpGw+6N3Li9YVG9Tg6VJunZQl6fZEyFdqkpVAl3U1fvK
   33.45 +My9bQ8qKJosir5rfrPFRLicJnQVYBFu2SocBDADBZ0xM3TBp64QqRuUUT2SNI6h2
   33.46 +ABl7nejdvc0zAjxDbTTh0jW+bDq/x72zuYETY5CauL6KhSZ3ByNQYlVkkDuLRGX0
   33.47 +lsFaI7POZXlgqmssY1RYCEGeMHbyGYf/onNjTAPEdlyZnj8aIw+DQfGrIt2T+B+Y
   33.48 +JAKIEv/4NI9cHVW/yS0ZS9VMBL9EDntMRj9F9+amVnDcpo6RUVd9P5c3jqYZ0kqn
   33.49 +spxZ1tMmo2TkDcZryK+I/sVW+XK9/FmTrj67a+nnenbzAHPKK9xrm0o9KJQWwcSe
   33.50 +Mdm1C7E+lF1Djf+2F0EOBQRqpolR/u4OqCsQPjxBzQ5fK287P4ylqJ/BFAW5lt7R
   33.51 +kO9KN7hmM89jPangducYd2OAsvKCQvJh1kg9RB+C0adQGBZQDPCiRT2jSeY1KeRs
   33.52 +KuOiV8deHx51poAMGhmNv194LOio6Wbqq3rUjel+UECOPqBRK0XCFJbmPCArRqN4
   33.53 +DxBCZWb/Zj58QDs5xgE1kjftVzeS2645SOsdansAEQEAAQAL/1mzS1QrEpVNwpLJ
   33.54 +Jt5wpDZB35Q7H5aR+rs9mLqbws+TCv/hu0OCdw0T2wxMcW1ItHzOSrF8aAa0rNBP
   33.55 +i0OFEdjZ9F+ovCzOekq0DcOjxuljeG8MBUMVP1WyOb163wGi8+xe6TvmhWXd9Qfv
   33.56 +weKZ3SMP5bdunC34gffgiM00Xd0BtYUSAu+rE/rArLcHrbkJ7VQgq1/rcBw+GdHh
   33.57 +eIUwCCHZwv5cfN++H1jAV77eFLVQ8vkbEPPx5iHvtKwmGLpcpeUgZ2FOn+t1qyn/
   33.58 +k+k9ZRHwFmkQ50rjpcw7hibkbiJ0w4qWJA2d8sfMfkizBF7Za2VYrJvoCKh3xKpi
   33.59 +LPevjnCjyXAKIp1UZzFsMYoVYDhlLFDnK2/dUVrGmXdfX/N6/coW0tXKBvAz18jA
   33.60 +K9ahgspzGb1uoNWcGEfOT5FHX+5f0jOlXNwsbmdOKLSBq4r1L9+Yb86LuoBus/+v
   33.61 +733LEVf8B+VvUkFYmE4LxvHMrYejakxEIFgEU8hX/tDXQREEoQYA0v5iAC7iWg6I
   33.62 +6UBetxWPgrt+yTVBAQ5GkH/k4d4CLw20l8/7WZUwItIRdQ0zkY9PPW/xR4NE1W+4
   33.63 +YNci6KLZfkOJr4+Bn16fEMukrPcrRbirVQyZHbabrTEm8eUWkrTPwkQcvmsXpz/1
   33.64 +wUf5mqeEBq8jAEiqKvlRAUKnK3oJY8maD0bxWbGkaAZVQc2lf1vUONQfzxc0dtql
   33.65 +Ll5g5qoiX2jpqcdQgHxAC5+lA3Lvt0YNWcLwonDXiHYF3dXgrWu1BgDqqGDNCWne
   33.66 +s3RTIl/X/ntnV/b9p5jW7xff07NZnTeVGED4kWvPZElV/ZzZ30/gzaGH/BLp3l2q
   33.67 +51WU1q5iw2OL/bZTds+a0g26trzM7FuniHXb2IL5kUzTc+162aa+ceyhjd7RteqH
   33.68 +Sm/GAU2tw8HKTqfQRdKc4+u8HGDshzXkpyPuysLMpBNW+2RgYdvUVJcRMo6UirFi
   33.69 +ggt8EBlh0YkSvEYj7GNYCXq2spSBoax/KBwnJpgk5Lnh8Fxh3dFVO28F/3cTq+e1
   33.70 +V9OljGEbdXkjEr4HZHagm7YrC/l4Vx8V6f0uiujc2P8gGSYX0ZMjqgbu+WzBGfJW
   33.71 +Lmh91Xvm/yJZHMqOwwzE5ioYWm+NjahVFqyq7+v7OK0riKgla/GWvODxpuqExApU
   33.72 +SwMoDTRjGCP2qh4Gbx3bEtw0czU7SywgmRzoHefAFq/WqY56tlIqE7Tl9KhSrPoN
   33.73 +XN2ejyyZ65bbnJIHnE2ikcujq6cM/uRduONVSfYILNQMnICnPEfS+OwPCPJWiQG2
   33.74 +BBgBCAAgFiEEWLzCvyrh48T76ria14OKygdzzSkFAlu2SocCGwwACgkQ14OKygdz
   33.75 +zSn6NQv+JEXdv3I2T0zTOpkaV9XXM0w4uh+3iM7LfGQWklSQhfuIIed+sr+dvi4P
   33.76 +VGr4M+ZmZB5g2ejDEzToPTRu2jmlW3jn75XY3x0f4J4QlMIZYC1hk5Z/4AApUR/o
   33.77 +vwEixe81bXXS0H5jxUdDa4+QbOPT2jcjbFcZMBD8HwSzm/JGwMM8IJHy9k0am1g9
   33.78 +QQR++oYUwUB2n9+uJSI3QW6xnYC1s+O7YROZgyv245P4FL0QmMqr6k2zEY0aELLz
   33.79 +lzJerU6rLT0mtlDNSMwyYYOSTgwkpHZ1jqYzwIjI9MTwjAQ67bVf1En7T0r2uHHe
   33.80 +mINL/Igta/J6rSIl8MV9IKegqzuAwm+0G1HtG+vok2lnGjYLNg9PgF8/bpmOxV93
   33.81 +l93y3YBVKGIod1UTYq+BDC+xSR+QLkxMLlN96YIhxNI/73I+SViwvfW8T+1ndiMs
   33.82 +tQHoWwDLs+/h8Zxc6L+078jII555fUbiKBm5DGoaHW3wuF1ELlfh/5gkFVwILRfj
   33.83 +Q433qaLY
   33.84 +=TSYZ
   33.85 +-----END PGP PRIVATE KEY BLOCK-----
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    34.3 @@ -0,0 +1,82 @@
    34.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    34.5 +
    34.6 +lQVYBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    34.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    34.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    34.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   34.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   34.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   34.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   34.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   34.14 +wOxN0vPiTwdHIycAEQEAAQAL/RNzvxT0XdbntBSUXfj4aeadOP4x2pqaR8n6GXHs
   34.15 +FgTDutbTqT13aCHlS3N68UXHXWzxNWnVjlfrKQ6Sziol0sZGrBJafw7Fd8mkYdRU
   34.16 +nxljDimOEnbKeqOjZFSvu1v/i3nMVuPiGmps4Yr1YnD1bplc7DUbNwYcIK3mSFHM
   34.17 +7kx1bOnlPPca+Hu65NT+kjetLlbgLVxC84Px2AFaNytFjDDt1ELAGqyZdvp8US4U
   34.18 +jqtc+Kpg1LEq0facmFQQ+j5LY3s5aZT8VjL4lNkOuaSP+DxQKEQ0nfkySRHSd/9+
   34.19 +9G50y2O7QBMbwv7hyLDPH5Myyb/DTe1X7YfZPF4kvM5FXA0/Hcw1tOEr3fXVyV3d
   34.20 +QrbkDlcfm8kpL1BkRzNtskYlN2fpkR4w9WLMoRQv4BLCskfQxxEXoyYnIog5iYH/
   34.21 +nB/i91jqCZg3E5at4Dr3LCFTegPTP+WXFusy8d9cos/iWOTRfR8dBftRmHkv2wfP
   34.22 +dpKeRwGuiCQm0t7EIOLtjzyu3QYA5aIv6lVlOhHDT8reBJE/7KwjAxyDI3mOMRuC
   34.23 +5gDNVf1ryoTPsobmOySWj4pkJYNhCsVXoruPqMq08Qj3310l990B2wx+D3NEvBMT
   34.24 +odoe4yPo8lTEYW5hc20ogO81TWOhLIRgPpSpWh854LCBssxNEQazW8LKZs9vezsS
   34.25 +Ms51b+zGujBr2yg7zPWT5HeZpKC4db2pABBp9zs+6Zt7xvJlZCoRiKCY4O5phe5+
   34.26 +/1sSxnfHuOz7SbpmwAkJOOYD5NezBgDrl6Iy6+ZiQ8fMQ91MT5puRzry+6pNTGbf
   34.27 +rF6QlH1Qw10Z08/ajR852L4MoAKKBSuJp/rmbk7nOqMHhEnuOQooz8kXYKdyAy5R
   34.28 +2+sHy/UJH2veMfBigEOBmosLjgT8bOBZ2byOYgG1QwKjEoUA9HzJ//UEVt6AlXE/
   34.29 ++EDrCdXojLhQerCQe7ILT9cbzxPVCiAbXLtbxU/ISCmRQFxSXA7zPWfurk/oYrSF
   34.30 +3uXJihVrasukb6T+/aFYnZBPuOoqjL0GAI00hAqN/h+7RIoH/H5gYDwT3XYpd6sR
   34.31 +y8Ag0jDooKXNLTsq3C2lwiJrd2QMZD5fkv6vXct1jHhyqG8uj80qgp7AfvWgbQtQ
   34.32 +3MCUDkXZZ6PzdA/Ugyu0lcdJ65Hz0DuBowN4EeJKyVWikGDZ40Oz+H9u3oryOaO4
   34.33 +1xvRmlQXVM0aGtWZOolPK60TWQvkMDCPUwxrORV07NdTkOqzQg436W0Sj41g3cIQ
   34.34 +kq0O+hjuqmik5lr8SCI9TQAydI36K24euOabtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   34.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEdNeb
   34.36 +RJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   34.37 +F4AACgkQqOLEUwAZaX01cwv/S/iFtnO1aSxHnnQeG6GOw+/yx4XJmJegWJpJZVIf
   34.38 +2I4MXkJ7CL2JmsdoP1iRp7eTut2KRAU/464VbLhdqq0ZrijAFFOnHJhDy9M1bY7E
   34.39 +khbwLU5GDgCl/FEGACltw2fAUbfO8mFp0x1LDHE9K8FdnTVRasmS9Tk8dlympP1q
   34.40 +djU8BpswqWekqhpU4777gUMrSubdaXjZIlgX6XHeGgGT0vD8tT9BGdwW/y/NeMjR
   34.41 +RgnEZNMnwvd4MkewgqbsKPKqKUJfv8BVD3QAuL9j8aK1ve22BjRGQNNkdPy1f20M
   34.42 +DTFdY7bXe9mTILnBDuVv1uvFMMDjIV/IU9bVz3mWg5gqoJ7OCDzV6urvBn8RxQcc
   34.43 +bYAYcEaXLF14ZpX41Eo0eY7khYJLumdSEzAG9l90X6s9MAwX05g/U7PPE7nwO15d
   34.44 +HZXg6iAxHo4JwDMru4k355MDy6mZFf6ia/aAQWHpoGg4me95F1ekoV3wjJuvcamP
   34.45 +rQ50DbAddbVtt7j+JfyaedrNnQVYBFu2SsUBDADNRou3spids1sdWqcMQpxGncDk
   34.46 +fsm9Da18AlPsxyQVEkfBIEau+dQvA69SsFETKQSSLM3yRVHAMKfTBSnTb9DYWkEL
   34.47 +i9drRug6k/UtZog1aza5oeyS8xZPJmOYtgTYeEstzziNSCj9GjAJJUYbqdWnRRH6
   34.48 +4RCJZJyDD9G4iB0fKFpdOGlOco27WBBo+6xOcUocF7R23IiGqLhiLprnWMNYCh2a
   34.49 +stpdgJhkYcOpOcjYpmq+saf4S+iOv2pa7jlfQTgUlcxCNC/Igtt/tN9c4bYuSxFH
   34.50 +kWONOEToO2WzvyY2vxxhGdjzHYE1xLAkK30Gcga36XvWABgZ35JbpTBctD2EiqlE
   34.51 +z2LUlClLQGwLlHij5PkPcReInPeCEvpm20oPYB9g2D2F4Pgto6CRj2OQHkgZI6G4
   34.52 +RoI3bmrhujj6KjiKZHZur35Q/Tf/6PsES2pQF435Zq2gnprxLqm8b4HqY1Fqeqav
   34.53 +Nk6aMsTLd4uHigeLOPUDsN20ngbLtZQgF7XoEbsAEQEAAQAL/Ag6yqqc+vXzAtnZ
   34.54 +R2ky/eDtvZX91iQdC7HHWGYCUUgCaVKahTrunbsbp0hTq5EBFR75apYBpgQ/pfrM
   34.55 +X+jmuGwq8iU1gFMks3Yu48stBt2B9t6O6+dqlTJilDAw2/DffS0+srAAfJsNp29b
   34.56 +AFf5SoipFDwHNVOoOGKx5WDWQd3F6qvPzN/bsP5i7yoPdhohRS0PuIR0jBuHqmXg
   34.57 +timyhnSm172RtO0tAqXoLqEbV/VzCNbQ5kDBilJuwP8Y1L9uCCcpbDmGVoRAj/sO
   34.58 +4qetAnblKkFFcwObKRkWBFJMLEK8qxbUlyIuO5ETNdPnTDonNPQdplupEkIurSwD
   34.59 +qyZMa5LPUnxPGsYzRjsrj5JyFuva5R1zfnv7CYUrYBqZUyfESPo2Ia7HIbW78f7U
   34.60 +CdoxM062zklEMMfoX0TvAOr9ovqYHzGu9hFESRo3xBKtu+3g0a2o3wXqpRaOpK7o
   34.61 +y1RUq8dghHPCTq5BzIAHrc6jCInN1kViAv4ZLLWjV63PH/+YAQYA42A0YENpsg0p
   34.62 +VbEmWsKgg6bg1H/RLhkUI9EEU3Sojmandq3pA4HRcjbDdpcp/yijC9xL9z6KAYdF
   34.63 +kyBzYVhA60MgI5wv8kMe9jkTa9Uaqof4hcSSyWmHEyH/OZxFx3F7Q4aySwU8Onx9
   34.64 +SgLyZyuyEI5Ys5eqMackab5kRI6qh8vlhguvyEXhjPMcG9l61Gya0y/MPWYEre/l
   34.65 +AJ6QTihhvz5CAW9NvSlnq/xH7cNUKngqxUDc71p6qsZuj2zjd2WBBgDnHhoZ0Agz
   34.66 +nNBSb0ohOLW+1RKJXjXYkBbajLT4r0tSLei3OwdwlqwoHR6mgptEMjQif/kt+8XJ
   34.67 +3IngYKFJPKAjvirLTa2+/DQErhuvglLtfok+yRY5im0vGsgKXWmBcdp9ZDStBuQ7
   34.68 +F6+l1U/QrnWG370KdGgovgB3tOLEq3QK3jXB9R5aDYQ/4FLPjHYzt3bqnWzrWrPD
   34.69 +8IF+CdmBD2L4UZ9j9cGr4h8k3VqXlB2VIsXr5ccUQJnw0x/ioMqMLTsF/1ksnvRQ
   34.70 +n4vVQqb1sQ1l8CZ/QGMFkd3LLiDijt3HP95sRxEB3lkpfM04RBTD0tFnisOBOkzY
   34.71 +NXZTfkzlKjHrhzSidfautwo1jM07TAf88vrffHxUU5sdorAvna0x0Xi9Y+AD0Dcc
   34.72 +WycE7i11EcnZ1edkOtZzHthtXKMyMqe/X38bds39vZ9YuzLkRiURfhofOHCUhfTO
   34.73 +g5ybnWRXbywcKXned+kAqCHdLUHq7esQwZOxCCW8z18kkyjB0f6l+ZyRctb/iQG2
   34.74 +BBgBCAAgFiEEdNebRJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwwACgkQqOLEUwAZ
   34.75 +aX16RQv8Cep8jDIr2xEB0O+3aa9xDR3miq4Rsz9Pc2oZhjYmTCn+CNLaLyTMbZsj
   34.76 +CZOAO+NFIKKcKy5WW2HgJ2pEDxm1fFV3xLDClT9xT6tDj8CJVpkL/wJiVRcLrBut
   34.77 +auV6qTxt13U1dxFNAemPNl7XJlT1ivl4Ur3bs2gkt/4MkPcuu4xAygWpKCEu0AWQ
   34.78 +m8aDbnpCG3vMLKMUo1VXBkhm16bXKDqOc40g+vLoKW1fYcgozSzFLPDoz3hY4Mwg
   34.79 +X6AlOW4soa4tvrB2mxG4AcQBVHFUrwcm3MtoXSJUiFKz+s0geySqoYG8j2G3lrpN
   34.80 +6YpB+K8qAkoEJmpPLE+J+GYVl4RhiBVJoiVHc2TTRirFTDa+s/kj+xSXwDJ+b9gT
   34.81 +dLd6wINV2djC+YZedO+bj02UQ4z58in/PSl2GYynQeEuSX04iwjeRcI/saFpvVo4
   34.82 +S84RZ8OlVWTDDZKeJMfeCJrUoc3MtMlU0V9/kwxtmEcMd65tZWuMR/AVyHh7G2vm
   34.83 +Q6EcubXn
   34.84 +=2cF7
   34.85 +-----END PGP PRIVATE KEY BLOCK-----
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    35.3 @@ -0,0 +1,82 @@
    35.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    35.5 +
    35.6 +lQVYBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    35.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    35.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    35.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   35.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   35.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   35.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   35.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   35.14 +ii3YZy2mWMv3nQkAEQEAAQAL/1KR16CAO20srjubKxhKuDnZykptn4obke03C6Br
   35.15 +ZOFANeYW1aPqZ70hXBMZPYJlsmNn2jeXbhblKm60CUkiv7qKhLVlNhe5Pl+EvFxv
   35.16 +aC8pBHBfamTY4MyT87C/gY2MPMIBNedilPiT/9oGg0yIK6j3T7UhayVBjhFpjoWh
   35.17 +47sPj+VLEidfpVUzFXZQ3ufaSmeO3GNf1UsGSz0l2DWFWZCMZnhYFfKJodDmakKT
   35.18 +z4YwYW/wOWteMooCa0UHnF/3t7C7PdIxjImcN9mrkDRUrf27RmOIapJoG1dlJd/p
   35.19 +LdM1/rR/M68/+314GsrdMPhBne+0qzZEjFAwKC55dMF4aN+qtNFKHVcfxy4liVue
   35.20 +936V+4CgI89rlvusKC/KbX8SPQ5i5ci0njKPOLi7nTkJRQ/XqJz1Z2/Xci0/vHSY
   35.21 +WfhFafBrAlQaLuUzGjkCHp6qDAvhBBO7TVNylGY0oqJZ2QQ4u5Hu8iWlApwAmgBL
   35.22 +Jn7pytWN88ko1hAojRupbIkPBQYA65Xbfl7J+Pkv2tcX2qPqdSc7WwRhkDm7FvoQ
   35.23 +lyRLjPdlzofJ49thnQD6VJxjhis8Tx75fQylEW4gJaUlxZzS8QFLq4ZQkRNF7zGK
   35.24 +5LpmrgdPaRuX3C4fhPZoaTbcbCu7LkOj58wQJh+/HmBJx9xiescrXAWwgggCP2DB
   35.25 +mgIjp1RRvlueHBQJfk7Au9mvYQjdLe5me0VlN1X7S/yxO7rjt4csljmp04rwjzQG
   35.26 +zIYsDZKy4vHfLQAOd0e8JrImEXiPBgDtmN6H2jzGE88TEJ+k3uJqgzolRT02edXs
   35.27 +btQjLBaWaf9I+Zp9Ftp84FxePLKxHqVgtKw4ucr96r0nYakrNyG3/5zOd+HiTo7n
   35.28 +qFOFEl0A4seMEyCZfsPZEN9ObnAMUTRghQFj2OawVHA25WvaG9MQvYt+1FdMvTBF
   35.29 +j+zvDQzpyqB3Db9k9/p3xPM7BSgeeiKqsAxvrk1t+0rLAoJaMcN7UkpOdTPa41yt
   35.30 +5aWzKHoL84wgB5zPh7Mm1tZMGh/w7OcF/1g2HYkJgx5tjChGArEr0Vmv1XYM5pp7
   35.31 +0MinHlCNR/52WFPOcbEFrxlEAv1yhNTcwfAewvqNTQJMkXs8hxAKOwlhLCAIj3My
   35.32 +jnreBqjq8Cy6HlM0J2ioMUtRcLZypvQXZYo6XG8+chfIZ+t/nXgrdJnv8YqmP9Rs
   35.33 +T67cIS4AfBC+XKExjEmaBZpmsuZwUe4NadCR1ON6fAbfIn4R0PARjmaLE6oDKLkj
   35.34 +ITTWGmIdimfFOSCNoKYqTXCCcrSIkJZMjsi9tDRBbGV4IEFsdGVybmF0ZSA2IDxw
   35.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEELiEy
   35.36 +XSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   35.37 +F4AACgkQ8JWyAlA7FNjU6Qv/VWgdluLNPHO9yck3IEvoBN6Aa+q0r8UyylLj6hEL
   35.38 +/KUdUVXgS09F1WxbFnc17RiO6fxNQPedVLNMd9I8x6bEG/x/9BOb3y0rzQSpL9sh
   35.39 +uvkbIti/051wtoxDOSsgNzkRI5SYHVdsKdUU1SARAs2H/GE0C9pDxleF6CWbRQ+X
   35.40 +X7POQy6nUd5CHNlMyLk4S7vFlYa30DptgmIosjlJTVh8t2FaHcU9sdffHzazD/90
   35.41 +e1R4dgVMjTPIKM2wwmoau7iRk6VZZ4SIpQkbqyPIIpYcgDIP8AnaFouz43PhJt7U
   35.42 +HcwsfnC4cDToCZiRIooBuJ0FFCaJQJ5U2uaNH2J6Ueb3LCFS5futhS4lD+/6RO0U
   35.43 +4bKBrlrxfOuluZuKKX5WyYn6SPcMQjfXeEyScnucPvyAHFptqnKM/0TU9xi9mxXE
   35.44 +K4kvuPZQj1vXIUR9rm2MjR6OA8qoI+d/8PkfBLnE2hq16d8Uu8DDUERil2rywptz
   35.45 +3q7mxtYiqMbGWZu5hQCBaHiInQVYBFu2SrcBDACt2bUNSzhBoYbWbrLCRfauPdhg
   35.46 +y0HlNPObu1sbcXaX1rR8eN3GGP8oEEDAehf+0CEauHa8BkOqSRamCsHYJTOQkocr
   35.47 +8h0Ole1RvjY987ZnOKcD3keG3HxDcLKkGUHimPI5DXNKqDvXjL3UCPDq9aesROQ6
   35.48 +x2AS6qEbbJCTsiIx+LeN/PgYTlVNjaG9BGoF9U4zR2bjH1TZooDAcLvx/v6KeZpv
   35.49 +kAppxswz71gVsvXNGeTTeiIErF2I2XiaEA/0g0J3RxNsgD3fz1PBZcmt4Egte264
   35.50 +vV+LmxNC6zK++Q/ZZqR4lYjF2OWzrxYJfvWP0R4TEaOPldq1SkR24y79Iz9Lbf1O
   35.51 +X5vrr7gxYn8ZeucAIN3/hAPOO5ngm22mB/XNZKKL0gX8jLSnTteFm87wUggngNK9
   35.52 +rk5CJUQFpEiRA+dogyUKNT+PQDYyURg6s87vkCW3d3tabvi7vko4xrTdGVtbT1/9
   35.53 +sqTnJ7n6Nio6dbdnEV462i31LM8vj0GfWZGsLLUAEQEAAQAL/0I55GgPhvstcqWe
   35.54 +Hte1+j4vDg31cAFGFiT1jsPaCcDWyAOAsY8Et7KF2nzYJerqUyoQKh7/TeiBFjEj
   35.55 +eOuDZGzG/NonTZ1gTLrueFBKVmpk4O6uztWXiXjRZiPwATK2a9ODBa/jfYRjt26e
   35.56 +B1SiRwDvb3fauoUKP1wok7zHx5H8usPKoaH0uTclZH8SPudNJsCPCykrJtIPPvfQ
   35.57 +GjCaIFIU99lW6DiaQ/Dm1MnTViKPIiXTaUEZfjojCfe6dbGCDH+FWGXygKZEVO/9
   35.58 +tigvPKZ3hbtv/RpMupiSh6GMA+03TnZrtEYUXUk9FcCgqvkjKysgYHBF5IdnKgKw
   35.59 +2L7jKZFM8+ggzT/BsVfoeygcacSVCrawLqn0EKTlsHS30B6POUIJe9F9y1Y0UJkp
   35.60 +Wkpgx/qJyP7DZtFyZs/aF9/5ysMSQCEFUnd4xIkvRGWa6XcB3KdiQDP0b+xaqH69
   35.61 +tK/0gMQ/tcvNeh0vqXsi6CAWbjy8oxWP2I6a4ayEAut4hldaswYAzXnxR2ChMcrM
   35.62 +zQDRP3zd9/SmsEi5ouifDgVYzNagbtWK1BH/xdkrNdZhKrwIxO62fqpgv1E9tSFO
   35.63 +uySj8BWwdmcIpYNGEECGTTEAWEyEWER8tM8Gsq7gLj2Brri7nge8sI7wa2fSqB9q
   35.64 +6A829ocBSFGXfMAaAMJRRy8XWijDLj67U0RVXWMvdqF/gzme5yOWhvnjOYfN6U3E
   35.65 ++QJ+BJU6NwUXeTWPF1pbrUoIRzU3tRHvW3D4unA0oIgajfSqa5G7BgDYmQR6DKQP
   35.66 +WvuiIlPCx/Vhp0j1eRPUnGX4hScSV19fDIr9W/O/d9jT0uHbql2AxWR5jBp+IP4N
   35.67 +mekGXC+eEW85XnPGPJekXsL3UGKV5IAVzXzspZAW1ziFPXVnRERrgp1Q4or7fRx8
   35.68 +i7qiZmB+SUW0usekiQU8j0eFz0hrMQXQsLxZm7k1Kv5gYo5oT+THTT3TSVaU9pH8
   35.69 +bfAhDu/daRjlFCVhrZfjmvO9zR3C7b6WYSgwVRKbV3rFmo/TFIshXE8GAK65kS2Q
   35.70 +qW+K8m/wujBf4rhFsomNP8c4PI8Xm0EtLH95tifBNIUglnUIT951XFd1oZxPi8XM
   35.71 +zh/w9m5TgKM7AMaWerihrMu46RRzFXMVbtQRehh472IgOwevm138GzajkN4Qk5Bj
   35.72 ++ZLU1wfeMq+Qteg8TP9OhKO9Q0SVcm75BOoVVwlAKe5e29cUnoNRrW3IlMPqiN/0
   35.73 +TBq++yT9+7If2ssRrewJYBVNdoSvwfC2aiSYX1/4sEo6xWWwi2s+flHHDd7aiQG2
   35.74 +BBgBCAAgFiEELiEyXSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwwACgkQ8JWyAlA7
   35.75 +FNiVrwv+IxhA7UmVxTgcSQeihaeA6cVJPLF8fMZb6dpR49RC2kD6xeuwLdv10RsA
   35.76 +2OopdY4FMXhfW0grI9gwRokyC07re9lF7rdBdaJD1M135CXfNoR11kutdrVxnijL
   35.77 +54pUPZcuYIUhmGfy5zMiZKqt3hnPnzeQie4Cw5T91E0VQESd5D3gUSVqxiIxNS1M
   35.78 +PjZc6zy+tcgKCfUuS8kIOFJlk/dN4uHZhSJPDo3tdgOLW/YXa8JSGdHPRYIijk9f
   35.79 +RyFVlxDetLybjQ1pjkO3auiFT9fZifK81hkbfz1SCcRmGFe4FkXexQVBTFChLSQC
   35.80 +BLaw8v/ZBZ6lBV/BEt3kFCHZ60BmeBrdv0YGimcYH/DJgrJZMYGcYvzmupZiDJFB
   35.81 +O0Ky+y9QS365buP0f3/L0zbaEYBxIaU2rUL5pjmQf0zfZMUiSuaAydTJ976tbnzk
   35.82 +yRdgI1paKCNWh1yxoKvKVyEJffC8VkGe3ae9PsNONu+nOs75CqAbQRkd4qU/7UHU
   35.83 +tfgygNHJ
   35.84 +=BSKH
   35.85 +-----END PGP PRIVATE KEY BLOCK-----
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    36.3 @@ -0,0 +1,82 @@
    36.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    36.5 +
    36.6 +lQVYBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    36.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    36.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    36.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   36.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   36.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   36.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   36.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   36.14 +WGRPrdsWtFU7pwcAEQEAAQAL/A4uF3B+jvYKSw0gjmt4EgwNlgtBnKk1KVyOgQbG
   36.15 +1pwFPPOR999q5PQ8IEv87nCxQza6+SxjKNeCwARAY0tOpMWbGHM+UiKu4oZtDJdu
   36.16 +SWiXU5kQaEDsR51hsNpGvt5LGCUCQDYlKq2SR/wSjIt2LUB8Jed/o5kHyRQc2TXf
   36.17 +SVaSsW1r95v61CxJ5lYt5U4A0ySmS85fCQeJflvkfe+rwf7Z27W/vodw+1yC6aRY
   36.18 +OrAvnYz3fV+mZ7Y57tOFIpEWujQ1mR5ENOx1/uDqRYFFrZ26jJlkWva1Emoe6O9t
   36.19 +Zd8q99Umclk1O53CVZvUE3OzzOG/CH7fES9iVX2ATCNi5tcGtfpS7pCkEDrmmll7
   36.20 +MkXiRznUg26deOvQkPi5d5kIX3QEH9qG+kHjtoNMIO8vge8vkYtw/iYtQC2/F3E6
   36.21 +Kf/5fVTCjAxOYvohgC14kVSyQ+9dswkXyHbRxxYKKd10MK2bFZN2sJjEe6qEJR8b
   36.22 +2hqc3ue6QCqIKxAon6wNvAwvVQYA0d1U7ZPXG9NmyC9t1JL7pKhQzCFYHeDVowxx
   36.23 +tdBQU0VcGrk8UC6CjQuf4RN0X+boVU50YN2K9pH6kkbm7xYlI3KRT8bh6k93NR37
   36.24 +lmVasiJoQRsrIf9IiBAuasffbK1zRKS866lhE7fr1Xuld13Smnjua7/n+6mOXUNH
   36.25 +C54Pc20cYN4CsFYk+8RSWaKBa1X4OJ0Q6Ol5Wd2m8F2cULhH9081GUAYUUVW6BtX
   36.26 +DXKy+a+F8VNv8bzgF8LS7Bc6L+xdBgDY4ieEXvpl+QFBy9jkGHZD5ENfeYMAvVqb
   36.27 +0LtzHjfcIbar4cZHIlpYmvO4uBGLQGDVeVm/AVrmJvmkcsUfecEI7pWVfbuKeckb
   36.28 +dcAyXOjkPLK3nwKQ2rCqvSxkjuR+7y7kly4Qqg2BPso0D8nhVQ+sFBFh2X24lwRf
   36.29 +HRqLlVXYKQ3j3TPR8ricmiWDAuRzVahQ+n+7oYA//WgrAMBt8a4bYyOncarN+Nt/
   36.30 +wQRXtBQq5BUK4zs54wclKqu6YpaYyrMF/23QSSA5Qt2gUh1K97bwk+6ntYt9sAqT
   36.31 +FG5MUI9k1S+ZoZjgOl9Qalr/nGdBe8cUyhEBUwdc9GxMD3xlqEa3e0umNIrZHHY4
   36.32 +0OFtn6rmEMAwOfAjql1P0YdGvCs/w+SWp5JlBo8X0Sudwo0vDFSFlbk+OvwMWBKP
   36.33 +6UDstBu73Q7vuJNxPpG5FNdsWgJPWUt1hPEkUJuD5L24nk8km/ravRNgnyOYuBZJ
   36.34 +NRiK3I9p3lUHFv5bwAd9HAJvNaEFJ++JRtbjtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   36.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEPB5x
   36.36 +PYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   36.37 +F4AACgkQF56qJKIW6Vr3Ggv+JdIeNU+98rzlj8gvJsj1DzJs8dgOc5SbAzYblHpL
   36.38 +pt8dHMjUNx8jEVxXUedro2IDWAWMfyVXkG3ZA5Z8/KNdEuuH4G/THn0LBzgkLUGk
   36.39 +/gYQPlc0zXhMAaZDc7N78d/059dVcMmU75oqW3FEQmsS209nsobpdQZM1kOr48ml
   36.40 +F+2y1rgbPQ7RhtwRtEjxyDtncdNPujx4P/QKejKTZR6Edc13XwERD98MwDDjP08m
   36.41 +3oNdsO23bK9QNKqnZ50ybIchx5aASBYZF5FJyKdorGE3tvhPFGHhvF8rRcaeXvhr
   36.42 +pghg+5SzQ4qlEE+5G5oiyvPA0WtDadZiXQ+QfKLS66eS1Pvfn1mO9lWOxJXKHhj+
   36.43 +VO57gUxW0FcXlkC7KDQc0DuiDAyc8Dt7fePBiXzMbVYFE/UbChBmnY1KQkoe+uNE
   36.44 +tVKWctBVSpuU3/mGUNfKdVBxbKGe17wYeJ4nz4BrKc8M7mNpqzGslMmtMEz6yW9C
   36.45 +Zw97Uf2jVQW2upzkvX1+7xbnnQVYBFu2Sr0BDADCoGWh9r6YwoBMmHKMDBHOuqQf
   36.46 +69i34kzGI8alUDVv5mO/As19JdwsBbFlzU4IyfwpCiUS3a9eLvwEoQYSXxvraomr
   36.47 +e0gdHhExLrkaxhjdY802pJK4ZGnSJ5pNx6nz6VWVN1B8p4FUDfdMOVCPOzo1AHZh
   36.48 +pULkx9s9d+rEq15npB9R9C07KTmNZmd/SMm85f/gmmd6iCkdJQ8G+BfUPdFOTA/l
   36.49 +0rm5szCp51rC3EaEK5hc2PULuXRYh+365CM4aWu6iVgVibIXLIOg/Pd9wwTMrH4O
   36.50 +8v/zjkPd5DF/HprJevKhWnMHjiex8IMX+p9UTHqhyEeTjpZTHkep7jEuu6JCenmN
   36.51 +l6pw/gQSqHldMfbiSbCTz/Ywmk1MlrUjQ+6BCLsjZQ0KKQb8pSflfUWEFjYYhVvC
   36.52 +RQhmiwcCERxUDjVZZUwxoeAio6xcuUnEct51NI4FgXg9Z8iTZpF5UUJMkA2s3hyo
   36.53 +dwPNh0e6TvGksNbaO5W9cxETuPZrHj0dU2SWrHsAEQEAAQAL/0VicVkgYiqLjLnB
   36.54 +z3RmCSMuHrzSk9xabQxmTLc6tRJDjGPYV/G5wZhgHzIv0xYHDEKFP1pOdeqZzXbJ
   36.55 +ASUjiwyOWq4rsTXQNkjWY19MKCklH0/PtA7QnXkybSw1dj1ifgRISAVoog6ZPASM
   36.56 +mk+1ybaDh7Cf/g0ZwutTCPs8LNe+BvxslIN22vGyBEu4Y1NYm7Qy15kzWZTuVUEi
   36.57 +yTv9HdVQAIrqaRPu8fZgaFb3uJv9/r97CUE4yGWXcBv1oSjHS+RAKcmeekOA9Glr
   36.58 +hKWargCsATScR2MuNo8hKx9ZX9WiRD0WjHk+sNiJBUWpcE4ky0hLBhblMM3LB/mr
   36.59 +jNOB7fsUYhMwRo1LIPxivIEo+VOXEVfiYR8OiZI+QuJeOkpD3NIxIYjwOgzPOKqw
   36.60 +LgT5T8Ugx3e/hAbmrEJPgt3bOoeKkgCgsLvWOvbVKp4HEpxPXcDc1tyMhRxnaDxn
   36.61 +MKqyEXxZRuaX7IOiWVi4oY+FV/bXzN7a2L5jCw+apTtul6orIQYAxTbcRYoBM0pi
   36.62 +e2HQcstBeoSf3/BYgPH7qUZJFG6wUuKPfBt4LGftce6Yx8UyOqWide2oNqtPVIAG
   36.63 +IcjiPTZC1PLZJItcq8qmPcGxOhKVa6Cj27H+sTVE2QeTTuuNsczxXj5DO8BCStbJ
   36.64 +6G9kULga/ncNsvdh/uNZDmNgJcy8w28uays6cKtCRP0RJj3VjlRwZrhVjl4x+fv1
   36.65 +yvccsoatNyDTAI/j1I0IgCusAwzc340VVSoMN6AKFGj8RkTnT5xNBgD8pBG6m5a/
   36.66 +NS9HAPyEbEMstFw5/rWnZ+NuFBZuO1eP8t8vpYVEejkedWHvRmjw7GJOO9naM0RV
   36.67 +DI1NjYEX1yPESJbREft83ahYQeQDVLxxyoYtqsaGoUovXUmH5ZXK08APxPeKR/PB
   36.68 +LQUKUyoHxBXyeRuFKxJ1Yy90AoeSbIGKSoMokKqN6UNWRsouE4sIxtkdSf4/U41M
   36.69 +L4VUr6TQZbh77scjHdUIBeT+xdlrCu8yCgSQWOOf4T7hwYQX7JOIr+cF/2DGgvJ2
   36.70 +EIAaeJ8oKjb+MLr/QpnyMAC0cqXVYov0RyVhNKYDuMZlaaU61S/wBrMTnB5tX30U
   36.71 +XxhhVSDWVq6ulZyqj89MR6F4kTMpAN+AbIBetY8NgEgy7RrigcgIU5vseT5j2kxY
   36.72 +xx+7xCQ4WRS3LMVz89PNG23f4OwFg0xJV93HoBkS3Z5BEwCQGmIisCHjWiBAnvyu
   36.73 +5nDGKUTzcsso7v0eIZBNmEXRS8s+/sFK2t76gIBYgdtJeTd9s7PwvWWcE861iQG2
   36.74 +BBgBCAAgFiEEPB5xPYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwwACgkQF56qJKIW
   36.75 +6Vq3pQv/Q3Cya7L5MDbn0y0Xq6pD8bXIfiRk+370v8vO8jWuLwwII//pH/nYWYxz
   36.76 +tfLgyEvwNBdROWeOLEyHWBehXsXbO86wIgypPcAyLfBSNPR3R/axEAfo4nWIEPRS
   36.77 +0hun6I4Ytyc9ENhM5V8+j3JkmB5A+oJ3H/0b5ZUIKzHfgwOghPoh6GrywMroDxDH
   36.78 +V3S21foTXfk6rpkj0SlNyOyOD673QsdpjwZmSkyfi0aQHKkAUitXryqGERT27KcN
   36.79 ++ja2tCWtBVLMfBVUMctXib0oC1PXwpPa/iT9r8CoNo4NgmuLGh/snMzpPUWFRFLp
   36.80 +O4VSK1uDuZwfzedQ/uCuyPXs4hMytUEmUPFV8Fuj+8n5Q/3QTkQonOfGONIvb9M5
   36.81 +D60eXl/oex0oSG/ptjGxgieC4/cMp32NZK3s0/vHEt9grYRtfi9jYOqRh61vt1N6
   36.82 +a4XZxK91mU1M1hrAGz25CN1CzNN+4UZ8UrMN7Gm/pgxycvTOh4+cloA0IlM42utR
   36.83 +u2uFhQAD
   36.84 +=CwuW
   36.85 +-----END PGP PRIVATE KEY BLOCK-----
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_priv.asc	Fri Oct 05 11:53:18 2018 +0200
    37.3 @@ -0,0 +1,82 @@
    37.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    37.5 +
    37.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    37.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    37.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    37.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   37.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   37.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   37.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   37.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   37.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   37.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   37.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   37.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   37.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   37.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   37.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   37.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   37.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   37.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   37.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   37.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   37.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   37.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   37.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   37.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   37.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   37.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   37.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   37.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   37.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   37.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   37.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   37.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   37.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   37.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   37.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   37.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   37.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   37.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   37.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   37.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   37.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   37.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   37.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   37.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   37.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   37.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   37.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   37.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   37.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   37.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   37.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   37.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   37.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   37.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   37.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   37.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   37.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   37.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   37.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   37.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   37.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   37.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   37.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   37.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   37.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   37.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   37.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   37.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   37.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   37.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   37.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   37.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   37.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   37.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   37.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   37.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   37.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   37.83 +Xfa30xD/
   37.84 +=lDJV
   37.85 +-----END PGP PRIVATE KEY BLOCK-----
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    38.3 @@ -0,0 +1,82 @@
    38.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    38.5 +
    38.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    38.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    38.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    38.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   38.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   38.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   38.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   38.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   38.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   38.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   38.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   38.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   38.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   38.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   38.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   38.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   38.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   38.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   38.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   38.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   38.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   38.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   38.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   38.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   38.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   38.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   38.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   38.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   38.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   38.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   38.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   38.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   38.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   38.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   38.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   38.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   38.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   38.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   38.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   38.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   38.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   38.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   38.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   38.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   38.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   38.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   38.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   38.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   38.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   38.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   38.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   38.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   38.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   38.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   38.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   38.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   38.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   38.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   38.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   38.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   38.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   38.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   38.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   38.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   38.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   38.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   38.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   38.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   38.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   38.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   38.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   38.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   38.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   38.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   38.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   38.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   38.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   38.83 +Xfa30xD/
   38.84 +=lDJV
   38.85 +-----END PGP PRIVATE KEY BLOCK-----
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/test/test_keys/pub/fake-schleuder.asc	Fri Oct 05 11:53:18 2018 +0200
    39.3 @@ -0,0 +1,31 @@
    39.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    39.5 +
    39.6 +mQENBFuzQsIBCACmVeBXI3U4gC3K92j/YACvhE6UropldTMUNomDZZI8Lj3CSry2
    39.7 +Ctiu+n3W0+arJyzkmj2dFzNn6z3iAK/Y9FVR71hyF38Zabg8iz68O0Ozjbl+5KCt
    39.8 +ZfVpdGT7xlFh2e+Vk9ZZ/XUy0aigama9ksEl+G0LhKsYGUsNbyk6g8XvSKm3yDUF
    39.9 +09b8hRV5a2kgwd9EqTdGRAFeR249u0+SL7Bp54rAfZOIEkRW51PCDOd77UmemMqw
   39.10 +6Q7aoi0G0+cYyb56cwITPjnqOI5p8cjH2wocwuVFrQ5hNnChqCVRDMQNw1VkodQP
   39.11 +wAFVLEcoAK+62ODQJN2QLOlUoLMOz9KH72JjABEBAAG0MkVOR0lORS00NjMgPGNs
   39.12 +YXVkaW8rZmFrZS1zY2hsZXVkZXJAcGVwLmZvdW5kYXRpb24+iQFUBBMBCgA+FiEE
   39.13 +Cq7ho+5b3T5/Wcu+6DUl7LL1JPoFAluzQsICGwMFCQPCZwAFCwkIBwMFFQoJCAsF
   39.14 +FgIDAQACHgECF4AACgkQ6DUl7LL1JPr89Qf+NrfTVtc4TrycPu2oWRnbJndJxkSA
   39.15 +uPgO92RSDc68A3YxIK7FuquT3CNUG9fqI2xFrYWl6mxcOQBxbzh8pcU67aellOem
   39.16 +fnr56ZgFZzwOwKmDl48sw6+axLVZBxtE6aqLGrJYk1YPqVmzViSUhBVyOyVthAk7
   39.17 +mUL+psfjXBaDsGFbKXPRsDpjMMLeDocXqEHJbnZunGK9o3bm8uAj0bW0LyJjV5WF
   39.18 +l2yhnZVzs200OETAO7+xBqPpjjGvp3/Pc4NybAX3C4XoElIy3Fn4I5xJ+sxQDIZj
   39.19 +UAwu/nT4Fyik/XVcP+/EIi2Yw8Y1S9fEENetWl98aDYNx2RLPlpPQlU6kLkBDQRb
   39.20 +s0LCAQgA0FmaRW42+C6DrvgkacKet/nFXUCiVAd8yYbS5P22pBbuqMfK0QowpQMK
   39.21 +5Uk4XiMCMJY0LKg6HmgNUpJWZIDNRaYEhvllU0OdZbbQQJ5pxGVN0U4mnmMOCsE7
   39.22 +FkIiwW3IeNrHbCUmNeNieQhecXevc0H7pVHQ7QWBSiI74/RY+wi9gDAYpHQN4VBk
   39.23 +3+oSDDFR9Z49VoDvMU/RLUUtyU78WHoxfL7U9Q1kdFwFREtcM1FXQORDxDOsa5DD
   39.24 +QALZ1LNJSaFk0TTqaPcGOH5qM1X8wdNN2cREGl2oDjLUyas1SFAX7SYvwUuFhpfF
   39.25 +w8Sn8yRNTL6Yd4X8YNLbmJth+OIiCQARAQABiQE8BBgBCgAmFiEECq7ho+5b3T5/
   39.26 +Wcu+6DUl7LL1JPoFAluzQsICGwwFCQPCZwAACgkQ6DUl7LL1JPpAygf+PrUQtxtx
   39.27 +SvYKUKU4afTiXeGIoAQvtrkEntenWAWeIzVEmQh2JdQFTRDzVBp6k5LY1QM8lNAB
   39.28 +Q8SimAw8qyog4M1H8OAXw3Dmb+KadoC+5aghG1BBRJT2dmVzNbFBERXTyfC5HQRk
   39.29 +lNWXM+IztTQ+H/K0YLN71OUx8da9smBgHs2AFglBDG4z8LCJ3LKCGVPUctAEMnje
   39.30 +yT8d5UtGPEitCKBuFBsq2ZZcjqc+zKBXmdoBcIOMfF0oX+AQqd6w4NH0tgiJ2+uV
   39.31 +TkmHZgKM5vLps+YC+r+1G+ymE3bitxwEaP+q5VGhKLcWuMkrj5Be2zdaJFQ1pZ8f
   39.32 +dJSyJu2U56cp0w==
   39.33 +=Zsve
   39.34 +-----END PGP PUBLIC KEY BLOCK-----
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/test/test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    40.3 @@ -0,0 +1,41 @@
    40.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    40.5 +
    40.6 +mQGNBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    40.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    40.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    40.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   40.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   40.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   40.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   40.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   40.14 +WuW5oqY0+BRGOL0AEQEAAbQ0QWxleCBBbHRlcm5hdGUgMCA8cGVwLnRlc3QuYWxl
   40.15 +eGFuZGVyMEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBPRZihfUaQ6ztbD2o0Tw
   40.16 +TpY7cwLbBQJbtkmjAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEETwTpY7
   40.17 +cwLbQ8QL/243450ktf6iX0aLoNotLdTMdtwIGWWdc9c+bIhu583EZewthxgWrgqL
   40.18 +wm1TdkOFxwxcJvGvi0X2AriLllGSDDTpvkxRw1Lc2zwASEs83ejNG4rMS2K7mXa7
   40.19 +Cof2Qdz1mD5e0PrJrbbH0HuhBWiFYuIhaa/KizIlZBNwp7BDY1fibJBGvAFkw4Fv
   40.20 +WB2AD/w0PSmHHSBRn+iJz591FIzoujXMqtVe2ogxC07fVhMnGEIFWKxXkRzXuy0i
   40.21 +rXJJ/jFIAI1otl27HVIv5rpuhoHyujxZquW+AtvqcK8jYmqaqE6cPJhZEvbtFNZx
   40.22 +3IMQdMecZbbLZHqyuRCbRUThA5jdoU3mcVWq9EKEx0FebLtgIdNhcX+IRTMRDMfX
   40.23 +Q791v8F0hiZfwm2daYokEyhsYys8apbkaWwARcJ6rRPsju5fN7ijcF+NnHO/NksD
   40.24 +35mn2hWBnl4gOJdN07zLz9WAyBXTfdwokwmF7S/q5SnhI1X4U9HKb5++mRP0+kfx
   40.25 +Z2qW0igZiLkBjQRbtkmjAQwA4wyK+uZrNstWaHsVY3Z+fpYGhwgGIrY5tHP+sg3V
   40.26 +yfvgfhInMbnAt7v5bgOfwSLZ9LdNqGZK+c64Lxb2vPXFCgqs4OoysxCGiik+fKBN
   40.27 +lWCrL8p77TD3Z2KjoJBZrh+gr+KUY6TvMoDhKk4UPCjTAs8x28UolzuFTt5TSNE3
   40.28 +1wJjfiQMoQgv9Vp8xKhLxRUa+SxI1ZoatMHvnIkEdvZIOe2mtUoZLvLnLrG0q2tg
   40.29 +ZZ8oJkZcjARoNwLMRtNKvgHIDbKhwfc9rAchtVLFk3ZmOqiyezxa9z03Rl6iRhPA
   40.30 +mfhL/6c8HVmf21x5qUU/r69xT6bva1IyWnRU8wpIEEbi58wucmI1PXejAP3yCWVd
   40.31 +1CZ85kWhYLl+Rw8awnPSSFnNVtsItAb1QulyMScXT5V0b5OBQesVX6VHBF5L8Xzk
   40.32 +tpmElfWcbE7Bg3QHS3y56obXxO1Ir9ZZkje+3jc8UcilI8sHWPZr8icstCmMGIWm
   40.33 +8+x0Cw0szAKZ1Opzn6re4+2dABEBAAGJAbYEGAEIACAWIQT0WYoX1GkOs7Ww9qNE
   40.34 +8E6WO3MC2wUCW7ZJowIbDAAKCRBE8E6WO3MC27acC/4x+mHPPkP0eur8yBSjZ3kM
   40.35 +gWD8HNGaVO7kBIQUnH156I9S1EzInl93fwTMWUPKyhghzVAiP4bDfjOW1OH0LEPT
   40.36 +OxU3uBNauWBnn63y8pYOKAlhB5xmxwqdluJDMMiH84N/ellUsowO/PoUN4cxXtiM
   40.37 +cVoyZbNEs1O+hvf+DODnxN1v75IKj94PvlZ8Nh68y09DGYhWNwm2VwiT0nddiX92
   40.38 +SF04WT+ucOsjGm2mw76gvMHXPB/Qa9FPjez6YObWXADK2rBJynwNLahb3LeE5JgH
   40.39 +Hpu7ONTjtHQPmF4TgKH6Fl/Rse66KwJZeYKhrMRSaflwbRl70jY8mcKxFtwGuIGu
   40.40 +B1tykpZMidZ0cmIt5eGfJ/NXTQA+AKBJ5aY5tW5ES9UCoWcF0p/5VHL+2l+exzkd
   40.41 +Q4h/dn002tIDbCykqL0CcwNz/tiiKo6heCCEwG4s9CovgIpF6s2MRVvKQjc5p5FT
   40.42 +3uhIr9IQ9gCkrmUfBism3o6/mLCfW39cAMQ3k/izRvM=
   40.43 +=txtS
   40.44 +-----END PGP PUBLIC KEY BLOCK-----
    41.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.2 +++ b/test/test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    41.3 @@ -0,0 +1,41 @@
    41.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    41.5 +
    41.6 +mQGNBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    41.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    41.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    41.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   41.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   41.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   41.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   41.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   41.14 +MtOUJwMpAelnOeMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMSA8cGVwLnRlc3QuYWxl
   41.15 +eGFuZGVyMUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFmvTFFJIoNSL2kEUxwJ
   41.16 +cwpUEmD2BQJbtkoDAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBwJcwpU
   41.17 +EmD2c/EL/j6lozpt/xio+XP6lLXq9b9yykdJpOFW6Zw8tB68snvliMQhVQui3NZz
   41.18 ++etb1KmO4eGRYxknRQKfYFZdOsgfWki+MTbTeyiXbS0TtAryxQEJB1SoU5/Fn3v+
   41.19 +E27WB7W4G58bdnQnULo7AwyVJQ4xqzBoQi21Zn8T1cnkq71AQ4fX44pqPoLKNpWy
   41.20 +tf7B4p6Il3p8KCZlgTNo5LlkAccV2nvPDEAf0pBSZ6XzvKWhg15Is4lIcIU8TUhJ
   41.21 +LHpuzQsADYBxv8FRQ4TqfQPqP0PJnWwiqw9D1y/DFdKQnxonDfmmoHEwxrqgX02X
   41.22 +QmV343BNMfaC/qXEzbCHtTd3Bg7nWw/8NSdYjE2FDM5x7BR9s5T2qnyXDav+KOWK
   41.23 +RIyEaD0c5+EyIafHgsCO+zFSdqgpg4hTKLqGbweqHGF5sIU0/fzl7JptczPCEF04
   41.24 +58FC9jzeI98wORUchEHo06ky3v2rnZ2FRxLEfDHkSA6CEnZnDUQEKyg5tKCFuzQF
   41.25 +kpaVtEf2UrkBjQRbtkoDAQwAtOGWjpeYKT21urofhE9qB0pDksAehxsHM5uWyJ99
   41.26 +i2fX0DkCuvdmvJaYNEbtRToREbK0lTpZJN2BYpc1/T+jb4NkJCxQXuCBS8ptkbAW
   41.27 +nPL6hftu6eco8jO7PluhHzpe+C6gqHEPOUUa7zG0afhggwsu0likKRHkKGYVH7ww
   41.28 +A5DHPh8aEo2vYObhVd3U6X/cO0DBlvJheNjqujW+GKoqjEAkhmNLe91guKYL1e4E
   41.29 +CTgN7BlXQyGuBQChcnApfI5O8HcmrH0sZ7NnKtozuB4AkBYn3rfoPce1OHrJ25Mh
   41.30 +VHPsjDCkCeZhtNFey39OxsmkLjjrSTo26LvIjLAKqxo6trkN7hLtnlTGDI+Cd10L
   41.31 +bVG93zm8D/RuwYv5EmRY8t/UsXyON9o3FU+cZsyGOiMsvi4CoWoDHlA4ADbOwN6a
   41.32 +030W0MauPA4zNuBGB1is7fBnTpPExyQLfd/xuJeaHn5nrnpSNw/JQRWaP67ptZiC
   41.33 +mmNlC5wCX8isPSN77E9xrV4NABEBAAGJAbYEGAEIACAWIQRZr0xRSSKDUi9pBFMc
   41.34 +CXMKVBJg9gUCW7ZKAwIbDAAKCRAcCXMKVBJg9j4FC/9bvVd8zvbyFZ++PO09GyyM
   41.35 +l2PdpHIKkADwhRlZWIg27rlrrIv7olli74ulBjb4CJSQkCKf1TZLR6B7QfbjUhcw
   41.36 ++PvuoImUu+28r4b69mXPyTIJNQ2Nbo6jWdu2ptzkfywJG/W5JM9WefcCeSMsvrEN
   41.37 +b3N+Mz99OoSOcsJQSmq3hM00NFxaeDVO68WY39k8bbrmCeSLZFO65fuIPAbj1OQk
   41.38 +sG4cOPYijSCU0aP7hYdPAu+y/5PPb9RmB18kIJgDOP1JoIeqPB3ZJNl8fVrLKUdV
   41.39 +JoENh/qCSBFp9HkChmNPrhHjtAMmPXzwbhoM6R7txu6yn7LCty1nMeSjav3SLHoE
   41.40 +uvqDri0pMC8foqbezb7K31EwQDJcNzfnSszfYf6iLWULBB60qtMBcVmdO2qzCDcq
   41.41 +TVvh8knra0GuchWEXUUORERBzidxz5CXy6TdjLEG7I2Hne9MeuUwpfeV4Dv0mgG+
   41.42 +0n5F4IBlmcht/cIZOl7afJP5HcxFKOuWQRpB1mStyp0=
   41.43 +=reOr
   41.44 +-----END PGP PUBLIC KEY BLOCK-----
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/test/test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    42.3 @@ -0,0 +1,41 @@
    42.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    42.5 +
    42.6 +mQGNBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    42.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    42.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    42.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   42.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   42.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   42.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   42.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   42.14 +Ln0EZR49Fm5yAWEAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMiA8cGVwLnRlc3QuYWxl
   42.15 +eGFuZGVyMkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBEaplPGQd8BWEIcCc8S4
   42.16 +qwumUS8wBQJbtkodAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMS4qwum
   42.17 +US8waagMAJFQBndihCqU8cbJWd50SiDKJKkq8YRMNSDZitPKpRR492+3m+8yRVTU
   42.18 +Kau7OVrJfPUpBFffHZfaZstjONUQGlPjP4zmJN5qsakrtcogPKpCslnBd5d/m+4q
   42.19 +vg94Xyh1vrZhzMqIrW5nu6LRB/gvoaqWPzXvqg/sGQMnpL7HC+uTAT11b5u8bHrg
   42.20 +RUfYfPwm6uWBaFtm+24rDFR6CbiD3pPrIlcuwsRwc1+JuTvmfTfuLzqOGnSMTBom
   42.21 +bG8j/Ep/urSnGvAmtjRH4CCP0N1rA3LTTMvTO+qtBJN9m3txf93iH+LFFlbXOC67
   42.22 +pBa5Qz0J7Dvrf235LUdPzh3S3McIzG59M+caQfLCSKq+car0s38BQ4XwPO5wcbe1
   42.23 +dbP0CkHnriPbzh6Uh4ML+gEiQm/EIopT4Xr9fDjQYNCs5k7eMYnjihuSjYGO8HJ7
   42.24 +1H+0m6r5qsXO7atCt4ABaqGUvYurbcdOJUqs3ZFKEDlZSPYV0e/iKYDPcoT3fumM
   42.25 +rQf8hAVCq7kBjQRbtkodAQwAwKrq3pXQlQDg4PQNnpYEK1g3aCpYsoOPvmfbDjBr
   42.26 ++egfb23dI81j1e5CaJCMEjNgSGjUrYwXUWFkY3p1Ko8BYI8//p8Vlefdzx2Dt4Ky
   42.27 +yhLyPmlVYB2V2KGkfT/EZyuoz8UoKY0ZTxYH9IFLLlTmr/XjthBRS9tu5LVDAi0H
   42.28 +/8Cg09orOqjo5aIDiELqDhjdrZ1i5hbPQlZIl/AYN3fVcFnK576azybu6X+NsApn
   42.29 +t0etAfNq4F+29Vvp253wQjypUHxDKq5t6wijSwn36NuVsrtBvVNLH4OtUpBYvCS8
   42.30 +5ouDTNinI4B8OwJFK1wBPCW4v8goS25lVQqhN1uVoLgjWnb5/xkKD6DgZlkKZZCw
   42.31 +tUrpSmI1WM8LJwCnQIdVSNwpQ2MK/5g9Tt/Uxr+k3cdS2yNa5+XCOisznpjHd3c6
   42.32 +t3TUfLVIN/AymMW2+szA9uBIOdPvZ7gBewEki9F8IyVINpD5SStpvJSFMp4ixCbh
   42.33 +cB4Q7JGKknLdTcI6aFzgmWNDABEBAAGJAbYEGAEIACAWIQRGqZTxkHfAVhCHAnPE
   42.34 +uKsLplEvMAUCW7ZKHQIbDAAKCRDEuKsLplEvMKm9C/9Uf+acjbtZkBLx3XhAfC/g
   42.35 +dG9bF3zxFfJ4HWmYkgSs6MAOzPVkbakeu/g6n0KA+hbGfN2HL4MXAoJim0lRelT0
   42.36 +XiRUMNanFag3L2c0jOccVrEvJe3ZzskUYujlP5VrlRdohiv2DqQ9gHAVjrBMq8tN
   42.37 +aCs8v6VpyKUt0HTFLUVV3lOjujZkkKAL+0Y6Dic8fYGJ57CM+AB09ykOMUK6DLvp
   42.38 +SWmNukn9RgOGDP+Dv6Qu3pcc/PmyAdeq876O6Kp3EYWU5CfjGIokGNIs9pTZAghi
   42.39 +OYedskfX46acXKbYSZGfh+EfTKEGkTQ4e6/T6JZi9+v+mO2UJkXqF20qIx+/lybF
   42.40 +lbNvcIrfdhd01xzDgJbq6qaraTKf1wNJfDs5AwifudmlzX0vvZvP71lEXbOlaZii
   42.41 +BJI3y9LCWwT6NOoQgLGVc2hqpByLQVfAtQDhafF4shOX4+TNWCFEMzX/4LVeRs7h
   42.42 +vq55IsjHfnTplniqWG3xcV/cpPCQ8OvknNjThzxNFao=
   42.43 +=Jo1Q
   42.44 +-----END PGP PUBLIC KEY BLOCK-----
    43.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    43.2 +++ b/test/test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    43.3 @@ -0,0 +1,41 @@
    43.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    43.5 +
    43.6 +mQGNBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    43.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    43.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    43.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   43.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   43.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   43.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   43.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   43.14 +2VVBJm5CGF0GJpcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMyA8cGVwLnRlc3QuYWxl
   43.15 +eGFuZGVyM0BkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBF9wdrvZLhTqSfDffCzk
   43.16 +lBlySzl1BQJbtko7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJECzklBly
   43.17 +Szl1cJAMAJP8Jm4z0ECHkBLQa04eZEMOQQnlGh9c2TYIUHpnRPjuClb/zjNqR8mz
   43.18 +cPSzYoVgh02bHZfDEXDlDBxc8BxE7D7gbjtG/40W/mzS6fKvzNpQUlMY4gz8xpY5
   43.19 +qXrfVouMuFDR87ueZ77vJEuZUh8TmyqiEkVH372LcY8uEcjOtTkE+n7wfYFiNQMY
   43.20 +dukKJrH+sFW8fXz5Ik/ktPsm+nKKsZb/GrOXpWwpLFYjm5L/nbugrytuhudG842X
   43.21 +YSPbqKZPnuf1CYAGOLly7Q7AevI3X60e45JzRMmGtIXjEcUBI6EDA0SesUa32rfq
   43.22 +veNbV53eUsELgimjkYvTrHAaPBtrznrnpdrM3j3ZorKlrnUF+PP83GCBiruHABEV
   43.23 ++n0ZLBR+iCspIn156cj0+DakPqDlEeWx78YDVbMNz5rWsvESGSpZJVzvB+z3S3S9
   43.24 +goRoC+PuCXM8CzJKUMzKqLhR37xC0h6k33lcqWvT0fL908ix9qPjAA8Uyz0mMk+i
   43.25 +8LMWpUF2dLkBjQRbtko7AQwA5VTUHI3e7nwI5TOlYxvqkT32KFLl+ODi9b7h15ZO
   43.26 +J84BIIll03m5Od5B9+yhnFGcP4+r+4ob0r1WpBA+N2qE+pMoqqPdX6ZLS3TEVBRS
   43.27 +Ot3zTxa7fW6RWOJoPnFMaWMyJrFDamrEm+tiCB8b654fSTfmvEUzB3U7Cnl1JEt8
   43.28 +XQBI6mOAuiQnkDfU3XRzAZ/R4ao2XelWf186AJGHQqNOieZbwLUrbXlJqhzSWCrE
   43.29 +CcKzV1C1cXAM19qJCnsbzsANTZH1ZR/cp57iTGG21v3nz41+mDPPR9YifZGS1Jko
   43.30 +PoXP74+FpsNzWaZh0pFGNHRZP7RrN7VpljtU04Et6Rgk0irRqvDpQztnFCm67r5p
   43.31 +6K9qA/ed23sNPBV7Ghbt6LSJygwAKBZUCJ3ulHc8nEfdlxPuiLqnDG3BLc8DtXEV
   43.32 +4DA2O5q4yVDkJaxMxypjFomdTqlzI2pInkPX5Npja8NXTXd/0E6/pyPiZofai+SH
   43.33 +Wb+M6NMlqbwdaivWVhBCLLj1ABEBAAGJAbYEGAEIACAWIQRfcHa72S4U6knw33ws
   43.34 +5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5dQFJDACOMW6qkDazVjjFenLdCxko
   43.35 +g+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQiy4kl70+pEz0eA6pOHEfmsK2ITCl
   43.36 +DCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLeRQN4lB0FmVys+lC9ad73Vl5Bzhyo
   43.37 +YTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEggirJTup7niIQfwm8bOuogt36+90J
   43.38 +sZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9rzxHpxKlQDLS/OGtBUz7AZWmZZnhI
   43.39 +ZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw0B9PLMSafP/i+Awf2vA0pO94uCGD
   43.40 +YG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0IaEH4EDChvYdfSNpghcdUu6+zBS4aA
   43.41 +B3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9SNZZYVcV9pTdbU6DtaQWmI3xMMav
   43.42 +XNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCVLqdCUc8=
   43.43 +=LncY
   43.44 +-----END PGP PUBLIC KEY BLOCK-----
    44.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    44.2 +++ b/test/test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    44.3 @@ -0,0 +1,41 @@
    44.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    44.5 +
    44.6 +mQGNBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    44.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    44.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    44.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   44.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   44.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   44.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   44.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   44.14 ++rKeexgmSicMiekAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNCA8cGVwLnRlc3QuYWxl
   44.15 +eGFuZGVyNEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBOlf/5W44v3UoSwzdDlf
   44.16 +FIWES53PBQJbtkpJAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEDlfFIWE
   44.17 +S53PXI4MAJR3ddyRa4Bczzsfsm3u1Ujg1cYwBv8y+mZaQ9MSwG9JxpSVZH3Bed9W
   44.18 +G8h90tLeiZlPm76s6oALjiUqjA7X/7/O+No7vOk6nyM1lRU52eXfAl3rMs1PpwJF
   44.19 +b4MkaacwraJZzDui9RPGiem82+ikCWXGb5YXVEOIi/qcsGI0EwxX62IwiOPyHu8Z
   44.20 +nZmqnOThUKnVnb44T83+ZgQuqDITOACB+uzHCgFOwUtGgjf4GCbH8viLZFOATrEH
   44.21 +UUZ96JQQbaRBLbx9ZMek61inhGCjMLHrybpa9n4V2yaRHhRoYMCR9YDZ4Hg2TZCN
   44.22 +OPMq9F9CuNK+chQMc8UY1CCwpswk0uYZWh6H1t0rhR+IC1FK+WfDOze7+sgNsB/l
   44.23 +hmt+P2dDG7jqk5UTkUW2LgRlb0h03Jm1jeCfSSLfSzOELKczGJGihXKtj7CXvAAP
   44.24 +SWmq10Bl4kFGEOl0GgxqqkO1ujtXLUU0idOK9w5GPEHd153O/zvwPcaWasGuVqiF
   44.25 +MVxGu8WFVrkBjQRbtkpJAQwA1AawhIeG9qirn3P12k2JfBmRd0eB2WypHi987kmD
   44.26 +ygiYyDZy1/8D9Msuw6QsvGhTu3bXvbHifBuu+/JPebUbJ6xyiNdgGMJAc6RVJiNz
   44.27 +a9Un3h9sM0P4lRfLCx0b3qdCafyc52YFO6bIAYtGK+0WAM2ya3rautPJmo/f2apn
   44.28 +98PpCMdpbhsJ7vHVoGG6+rakR0OCDe12+JGYQ0ilpX1dk0RwH1ErzpHIkBgrmcBz
   44.29 +F+gpEDvFPYpWrKOIzouKJlXi4KMSfjW3NayJO49BZUf9yk4GOVT/uG9RlPeK956m
   44.30 ++kDH0pESqpbgJbW36xIUgCf5/fZkrjuVXHpl58DVUrJsq1RFjtJgVyyd+VpZsaN+
   44.31 +emyeKJ7Vdu9VZitbxajKhsEPmzxlb8YP0UvKtcr4A2WnH7Ds22/j1hoy+1XTanXZ
   44.32 +MCnqc4+ilHt2oz4kM3Nkn7bizswaP3606O9XogTkHA6kX6qtGSU1ALMJ2fDPJjYH
   44.33 +jv07sJuM9DFciAzin2iC34ZFABEBAAGJAbYEGAEIACAWIQTpX/+VuOL91KEsM3Q5
   44.34 +XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEudz7Q7C/9k0vPVUQ7mP5B5Mi8yQLEC
   44.35 +cFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m2ptPhrreFVPcmIINpluQEWUsS1rq
   44.36 +e6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oGXR0G+ujZnjWuDIhqfkGUxhZCic/z
   44.37 +toboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOKIkx4iaf+bd+hwGkdo+Y87jHkCctW
   44.38 +9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAwwZflB98agOQWbzZ7HHq7jI/SXlewG
   44.39 +PRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOymamqLVerp72RRSkGfPpYcgCQu5qY
   44.40 +X9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+UgWImfUr8E0ZVgjXcEAHOUXjuIiZ
   44.41 +q01TQAnprcdREzJas5rX8jEttddKeT4WlBY5mu0oNrBiTOiQK2ZIG8M3Zch5L4I7
   44.42 +P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWKvVrZVl8=
   44.43 +=W5LX
   44.44 +-----END PGP PUBLIC KEY BLOCK-----
    45.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    45.2 +++ b/test/test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    45.3 @@ -0,0 +1,41 @@
    45.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    45.5 +
    45.6 +mQGNBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    45.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    45.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    45.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   45.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   45.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   45.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   45.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   45.14 +YncgyLU1Gn3bDIMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNSA8cGVwLnRlc3QuYWxl
   45.15 +eGFuZGVyNUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFi8wr8q4ePE++q4mteD
   45.16 +isoHc80pBQJbtkqHAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJENeDisoH
   45.17 +c80pZKoMAIaruJ8K0WbSOtS5xtOolQRmug+usnbk5LAlKOgD822qWjNmocO4+Xde
   45.18 +OMOUKcZS/Py8SbftMQkpo3urcCtH3xJYrOj16gEzZU57cgyfEFVOE2wYqGHxAM0y
   45.19 +0obJpHwfoy6yFxGCka8cKjevGw/7InRRWu6+dg2VLHvKmIKxw4PpOvGa/J60nObM
   45.20 +p3XLq5YdnNgbcGFwT0zWAzyD1qtdFmn+2BQ4e04WUnTYdSnDWpaZQ2GV/LYLTmIl
   45.21 +IIChKYem6jOxSXhkSfN85CmB5MT1gNBJPtZZ/hLqPNhRFz8cteKAt0tRhOYECG2D
   45.22 +nAHufJBMuDGkBtpzJQ5EJWEmglUv1Kh3pFam4lWsSFbdLB0/zzTpl3AnxELbjcrG
   45.23 +eHpTgYX/Yn8kAcdW/dWh79g8rbEYEhyniJLIgqvAKwZF1JD6gnXuuBXJOrUGOZd1
   45.24 +U+NFHwqRsPujdy4vWFRvU4OlSbp2UJen2RMhXapKVQJd1NX7yjMvW0PKiiaLIq+a
   45.25 +36zxUS4nCbkBjQRbtkqHAQwAwWdMTN0waeuEKkblFE9kjSOodgAZe53o3b3NMwI8
   45.26 +Q2004dI1vmw6v8e9s7mBE2OQmri+ioUmdwcjUGJVZJA7i0Rl9JbBWiOzzmV5YKpr
   45.27 +LGNUWAhBnjB28hmH/6JzY0wDxHZcmZ4/GiMPg0HxqyLdk/gfmCQCiBL/+DSPXB1V
   45.28 +v8ktGUvVTAS/RA57TEY/RffmplZw3KaOkVFXfT+XN46mGdJKp7KcWdbTJqNk5A3G
   45.29 +a8iviP7FVvlyvfxZk64+u2vp53p28wBzyivca5tKPSiUFsHEnjHZtQuxPpRdQ43/
   45.30 +thdBDgUEaqaJUf7uDqgrED48Qc0OXytvOz+MpaifwRQFuZbe0ZDvSje4ZjPPYz2p
   45.31 +4HbnGHdjgLLygkLyYdZIPUQfgtGnUBgWUAzwokU9o0nmNSnkbCrjolfHXh8edaaA
   45.32 +DBoZjb9feCzoqOlm6qt61I3pflBAjj6gUStFwhSW5jwgK0ajeA8QQmVm/2Y+fEA7
   45.33 +OcYBNZI37Vc3ktuuOUjrHWp7ABEBAAGJAbYEGAEIACAWIQRYvMK/KuHjxPvquJrX
   45.34 +g4rKB3PNKQUCW7ZKhwIbDAAKCRDXg4rKB3PNKfo1C/4kRd2/cjZPTNM6mRpX1dcz
   45.35 +TDi6H7eIzst8ZBaSVJCF+4gh536yv52+Lg9Uavgz5mZkHmDZ6MMTNOg9NG7aOaVb
   45.36 +eOfvldjfHR/gnhCUwhlgLWGTln/gAClRH+i/ASLF7zVtddLQfmPFR0Nrj5Bs49Pa
   45.37 +NyNsVxkwEPwfBLOb8kbAwzwgkfL2TRqbWD1BBH76hhTBQHaf364lIjdBbrGdgLWz
   45.38 +47thE5mDK/bjk/gUvRCYyqvqTbMRjRoQsvOXMl6tTqstPSa2UM1IzDJhg5JODCSk
   45.39 +dnWOpjPAiMj0xPCMBDrttV/USftPSva4cd6Yg0v8iC1r8nqtIiXwxX0gp6CrO4DC
   45.40 +b7QbUe0b6+iTaWcaNgs2D0+AXz9umY7FX3eX3fLdgFUoYih3VRNir4EML7FJH5Au
   45.41 +TEwuU33pgiHE0j/vcj5JWLC99bxP7Wd2Iyy1AehbAMuz7+HxnFzov7TvyMgjnnl9
   45.42 +RuIoGbkMahodbfC4XUQuV+H/mCQVXAgtF+NDjfepotg=
   45.43 +=059J
   45.44 +-----END PGP PUBLIC KEY BLOCK-----
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    46.3 @@ -0,0 +1,41 @@
    46.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    46.5 +
    46.6 +mQGNBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    46.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    46.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    46.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   46.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   46.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   46.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   46.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   46.14 +wOxN0vPiTwdHIycAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   46.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBHTXm0SW4om9inG3C6ji
   46.16 +xFMAGWl9BQJbtkrFAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEKjixFMA
   46.17 +GWl9NXML/0v4hbZztWksR550HhuhjsPv8seFyZiXoFiaSWVSH9iODF5Cewi9iZrH
   46.18 +aD9Ykae3k7rdikQFP+OuFWy4XaqtGa4owBRTpxyYQ8vTNW2OxJIW8C1ORg4ApfxR
   46.19 +BgApbcNnwFG3zvJhadMdSwxxPSvBXZ01UWrJkvU5PHZcpqT9anY1PAabMKlnpKoa
   46.20 +VOO++4FDK0rm3Wl42SJYF+lx3hoBk9Lw/LU/QRncFv8vzXjI0UYJxGTTJ8L3eDJH
   46.21 +sIKm7CjyqilCX7/AVQ90ALi/Y/Gitb3ttgY0RkDTZHT8tX9tDA0xXWO213vZkyC5
   46.22 +wQ7lb9brxTDA4yFfyFPW1c95loOYKqCezgg81erq7wZ/EcUHHG2AGHBGlyxdeGaV
   46.23 ++NRKNHmO5IWCS7pnUhMwBvZfdF+rPTAMF9OYP1OzzxO58DteXR2V4OogMR6OCcAz
   46.24 +K7uJN+eTA8upmRX+omv2gEFh6aBoOJnveRdXpKFd8Iybr3Gpj60OdA2wHXW1bbe4
   46.25 +/iX8mnnazbkBjQRbtkrFAQwAzUaLt7KYnbNbHVqnDEKcRp3A5H7JvQ2tfAJT7Mck
   46.26 +FRJHwSBGrvnULwOvUrBREykEkizN8kVRwDCn0wUp02/Q2FpBC4vXa0boOpP1LWaI
   46.27 +NWs2uaHskvMWTyZjmLYE2HhLLc84jUgo/RowCSVGG6nVp0UR+uEQiWScgw/RuIgd
   46.28 +HyhaXThpTnKNu1gQaPusTnFKHBe0dtyIhqi4Yi6a51jDWAodmrLaXYCYZGHDqTnI
   46.29 +2KZqvrGn+Evojr9qWu45X0E4FJXMQjQvyILbf7TfXOG2LksRR5FjjThE6Dtls78m
   46.30 +Nr8cYRnY8x2BNcSwJCt9BnIGt+l71gAYGd+SW6UwXLQ9hIqpRM9i1JQpS0BsC5R4
   46.31 +o+T5D3EXiJz3ghL6ZttKD2AfYNg9heD4LaOgkY9jkB5IGSOhuEaCN25q4bo4+io4
   46.32 +imR2bq9+UP03/+j7BEtqUBeN+WatoJ6a8S6pvG+B6mNRanqmrzZOmjLEy3eLh4oH
   46.33 +izj1A7DdtJ4Gy7WUIBe16BG7ABEBAAGJAbYEGAEIACAWIQR015tEluKJvYpxtwuo
   46.34 +4sRTABlpfQUCW7ZKxQIbDAAKCRCo4sRTABlpfXpFC/wJ6nyMMivbEQHQ77dpr3EN
   46.35 +HeaKrhGzP09zahmGNiZMKf4I0tovJMxtmyMJk4A740UgopwrLlZbYeAnakQPGbV8
   46.36 +VXfEsMKVP3FPq0OPwIlWmQv/AmJVFwusG61q5XqpPG3XdTV3EU0B6Y82XtcmVPWK
   46.37 ++XhSvduzaCS3/gyQ9y67jEDKBakoIS7QBZCbxoNuekIbe8wsoxSjVVcGSGbXptco
   46.38 +Oo5zjSD68ugpbV9hyCjNLMUs8OjPeFjgzCBfoCU5biyhri2+sHabEbgBxAFUcVSv
   46.39 +Bybcy2hdIlSIUrP6zSB7JKqhgbyPYbeWuk3pikH4ryoCSgQmak8sT4n4ZhWXhGGI
   46.40 +FUmiJUdzZNNGKsVMNr6z+SP7FJfAMn5v2BN0t3rAg1XZ2ML5hl5075uPTZRDjPny
   46.41 +Kf89KXYZjKdB4S5JfTiLCN5Fwj+xoWm9WjhLzhFnw6VVZMMNkp4kx94ImtShzcy0
   46.42 +yVTRX3+TDG2YRwx3rm1la4xH8BXIeHsba+ZDoRy5tec=
   46.43 +=mv2X
   46.44 +-----END PGP PUBLIC KEY BLOCK-----
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    47.3 @@ -0,0 +1,41 @@
    47.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    47.5 +
    47.6 +mQGNBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    47.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    47.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    47.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   47.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   47.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   47.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   47.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   47.14 +ii3YZy2mWMv3nQkAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   47.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBC4hMl0gKkS/2cYH/PCV
   47.16 +sgJQOxTYBQJbtkq3AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEPCVsgJQ
   47.17 +OxTY1OkL/1VoHZbizTxzvcnJNyBL6ATegGvqtK/FMspS4+oRC/ylHVFV4EtPRdVs
   47.18 +WxZ3Ne0Yjun8TUD3nVSzTHfSPMemxBv8f/QTm98tK80EqS/bIbr5GyLYv9OdcLaM
   47.19 +QzkrIDc5ESOUmB1XbCnVFNUgEQLNh/xhNAvaQ8ZXheglm0UPl1+zzkMup1HeQhzZ
   47.20 +TMi5OEu7xZWGt9A6bYJiKLI5SU1YfLdhWh3FPbHX3x82sw//dHtUeHYFTI0zyCjN
   47.21 +sMJqGru4kZOlWWeEiKUJG6sjyCKWHIAyD/AJ2haLs+Nz4Sbe1B3MLH5wuHA06AmY
   47.22 +kSKKAbidBRQmiUCeVNrmjR9ielHm9ywhUuX7rYUuJQ/v+kTtFOGyga5a8Xzrpbmb
   47.23 +iil+VsmJ+kj3DEI313hMknJ7nD78gBxabapyjP9E1PcYvZsVxCuJL7j2UI9b1yFE
   47.24 +fa5tjI0ejgPKqCPnf/D5HwS5xNoatenfFLvAw1BEYpdq8sKbc96u5sbWIqjGxlmb
   47.25 +uYUAgWh4iLkBjQRbtkq3AQwArdm1DUs4QaGG1m6ywkX2rj3YYMtB5TTzm7tbG3F2
   47.26 +l9a0fHjdxhj/KBBAwHoX/tAhGrh2vAZDqkkWpgrB2CUzkJKHK/IdDpXtUb42PfO2
   47.27 +ZzinA95Hhtx8Q3CypBlB4pjyOQ1zSqg714y91Ajw6vWnrETkOsdgEuqhG2yQk7Ii
   47.28 +Mfi3jfz4GE5VTY2hvQRqBfVOM0dm4x9U2aKAwHC78f7+inmab5AKacbMM+9YFbL1
   47.29 +zRnk03oiBKxdiNl4mhAP9INCd0cTbIA9389TwWXJreBILXtuuL1fi5sTQusyvvkP
   47.30 +2WakeJWIxdjls68WCX71j9EeExGjj5XatUpEduMu/SM/S239Tl+b66+4MWJ/GXrn
   47.31 +ACDd/4QDzjuZ4Jttpgf1zWSii9IF/Iy0p07XhZvO8FIIJ4DSva5OQiVEBaRIkQPn
   47.32 +aIMlCjU/j0A2MlEYOrPO75Alt3d7Wm74u75KOMa03RlbW09f/bKk5ye5+jYqOnW3
   47.33 +ZxFeOtot9SzPL49Bn1mRrCy1ABEBAAGJAbYEGAEIACAWIQQuITJdICpEv9nGB/zw
   47.34 +lbICUDsU2AUCW7ZKtwIbDAAKCRDwlbICUDsU2JWvC/4jGEDtSZXFOBxJB6KFp4Dp
   47.35 +xUk8sXx8xlvp2lHj1ELaQPrF67At2/XRGwDY6il1jgUxeF9bSCsj2DBGiTILTut7
   47.36 +2UXut0F1okPUzXfkJd82hHXWS612tXGeKMvnilQ9ly5ghSGYZ/LnMyJkqq3eGc+f
   47.37 +N5CJ7gLDlP3UTRVARJ3kPeBRJWrGIjE1LUw+NlzrPL61yAoJ9S5LyQg4UmWT903i
   47.38 +4dmFIk8Oje12A4tb9hdrwlIZ0c9FgiKOT19HIVWXEN60vJuNDWmOQ7dq6IVP19mJ
   47.39 +8rzWGRt/PVIJxGYYV7gWRd7FBUFMUKEtJAIEtrDy/9kFnqUFX8ES3eQUIdnrQGZ4
   47.40 +Gt2/RgaKZxgf8MmCslkxgZxi/Oa6lmIMkUE7QrL7L1BLfrlu4/R/f8vTNtoRgHEh
   47.41 +pTatQvmmOZB/TN9kxSJK5oDJ1Mn3vq1ufOTJF2AjWlooI1aHXLGgq8pXIQl98LxW
   47.42 +QZ7dp70+w04276c6zvkKoBtBGR3ipT/tQdS1+DKA0ck=
   47.43 +=tYCn
   47.44 +-----END PGP PUBLIC KEY BLOCK-----
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    48.3 @@ -0,0 +1,41 @@
    48.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    48.5 +
    48.6 +mQGNBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    48.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    48.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    48.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   48.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   48.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   48.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   48.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   48.14 +WGRPrdsWtFU7pwcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   48.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBDwecT2FGdf5B+MULRee
   48.16 +qiSiFulaBQJbtkq9AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBeeqiSi
   48.17 +Fula9xoL/iXSHjVPvfK85Y/ILybI9Q8ybPHYDnOUmwM2G5R6S6bfHRzI1DcfIxFc
   48.18 +V1Hna6NiA1gFjH8lV5Bt2QOWfPyjXRLrh+Bv0x59Cwc4JC1BpP4GED5XNM14TAGm
   48.19 +Q3Oze/Hf9OfXVXDJlO+aKltxREJrEttPZ7KG6XUGTNZDq+PJpRftsta4Gz0O0Ybc
   48.20 +EbRI8cg7Z3HTT7o8eD/0Cnoyk2UehHXNd18BEQ/fDMAw4z9PJt6DXbDtt2yvUDSq
   48.21 +p2edMmyHIceWgEgWGReRScinaKxhN7b4TxRh4bxfK0XGnl74a6YIYPuUs0OKpRBP
   48.22 +uRuaIsrzwNFrQ2nWYl0PkHyi0uunktT7359ZjvZVjsSVyh4Y/lTue4FMVtBXF5ZA
   48.23 +uyg0HNA7ogwMnPA7e33jwYl8zG1WBRP1GwoQZp2NSkJKHvrjRLVSlnLQVUqblN/5
   48.24 +hlDXynVQcWyhnte8GHieJ8+AaynPDO5jaasxrJTJrTBM+slvQmcPe1H9o1UFtrqc
   48.25 +5L19fu8W57kBjQRbtkq9AQwAwqBlofa+mMKATJhyjAwRzrqkH+vYt+JMxiPGpVA1
   48.26 +b+ZjvwLNfSXcLAWxZc1OCMn8KQolEt2vXi78BKEGEl8b62qJq3tIHR4RMS65GsYY
   48.27 +3WPNNqSSuGRp0ieaTcep8+lVlTdQfKeBVA33TDlQjzs6NQB2YaVC5MfbPXfqxKte
   48.28 +Z6QfUfQtOyk5jWZnf0jJvOX/4JpneogpHSUPBvgX1D3RTkwP5dK5ubMwqedawtxG
   48.29 +hCuYXNj1C7l0WIft+uQjOGlruolYFYmyFyyDoPz3fcMEzKx+DvL/845D3eQxfx6a
   48.30 +yXryoVpzB44nsfCDF/qfVEx6ochHk46WUx5Hqe4xLruiQnp5jZeqcP4EEqh5XTH2
   48.31 +4kmwk8/2MJpNTJa1I0PugQi7I2UNCikG/KUn5X1FhBY2GIVbwkUIZosHAhEcVA41
   48.32 +WWVMMaHgIqOsXLlJxHLedTSOBYF4PWfIk2aReVFCTJANrN4cqHcDzYdHuk7xpLDW
   48.33 +2juVvXMRE7j2ax49HVNklqx7ABEBAAGJAbYEGAEIACAWIQQ8HnE9hRnX+QfjFC0X
   48.34 +nqokohbpWgUCW7ZKvQIbDAAKCRAXnqokohbpWrelC/9DcLJrsvkwNufTLRerqkPx
   48.35 +tch+JGT7fvS/y87yNa4vDAgj/+kf+dhZjHO18uDIS/A0F1E5Z44sTIdYF6Fexds7
   48.36 +zrAiDKk9wDIt8FI09HdH9rEQB+jidYgQ9FLSG6fojhi3Jz0Q2EzlXz6PcmSYHkD6
   48.37 +gncf/RvllQgrMd+DA6CE+iHoavLAyugPEMdXdLbV+hNd+TqumSPRKU3I7I4PrvdC
   48.38 +x2mPBmZKTJ+LRpAcqQBSK1evKoYRFPbspw36Nra0Ja0FUsx8FVQxy1eJvSgLU9fC
   48.39 +k9r+JP2vwKg2jg2Ca4saH+yczOk9RYVEUuk7hVIrW4O5nB/N51D+4K7I9eziEzK1
   48.40 +QSZQ8VXwW6P7yflD/dBORCic58Y40i9v0zkPrR5eX+h7HShIb+m2MbGCJ4Lj9wyn
   48.41 +fY1krezT+8cS32CthG1+L2Ng6pGHrW+3U3prhdnEr3WZTUzWGsAbPbkI3ULM037h
   48.42 +RnxSsw3sab+mDHJy9M6Hj5yWgDQiUzja61G7a4WFAAM=
   48.43 +=BKiI
   48.44 +-----END PGP PUBLIC KEY BLOCK-----
    49.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc	Fri Oct 05 11:53:18 2018 +0200
    49.3 @@ -0,0 +1,41 @@
    49.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    49.5 +
    49.6 +mQGNBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    49.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    49.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    49.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   49.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   49.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   49.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   49.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   49.14 +FYLRGY3NIn8ZUQcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   49.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBLTOL2lHtpR8UA8Gh679
   49.16 +5TC9oXAgBQJbtkqtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK795TC9
   49.17 +oXAgtFML/3EOu0mP3lRBiU72xImVtBEFiPdwLcZf00etQbizwsCf5RDp2rUMOdvg
   49.18 +JMpO9nECw1FHLYNWjDuKLm6yvI4UScVFu8hEGMZsXFHygSfJnzZP9wWAkBCE4T/5
   49.19 +KGrMjp0xYp1UpjIwUDhoj3zhix36CEn+dhzEvmXRipafHTLwfHIJzaK9qPiXHv1y
   49.20 +VUFYiIjIcM+1IS2sqtUXDMdIh3BI58KBtumQMhwGrVmIYS82BcImFSCy2fGqAcEp
   49.21 +XRmLVhFAxhepCwH24h+6Q/oXWM8pC0pyoCGAWkbFexpuhbBKruIbDOKcO0fhDozV
   49.22 +dr9Xsb9bjV9bmYatIS3hjYuFRxGZeDcvp/qUQgmjXiFXW6Wjhtt6uCg7aztxBfaX
   49.23 +eKzPeFnXlOEm6FuSmVpBL4HTSDYcMtvaB2NGds4kOSsAb/dEmIrRM88kwzem0b2R
   49.24 +yOQp28tgMV3/KZbx4Pwdm9Ao3Ei64hOIC6csX535i4YAt0chqRpjeXIu9kPcOXQd
   49.25 +2YpERB9X/rkBjQRbtkqtAQwAtivotreDp76B7oCpTHE2sIusp2rtivy3kFpnP7zx
   49.26 +cJNGMADhEZLK2xj/xg6c7NzImblcfsdak+3VJnoa7/lG04D5Z01pKhMjTImRuATi
   49.27 +/jSNm/nbOwxFD4kbC3HuQSFxvX6HWNYy7zEE6nJWgI1DwNYhxQwcKYHeR6qlFmPO
   49.28 +yJIN5S7dimq1kg8FQohQicH1aFji2Ap/p+X3hv7kYJpHfZDEzKGpO2CRhr8FqfhR
   49.29 +OgBJHnHYda1jZf1hJsg+kozQUdQDJsxZ5kIbm6fHMc4PdQkDGb3NFi6pf+iZDKSB
   49.30 +RpCqf11SHkko+eIRJnPHGvG12TSPoGxdYNMY39yJ6jIfKvuMTrC8z6VmJga1Kh8I
   49.31 +dkWQknVQo7xXPKDpgIwpuQP24L1bM4HntvqU7jhI9UYS0EXa+kPH6JlgppGsnc0j
   49.32 +XUuLJQvLFl+LhKATUu7V3g57+10gyfABBOmf4/c6gmCfc72s/L1/cYfQ5uFC65wB
   49.33 +N9TgDfXno3D6B9G3+MDtLx0/ABEBAAGJAbYEGAEIACAWIQS0zi9pR7aUfFAPBoeu
   49.34 +/eUwvaFwIAUCW7ZKrQIbDAAKCRCu/eUwvaFwIO4HDAClDsWl8lefbrxItGhcS9iJ
   49.35 +jwDZYNx9i/vu/nIzMBGNe67SxdVD6s6UwvB3Zpy7gts+pjTXZd1iMb0bNN6xbw7h
   49.36 +e025jVwX42zXnf7dEG5Aj13AT4gV/zToAkkxjKAOBUjmF9SBqhuiKadrn6GPPkPp
   49.37 +WfQErVLhH8Q8yoDqW3Paa4f+J3hl0OZ0aFd9x24ljDy/LcMqirDzyHgHU61yeEMg
   49.38 +WrtSJ3M4Lli4wdPzNhC4AW1EQSj9RNGOHwH13fjqqeiXUnaM/3CCtCWFy+JBwYIK
   49.39 +9wHl3/TiP7lyCMhOh3Rf9dPhJEMywWcRscAGGWWM+HzxwwjflCsVkQ6/UeieVGTw
   49.40 +VqvPdQPa3yfvRpjbySCRu+Vdu9ghW4lFrjBlbJNx0Ox7wtMuPjohKRNtQ9YPakHT
   49.41 +0gwhj88ZYoWaUc9/sXTOgMQx1HXC+QDkhdgFh6Wh49tIJdSbM5cgyO74VGpPeVXj
   49.42 +WYvXTzbesQJeuUEDqh0qzwrpOEn2u3zc3QRd9rfTEP8=
   49.43 +=8DKL
   49.44 +-----END PGP PUBLIC KEY BLOCK-----
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/test/test_mails/notfound-alt.msg	Fri Oct 05 11:53:18 2018 +0200
    50.3 @@ -0,0 +1,224 @@
    50.4 +Return-Path: <members-bounce@schleuder.ccczh.ch>
    50.5 +Delivered-To: claudio+engine-463@pep.foundation
    50.6 +Received: from proxy02.posteo.name ([127.0.0.1])
    50.7 +	by dovecot09.posteo.name (Dovecot) with LMTP id cX0iAH3bsVt7fwEA1vIg/w
    50.8 +	for <claudio+engine-463@pep.foundation>; Mon, 01 Oct 2018 11:53:13 +0200
    50.9 +Received: from proxy02.posteo.de ([127.0.0.1])
   50.10 +	by proxy02.posteo.name (Dovecot) with LMTP id TRCbIPjssVu/FwAAGFAyLg
   50.11 +	; Mon, 01 Oct 2018 11:53:13 +0200
   50.12 +Received: from mailin06.posteo.de (unknown [10.0.1.6])
   50.13 +	by proxy02.posteo.de (Postfix) with ESMTPS id 42NyJn1CB6z12dc
   50.14 +	for <claudio+engine-463@pep.foundation>; Mon,  1 Oct 2018 11:53:13 +0200 (CEST)
   50.15 +Received: from mx04.posteo.de (mailin06.posteo.de [127.0.0.1])
   50.16 +	by mailin06.posteo.de (Postfix) with ESMTPS id 1629820C69
   50.17 +	for <claudio+engine-463@pep.foundation>; Mon,  1 Oct 2018 11:53:13 +0200 (CEST)
   50.18 +X-Virus-Scanned: amavisd-new at posteo.de
   50.19 +X-Spam-Flag: NO
   50.20 +X-Spam-Score: -2
   50.21 +X-Spam-Level: 
   50.22 +X-Spam-Status: No, score=-2 tagged_above=-1000 required=8
   50.23 +	tests=[ALL_TRUSTED=-1, ATTACHMT_OFFICE_RULE_POSTEO=5,
   50.24 +	ENCRYPTED_MESSAGE=-1, PGP_FIX_RULE_POSTEO=-5] autolearn=disabled
   50.25 +Received: from mail.ccczh.ch (mail.ccczh.ch [77.109.139.210])
   50.26 +	by mx04.posteo.de (Postfix) with ESMTPS id 42NyJm4K7mzym3
   50.27 +	for <claudio+engine-463@pep.foundation>; Mon,  1 Oct 2018 11:53:12 +0200 (CEST)
   50.28 +Authentication-Results: mx04.posteo.de; dmarc=none (p=none dis=none) header.from=schleuder.ccczh.ch
   50.29 +Received: from localhost.localdomain (localhost [IPv6:::1])
   50.30 +	by mail.ccczh.ch (Postfix) with ESMTP id EF16F1FF63
   50.31 +	for <claudio+engine-463@pep.foundation>; Mon,  1 Oct 2018 11:53:08 +0200 (CEST)
   50.32 +Date: Mon, 1 Oct 2018 11:53:08 +0200
   50.33 +From: members@schleuder.ccczh.ch
   50.34 +To: claudio+engine-463@pep.foundation
   50.35 +Message-Id: <67vvvaEGaCL51zsMs14Zzn7S23fgCVlb@members.schleuder.ccczh.ch-schleuder>
   50.36 +In-Reply-To: <GJMgxnRqVyuiQgrKfymrACLEQrgheEIg@members.schleuder.ccczh.ch-schleuder>
   50.37 +References: <GJMgxnRqVyuiQgrKfymrACLEQrgheEIg@members.schleuder.ccczh.ch-schleuder>
   50.38 +Subject: Re: Logo
   50.39 +Mime-Version: 1.0
   50.40 +Content-Type: multipart/encrypted; boundary=mimepart_5bb1ee84ee1db_4ec73f94fb6a61b4121d7; protocol="application/pgp-encrypted"
   50.41 +List-Owner: <mailto:members-owner@schleuder.ccczh.ch> (Use list's public key)
   50.42 +List-Id: <members.schleuder.ccczh.ch>
   50.43 +List-Help: <https://schleuder2.nadir.org/documentation.html>
   50.44 +List-Post: <mailto:members@schleuder.ccczh.ch> (Subscribers only)
   50.45 +Openpgp: id=9A4603A5341A7D8FB377E52A901256D277B23A50 (Send an email to members-sendkey@schleuder.ccczh.ch to receive the public-key); preference=signencrypt (Only encrypted and signed emails by list-members are accepted)
   50.46 +
   50.47 +
   50.48 +--mimepart_5bb1ee84ee1db_4ec73f94fb6a61b4121d7
   50.49 +Content-Type: application/pgp-encrypted
   50.50 +Content-Disposition: attachment
   50.51 +
   50.52 +Version: 1
   50.53 +
   50.54 +--mimepart_5bb1ee84ee1db_4ec73f94fb6a61b4121d7
   50.55 +Content-Type: application/octet-stream
   50.56 +Content-Disposition: inline; filename=message.asc
   50.57 +
   50.58 +-----BEGIN PGP MESSAGE-----
   50.59 +
   50.60 +hQEMAw8VxVF6WvmHAQf/alZk1Lju5cDiMtRF7tkTgRibYoizahOOPEvW3fAGIH5B
   50.61 +RwoyQryuFXFT0GL+ndVJGaVcOeSGLupk4mipytLsSlsN+EFhVrwLKoSuowSVsFxi
   50.62 +Mkp/MW+cMTmFG9sevm0sClMyrkoxtYMH7r5dt6HjImElqD1ITD2JgiS49bWADJXF
   50.63 +k/rpdyqr+/fvAjuz7s48YeSwsdTvxvqpEZtEjDaq3nH4/DkYv5zhl/Qgc9PloiVV
   50.64 +Ciq0FKzhpNsjsY6J9/H3hHYqCHVD7kNCSsv4MYtslrzxlBr+EC5XNUsrANmg0rHm
   50.65 +uepxE00bdlQcGuaRyMXUXyiHgh0nXohtDYadpvI98NLsAQs7eJBKd4Bam5ieks3n
   50.66 +A0Ps9yc7uUtwj9azPvU+SSt2FKPZ3y0geR0/Qb2FgSJgJLFxeNNw0tnzI0sJFODz
   50.67 +KKzIrgae3et/2fg3SJDg/3l97bjGSOIghZM/QsFsODczvMBjXaqhpGnW05nN2rgx
   50.68 +FDENSRJLp9pO7M6EpZFFA+FWTzF8BF5+fMDyBQ2kw52Co188yRDRQvSEDXNkEO3c
   50.69 +MoNDlLGQWTe2LjIhq9UJiGL7D5P4FiKbgCrLfgM7AAe90izyXZ9H1aNOB5KSucEt
   50.70 +qgWkwNVUUFuIpXBp6i5Fr8ORlaPF8WcrutU4gYHNqOmvgjZZrz51n87THyMBDRmp
   50.71 +J5deLvhQpCi02NAZmfzko7l7GnXEawse3xgFr8BIS6y/TSmHr2cdzI0VdbrPdDmn
   50.72 +PBE0H6a80q8Ps9kkVlSJFqPqCjuGI/hM7kzQkIOd3JA9/PHk4r/fytC80bv74uPG
   50.73 +p2drpULTb9ehyV6O7mSWfCa1DwSiwgPNkrsuWZwn37IrW1sLQ9kvni82beBLkSXM
   50.74 +mrshIED2D9ZDQdrN76XRAot3t6Ls6ctROTR+6kx9enmdC6qlwAhhh7g6iQ81Ox/A
   50.75 +xWRYLJVqKzRHDoALJAWxvRXt56o9ZSUoR8SzD69JyVs1mKdo+ZxULXTtK3dV8Zaz
   50.76 +usw0C3Z2H760ttOrONYSEU1vXcshyRqH+Kzpe1nRweeTsewB0C2qnO7HyE6dP6Pn
   50.77 +Jl/pMbGxl51tHNQrRYXwZdW6yo/nNHN+fgfYSjDWdwBzDDbUX3GLxvRrEwzGA2w6
   50.78 +OkcMcC4zD8pqHOiORJXfivqDPgTFiqRG1YWVk2U2+LfZd7iA0mO6ZstkU89eHdZ6
   50.79 +gHMZeg8/4zRSTARAlcZ57svTQ70k/A0Mns1/O+eETnXwdblPjzPfP4XMJaAyeApM
   50.80 +Div0jsq69wX8xoiENV1XIAfIcfh+QNB6LRBOeFuozfiMdVoI5JiupePlprAEb86X
   50.81 +14zHL/4YEMSaiZecJApVhuviu+DPFzLgX4F2cKqmX2Jb0660+Rn4hlVQQ8kHyFsj
   50.82 +G9SxQxNXG7/u7FuedjXE8P3Zd7quAJUvG4PLBP11FWfROcSBNaq2xHmmU+ylpIgd
   50.83 +8oewniumPlZK5ga7KJ2uNYN3ZYqLGsvkozfRkzNE6NsY7dL14ZCZbs4+StO3G4n9
   50.84 +bInRMMvs6BXDswpLLcIluSA2c3rJM5+4rm3upNEsD36VDTQ3Cz89wcxOPG1+svSB
   50.85 +nHYgbz2w+1J1UR2cQ6KQk2yUe701Lm52BI649MWvoABq4+TSItv81ILgr1U4qyus
   50.86 +BSVR3TrdvpxO9r7+xp5JfdtZNqjvp6ivG9ejE81WCCYDw9cfewIkMCuAWrYHKxbt
   50.87 +1PMW2ZZLClUzDsrJPbaaFxed7QZAc8xhRi5sxwncA/mFv//AEUFi4aO3L4vlrd37
   50.88 +1qoCGuOS7x59wMfsAfZABxbODZH95DphextXawfggO3fh7b2+QZX+MdWT55kDIaq
   50.89 +NJg66w2XyyCeX4SbxvHyaRWWNgtlAMfS4S5J7Gr+oHDD79u9yLGQ8pzm94rvhrQy
   50.90 +nVfp86iiCVAf1p3yIujXv6P/GK5dCdRZ5wIwNIrCkzcAZ9sy5Ywxiffjr+Wd58/e
   50.91 +0TpPFCLQwC3dmBH1l2XAvGeLqnoO7H1IDKobc189n+9eNvIrNGK5l5KXeoYyttf+
   50.92 +PdkO/fsyVgmqn2rs3ZffeggL9/fZwFqoEriS7oClQ5+hKjursjYMWWPI9e7iaKau
   50.93 +djmBBu473FbqElE9E+arRQ/RnDlHPllmwirgO5MImnktiTgRdGOBjD7w5aADQ4lM
   50.94 ++uHQ7ul58g+akUpXKPz7B4tEZDos2a4e0LEyXHhlnNbxvLYjynm2UgsiHRc+OUKk
   50.95 +q8ebTj0V6rTvqMZPIKVpyEQRQBy2Wzv1uJeOrcQTgIH/XowZ2jgLgrRTMY8DqQre
   50.96 +S5yQuijgch/cik8Llji62x7zOjYFeleW8yyVGffNBvJDUPJOF8HdoaVSj37tPXab
   50.97 +f0SWElMgx6o8R80P+pNBJ0C6RwbKQVAO8daiNvCe7FY+0ykefQlF8Y1Cep1Le7+c
   50.98 +qsp4QGREsMuAZ1VyqmBXAUZ1Oy/ocaCYSdYvx2pkVfAlDZLWGJAs6q/AT8/jhxQW
   50.99 +Wk34Xxtr8sGcliMoCPrTnF70kIrat9G71Jl9vfMbXVDbyNEHy45QbDYj8RSGk1G5
  50.100 +LedF4eNcBuBHaXUblZ8jpuE989VHmXKY56ZxvPkJ2l7PY6S7WmWbzFkwUizscOM9
  50.101 +XLNsdFghL9Yr28frFHXERfh1BxrIoOHFEYJEbuKy0089B/nAvujCmZ3m9G5SBdE/
  50.102 +M5iV6QGJ5ylYDezkX6miM7UqjxVndJ8umyA4lTaEjAotuEhCtJ4EFOAQN3Yk9DnA
  50.103 +MGNzVqKcdMYVK9Y7wD4lIy5RR5XQy72nFBC0fonVnzAg16b3lIwIw1s/TkN0BQvA
  50.104 +8U5TGZyTVoRRr9EJfGN+fbj2pTaT2ZJNPo0w5ak2d+BnaZAPlhx+8nQxd/7UnQMk
  50.105 +US6QhLcAFz26YdG61BuPdfL5QD8WubZOQ4QXFThZSYudTr4gS/6FtRvZtFisv0Ov
  50.106 +EaMqw1jzAmJ4MGmogP1/exGgVW74tiwmOO6PpXfl8mEfRWJLKkP7fvwBKrjmdbHA
  50.107 +E7YDP+s/45BU/YjG14WatCjV5j2vTr2+crFyhfVHj1Xay37bJRpgh/dJZsehvUl/
  50.108 +wZB+RKln22iwoPbTgbFsbTqYhggcdaNXXRmYO9rQdD1ej+KMNy1aE18kDEVgIKBK
  50.109 +0GlCHAwFZ3WcnTrEYFp1VcsY+pCexwUUmQ6afRpc/ukZg16YiZWi9SsHI3Ty0SXj
  50.110 +Kn7Jp+55YpzfENutUi3SUMb01/vfEvm89dUJG27bN+p+ZovHMW3bHCRyKeKcFt/M
  50.111 +sBvxSYWfmYXCdDyNRR597r8sijdWwIWJ62lGefdjhoH/EAPmOe9wnEJzZjrkblhM
  50.112 +IYe3JEWh5hszHeKVOv1xKOwEvtSo22pBJwXfTtANYFmxbOqhhEctNoow4Qiovlyy
  50.113 +uhQBd2dAMnBzC1VaiXglKlNBuogdDAZnT7yT1/1IZQjhVoYMF0llvSXDub4dC3iX
  50.114 +iyBN4Tac6Pex+xt5V6L4KqmuMeBwbGVvDAiz382a7WFCkU1biSwmGDtMx7WNNTly
  50.115 +3lm4glEv58GwBKXNiSq8wG3wlQiCUhs0sajpOILgY+O/2J2N/GcCkvs7tdDCUTTD
  50.116 +Oo+EoROHU9vl5ZsuyPiEeZ/DTiTavfQdjaGH7FHDbd0nzochrTWzoYq9hXhuMtV5
  50.117 +WFpW5jzxY30Lh0XAjutrtWdVJkKrj3BNRtOFYfXmfQfnKD2MW5G/LH1G4y66e4YP
  50.118 +D8CLPxw0Tjp5grpzZBtm6txZ9Vxa4qmPqVI8bj9ccwkwH9tllws/qFV06KxHnsJB
  50.119 +VjzFOHAqfv3osO7HlRhH8lsUcFPGxMkDJaK2M8ZYvruQo0HTHuKjNl+yH58Is1vu
  50.120 +e5iy1N+rW9yg6eJ6hePmg0jn8e475jYZj8L8+7kIsRTauNv6CpHjBeExNIkiNdE4
  50.121 +ySC2xFZVuhGJaBEPgUvD2+PvxooDsVT/lgy0Mg13hQZdai/RljP2cetJ5ZXvOrhz
  50.122 ++8LTZFC17zdtIGGJjbBxjDOV5/kEjSDrkjB5DNQxeJf38HT5sxyrQRaF/YfHL4gS
  50.123 +4TEVqeULMlvrJqfpcWosMK5DvynLMaERNJh0ceEz10sr2p44MD9tMjdwFgEITon9
  50.124 +EvZftA8ZNjAnV/axPkwNUQFKER/8LhJnl9qQTdkwm+MCd3u9EZG0Z+4r5ha4doH2
  50.125 +YbBSF6G+6tp7Wv/epoekDcEcUm3o0OBefpCKqSbhvB2ndwJlmE9F8eq5iOFJiKAk
  50.126 +VoSfQ0X4/WRJsN7gUNIftIh30Tgqo9MdUNqN093qVUcPmoXNyLvTJ+tAe4cEqUNE
  50.127 ++sMwwgfznlbleDRhojHxrgh1v8tBFPytBbI0Tlw+DQyUEby0f9NhHp6UtyDI+23m
  50.128 +dlBr+j0gTbwSrfV40OyYrmOaY0aeJEtRzHyvR+RNVg893ehuzX+J9JDjKG5dLxZs
  50.129 +ITob3tTtVToK3/VsiJltnSAE04hSibswrKWvORVa1hp5YRC5sTvdykvdhvMtHTzZ
  50.130 +jq3vJj/wAf+BL3Aa0CGssipiv7MGfAApjOvCVcDnUEotsHIL28Xv/MLl38OjKYR9
  50.131 +ltVPF8YijCpW0bKdbN+IOsY3mDP/wEA3nrnZVKQgdkw6PMhpBS1J3Vqa5rbVDdG6
  50.132 +xtFEVt7gUiNVo3A9c+vfmNGQJ/w1svmo+jXADk3UjefFubGZ/RpwW8xItvd438xR
  50.133 +LT3duOvA3A2YWwSxAFwIR6SO2k9lP3OiqF+5ZT4sx8lpUMumRBEhxHv5oNUV2+jj
  50.134 +Wv8A5+afA+PwYHoeeAbaq71qt4qAFPiLmRE05MlQAZMK2MCvvVh46+6EZ82bN+/H
  50.135 +YfMwqv/yGOCtSKTkTI/duUZyz+P1qffTC6y8+BqEwAx05hhX3kfqlIqBUrE2h54X
  50.136 +kAtyL5T3W3ARAdPngaUICmS7UHSBZzo9uHxbT3D0Fuvor/8AOQs6NM3r53d2ly0c
  50.137 +dLa5KI8CvwVcK/M+kdL0b5LKmOVTicW0RN0E2CypVhJuyg8hFxhV0P3VkDrBvJfc
  50.138 +5L78fFB3pQWy3lSlxY6dJyoOpb8yDRrmSSZZlO+F4YBTc9XhGJIvjxMSPxFRB35V
  50.139 +jo4CWrExG0IISybkPLNfyZiWxHC5vxoZ4YmbpaizFSNE2a9LtUasn/Ts73U3jkGV
  50.140 +5GE5fWD2LooAC6+A145ZexUiAZEAcQ8nzA7/DPVP/+70xSoPbF4agGKvd0rMbWAi
  50.141 +pxddHCREWRLkxUuv2UCZlS4TNn/LXWOR9M0kGx2nPkCOKS+mAqCGX6ZDscpBxj/8
  50.142 +AbMN1YnYlDlCwTuh6QD3bsjV73XrTkZlLKShwmtRdUdN09gX0J2pVrWuuVdCuvPZ
  50.143 +d1dddgNYgOj//SdS+2Q9iqp67jzt/IzplK6IlNNPkkilJiVEvLHaTG9wJ1PVum0m
  50.144 +3n11POGH6so6e54wvyXCDTaPN0kIjMjCKvuFkFNaSA1PSJph3Y918MHS3+G8blnM
  50.145 +PGarUcmDoV5xzGuYpmLYPR+CDp9HpegaJnfJz6yQcsjKYG3uykFSq9nEkO+GQMUK
  50.146 +kT8T2vV4dgWzs1EwUSH38rG12zfq0xTgy7jbRwQwj4dz5/8RHV6jTtGFjxl3yMcJ
  50.147 +pbdaE+BCtmrQbZSepAyFYjrwxIBHjbl0RVsFqgXaHH7mm3wKXr0ku8aEso3VTBWr
  50.148 +RY8TAcl+RC8I7QsNP9KIgDE7Edimx2yMEVuocQEYguZZbVv5WVEnWHc/BG++px0q
  50.149 +Km9Amlnd7FaRIwfiYocomvKGvKlwFY2a2Y1N+25vTswQHAC+PqMi0TZoIYmNlYkg
  50.150 +itAZCj37KrMGO45T697GQr3C+0ZG9jJfH7M4A1XVpF3FhuHPn0Wpjb+yZt5D/ba/
  50.151 +6uv6YUe/dIuRvvwXFINYFBubYSMbwYIqXFjeZccFKYpgkV+q5QVM9AShynivgttg
  50.152 +w5yUdlEUNePTXD0JANmWPWtr3/fQl3/VwoQPSrEZawLTimuak8MnaL+nke10CJHt
  50.153 +EZHLv1DW6R0NA9AXG1M0juEfqjEdNXmhFg8WifjrwhBM0SVyuu7m2fY4gLyYeiwW
  50.154 +VPozkviE4VW4ARWp1H2jSyla3baoFjD3UwxO9ixwtbOTC31PfLd75Ak/kTKLfd5E
  50.155 +gdZ+NxxVfsOTFSbsQR3IuOCxcuTU+JEuG/6TixMZBH5dAubLMvOAOk46h6tLN0AC
  50.156 +kd8s1spZyN36zAhpyS09oYGpLs1NHtRT+q8Lu64b5h70HrgSZHuIyzFnDUPN/f9m
  50.157 +R1qskWBZSS8pBf31GciT9+5hlOa1qJh15i1vp/u7UAzDcai5ZC0YXSEBAZVYwPuA
  50.158 +fGBVFrwi+AT1iWQ5X6ajoNIACM4RER/k5Jxw6++qcgSHC6RwygDYDJWx83fvkohh
  50.159 +QLgBqM0UO9BTrrYTT7uAXlZ/xOiCJFXEb7yXapfh56E4svwPb3LV7tOpJK5NmTvw
  50.160 +KKzc0DryzhY9613jyg9rDtJbpqPjx3/55KfBWT0XDKxcxKpQuwyf63VP6gH4oERf
  50.161 +r7Fqs2GlSAtZDV1jFMON46X5ikbW9mSC6R1ynSG00OMbKZzVHDwnNaFV7objleuj
  50.162 +bdwaNxjD6IxJrzTKsbXmP9PC/rEPJouXRAnEO3m0j7LBNFLXZ7qV3xe0OT8DSVxv
  50.163 +E2vdan0r9KCp2SwBTfwuug+5sVwZ6ioqlTHzQgHbsf7aPIetlgiSHiVdw+9FN8Ip
  50.164 +Eoj8Xxwi+UuQfaV6o+m5/zs0lZQQQ4MNpJPhnSGr317G0Kq2fDS41hsyXwc0jAgm
  50.165 +fJjW2mqIBKyiT0taqldj4aEAn3BYmp+6OYd5hmgkgh52of575vdq7vRH+ctE8lWw
  50.166 +wyVPlJFsrvR38IYCWxTKBUA5qA/ZOGmKGy5u6ShYLWi/cr/jpV5+fyUt1ViNA66H
  50.167 +pQhcaitN/fsUllIk8WF0+goVJs8jTt4xdMazrXhNP+asusBilafbm5ARgS4CfeCZ
  50.168 +QFLt+OuuFwEvGXFAFujwawWnDuGbs26QN6aEH0Ne3fx2mgvN7wQmy6/Jvl2WozkU
  50.169 +4+r0aELWUe6pAVBAE5/vcqy4znZCGASEK4PMsB3A4B/sPF40jzc+GtSeqez3T2g7
  50.170 +5VrQTc9SRNrA/NO+f3M63yUVNrrXRFeUqSP7ZR9gyZLhjDW8At34EkUFKsUPEHgA
  50.171 +mcgZdzxcHuSYxpgYxy+Dr0xZ3kd678ZgacF/n5L4iNBNDwia1Q27Kh9pXOfTLkq5
  50.172 +hhq17ir8Ct3kQtiTBr5accO4/C8qe7I4ZltMtMHrcDrV2r1sWsR4f3f/mFaLEwKr
  50.173 +Ia6Ihtp6XumbqVfDbT9g3mnlQOhi9tRx5vKtcWDw9y9Y0a23jO54BaPrbV9jFMXJ
  50.174 +NL9wc7hd8xvhqXz+b+MlzCYNijDC3WkdE6pkYNvi4Z83UwNTgz5JUZYR4xNE9oa9
  50.175 +ShXoJubUaq9FSpFJoMJ+gixJxCt1pJ3v1eussHODMEfnpKSsZeW+fg/XTMWEme7d
  50.176 +IlJnFkUwqrpLgYwqIkeYS1wRjt9V/tlq5968G2LjESSoVpW6SWsjZa7SITD6sMmo
  50.177 +H32b7o19gHjUbvOjpX0SC6q/Sn1kWDr//XrMw88S3nWWiytHk8RtJbMbxy0YrTx3
  50.178 +5LQOGqZbglposyycTui8FhsvEAwKP2dIjnLfdAR/e/ceGkwwxt8G1r7yaXXDWVlQ
  50.179 +gdOoE3M94Vp3QIGT4n5eRAwcuMF4sCfQkL+DV46eUR33LPaZo8EK80Jyy8j2paH/
  50.180 +im05bPcROuPOCCQqZhQc6qXUfelPATxkLPkFQihwKciOsZ1aZHTVVQH5ZxJ3fkxj
  50.181 +kC0Cy0GoFZeUCTSz9pYR7T7tUnxHioG2J5rVcHpIwHcFoqRk9dY+lY01up/JGiAT
  50.182 +iJ0aSaqvGfqwi42akX34hln2RTJrzPJJd6+M53+t0Cl+9Qwfd0p7jJhLWVG9Aixw
  50.183 +Cycu15zB8XR8lpMLpnMzVtloWzn80uyXGZmIafbf+pel5wBHhEAKhctdn9vAgKwc
  50.184 +YZLUNEZnSg1oAk1ppwqF5JOGnMX5jojMP66LiK7fqSJnbdiC0WyzhNEd+zvWaMBP
  50.185 +2ZfYCONIFi3YNJ7buYZF5kCrBmg4WpNRtSHqRhcB1qtk3zRrDYEM2EISOxG3PNB3
  50.186 +Yy983c9q5muDGIPP6GMzXwjF8SP6bnvM5hD6TuedN+t5rxV+XTFI4EsIN2jOt5c5
  50.187 +fno+x+orz12K8XxbNnkhZJZYOvE5kLWElOG0C/hnEjTNDngznoiU558PBU1ZWcnl
  50.188 +ahdi7YiEpyGIyli1Q41x7I/KR9Qgbi4xdm8H33eFu+h9c5kHKMHdk2Cr864yKWMz
  50.189 +RlvuF/cxfF+RUl59R5Pu0I3sA5wvK0cKEozKRYM/uws3BUbdI8EBlDQEswLXnsk0
  50.190 +37GGOmqlBX77h95SpdC59JGH3yXbwBqFeN0bb0LS85mWg1GQDeLe7WAUxnrRjhmE
  50.191 +DIKxkemKfebhzaRmyxY/IDt3NGCPRRyboNf4xlEJCOftbw6mCrESiMapl2Skvxnb
  50.192 +6LP9fKN5XGZnHMh0aluOAzSl2I3v0PN5aSzNq5Vk9Js8mF8bWAKj5r/iqG1uSPw8
  50.193 +mNcKcDpCzRQluA79ho/Gllks5IrzeFBSIXSaMnlySZ/jqeqSlBqrtSpxyKhT/0mA
  50.194 +etDYYR1/n3Q3aEHhD6W1ETd7Ib6Q0hN98ZTuZdqfEarNPnJY+/jVoxxWtlWwbZP3
  50.195 +QbjbvXRE7owFp2nnWQEn390Z/nkd+vBTCJrJNETc2sY02N8Og7uYCoMUehtYP0XU
  50.196 +GzLWOymifUjeOF+U5XO94CfyWo6E8GEhsh8i6keeumrshzPDMYK27TUiebEGHm1B
  50.197 +913i7SKtSdDLIWwkZrJ2dpc4sRQ+n4gJ52Idy9hkcJ/n0V8GvkPkLXRizwYqhDJs
  50.198 +WTcRjDDF6RYZfZVOg1vRLrvzL8oVMy+gvUCWgJ5qBZ0qY1+R9Ih8xzq6CFx8/DNM
  50.199 +Jm2+sq2gxT8bEHgIFG0s09zSa+U7pKa5gypHSb0GsEBPMQYc/hAwkfvadit8zdfm
  50.200 +A/XCZVbOBk3nBFCDdnHJfq1vZkaMERU7sdIL8lF9sq/kvwRiwFkZeBGhhkj1XPvx
  50.201 +8l23RFLLzLVZVXXfpFAoHMEhV4YYAR7rvrL6MWnP6Je8FHG3kh5fALCQsYHY2t+d
  50.202 +GzSsXYdPpZzagPfxPwb586nLRS//TXhWONqRgksd0ZbqHQ7UBU1TMgLwYK6TFFjI
  50.203 +CRO5H8Rp/o5MRMFfK0et1YSRiPeK3P7leK1n4foguhL3KEAqn+f0QeyE+8CYs/iN
  50.204 +raiVDmqBaCUfvfCJI0w7YAx3U7XwDUZluHqjupe2lDaJ6DbOlQ6UmOiw3TPB4IDT
  50.205 +W56ZthB1Gyjlh2ltoQyfmw0hX6UGlYITTdRGvefTYUtNy0znMbAy/3a+8v5zXUwt
  50.206 +oHE50jAqF0uvi+q2o2pcPRUQwMR5RuaXUkBaFWIfH+LTL7EOINHeSmV+XBrFhlsP
  50.207 +FSxBK2N/lF5t/BfFeXdAEQUXY3ZGRbtcVlsn1stlkX1YI3w7AEoSH67HJlz59vsr
  50.208 +V2A/R0k1rvtPze5CXX0DWswa5jXpp9XeP3cqmqojT8f2BXJEjjaWBwLVSQiFS9UI
  50.209 +MrOPNw0q12KINsVI5nA8XXsVzi/nAyz2dQEZDjIzOimLjM2e26Bo5S/PTt3JhfGA
  50.210 +FHF+VqEWJ76SjKGu5LcDq2bU2nk5Yu1wgbwDBAq4doHdZX1ZmFmSD4Q5qGXg58pH
  50.211 +d8/jG7lXHLfFgwThjnvFEkKrTz/UWqSbfg9Yek0DDSbWkfu/+SD1sbma3K017aOs
  50.212 +6Mkw7SPOQ+WI9FDH4bPaRs3QsI8z4yu7P1huLgV/L1SW67YDpvQ+uKMNM/DG/VLq
  50.213 +lI9zzZDVH0IOHKrxCG62Ytsw6a4XEeNNrY563YqmCr3PGMXATQOXojr6mOxL/3pt
  50.214 +fB4k8a/y/1nFSMarwXcLKDaBkOdLM+VHTrBHFrNLMVFszq2/nLwB479lGi7i2L3r
  50.215 +y9axwF0ybAQ1nSnOHPsyWhzZ3AYQSg9+ByYAgGqAwRR7OYFrHNK695W/bEYZAWdp
  50.216 +UtWOuiM0hMkXs+QUk68esltTUtwWmimMfD5YVLn6/Saxq+BWLoR7nZSoeI2ZqYzc
  50.217 +LwfhgS2YQ/jeI8Y81OQfrOL5isrGlgM18HgtERXhHMc2sc6iIUUk8+3R1Hy8CcEW
  50.218 +FEupodYho1qo9dv4yw972072MIlcXIqQryZX5H5McOqKN6dSUnZtEH11X+nYxtyx
  50.219 +ekhklWyExjwjYhUyJowGbl6IkYcTstq9lQAxbPs9Ir8ir3J5Z1CvH0mwMXHtoF/I
  50.220 +ZcrKn7wT2Au9V4bSbXNkevVk7GFZOn44M/iuulqzfaRF2WjurD9GMsOqpjVeRFcC
  50.221 +qyQ=
  50.222 +=CC/J
  50.223 +-----END PGP MESSAGE-----
  50.224 +
  50.225 +
  50.226 +--mimepart_5bb1ee84ee1db_4ec73f94fb6a61b4121d7--
  50.227 +