IOSAD-103 merge in sync IOSAD-103
authorDirk Zimmermann <dz@pep.security>
Wed, 21 Nov 2018 08:35:41 +0100
branchIOSAD-103
changeset 3148faf47cc68597
parent 3128 7d0a5e2def04
parent 3147 a76766d1ed47
child 3151 9a6e62340dab
IOSAD-103 merge in sync
build-mac/pEpEngine.xcodeproj/project.pbxproj
     1.1 --- a/.hgtags	Fri Nov 09 09:05:32 2018 +0100
     1.2 +++ b/.hgtags	Wed Nov 21 08:35:41 2018 +0100
     1.3 @@ -6,3 +6,6 @@
     1.4  fa00137505b8528c77efe8df40963f5fef452cad 0.9.0 release
     1.5  b70a6082836b89f8718b23dcba0624d6db318033 ENGINE-323 fixed
     1.6  d958333b87d0cdda1bb02f50173f1207baade54a Release 1.0.441
     1.7 +e4d80dd0a663c5397a6a9178e08aea1e7808d43e Patch release 1.0.442
     1.8 +43ab5608555e12cb110ccda79cbfb9783e40408b Release 1.1.0
     1.9 +084c00652ac9fedcd56e2c316be795ed0ba00b2f Release 1.1.1
     2.1 --- a/build-mac/pEpEngine.xcodeproj/project.pbxproj	Fri Nov 09 09:05:32 2018 +0100
     2.2 +++ b/build-mac/pEpEngine.xcodeproj/project.pbxproj	Wed Nov 21 08:35:41 2018 +0100
     2.3 @@ -139,6 +139,8 @@
     2.4  		64A826891B455D0800EECAF0 /* trans_auto.c in Sources */ = {isa = PBXBuildFile; fileRef = 64A826731B455D0800EECAF0 /* trans_auto.c */; };
     2.5  		64A8268A1B455D0800EECAF0 /* transport.c in Sources */ = {isa = PBXBuildFile; fileRef = 64A826751B455D0800EECAF0 /* transport.c */; };
     2.6  		64A8268C1B455D9D00EECAF0 /* pEpEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 64A826611B455D0800EECAF0 /* pEpEngine.h */; };
     2.7 +		C46EBAED216E445F0042A6A3 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = C46EBAE7216E445F0042A6A3 /* base64.c */; };
     2.8 +		C46EBAEE216E445F0042A6A3 /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = C46EBAEC216E445F0042A6A3 /* base64.h */; };
     2.9  /* End PBXBuildFile section */
    2.10  
    2.11  /* Begin PBXContainerItemProxy section */
    2.12 @@ -356,6 +358,8 @@
    2.13  		64A826771B455D0800EECAF0 /* wrappers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wrappers.h; path = ../src/wrappers.h; sourceTree = "<group>"; };
    2.14  		64DA240C1B832EA0000BEE80 /* netpgp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = netpgp.xcodeproj; path = "../../netpgp-et/netpgp-xcode/netpgp.xcodeproj"; sourceTree = "<group>"; };
    2.15  		64DA24121B832EBA000BEE80 /* libetpan.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libetpan.xcodeproj; path = "../../libetpan/build-mac/libetpan.xcodeproj"; sourceTree = "<group>"; };
    2.16 +		C46EBAE7216E445F0042A6A3 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = base64.c; path = ../src/base64.c; sourceTree = "<group>"; };
    2.17 +		C46EBAEC216E445F0042A6A3 /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = base64.h; path = ../src/base64.h; sourceTree = "<group>"; };
    2.18  /* End PBXFileReference section */
    2.19  
    2.20  /* Begin PBXFrameworksBuildPhase section */
    2.21 @@ -525,6 +529,8 @@
    2.22  		64A8264B1B455C5600EECAF0 /* srcref */ = {
    2.23  			isa = PBXGroup;
    2.24  			children = (
    2.25 +				C46EBAE7216E445F0042A6A3 /* base64.c */,
    2.26 +				C46EBAEC216E445F0042A6A3 /* base64.h */,
    2.27  				438C43B42167752C00C7425B /* labeled_int_list.c */,
    2.28  				438C43AF2167752C00C7425B /* labeled_int_list.h */,
    2.29  				438C43962167582400C7425B /* sync_api.h */,
    2.30 @@ -643,6 +649,7 @@
    2.31  				646C410D1D510CD800C63EFF /* der_encoder.h in Headers */,
    2.32  				646C41231D510CD800C63EFF /* NativeEnumerated.h in Headers */,
    2.33  				646C41071D510CD800C63EFF /* constr_SET_OF.h in Headers */,
    2.34 +				C46EBAEE216E445F0042A6A3 /* base64.h in Headers */,
    2.35  				646C411B1D510CD800C63EFF /* Identity.h in Headers */,
    2.36  				646C412B1D510CD800C63EFF /* per_encoder.h in Headers */,
    2.37  				646C40F91D510CD800C63EFF /* ber_tlv_length.h in Headers */,
    2.38 @@ -877,6 +884,7 @@
    2.39  				646C412E1D510CD800C63EFF /* per_support.c in Sources */,
    2.40  				43F73C0C2166282C00AB4524 /* Sync_event.c in Sources */,
    2.41  				64A826781B455D0800EECAF0 /* bloblist.c in Sources */,
    2.42 +				C46EBAED216E445F0042A6A3 /* base64.c in Sources */,
    2.43  				430BCC492015EE800077E998 /* pEp_string.c in Sources */,
    2.44  				43F73C00216627CC00AB4524 /* Rollback.c in Sources */,
    2.45  				646C41041D510CD800C63EFF /* constr_SEQUENCE.c in Sources */,
     3.1 --- a/build-windows/pEpEngine.vcxproj	Fri Nov 09 09:05:32 2018 +0100
     3.2 +++ b/build-windows/pEpEngine.vcxproj	Wed Nov 21 08:35:41 2018 +0100
     3.3 @@ -115,6 +115,7 @@
     3.4      </PreBuildEvent>
     3.5    </ItemDefinitionGroup>
     3.6    <ItemGroup>
     3.7 +    <ClCompile Include="..\src\base64.c" />
     3.8      <ClCompile Include="..\src\baseprotocol.c" />
     3.9      <ClCompile Include="..\src\blacklist.c" />
    3.10      <ClCompile Include="..\src\bloblist.c" />
    3.11 @@ -152,6 +153,7 @@
    3.12    </ItemGroup>
    3.13    <ItemGroup>
    3.14      <ClInclude Include="..\src\asn1_helper.h" />
    3.15 +    <ClInclude Include="..\src\base64.h" />
    3.16      <ClInclude Include="..\src\baseprotocol.h" />
    3.17      <ClInclude Include="..\src\blacklist.h" />
    3.18      <ClInclude Include="..\src\bloblist.h" />
     4.1 --- a/build-windows/pEpEngine.vcxproj.filters	Fri Nov 09 09:05:32 2018 +0100
     4.2 +++ b/build-windows/pEpEngine.vcxproj.filters	Wed Nov 21 08:35:41 2018 +0100
     4.3 @@ -117,6 +117,9 @@
     4.4      <ClCompile Include="..\src\growing_buf.c">
     4.5        <Filter>Quelldateien</Filter>
     4.6      </ClCompile>
     4.7 +    <ClCompile Include="..\src\base64.c">
     4.8 +      <Filter>Quelldateien</Filter>
     4.9 +    </ClCompile>
    4.10    </ItemGroup>
    4.11    <ItemGroup>
    4.12      <ClInclude Include="..\src\keymanagement.h">
    4.13 @@ -215,6 +218,9 @@
    4.14      <ClInclude Include="..\src\labeled_int_list.h">
    4.15        <Filter>Headerdateien</Filter>
    4.16      </ClInclude>
    4.17 +    <ClInclude Include="..\src\base64.h">
    4.18 +      <Filter>Headerdateien</Filter>
    4.19 +    </ClInclude>
    4.20      <ClInclude Include="..\src\key_reset.h">
    4.21        <Filter>Headerdateien</Filter>
    4.22      </ClInclude>
     5.1 --- a/src/Makefile	Fri Nov 09 09:05:32 2018 +0100
     5.2 +++ b/src/Makefile	Wed Nov 21 08:35:41 2018 +0100
     5.3 @@ -90,8 +90,8 @@
     5.4  	cp -v pEpEngine.h keymanagement.h message_api.h dynamic_api.h stringlist.h \
     5.5  	      timestamp.h identity_list.h bloblist.h stringpair.h message.h mime.h \
     5.6  	      cryptotech.h sync_api.h blacklist.h pEp_string.h openpgp_compat.h \
     5.7 -	      labeled_int_list.h key_reset.h \
     5.8 -		  ../asn.1/*.h sync_codec.h $(PREFIX)/include/pEp/
     5.9 +	      labeled_int_list.h key_reset.h base64.h sync_codec.h \
    5.10 +		  ../asn.1/*.h $(PREFIX)/include/pEp/
    5.11  
    5.12  .PHONY: uninstall
    5.13  uninstall:
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/base64.c	Wed Nov 21 08:35:41 2018 +0100
     6.3 @@ -0,0 +1,220 @@
     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 "base64.h"
    6.14 +
    6.15 +static char translate_char_to_bits(char input) {
    6.16 +    if (input >= 65 && input <= 90)
    6.17 +        return input - 65;
    6.18 +    if (input >= 97 && input <= 122)
    6.19 +        return input - 71; // 97 - 26
    6.20 +    if (input >= 48 && input <= 57)
    6.21 +        return input + 4; // 52 - 48
    6.22 +    if (input == '+')
    6.23 +        return 62;
    6.24 +    if (input == '/')
    6.25 +        return 63;
    6.26 +    if (input == ' ' || input == '\r' || input == '\n')
    6.27 +        return 127;
    6.28 +    return -1;    
    6.29 +}
    6.30 +
    6.31 +static bool _is_whitespace(const char in) {
    6.32 +    switch (in) {
    6.33 +        case ' ':
    6.34 +        case '\r':
    6.35 +        case '\t':
    6.36 +        case '\n':
    6.37 +            return true;
    6.38 +        default:
    6.39 +            return false;
    6.40 +    }        
    6.41 +}
    6.42 +
    6.43 +static size_t subtract_whitespace(const char* input, int length) {
    6.44 +    size_t actual_size = length;
    6.45 +    int i;
    6.46 +    const char* curr = input;
    6.47 +    for (i = 0; i < length; i++, curr++) {
    6.48 +        if (_is_whitespace(*curr))
    6.49 +            actual_size--;
    6.50 +    }
    6.51 +    return actual_size;
    6.52 +}
    6.53 +    
    6.54 +static void trim_end(const char* input, int* length) {
    6.55 +    const char* end = input + *length;
    6.56 +    
    6.57 +    int start_length = *length;
    6.58 +    
    6.59 +    int i;
    6.60 +    
    6.61 +    for (i = 0; i < start_length; i++) {
    6.62 +        if (!_is_whitespace(*(--end)))
    6.63 +            break;
    6.64 +        (*length) = (*length) - 1;        
    6.65 +    }
    6.66 +}    
    6.67 +    
    6.68 +char next_char(const char** input_ptr, const char* end) {
    6.69 +    const char* input = *input_ptr;
    6.70 +    char this_ch = 0;
    6.71 +    
    6.72 +    while (input < end) {
    6.73 +        this_ch = *input++;
    6.74 +        if (!this_ch)
    6.75 +            return 0;
    6.76 +        if (_is_whitespace(this_ch))
    6.77 +            continue;
    6.78 +        break;    
    6.79 +    }
    6.80 +    
    6.81 +    *input_ptr = input;
    6.82 +    return this_ch;
    6.83 +}
    6.84 +
    6.85 +// 4 chars = 3 output bytes
    6.86 +bloblist_t* base64_str_to_binary_blob(const char* input, int length) {
    6.87 +    if (length == 0)
    6.88 +        return NULL;
    6.89 +    
    6.90 +    trim_end(input, &length);
    6.91 +        
    6.92 +    const char* input_curr;
    6.93 +    input_curr = input;
    6.94 +    const char* input_end = input_curr + length;
    6.95 +    length = subtract_whitespace(input, length);
    6.96 +    size_t final_length = (length / 4) * 3;
    6.97 +
    6.98 +    // padded -- FIXME: whitespace in between ==!!!! 
    6.99 +    if (*(input_end - 1) == '=') {
   6.100 +        final_length -= 1;
   6.101 +        
   6.102 +        if (*(input_end - 2) == '=')
   6.103 +            final_length -=1;
   6.104 +    }
   6.105 +    else {
   6.106 +        // not padded
   6.107 +        int leftover = length % 4;
   6.108 +        switch (leftover) {
   6.109 +            case 0:
   6.110 +                break;
   6.111 +            case 2:
   6.112 +                final_length++;
   6.113 +                break;
   6.114 +            case 3:
   6.115 +                final_length+=2;
   6.116 +                break;
   6.117 +            default:
   6.118 +                return NULL;
   6.119 +        }
   6.120 +    }
   6.121 +    void* blobby = calloc(final_length, 1);
   6.122 +    char* blobby_curr = (char*)blobby;
   6.123 +
   6.124 +    // if the last 1 or 2 bytes are padded, we do those after
   6.125 +    size_t number_of_rounds = final_length / 3;
   6.126 +    
   6.127 +    unsigned int cycle;
   6.128 +    
   6.129 +    // full 3-byte rounds
   6.130 +    for (cycle = 0; cycle < number_of_rounds; cycle++) {
   6.131 +        char byte_array[] = {0,0,0};
   6.132 +        char in_val = next_char(&input_curr, input_end);
   6.133 +        if (in_val == 0)
   6.134 +            goto pEp_error; // can ALSO happen when input_curr == input_end,
   6.135 +                            // which simply shouldn't happen, since we're
   6.136 +                            // interating based on expected OUTPUT, not
   6.137 +                            // input.
   6.138 +                            
   6.139 +        char out_val = translate_char_to_bits(in_val);
   6.140 +        if (out_val > 63)
   6.141 +            goto pEp_error;
   6.142 +        
   6.143 +        byte_array[0] |= out_val << 2;
   6.144 +
   6.145 +        in_val = next_char(&input_curr, input_end);
   6.146 +        if (in_val == 0)
   6.147 +            goto pEp_error;         
   6.148 +        out_val = translate_char_to_bits(in_val);
   6.149 +        if (out_val > 63)
   6.150 +            goto pEp_error;
   6.151 +
   6.152 +        byte_array[0] |= out_val >> 4;
   6.153 +        byte_array[1] = out_val << 4;
   6.154 +        
   6.155 +        in_val = next_char(&input_curr, input_end);
   6.156 +        if (in_val == 0)
   6.157 +            goto pEp_error;         
   6.158 +        out_val = translate_char_to_bits(in_val);
   6.159 +        if (out_val > 63)
   6.160 +            goto pEp_error;
   6.161 +    
   6.162 +        byte_array[1] |= out_val >> 2;
   6.163 +        byte_array[2] = out_val << 6;
   6.164 +
   6.165 +        in_val = next_char(&input_curr, input_end);
   6.166 +        if (in_val == 0)
   6.167 +            goto pEp_error;         
   6.168 +        out_val = translate_char_to_bits(in_val);
   6.169 +        if (out_val > 63)
   6.170 +            goto pEp_error;
   6.171 +        
   6.172 +        byte_array[2] |= out_val;
   6.173 +        
   6.174 +        // Now write everything to the blob
   6.175 +        *blobby_curr++ = byte_array[0];
   6.176 +        *blobby_curr++ = byte_array[1];
   6.177 +        *blobby_curr++ = byte_array[2];        
   6.178 +    }
   6.179 +
   6.180 +    int last_bytes = final_length % 3;
   6.181 +
   6.182 +    if (last_bytes != 0) {
   6.183 +        char byte_1 = 0;
   6.184 +        char byte_2 = 0;
   6.185 +
   6.186 +        char in_val = next_char(&input_curr, input_end);
   6.187 +        if (in_val == 0)
   6.188 +            goto pEp_error;         
   6.189 +        char out_val = translate_char_to_bits(in_val);
   6.190 +        if (out_val > 63)
   6.191 +            goto pEp_error;
   6.192 +        byte_1 = out_val << 2;
   6.193 +        in_val = next_char(&input_curr, input_end);
   6.194 +        if (in_val == 0)
   6.195 +            goto pEp_error;         
   6.196 +        out_val = translate_char_to_bits(in_val);
   6.197 +        if (out_val > 63)
   6.198 +            goto pEp_error;
   6.199 +        byte_1 |= out_val >> 4;
   6.200 +        *blobby_curr++ = byte_1;                   
   6.201 +            
   6.202 +        if (last_bytes == 2) {
   6.203 +            byte_2 = out_val << 4;
   6.204 +            in_val = next_char(&input_curr, input_end);
   6.205 +            if (in_val == 0)
   6.206 +                goto pEp_error;         
   6.207 +            
   6.208 +            out_val = translate_char_to_bits(in_val);
   6.209 +            if (out_val > 63)
   6.210 +                goto pEp_error;
   6.211 +        
   6.212 +            byte_2 |= out_val >> 2;
   6.213 +            *blobby_curr++ = byte_2;
   6.214 +        }
   6.215 +    }
   6.216 +    
   6.217 +    return new_bloblist((char*)blobby, final_length, NULL, NULL);
   6.218 +            
   6.219 +pEp_error:
   6.220 +    free(blobby);
   6.221 +    return NULL;
   6.222 +}    
   6.223 +
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/base64.h	Wed Nov 21 08:35:41 2018 +0100
     7.3 @@ -0,0 +1,17 @@
     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 "bloblist.h"
    7.11 +
    7.12 +#ifdef __cplusplus
    7.13 +extern "C" {
    7.14 +#endif
    7.15 +
    7.16 +bloblist_t* base64_str_to_binary_blob(const char* input, int length);
    7.17 +
    7.18 +#ifdef __cplusplus
    7.19 +}
    7.20 +#endif
     8.1 --- a/src/baseprotocol.c	Fri Nov 09 09:05:32 2018 +0100
     8.2 +++ b/src/baseprotocol.c	Wed Nov 21 08:35:41 2018 +0100
     8.3 @@ -5,11 +5,15 @@
     8.4  #include "message_api.h"
     8.5  
     8.6  PEP_STATUS base_decorate_message(
     8.7 +        PEP_SESSION session,
     8.8          message *msg,
     8.9          char *payload,
    8.10 -        size_t size
    8.11 +        size_t size,
    8.12 +        char *fpr
    8.13      )
    8.14  {
    8.15 +    PEP_STATUS status = PEP_STATUS_OK;
    8.16 +
    8.17      assert(msg);
    8.18      assert(payload);
    8.19      assert(size);
    8.20 @@ -22,18 +26,37 @@
    8.21      if (bl == NULL)
    8.22          goto enomem;
    8.23  
    8.24 -    msg->attachments = bl;
    8.25 +    if (fpr) {
    8.26 +        char *sign;
    8.27 +        size_t sign_size;
    8.28 +        status = sign_only(session,  payload, size, fpr, &sign, &sign_size);
    8.29 +        if (status)
    8.30 +            goto error;
    8.31 +
    8.32 +        assert(sign && sign_size);
    8.33 +
    8.34 +        bl = bloblist_add(bl, sign, sign_size,
    8.35 +                "application/pEp.sign", "ignore_this_attachment.pEp");
    8.36 +        if (!bl)
    8.37 +            goto enomem;
    8.38 +    }
    8.39 +
    8.40      return PEP_STATUS_OK;
    8.41  
    8.42  enomem:
    8.43 -    return PEP_OUT_OF_MEMORY;
    8.44 +    status = PEP_OUT_OF_MEMORY;
    8.45 +
    8.46 +error:
    8.47 +    return status;
    8.48  }
    8.49  
    8.50  PEP_STATUS base_prepare_message(
    8.51 +        PEP_SESSION session,
    8.52          const pEp_identity *me,
    8.53          const pEp_identity *partner,
    8.54          char *payload,
    8.55          size_t size,
    8.56 +        char *fpr,
    8.57          message **result
    8.58      )
    8.59  {
    8.60 @@ -75,7 +98,7 @@
    8.61      if (!msg->longmsg)
    8.62          goto enomem;
    8.63  
    8.64 -    status = base_decorate_message(msg, payload, size);
    8.65 +    status = base_decorate_message(session, msg, payload, size, fpr);
    8.66      if (status == PEP_STATUS_OK)
    8.67          *result = msg;
    8.68      return status;
    8.69 @@ -85,3 +108,77 @@
    8.70      return PEP_OUT_OF_MEMORY;
    8.71  }
    8.72  
    8.73 +PEP_STATUS base_extract_message(
    8.74 +        PEP_SESSION session,
    8.75 +        message *msg,
    8.76 +        size_t *size,
    8.77 +        const char **payload,
    8.78 +        char **fpr
    8.79 +    )
    8.80 +{
    8.81 +    PEP_STATUS status = PEP_STATUS_OK;
    8.82 +
    8.83 +    assert(session && msg && size && payload && fpr);
    8.84 +    if (!(session && msg && size && payload && fpr))
    8.85 +        return PEP_ILLEGAL_VALUE;
    8.86 +
    8.87 +    *size = 0;
    8.88 +    *payload = NULL;
    8.89 +
    8.90 +    const char *_payload = NULL;
    8.91 +    size_t _payload_size = 0;
    8.92 +    const char *_sign = NULL;
    8.93 +    size_t _sign_size = 0;
    8.94 +    stringlist_t *keylist = NULL;
    8.95 +
    8.96 +    for (bloblist_t *bl = msg->attachments; bl ; bl = bl->next) {
    8.97 +        if (bl->mime_type && strcasecmp(bl->mime_type, "application/pEp.sync") == 0) {
    8.98 +            if (!_payload) {
    8.99 +                _payload = bl->value;
   8.100 +                _payload_size = bl->size;
   8.101 +            }
   8.102 +            else {
   8.103 +                status = PEP_DECRYPT_WRONG_FORMAT;
   8.104 +                goto the_end;
   8.105 +            }
   8.106 +        }
   8.107 +        else if (bl->mime_type && strcasecmp(bl->mime_type, "application/pEp.sign") == 0) {
   8.108 +            if (!_sign) {
   8.109 +                _sign = bl->value;
   8.110 +                _sign_size = bl->size;
   8.111 +            }
   8.112 +            else {
   8.113 +                status = PEP_DECRYPT_WRONG_FORMAT;
   8.114 +                goto the_end;
   8.115 +            }
   8.116 +        }
   8.117 +    }
   8.118 +    
   8.119 +    if (!(_payload && _payload_size))
   8.120 +        goto the_end;
   8.121 +
   8.122 +    if (_sign) {
   8.123 +        status = verify_text(session, _payload, _payload_size, _sign, _sign_size, &keylist);
   8.124 +        if (status != PEP_VERIFIED || !keylist || !keylist->value) {
   8.125 +            // signature invalid or does not match; ignore sync message
   8.126 +            status = PEP_STATUS_OK;
   8.127 +            goto the_end;
   8.128 +        }
   8.129 +
   8.130 +        char *_fpr = strdup(keylist->value);
   8.131 +        assert(_fpr);
   8.132 +        if (!_fpr) {
   8.133 +            status = PEP_OUT_OF_MEMORY;
   8.134 +            goto the_end;
   8.135 +        }
   8.136 +    }
   8.137 +
   8.138 +    *size = _payload_size;
   8.139 +    *payload = _payload;
   8.140 +    status = PEP_STATUS_OK;
   8.141 +
   8.142 +the_end:
   8.143 +    free_stringlist(keylist);
   8.144 +    return status;
   8.145 +}
   8.146 +
     9.1 --- a/src/baseprotocol.h	Fri Nov 09 09:05:32 2018 +0100
     9.2 +++ b/src/baseprotocol.h	Wed Nov 21 08:35:41 2018 +0100
     9.3 @@ -13,9 +13,11 @@
     9.4  // base_decorate_message() - decorate a message with payload
     9.5  //
     9.6  //  parameters:
     9.7 +//      session (in)    session handle
     9.8  //      msg (inout)     message to decorate
     9.9  //      payload (in)    payload to send
    9.10  //      size (in)       size of payload
    9.11 +//      fpr (in)        optional key to sign or NULL
    9.12  //
    9.13  //  returns:
    9.14  //      PEP_STATUS_OK and result on success or an error on failure
    9.15 @@ -25,19 +27,23 @@
    9.16  //      the ownership of the msg remains with the caller
    9.17  
    9.18  PEP_STATUS base_decorate_message(
    9.19 +        PEP_SESSION session,
    9.20          message *msg,
    9.21          char *payload,
    9.22 -        size_t size
    9.23 +        size_t size,
    9.24 +        char *fpr
    9.25      );
    9.26  
    9.27  
    9.28  // base_prepare_message() - prepare a sync message with payload
    9.29  //
    9.30  //  parameters:
    9.31 +//      session (in)    session handle
    9.32  //      me (in)         identity to use for the sender
    9.33  //      partner (in)    identity to use for the receiver
    9.34  //      payload (in)    payload to send
    9.35  //      size (in)       size of payload
    9.36 +//      fpr (in)        optional key to sign or NULL
    9.37  //      result (out)    message with payload
    9.38  //
    9.39  //  returns:
    9.40 @@ -48,14 +54,44 @@
    9.41  //      the ownership of the result goes to the caller
    9.42  
    9.43  PEP_STATUS base_prepare_message(
    9.44 +        PEP_SESSION session,
    9.45          const pEp_identity *me,
    9.46          const pEp_identity *partner,
    9.47          char *payload,
    9.48          size_t size,
    9.49 +        char *fpr,
    9.50          message **result
    9.51      );
    9.52  
    9.53  
    9.54 +// base_extract_message() - extract a sync message from a pEp message
    9.55 +//
    9.56 +//  parameters:
    9.57 +//      session (in)    session handle
    9.58 +//      msg (in)        message to analyze
    9.59 +//      size (out)      size of extracted payload or 0 if not found
    9.60 +//      payload (out)   extraced payload
    9.61 +//      fpr (out)       if message was correctly signed then fpr of signature's
    9.62 +//                      key, otherwise NULL
    9.63 +//
    9.64 +//  returns:
    9.65 +//      PEP_STATUS_OK and payload == NULL if no sync message
    9.66 +//      PEP_STATUS_OK and payload, size if sync message found
    9.67 +//      any other value on error
    9.68 +//
    9.69 +//  caveat:
    9.70 +//      payload may point to msg attachment, the ownership does not change
    9.71 +//      if fpr != NULL the ownership goes to the caller
    9.72 +
    9.73 +PEP_STATUS base_extract_message(
    9.74 +        PEP_SESSION session,
    9.75 +        message *msg,
    9.76 +        size_t *size,
    9.77 +        const char **payload,
    9.78 +        char **fpr
    9.79 +    );
    9.80 +
    9.81 +
    9.82  #ifdef __cplusplus
    9.83  }
    9.84  #endif
    10.1 --- a/src/cryptotech.c	Fri Nov 09 09:05:32 2018 +0100
    10.2 +++ b/src/cryptotech.c	Wed Nov 21 08:35:41 2018 +0100
    10.3 @@ -37,6 +37,7 @@
    10.4          cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify = pgp_decrypt_and_verify;
    10.5          cryptotech[PEP_crypt_OpenPGP].encrypt_and_sign = pgp_encrypt_and_sign;
    10.6          cryptotech[PEP_crypt_OpenPGP].encrypt_only = pgp_encrypt_only;
    10.7 +        cryptotech[PEP_crypt_OpenPGP].sign_only = pgp_sign_only;        
    10.8          cryptotech[PEP_crypt_OpenPGP].verify_text = pgp_verify_text;
    10.9          cryptotech[PEP_crypt_OpenPGP].delete_keypair = pgp_delete_keypair;
   10.10          cryptotech[PEP_crypt_OpenPGP].export_key = pgp_export_keydata;
    11.1 --- a/src/cryptotech.h	Fri Nov 09 09:05:32 2018 +0100
    11.2 +++ b/src/cryptotech.h	Wed Nov 21 08:35:41 2018 +0100
    11.3 @@ -38,6 +38,11 @@
    11.4          size_t psize, char **ctext, size_t *csize
    11.5      );
    11.6  
    11.7 +typedef PEP_STATUS (*sign_only_t)(
    11.8 +        PEP_SESSION session, const char* fpr, const char *ptext,
    11.9 +        size_t psize, char **stext, size_t *ssize
   11.10 +    );
   11.11 +
   11.12  typedef PEP_STATUS (*delete_keypair_t)(PEP_SESSION session, const char *fpr);
   11.13  
   11.14  typedef PEP_STATUS (*export_key_t)(
   11.15 @@ -99,6 +104,7 @@
   11.16      verify_text_t verify_text;
   11.17      encrypt_and_sign_t encrypt_and_sign;
   11.18      encrypt_only_t encrypt_only;
   11.19 +    sign_only_t sign_only;    
   11.20      delete_keypair_t delete_keypair;
   11.21      export_key_t export_key;
   11.22      find_keys_t find_keys;
    12.1 --- a/src/keymanagement.c	Fri Nov 09 09:05:32 2018 +0100
    12.2 +++ b/src/keymanagement.c	Wed Nov 21 08:35:41 2018 +0100
    12.3 @@ -133,6 +133,19 @@
    12.4          get_key_rating(session, fpr, &ct);
    12.5          ident->comm_type = ct;
    12.6      }
    12.7 +    else if (ct == PEP_ct_key_expired || ct == PEP_ct_key_expired_but_confirmed) {
    12.8 +        PEP_comm_type ct_expire_check = PEP_ct_unknown;
    12.9 +        get_key_rating(session, fpr, &ct_expire_check);
   12.10 +        if (ct_expire_check >= PEP_ct_strong_but_unconfirmed) {
   12.11 +            ident->comm_type = ct_expire_check;
   12.12 +            if (ct == PEP_ct_key_expired_but_confirmed)
   12.13 +                ident->comm_type |= PEP_ct_confirmed;
   12.14 +            ct = ident->comm_type;
   12.15 +            // We need to fix this trust in the DB.
   12.16 +            status = set_trust(session, ident);
   12.17 +        }
   12.18 +    }
   12.19 +    
   12.20      
   12.21      bool pEp_user = false;
   12.22      
   12.23 @@ -192,18 +205,28 @@
   12.24              // if key is valid (second check because pEp key might be extended above)
   12.25              //      Return fpr        
   12.26              status = key_expired(session, fpr, time(NULL), &expired);            
   12.27 -            if (status != PEP_STATUS_OK) {
   12.28 -                 ident->comm_type = PEP_ct_key_expired;
   12.29 -                 return status;
   12.30 -             }
   12.31 +            if (status != PEP_STATUS_OK)
   12.32 +                return status;
   12.33 +                
   12.34 +            if (expired) {
   12.35 +                if (ident->comm_type & PEP_ct_confirmed || (ident->comm_type == PEP_ct_key_expired_but_confirmed))
   12.36 +                    ident->comm_type = PEP_ct_key_expired_but_confirmed;
   12.37 +                else
   12.38 +                    ident->comm_type = PEP_ct_key_expired;
   12.39 +                return status;
   12.40 +            }
   12.41              // communicate key(?)
   12.42          }        
   12.43      }
   12.44       
   12.45      if (revoked) 
   12.46          ct = PEP_ct_key_revoked;
   12.47 -    else if (expired)
   12.48 -        ct = PEP_ct_key_expired;        
   12.49 +    else if (expired) {
   12.50 +        if (ident->comm_type & PEP_ct_confirmed || (ident->comm_type == PEP_ct_key_expired_but_confirmed))
   12.51 +            ct = PEP_ct_key_expired_but_confirmed;
   12.52 +        else
   12.53 +            ct = PEP_ct_key_expired;
   12.54 +    }
   12.55      else if (blacklisted) { // never true for .me
   12.56          ident->comm_type = ct = PEP_ct_key_not_found;
   12.57          free(ident->fpr);
   12.58 @@ -213,6 +236,7 @@
   12.59      
   12.60      switch (ct) {
   12.61          case PEP_ct_key_expired:
   12.62 +        case PEP_ct_key_expired_but_confirmed:
   12.63          case PEP_ct_key_revoked:
   12.64          case PEP_ct_key_b0rken:
   12.65              // delete key from being default key for all users/identities
   12.66 @@ -375,6 +399,7 @@
   12.67          case PEP_ct_key_revoked:
   12.68          case PEP_ct_key_b0rken:
   12.69          case PEP_ct_key_expired:
   12.70 +        case PEP_ct_key_expired_but_confirmed:
   12.71          case PEP_ct_compromised:
   12.72          case PEP_ct_mistrusted:
   12.73              // this only happens when it's all there is
   12.74 @@ -757,9 +782,36 @@
   12.75                  status = elect_pubkey(session, identity, false);
   12.76                               
   12.77                  //    * call set_identity() to store
   12.78 -                if (identity->fpr)
   12.79 +                if (identity->fpr) {
   12.80 +                    // it is still possible we have DB information on this key. Better check.
   12.81 +                    status = get_trust(session, identity);
   12.82 +                    PEP_comm_type db_ct = identity->comm_type;
   12.83                      status = get_key_rating(session, identity->fpr, &identity->comm_type);
   12.84 -            
   12.85 +                    PEP_comm_type key_ct = identity->comm_type;
   12.86 +                                        
   12.87 +                    if (status == PEP_STATUS_OK) {
   12.88 +                        switch (key_ct) {
   12.89 +                            case PEP_ct_key_expired:
   12.90 +                                if (db_ct == PEP_ct_key_expired_but_confirmed)
   12.91 +                                    identity->comm_type = db_ct;
   12.92 +                                break;    
   12.93 +                            default:
   12.94 +                                switch(db_ct) {
   12.95 +                                    case PEP_ct_key_expired_but_confirmed:
   12.96 +                                        if (key_ct >= PEP_ct_strong_but_unconfirmed)
   12.97 +                                            identity->comm_type |= PEP_ct_confirmed;
   12.98 +                                        break;
   12.99 +                                    case PEP_ct_mistrusted:
  12.100 +                                    case PEP_ct_compromised:
  12.101 +                                    case PEP_ct_key_b0rken:
  12.102 +                                        identity->comm_type = db_ct;
  12.103 +                                    default:
  12.104 +                                        break;
  12.105 +                                }    
  12.106 +                                break;
  12.107 +                        }
  12.108 +                    }
  12.109 +                }
  12.110                  //    * call set_identity() to store
  12.111                  adjust_pEp_trust_status(session, identity);            
  12.112                  status = set_identity(session, identity);
  12.113 @@ -1072,6 +1124,7 @@
  12.114                  if (revoked_fpr) {
  12.115                      status = set_revoked(session, revoked_fpr,
  12.116                                           stored_identity->fpr, time(NULL));
  12.117 +                    assert(status == PEP_STATUS_OK);                     
  12.118                  }
  12.119              }
  12.120          }
    13.1 --- a/src/message_api.c	Fri Nov 09 09:05:32 2018 +0100
    13.2 +++ b/src/message_api.c	Wed Nov 21 08:35:41 2018 +0100
    13.3 @@ -7,7 +7,9 @@
    13.4  #include "platform.h"
    13.5  #include "mime.h"
    13.6  #include "blacklist.h"
    13.7 +#include "baseprotocol.h"
    13.8  #include "KeySync_fsm.h"
    13.9 +#include "base64.h"
   13.10  
   13.11  #include <assert.h>
   13.12  #include <string.h>
   13.13 @@ -2793,7 +2795,7 @@
   13.14                      ptext = NULL;
   13.15                  }
   13.16                  else {
   13.17 -                    static const char * const mime_type = "application/octet-stream";
   13.18 +                    static const char * const mime_type = "application/octet-stream";                    
   13.19                      if (pgp_filename) {
   13.20                          _m = bloblist_add(_m, ptext, psize, mime_type,
   13.21                               pgp_filename);
   13.22 @@ -3102,6 +3104,28 @@
   13.23      return NULL;
   13.24  }
   13.25  
   13.26 +static bool import_header_keys(PEP_SESSION session, message* src) {
   13.27 +    stringpair_list_t* header_keys = stringpair_list_find(src->opt_fields, "Autocrypt"); 
   13.28 +    if (!header_keys || !header_keys->value)
   13.29 +        return false;
   13.30 +    const char* value = header_keys->value->value;
   13.31 +    if (!value)
   13.32 +        return false;
   13.33 +    const char* start_key = strstr(value, "keydata=");
   13.34 +    if (!start_key)
   13.35 +        return false;
   13.36 +    start_key += 8; // length of "keydata="
   13.37 +    int length = strlen(start_key);
   13.38 +    bloblist_t* the_key = base64_str_to_binary_blob(start_key, length);
   13.39 +    if (!the_key)
   13.40 +        return false;
   13.41 +    PEP_STATUS status = import_key(session, the_key->value, the_key->size, NULL);
   13.42 +    free_bloblist(the_key);
   13.43 +    if (status == PEP_STATUS_OK)
   13.44 +        return true;
   13.45 +    return false;
   13.46 +}
   13.47 +
   13.48  PEP_STATUS check_for_own_revoked_key(
   13.49          PEP_SESSION session, 
   13.50          stringlist_t* keylist,
   13.51 @@ -3254,7 +3278,8 @@
   13.52      /*** Begin Import any attached public keys and update identities accordingly ***/
   13.53      // Private key in unencrypted mail are ignored -> NULL
   13.54      bool imported_keys = import_attached_keys(session, src, NULL);
   13.55 -
   13.56 +    import_header_keys(session, src);
   13.57 +    
   13.58      // FIXME: is this really necessary here?
   13.59      if (src->from) {
   13.60          if (!is_me(session, src->from))
   13.61 @@ -3262,7 +3287,8 @@
   13.62          else
   13.63              status = myself(session, src->from);
   13.64          
   13.65 -        if (status != PEP_STATUS_OK)
   13.66 +        // We absolutely should NOT be bailing here unless it's a serious error
   13.67 +        if (status == PEP_OUT_OF_MEMORY)
   13.68              return status;
   13.69      }
   13.70      
   13.71 @@ -3723,15 +3749,29 @@
   13.72      if (!(session && src && dst && keylist && rating && flags))
   13.73          return PEP_ILLEGAL_VALUE;
   13.74  
   13.75 +    *keylist = NULL;
   13.76      PEP_STATUS status = _decrypt_message(session, src, dst, keylist, rating, flags, NULL);
   13.77  
   13.78      message *msg = *dst ? *dst : src;
   13.79  
   13.80 -    if (session->inject_sync_event && msg && msg->attachments) {
   13.81 -        for (bloblist_t *bl = msg->attachments; bl ; bl = bl->next) {
   13.82 -            if (bl->mime_type && strcasecmp(bl->mime_type, "application/pEp.sync") == 0)
   13.83 -                signal_Sync_message(session, *rating, bl->value, bl->size);
   13.84 +    if (session->inject_sync_event && msg && msg->from) {
   13.85 +        size_t size;
   13.86 +        const char *data;
   13.87 +        char *sync_fpr = NULL;
   13.88 +        status = base_extract_message(session, msg, &size, &data, &sync_fpr);
   13.89 +        if (!status && size && data) {
   13.90 +            pEp_identity *_from = identity_dup(msg->from);
   13.91 +            if (!_from) {
   13.92 +                free_message(*dst);
   13.93 +                *dst = NULL;
   13.94 +                free_stringlist(*keylist);
   13.95 +                *keylist = NULL;
   13.96 +                return PEP_OUT_OF_MEMORY;
   13.97 +            }
   13.98 +            memcpy(&session->sync_state.common.from, _from, sizeof(pEp_identity));
   13.99 +            signal_Sync_message(session, *rating, data, size, sync_fpr);
  13.100          }
  13.101 +        free(sync_fpr);
  13.102      }
  13.103  
  13.104      return status;
    14.1 --- a/src/pEpEngine.c	Fri Nov 09 09:05:32 2018 +0100
    14.2 +++ b/src/pEpEngine.c	Wed Nov 21 08:35:41 2018 +0100
    14.3 @@ -3869,6 +3869,28 @@
    14.4              keylist, ptext, psize, ctext, csize);
    14.5  }
    14.6  
    14.7 +PEP_STATUS sign_only(PEP_SESSION session, 
    14.8 +                     const char *data, 
    14.9 +                     size_t data_size, 
   14.10 +                     const char *fpr, 
   14.11 +                     char **sign, 
   14.12 +                     size_t *sign_size) {
   14.13 +    assert(session);
   14.14 +    assert(fpr);
   14.15 +    assert(data);
   14.16 +    assert(data_size);
   14.17 +    assert(sign);
   14.18 +    assert(sign_size);
   14.19 +
   14.20 +    if (!(session && fpr && data && data_size && sign && sign_size))
   14.21 +        return PEP_ILLEGAL_VALUE;
   14.22 +
   14.23 +    return session->cryptotech[PEP_crypt_OpenPGP].sign_only(session,
   14.24 +                                fpr, data, data_size, sign, sign_size);
   14.25 +                         
   14.26 +}
   14.27 +
   14.28 +
   14.29  
   14.30  DYNAMIC_API PEP_STATUS verify_text(
   14.31      PEP_SESSION session, const char *text, size_t size,
    15.1 --- a/src/pEpEngine.h	Fri Nov 09 09:05:32 2018 +0100
    15.2 +++ b/src/pEpEngine.h	Wed Nov 21 08:35:41 2018 +0100
    15.3 @@ -484,6 +484,7 @@
    15.4      PEP_ct_key_expired = 0x04,
    15.5      PEP_ct_key_revoked = 0x05,
    15.6      PEP_ct_key_b0rken = 0x06,
    15.7 +    PEP_ct_key_expired_but_confirmed = 0x07, // NOT with confirmed bit. Just retaining info here in case of renewal.
    15.8      PEP_ct_my_key_not_included = 0x09,
    15.9  
   15.10      PEP_ct_security_by_obscurity = 0x0a,
   15.11 @@ -1370,7 +1371,14 @@
   15.12          PEP_SESSION session,
   15.13          const char *fpr,
   15.14          identity_list **identities);
   15.15 -
   15.16 +        
   15.17 +PEP_STATUS sign_only(PEP_SESSION session, 
   15.18 +                     const char *data, 
   15.19 +                     size_t data_size, 
   15.20 +                     const char *fpr, 
   15.21 +                     char **sign, 
   15.22 +                     size_t *sign_size);
   15.23 +                     
   15.24  #ifdef __cplusplus
   15.25  }
   15.26  #endif
    16.1 --- a/src/pEp_internal.h	Fri Nov 09 09:05:32 2018 +0100
    16.2 +++ b/src/pEp_internal.h	Wed Nov 21 08:35:41 2018 +0100
    16.3 @@ -1,7 +1,7 @@
    16.4  // This file is under GNU General Public License 3.0
    16.5  // see LICENSE.txt
    16.6  
    16.7 -#define PEP_ENGINE_VERSION "0.9.0"
    16.8 +#define PEP_ENGINE_VERSION "1.1.1"
    16.9  
   16.10  // maximum attachment size to import as key 1MB, maximum of 20 attachments
   16.11  
    17.1 --- a/src/pgp_gpg.c	Fri Nov 09 09:05:32 2018 +0100
    17.2 +++ b/src/pgp_gpg.c	Wed Nov 21 08:35:41 2018 +0100
    17.3 @@ -11,6 +11,12 @@
    17.4  
    17.5  #define _GPGERR(X) ((X) & 0xffffL)
    17.6  
    17.7 +#ifdef NODLSYM
    17.8 +#define DLOAD(X) gpg.X = X
    17.9 +#else
   17.10 +#define DLOAD(X) gpg.X = (X ## _t) (intptr_t) dlsym(gpgme, #X); assert(gpg.X)
   17.11 +#endif
   17.12 +
   17.13  static void *gpgme;
   17.14  static struct gpg_s gpg;
   17.15  
   17.16 @@ -298,18 +304,17 @@
   17.17              goto pEp_error;
   17.18          }
   17.19  
   17.20 +#ifndef NODLSYM
   17.21          gpgme = dlopen(LIBGPGME, RTLD_LAZY);
   17.22          if (gpgme == NULL) {
   17.23              status = PEP_INIT_CANNOT_LOAD_GPGME;
   17.24              goto pEp_error;
   17.25          }
   17.26 +#endif
   17.27  
   17.28          memset(&gpg, 0, sizeof(struct gpg_s));
   17.29  
   17.30 -        gpg.gpgme_get_engine_info
   17.31 -            = (gpgme_get_engine_info_t) (intptr_t) dlsym(gpgme,
   17.32 -            "gpgme_get_engine_info");
   17.33 -        assert(gpg.gpgme_get_engine_info);
   17.34 +        DLOAD(gpgme_get_engine_info);
   17.35  
   17.36          gpgme_engine_info_t info;
   17.37          int err = gpg.gpgme_get_engine_info(&info);
   17.38 @@ -325,208 +330,62 @@
   17.39          if (status != PEP_STATUS_OK)
   17.40              return status;
   17.41  
   17.42 -        gpg.gpgme_set_locale
   17.43 -            = (gpgme_set_locale_t) (intptr_t) dlsym(gpgme,
   17.44 -            "gpgme_set_locale");
   17.45 -        assert(gpg.gpgme_set_locale);
   17.46 -
   17.47 -        gpg.gpgme_check
   17.48 -            = (gpgme_check_version_t) (intptr_t) dlsym(gpgme,
   17.49 -            "gpgme_check_version");
   17.50 +#ifdef NODLSYM
   17.51 +        gpg.gpgme_check = gpgme_check_version;
   17.52 +#else
   17.53 +        gpg.gpgme_check = (gpgme_check_t) (intptr_t) dlsym(gpgme, "gpgme_check_version");
   17.54          assert(gpg.gpgme_check);
   17.55 -
   17.56 -        gpg.gpgme_new
   17.57 -            = (gpgme_new_t) (intptr_t) dlsym(gpgme, "gpgme_new");
   17.58 -        assert(gpg.gpgme_new);
   17.59 -
   17.60 -        gpg.gpgme_release
   17.61 -            = (gpgme_release_t) (intptr_t) dlsym(gpgme, "gpgme_release");
   17.62 -        assert(gpg.gpgme_release);
   17.63 -
   17.64 -        gpg.gpgme_set_protocol
   17.65 -            = (gpgme_set_protocol_t) (intptr_t) dlsym(gpgme,
   17.66 -            "gpgme_set_protocol");
   17.67 -        assert(gpg.gpgme_set_protocol);
   17.68 -
   17.69 -        gpg.gpgme_set_armor
   17.70 -            = (gpgme_set_armor_t) (intptr_t) dlsym(gpgme,
   17.71 -            "gpgme_set_armor");
   17.72 -        assert(gpg.gpgme_set_armor);
   17.73 -
   17.74 -        gpg.gpgme_data_new
   17.75 -            = (gpgme_data_new_t) (intptr_t) dlsym(gpgme,
   17.76 -            "gpgme_data_new");
   17.77 -        assert(gpg.gpgme_data_new);
   17.78 -
   17.79 -        gpg.gpgme_data_new_from_mem
   17.80 -            = (gpgme_data_new_from_mem_t) (intptr_t) dlsym(gpgme,
   17.81 -            "gpgme_data_new_from_mem");
   17.82 -        assert(gpg.gpgme_data_new_from_mem);
   17.83 -
   17.84 -        gpg.gpgme_data_new_from_cbs
   17.85 -            = (gpgme_data_new_from_cbs_t) (intptr_t) dlsym(gpgme,
   17.86 -            "gpgme_data_new_from_cbs");
   17.87 -        assert(gpg.gpgme_data_new_from_cbs);
   17.88 -
   17.89 -        gpg.gpgme_data_release
   17.90 -            = (gpgme_data_release_t) (intptr_t) dlsym(gpgme,
   17.91 -            "gpgme_data_release");
   17.92 -        assert(gpg.gpgme_data_release);
   17.93 -
   17.94 -        gpg.gpgme_data_identify
   17.95 -            = (gpgme_data_identify_t) (intptr_t) dlsym(gpgme,
   17.96 -            "gpgme_data_identify");
   17.97 -        assert(gpg.gpgme_data_identify);
   17.98 -
   17.99 -        gpg.gpgme_data_seek
  17.100 -            = (gpgme_data_seek_t) (intptr_t) dlsym(gpgme,
  17.101 -            "gpgme_data_seek");
  17.102 -        assert(gpg.gpgme_data_seek);
  17.103 -
  17.104 -        gpg.gpgme_data_read
  17.105 -            = (gpgme_data_read_t) (intptr_t) dlsym(gpgme,
  17.106 -            "gpgme_data_read");
  17.107 -        assert(gpg.gpgme_data_read);
  17.108 -
  17.109 -        gpg.gpgme_op_decrypt
  17.110 -            = (gpgme_op_decrypt_t) (intptr_t) dlsym(gpgme,
  17.111 -            "gpgme_op_decrypt");
  17.112 -        assert(gpg.gpgme_op_decrypt);
  17.113 -
  17.114 -        gpg.gpgme_op_verify
  17.115 -            = (gpgme_op_verify_t) (intptr_t) dlsym(gpgme,
  17.116 -            "gpgme_op_verify");
  17.117 -        assert(gpg.gpgme_op_verify);
  17.118 -
  17.119 -        gpg.gpgme_op_decrypt_verify
  17.120 -            = (gpgme_op_decrypt_verify_t) (intptr_t) dlsym(gpgme,
  17.121 -            "gpgme_op_decrypt_verify");
  17.122 -        assert(gpg.gpgme_op_decrypt_verify);
  17.123 -
  17.124 -        gpg.gpgme_op_decrypt_result
  17.125 -            = (gpgme_op_decrypt_result_t) (intptr_t) dlsym(gpgme,
  17.126 -            "gpgme_op_decrypt_result");
  17.127 -        assert(gpg.gpgme_op_decrypt_result);
  17.128 -
  17.129 -        gpg.gpgme_op_encrypt_sign
  17.130 -            = (gpgme_op_encrypt_sign_t) (intptr_t) dlsym(gpgme,
  17.131 -            "gpgme_op_encrypt_sign");
  17.132 -        assert(gpg.gpgme_op_encrypt_sign);
  17.133 -
  17.134 -        gpg.gpgme_op_encrypt
  17.135 -            = (gpgme_op_encrypt_t) (intptr_t) dlsym(gpgme,
  17.136 -            "gpgme_op_encrypt");
  17.137 -        assert(gpg.gpgme_op_encrypt);
  17.138 -
  17.139 -        gpg.gpgme_op_verify_result
  17.140 -            = (gpgme_op_verify_result_t) (intptr_t) dlsym(gpgme,
  17.141 -            "gpgme_op_verify_result");
  17.142 -        assert(gpg.gpgme_op_verify_result);
  17.143 -
  17.144 -        gpg.gpgme_signers_clear
  17.145 -            = (gpgme_signers_clear_t) (intptr_t) dlsym(gpgme,
  17.146 -            "gpgme_signers_clear");
  17.147 -        assert(gpg.gpgme_signers_clear);
  17.148 -
  17.149 -        gpg.gpgme_signers_add
  17.150 -            = (gpgme_signers_add_t) (intptr_t) dlsym(gpgme,
  17.151 -            "gpgme_signers_add");
  17.152 -        assert(gpg.gpgme_signers_add);
  17.153 -
  17.154 -        gpg.gpgme_set_passphrase_cb
  17.155 -            = (gpgme_set_passphrase_cb_t) (intptr_t) dlsym(gpgme,
  17.156 -            "gpgme_set_passphrase_cb");
  17.157 -        assert(gpg.gpgme_set_passphrase_cb);
  17.158 -
  17.159 -        gpg.gpgme_get_key
  17.160 -            = (gpgme_get_key_t) (intptr_t) dlsym(gpgme, "gpgme_get_key");
  17.161 -        assert(gpg.gpgme_get_key);
  17.162 +#endif
  17.163 +
  17.164 +        DLOAD(gpgme_set_locale);
  17.165 +        DLOAD(gpgme_new);
  17.166 +        DLOAD(gpgme_release);
  17.167 +        DLOAD(gpgme_set_protocol);
  17.168 +        DLOAD(gpgme_set_armor);
  17.169 +        DLOAD(gpgme_data_new);
  17.170 +        DLOAD(gpgme_data_new_from_mem);
  17.171 +        DLOAD(gpgme_data_new_from_cbs);
  17.172 +        DLOAD(gpgme_data_release);
  17.173 +        DLOAD(gpgme_data_identify);
  17.174 +        DLOAD(gpgme_data_seek);
  17.175 +        DLOAD(gpgme_data_read);
  17.176 +        DLOAD(gpgme_op_decrypt);
  17.177 +        DLOAD(gpgme_op_verify);
  17.178 +        DLOAD(gpgme_op_decrypt_verify);
  17.179 +        DLOAD(gpgme_op_decrypt_result);
  17.180 +        DLOAD(gpgme_op_encrypt_sign);
  17.181 +        DLOAD(gpgme_op_encrypt);
  17.182 +        DLOAD(gpgme_op_sign);
  17.183 +        DLOAD(gpgme_op_verify_result);
  17.184 +        DLOAD(gpgme_signers_clear);
  17.185 +        DLOAD(gpgme_signers_add);
  17.186 +        DLOAD(gpgme_set_passphrase_cb);
  17.187 +        DLOAD(gpgme_get_key);
  17.188          
  17.189 -        #ifdef GPGME_VERSION_NUMBER
  17.190 -        #if (GPGME_VERSION_NUMBER >= 0x010700)
  17.191 -                gpg.gpgme_op_createkey
  17.192 -                    = (gpgme_op_createkey_t) (intptr_t) dlsym(gpgme,
  17.193 -                    "gpgme_op_createkey");
  17.194 -                assert(gpg.gpgme_op_createkey);
  17.195 -                
  17.196 -                gpg.gpgme_op_createsubkey
  17.197 -                    = (gpgme_op_createsubkey_t) (intptr_t) dlsym(gpgme,
  17.198 -                    "gpgme_op_createsubkey");
  17.199 -                assert(gpg.gpgme_op_createsubkey);
  17.200 -
  17.201 -        #endif
  17.202 -        #endif
  17.203 -        
  17.204 -        gpg.gpgme_op_genkey
  17.205 -            = (gpgme_op_genkey_t) (intptr_t) dlsym(gpgme,
  17.206 -            "gpgme_op_genkey");
  17.207 -        assert(gpg.gpgme_op_genkey);
  17.208 -
  17.209 -        gpg.gpgme_op_genkey_result
  17.210 -            = (gpgme_op_genkey_result_t) (intptr_t) dlsym(gpgme,
  17.211 -            "gpgme_op_genkey_result");
  17.212 -        assert(gpg.gpgme_op_genkey_result);
  17.213 -
  17.214 -        gpg.gpgme_op_delete = (gpgme_op_delete_t) (intptr_t)
  17.215 -            dlsym(gpgme, "gpgme_op_delete");
  17.216 -        assert(gpg.gpgme_op_delete);
  17.217 -
  17.218 -        gpg.gpgme_op_import = (gpgme_op_import_t) (intptr_t)
  17.219 -            dlsym(gpgme, "gpgme_op_import");
  17.220 -        assert(gpg.gpgme_op_import);
  17.221 -
  17.222 -        gpg.gpgme_op_import_result
  17.223 -            = (gpgme_op_import_result_t) (intptr_t) dlsym(gpgme,
  17.224 -            "gpgme_op_import_result");
  17.225 -        assert(gpg.gpgme_op_import_result);
  17.226 -
  17.227 -        gpg.gpgme_op_export = (gpgme_op_export_t) (intptr_t)
  17.228 -            dlsym(gpgme, "gpgme_op_export");
  17.229 -        assert(gpg.gpgme_op_export);
  17.230 -
  17.231 -        gpg.gpgme_set_keylist_mode = (gpgme_set_keylist_mode_t) (intptr_t)
  17.232 -            dlsym(gpgme, "gpgme_set_keylist_mode");
  17.233 -        assert(gpg.gpgme_set_keylist_mode);
  17.234 -
  17.235 -        gpg.gpgme_get_keylist_mode = (gpgme_get_keylist_mode_t) (intptr_t)
  17.236 -            dlsym(gpgme, "gpgme_get_keylist_mode");
  17.237 -        assert(gpg.gpgme_get_keylist_mode);
  17.238 -
  17.239 -        gpg.gpgme_op_keylist_start = (gpgme_op_keylist_start_t) (intptr_t)
  17.240 -            dlsym(gpgme, "gpgme_op_keylist_start");
  17.241 -        assert(gpg.gpgme_op_keylist_start);
  17.242 -
  17.243 -        gpg.gpgme_op_keylist_next = (gpgme_op_keylist_next_t) (intptr_t)
  17.244 -            dlsym(gpgme, "gpgme_op_keylist_next");
  17.245 -        assert(gpg.gpgme_op_keylist_next);
  17.246 -
  17.247 -        gpg.gpgme_op_keylist_end = (gpgme_op_keylist_end_t) (intptr_t)
  17.248 -            dlsym(gpgme, "gpgme_op_keylist_end");
  17.249 -        assert(gpg.gpgme_op_keylist_end);
  17.250 -
  17.251 -        gpg.gpgme_op_import_keys = (gpgme_op_import_keys_t) (intptr_t)
  17.252 -            dlsym(gpgme, "gpgme_op_import_keys");
  17.253 -        assert(gpg.gpgme_op_import_keys);
  17.254 -
  17.255 -        gpg.gpgme_key_ref = (gpgme_key_ref_t) (intptr_t)
  17.256 -            dlsym(gpgme, "gpgme_key_ref");
  17.257 -        assert(gpg.gpgme_key_ref);
  17.258 -
  17.259 -        gpg.gpgme_key_unref = (gpgme_key_unref_t) (intptr_t)
  17.260 -            dlsym(gpgme, "gpgme_key_unref");
  17.261 -        assert(gpg.gpgme_key_unref);
  17.262 -
  17.263 -		gpg.gpgme_key_release = (gpgme_key_release_t)(intptr_t)
  17.264 -			dlsym(gpgme, "gpgme_key_release");
  17.265 -		assert(gpg.gpgme_key_release);
  17.266 -
  17.267 -        gpg.gpgme_op_edit = (gpgme_op_edit_t) (intptr_t)
  17.268 -            dlsym(gpgme, "gpgme_op_edit");
  17.269 -        assert(gpg.gpgme_op_edit);
  17.270 -
  17.271 -        gpg.gpgme_io_write = (gpgme_io_write_t) (intptr_t)
  17.272 -            dlsym(gpgme, "gpgme_io_write");
  17.273 -        assert(gpg.gpgme_io_write);
  17.274 +#ifdef GPGME_VERSION_NUMBER
  17.275 +#if (GPGME_VERSION_NUMBER >= 0x010700)
  17.276 +        DLOAD(gpgme_op_createkey);
  17.277 +        DLOAD(gpgme_op_createsubkey);
  17.278 +#endif
  17.279 +#endif
  17.280 +
  17.281 +        DLOAD(gpgme_op_genkey);
  17.282 +        DLOAD(gpgme_op_genkey_result);
  17.283 +        DLOAD(gpgme_op_delete);
  17.284 +        DLOAD(gpgme_op_import);
  17.285 +        DLOAD(gpgme_op_import_result);
  17.286 +        DLOAD(gpgme_op_export);
  17.287 +        DLOAD(gpgme_set_keylist_mode);
  17.288 +        DLOAD(gpgme_get_keylist_mode);
  17.289 +        DLOAD(gpgme_op_keylist_start);
  17.290 +        DLOAD(gpgme_op_keylist_next);
  17.291 +        DLOAD(gpgme_op_keylist_end);
  17.292 +        DLOAD(gpgme_op_import_keys);
  17.293 +        DLOAD(gpgme_key_ref);
  17.294 +        DLOAD(gpgme_key_unref);
  17.295 +		DLOAD(gpgme_key_release);
  17.296 +        DLOAD(gpgme_op_edit);
  17.297 +        DLOAD(gpgme_io_write);
  17.298  
  17.299          gpg.version = gpg.gpgme_check(NULL);
  17.300  
  17.301 @@ -657,8 +516,6 @@
  17.302                  if (!recipient_keylist) {
  17.303                      gpg.gpgme_data_release(plain);
  17.304                      gpg.gpgme_data_release(cipher);
  17.305 -                    if (recipient_keylist)
  17.306 -                        free_stringlist(recipient_keylist);
  17.307                      return PEP_OUT_OF_MEMORY;
  17.308                  }
  17.309                 
  17.310 @@ -702,7 +559,7 @@
  17.311                              if (!(*filename_ptr))
  17.312                                  result = PEP_OUT_OF_MEMORY;
  17.313                          }
  17.314 -                    }
  17.315 +                    }                    
  17.316                  } /* Ok, so now we have any recipients it was encrypted for
  17.317                       in recipient_keylist */
  17.318              
  17.319 @@ -1077,6 +934,143 @@
  17.320      return result;
  17.321  }
  17.322  
  17.323 +PEP_STATUS pgp_sign_only(    
  17.324 +    PEP_SESSION session, const char* fpr, const char *ptext,
  17.325 +    size_t psize, char **stext, size_t *ssize
  17.326 +)
  17.327 +{
  17.328 +    assert(session);
  17.329 +    assert(fpr && fpr[0]);
  17.330 +    assert(ptext);
  17.331 +    assert(psize);
  17.332 +    assert(stext);
  17.333 +    assert(ssize);
  17.334 +
  17.335 +    PEP_STATUS result;
  17.336 +    gpgme_error_t gpgme_error;
  17.337 +    gpgme_data_t plain, signed_text;
  17.338 +    gpgme_key_t* signer_key_ptr;
  17.339 +
  17.340 +    gpgme_sig_mode_t sign_mode = GPGME_SIG_MODE_DETACH;
  17.341 +       
  17.342 +    *stext = NULL;
  17.343 +    *ssize = 0;
  17.344 +
  17.345 +    gpgme_error = gpg.gpgme_data_new_from_mem(&plain, ptext, psize, 0);
  17.346 +    gpgme_error = _GPGERR(gpgme_error);
  17.347 +    assert(gpgme_error == GPG_ERR_NO_ERROR);
  17.348 +    if (gpgme_error != GPG_ERR_NO_ERROR) {
  17.349 +        if (gpgme_error == GPG_ERR_ENOMEM)
  17.350 +            return PEP_OUT_OF_MEMORY;
  17.351 +        else
  17.352 +            return PEP_UNKNOWN_ERROR;
  17.353 +    }
  17.354 +
  17.355 +    gpgme_error = gpg.gpgme_data_new(&signed_text);
  17.356 +    gpgme_error = _GPGERR(gpgme_error);
  17.357 +    assert(gpgme_error == GPG_ERR_NO_ERROR);
  17.358 +    if (gpgme_error != GPG_ERR_NO_ERROR) {
  17.359 +        gpg.gpgme_data_release(plain);
  17.360 +        if (gpgme_error == GPG_ERR_ENOMEM)
  17.361 +            return PEP_OUT_OF_MEMORY;
  17.362 +        else
  17.363 +            return PEP_UNKNOWN_ERROR;
  17.364 +    }
  17.365 +
  17.366 +    signer_key_ptr = calloc(1, sizeof(gpgme_key_t));   
  17.367 +    assert(signer_key_ptr);
  17.368 +    if (signer_key_ptr == NULL) {
  17.369 +        gpg.gpgme_data_release(plain);
  17.370 +        gpg.gpgme_data_release(signed_text);
  17.371 +        return PEP_OUT_OF_MEMORY;
  17.372 +    }
  17.373 +
  17.374 +    gpg.gpgme_signers_clear(session->ctx);
  17.375 +
  17.376 +    // Get signing key
  17.377 +    gpgme_error = gpg.gpgme_get_key(session->ctx, fpr,
  17.378 +                                    signer_key_ptr, 0);
  17.379 +    gpgme_error = _GPGERR(gpgme_error);
  17.380 +    assert(gpgme_error != GPG_ERR_ENOMEM);
  17.381 +    gpgme_error_t _gpgme_error;
  17.382 +    
  17.383 +    switch (gpgme_error) {
  17.384 +    case GPG_ERR_ENOMEM:
  17.385 +        gpg.gpgme_key_unref(*signer_key_ptr);
  17.386 +        free(signer_key_ptr);
  17.387 +        gpg.gpgme_data_release(plain);
  17.388 +        gpg.gpgme_data_release(signed_text);
  17.389 +        return PEP_OUT_OF_MEMORY;
  17.390 +    case GPG_ERR_NO_ERROR:
  17.391 +        _gpgme_error = gpg.gpgme_signers_add(session->ctx, *signer_key_ptr);
  17.392 +        _gpgme_error = _GPGERR(_gpgme_error);
  17.393 +        assert(_gpgme_error == GPG_ERR_NO_ERROR);
  17.394 +        break;
  17.395 +    case GPG_ERR_EOF:
  17.396 +        gpg.gpgme_key_unref(*signer_key_ptr);
  17.397 +        free(signer_key_ptr);
  17.398 +        gpg.gpgme_data_release(plain);
  17.399 +        gpg.gpgme_data_release(signed_text);
  17.400 +        return PEP_KEY_NOT_FOUND;
  17.401 +    case GPG_ERR_AMBIGUOUS_NAME:
  17.402 +        gpg.gpgme_key_unref(*signer_key_ptr);
  17.403 +        free(signer_key_ptr);
  17.404 +        gpg.gpgme_data_release(plain);
  17.405 +        gpg.gpgme_data_release(signed_text);
  17.406 +        return PEP_KEY_HAS_AMBIG_NAME;
  17.407 +    default: // GPG_ERR_INV_VALUE if CTX or R_KEY is not a valid pointer or
  17.408 +        // FPR is not a fingerprint or key ID
  17.409 +        gpg.gpgme_key_unref(*signer_key_ptr);
  17.410 +        free(signer_key_ptr);
  17.411 +        gpg.gpgme_data_release(plain);
  17.412 +        gpg.gpgme_data_release(signed_text);
  17.413 +        return PEP_GET_KEY_FAILED;
  17.414 +    }
  17.415 + 
  17.416 +    gpgme_error = gpg.gpgme_op_sign(session->ctx, plain, signed_text, sign_mode);
  17.417 +
  17.418 +    gpgme_error = _GPGERR(gpgme_error);
  17.419 +    switch (gpgme_error) {
  17.420 +    case GPG_ERR_NO_ERROR:
  17.421 +    {
  17.422 +        char *_buffer = NULL;
  17.423 +        size_t reading;
  17.424 +        size_t length = gpg.gpgme_data_seek(signed_text, 0, SEEK_END);
  17.425 +        assert(length != -1);
  17.426 +        gpg.gpgme_data_seek(signed_text, 0, SEEK_SET);
  17.427 +
  17.428 +        // TODO: make things less memory consuming
  17.429 +        // the following algorithm allocates a buffer for the complete text
  17.430 +
  17.431 +        _buffer = malloc(length + 1);
  17.432 +        assert(_buffer);
  17.433 +        if (_buffer == NULL) {
  17.434 +            gpg.gpgme_key_unref(*signer_key_ptr);
  17.435 +            free(signer_key_ptr);
  17.436 +            gpg.gpgme_data_release(plain);
  17.437 +            gpg.gpgme_data_release(signed_text);
  17.438 +            return PEP_OUT_OF_MEMORY;
  17.439 +        }
  17.440 +
  17.441 +        reading = gpg.gpgme_data_read(signed_text, _buffer, length);
  17.442 +        assert(length == reading);
  17.443 +
  17.444 +        *stext = _buffer;
  17.445 +        *ssize = reading;
  17.446 +        (*stext)[*ssize] = 0; // safeguard for naive users
  17.447 +        result = PEP_STATUS_OK;
  17.448 +        break;
  17.449 +    }
  17.450 +    default:
  17.451 +        result = PEP_UNKNOWN_ERROR;
  17.452 +    }
  17.453 +
  17.454 +    gpg.gpgme_key_unref(*signer_key_ptr);
  17.455 +    free(signer_key_ptr);
  17.456 +    gpg.gpgme_data_release(plain);
  17.457 +    gpg.gpgme_data_release(signed_text);
  17.458 +    return result;   
  17.459 +}
  17.460  
  17.461  static PEP_STATUS pgp_encrypt_sign_optional(    
  17.462      PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
  17.463 @@ -2125,38 +2119,95 @@
  17.464          gpg.gpgme_op_keylist_end(session->ctx);
  17.465          return PEP_STATUS_OK;
  17.466      }
  17.467 -
  17.468 +    
  17.469 +
  17.470 +    // N.B. and FIXME 
  17.471 +    // We could get a key with a bad signing subkey and a good encryption
  17.472 +    // subkey. For now, we reject this, because it forces large changes in
  17.473 +    // how we rate keys. It's on the to-do list, but it's low priority.
  17.474 +    // We don't really want to be doing much for tinkered keys in the first
  17.475 +    // place.
  17.476      switch (gpgme_error) {
  17.477      case GPG_ERR_EOF:
  17.478          break;
  17.479      case GPG_ERR_NO_ERROR:
  17.480          assert(key);
  17.481          assert(key->subkeys);
  17.482 -        for (gpgme_subkey_t sk = key->subkeys; sk != NULL; sk = sk->next) {
  17.483 -            if (sk->length < 1024)
  17.484 -                *comm_type = PEP_ct_key_too_short;
  17.485 -            else if (
  17.486 -                (
  17.487 -                (sk->pubkey_algo == GPGME_PK_RSA)
  17.488 -                || (sk->pubkey_algo == GPGME_PK_RSA_E)
  17.489 -                || (sk->pubkey_algo == GPGME_PK_RSA_S)
  17.490 -                )
  17.491 -                && sk->length == 1024
  17.492 -                )
  17.493 -                *comm_type = PEP_ct_OpenPGP_weak_unconfirmed;
  17.494 -
  17.495 -            if (sk->invalid) {
  17.496 +        
  17.497 +        // is main key expired or revoked? If so, we can cut short this nonsense.
  17.498 +        if (key->invalid)
  17.499 +            *comm_type = PEP_ct_key_b0rken;
  17.500 +        else if (key->revoked)
  17.501 +            *comm_type = PEP_ct_key_revoked;            
  17.502 +        else if (key->expired)
  17.503 +            *comm_type = PEP_ct_key_expired;
  17.504 +        else {
  17.505 +            // Ok, so we now need to check subkeys. Normally, we could just
  17.506 +            // shortcut this by looking at key->can_sign and key->can_encrypt,
  17.507 +            // but we want the REASON we can't use a key, so this gets ugly.
  17.508 +            PEP_comm_type max_comm_type = *comm_type;
  17.509 +                        
  17.510 +            PEP_comm_type best_sign = PEP_ct_no_encryption;
  17.511 +            PEP_comm_type best_enc = PEP_ct_no_encryption;
  17.512 +            
  17.513 +            for (gpgme_subkey_t sk = key->subkeys; sk != NULL; sk = sk->next) {
  17.514 +                if (sk->can_sign || sk->can_encrypt) {
  17.515 +                    PEP_comm_type curr_sign = PEP_ct_no_encryption;
  17.516 +                    PEP_comm_type curr_enc = PEP_ct_no_encryption;
  17.517 +                    
  17.518 +                    if (sk->length < 1024) {
  17.519 +                        if (sk->can_sign)
  17.520 +                            curr_sign = PEP_ct_key_too_short;
  17.521 +                        if (sk->can_encrypt)                               
  17.522 +                            curr_enc = PEP_ct_key_too_short;
  17.523 +                    }
  17.524 +                    else if (
  17.525 +                        ((sk->pubkey_algo == GPGME_PK_RSA)
  17.526 +                        || (sk->pubkey_algo == GPGME_PK_RSA_E)
  17.527 +                        || (sk->pubkey_algo == GPGME_PK_RSA_S))
  17.528 +                        && sk->length == 1024) {
  17.529 +                        if (sk->can_sign)
  17.530 +                            curr_sign = PEP_ct_OpenPGP_weak_unconfirmed;
  17.531 +                        if (sk->can_encrypt)                               
  17.532 +                            curr_enc = PEP_ct_OpenPGP_weak_unconfirmed;
  17.533 +                    }
  17.534 +                    else {
  17.535 +                        if (sk->can_sign)
  17.536 +                            curr_sign = max_comm_type;
  17.537 +                        if (sk->can_encrypt)
  17.538 +                            curr_enc = max_comm_type;
  17.539 +                    }
  17.540 +                    if (sk->invalid) {
  17.541 +                        if (sk->can_sign)
  17.542 +                            curr_sign = PEP_ct_key_b0rken;
  17.543 +                        if (sk->can_encrypt)                               
  17.544 +                            curr_enc = PEP_ct_key_b0rken;
  17.545 +                    }
  17.546 +                    if (sk->expired) {
  17.547 +                        if (sk->can_sign)
  17.548 +                            curr_sign = PEP_ct_key_expired;
  17.549 +                        if (sk->can_encrypt)                               
  17.550 +                            curr_enc = PEP_ct_key_expired;
  17.551 +                    }
  17.552 +                    if (sk->revoked) {
  17.553 +                        if (sk->can_sign)
  17.554 +                            curr_sign = PEP_ct_key_revoked;
  17.555 +                        if (sk->can_encrypt)                               
  17.556 +                            curr_enc = PEP_ct_key_revoked;
  17.557 +                    }
  17.558 +                    if (sk->can_sign)
  17.559 +                        best_sign = _MAX(curr_sign, best_sign);
  17.560 +                    if (sk->can_encrypt)
  17.561 +                        best_enc = _MAX(curr_enc, best_enc);
  17.562 +                }    
  17.563 +            }
  17.564 +            if (best_enc == PEP_ct_no_encryption ||
  17.565 +                best_sign == PEP_ct_no_encryption) {
  17.566                  *comm_type = PEP_ct_key_b0rken;
  17.567 -                break;
  17.568              }
  17.569 -            if (sk->expired) {
  17.570 -                *comm_type = PEP_ct_key_expired;
  17.571 -                break;
  17.572 -            }
  17.573 -            if (sk->revoked) {
  17.574 -                *comm_type = PEP_ct_key_revoked;
  17.575 -                break;
  17.576 -            }
  17.577 +            else {
  17.578 +                *comm_type = _MIN(best_sign, _MIN(max_comm_type, best_enc));
  17.579 +            }                
  17.580          }
  17.581          break;
  17.582      case GPG_ERR_ENOMEM:
    18.1 --- a/src/pgp_gpg.h	Fri Nov 09 09:05:32 2018 +0100
    18.2 +++ b/src/pgp_gpg.h	Wed Nov 21 08:35:41 2018 +0100
    18.3 @@ -99,6 +99,10 @@
    18.4          size_t *csize
    18.5      );
    18.6  
    18.7 +PEP_STATUS pgp_sign_only(
    18.8 +        PEP_SESSION session, const char* fpr, const char *ptext,
    18.9 +        size_t psize, char **stext, size_t *ssize
   18.10 +    );
   18.11  
   18.12  // pgp_encrypt_only() - encrypt plaintext
   18.13  //
    19.1 --- a/src/pgp_gpg_internal.h	Fri Nov 09 09:05:32 2018 +0100
    19.2 +++ b/src/pgp_gpg_internal.h	Wed Nov 21 08:35:41 2018 +0100
    19.3 @@ -7,7 +7,7 @@
    19.4  
    19.5  // init
    19.6  
    19.7 -typedef const char * (*gpgme_check_version_t)(const char*);
    19.8 +typedef const char * (*gpgme_check_t)(const char*);
    19.9  typedef gpgme_error_t (*gpgme_get_engine_info_t)(gpgme_engine_info_t *INFO);
   19.10  typedef gpgme_error_t(*gpgme_set_locale_t)(gpgme_ctx_t CTX, int CATEGORY,
   19.11      const char *VALUE);
   19.12 @@ -46,6 +46,8 @@
   19.13  typedef gpgme_error_t(*gpgme_op_encrypt_t)(gpgme_ctx_t CTX,
   19.14          gpgme_key_t RECP[], gpgme_encrypt_flags_t FLAGS, gpgme_data_t PLAIN,
   19.15          gpgme_data_t CIPHER);
   19.16 +typedef gpgme_error_t(*gpgme_op_sign_t)(gpgme_ctx_t CTX,
   19.17 +        gpgme_data_t PLAIN, gpgme_data_t SIG, gpgme_sig_mode_t MODE);        
   19.18  typedef gpgme_verify_result_t(*gpgme_op_verify_result_t)(gpgme_ctx_t CTX);
   19.19  typedef void(*gpgme_signers_clear_t)(gpgme_ctx_t CTX);
   19.20  typedef gpgme_error_t(*gpgme_signers_add_t)(gpgme_ctx_t CTX, const gpgme_key_t KEY);
   19.21 @@ -100,7 +102,7 @@
   19.22  
   19.23  struct gpg_s {
   19.24      const char * version;
   19.25 -    gpgme_check_version_t gpgme_check;
   19.26 +    gpgme_check_t gpgme_check;
   19.27      gpgme_get_engine_info_t gpgme_get_engine_info;
   19.28      gpgme_set_locale_t gpgme_set_locale;
   19.29      gpgme_new_t gpgme_new;
   19.30 @@ -122,6 +124,7 @@
   19.31      gpgme_op_decrypt_result_t gpgme_op_decrypt_result;
   19.32      gpgme_op_encrypt_sign_t gpgme_op_encrypt_sign;
   19.33      gpgme_op_encrypt_t gpgme_op_encrypt;
   19.34 +    gpgme_op_sign_t gpgme_op_sign;    
   19.35      gpgme_op_verify_result_t gpgme_op_verify_result;
   19.36      gpgme_signers_clear_t gpgme_signers_clear;
   19.37      gpgme_signers_add_t gpgme_signers_add;
    20.1 --- a/src/pgp_netpgp.c	Fri Nov 09 09:05:32 2018 +0100
    20.2 +++ b/src/pgp_netpgp.c	Wed Nov 21 08:35:41 2018 +0100
    20.3 @@ -765,6 +765,132 @@
    20.4      return result;
    20.5  }
    20.6  
    20.7 +
    20.8 +PEP_STATUS pgp_sign_only(
    20.9 +    PEP_SESSION session, const char* fpr, const char *ptext,
   20.10 +    size_t psize, char **stext, size_t *ssize
   20.11 +    )
   20.12 +{
   20.13 +    pgp_key_t *signer = NULL;
   20.14 +    pgp_seckey_t *seckey = NULL;
   20.15 +    pgp_memory_t *signedmem = NULL;
   20.16 +    const char *hashalg;
   20.17 +    pgp_keyring_t *snrs;
   20.18 +
   20.19 +    PEP_STATUS result;
   20.20 +    const stringlist_t *_keylist;
   20.21 +
   20.22 +    assert(session);
   20.23 +    assert(keylist);
   20.24 +    assert(ptext);
   20.25 +    assert(psize);
   20.26 +    assert(stext);
   20.27 +    assert(ssize);
   20.28 +
   20.29 +    if(!session || !ptext || !psize || !stext || !ssize || !fpr || !fpr[0])
   20.30 +        return PEP_ILLEGAL_VALUE;
   20.31 +
   20.32 +    if(pthread_mutex_lock(&netpgp_mutex)){
   20.33 +        return PEP_UNKNOWN_ERROR;
   20.34 +    }
   20.35 +
   20.36 +    *stext = NULL;
   20.37 +    *ssize = 0;
   20.38 +
   20.39 +    if ((snrs = calloc(1, sizeof(*rcpts))) == NULL) {
   20.40 +        result = PEP_OUT_OF_MEMORY;
   20.41 +        goto unlock_netpgp;
   20.42 +    }
   20.43 +    
   20.44 +    assert(fpr && fpr[0]);
   20.45 +
   20.46 +    const pgp_key_t *key;
   20.47 +    uint8_t uint_fpr[PGP_FINGERPRINT_SIZE];
   20.48 +    size_t fprlen;
   20.49 +    unsigned from = 0;
   20.50 +
   20.51 +    if (str_to_fpr(fpr, uint_fpr, &fprlen)) {
   20.52 +        if ((signer = (pgp_key_t *)pgp_getkeybyfpr(netpgp.io, netpgp.pubring,
   20.53 +                                                uint_fpr, fprlen, &from, NULL,
   20.54 +                                                /* reject revoked and expired */
   20.55 +                                                1,1)) == NULL) {
   20.56 +            result = PEP_KEY_NOT_FOUND;
   20.57 +            goto free_snrs;
   20.58 +        }
   20.59 +    }else{
   20.60 +        result = PEP_ILLEGAL_VALUE;
   20.61 +        goto free_snrs;
   20.62 +    }
   20.63 +
   20.64 +    // add key to signers
   20.65 +    pgp_keyring_add(snrs, signer);
   20.66 +    if(snrs->keys == NULL){
   20.67 +        result = PEP_OUT_OF_MEMORY;
   20.68 +        goto free_snrs;
   20.69 +    }
   20.70 +
   20.71 +    /* Empty keylist ?*/
   20.72 +    if(snrs->keyc == 0){
   20.73 +        result = PEP_ILLEGAL_VALUE;
   20.74 +        goto free_snrs;
   20.75 +    }
   20.76 +
   20.77 +    seckey = pgp_key_get_certkey(signer);
   20.78 +
   20.79 +    /* No signing key. Revoked ? */
   20.80 +    if(seckey == NULL){
   20.81 +        result = PEP_GET_KEY_FAILED;
   20.82 +        goto free_snrs;
   20.83 +    }
   20.84 +
   20.85 +    hashalg = netpgp_getvar(&netpgp, "hash");
   20.86 +
   20.87 +    const char *_stext;
   20.88 +    size_t _ssize;
   20.89 +    unsigned encrypt_raw_packet;
   20.90 +   
   20.91 +    // Sign data
   20.92 +    signedmem = pgp_sign_buf(netpgp.io, ptext, psize, seckey,
   20.93 +                time(NULL), /* birthtime */
   20.94 +                0 /* duration */,
   20.95 +                hashalg,
   20.96 +                1 /* armored */,
   20.97 +                0 /* cleartext */);
   20.98 +
   20.99 +    if (!signedmem) {
  20.100 +        result = PEP_UNENCRYPTED;
  20.101 +        goto free_snrs;
  20.102 +    }
  20.103 +    _stext = (char*) pgp_mem_data(signedmem);
  20.104 +    _ssize = pgp_mem_len(signedmem);
  20.105 +    
  20.106 +    // Allocate transferable buffer
  20.107 +    char *_buffer = malloc(_ssize + 1);
  20.108 +
  20.109 +    assert(_buffer);
  20.110 +    if (_buffer == NULL) {
  20.111 +        result = PEP_OUT_OF_MEMORY;
  20.112 +        goto free_signedmem;
  20.113 +    }
  20.114 +
  20.115 +    memcpy(_buffer, pgp_mem_data(_stext), _ssize);
  20.116 +    *stext = _buffer;
  20.117 +    *ssize = _ssize;
  20.118 +    (*stext)[*ssize] = 0; // safeguard for naive users
  20.119 +
  20.120 +    result = PEP_STATUS_OK;
  20.121 +
  20.122 +free_signedmem :
  20.123 +    pgp_memory_free(signedmem);
  20.124 +free_snrs :
  20.125 +    pgp_keyring_free(snrs);
  20.126 +unlock_netpgp:
  20.127 +    pthread_mutex_unlock(&netpgp_mutex);
  20.128 +
  20.129 +    return result;
  20.130 +}
  20.131 +
  20.132 +
  20.133  PEP_STATUS pgp_encrypt_and_sign(
  20.134      PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
  20.135      size_t psize, char **ctext, size_t *csize
    21.1 --- a/src/pgp_netpgp.h	Fri Nov 09 09:05:32 2018 +0100
    21.2 +++ b/src/pgp_netpgp.h	Wed Nov 21 08:35:41 2018 +0100
    21.3 @@ -25,6 +25,10 @@
    21.4          size_t psize, char **ctext, size_t *csize
    21.5      );
    21.6  
    21.7 +PEP_STATUS pgp_sign_only(
    21.8 +        PEP_SESSION session, const char* fpr, const char *ptext,
    21.9 +        size_t psize, char **stext, size_t *ssize
   21.10 +    );
   21.11  
   21.12  PEP_STATUS pgp_verify_text(
   21.13          PEP_SESSION session, const char *text, size_t size,
    22.1 --- a/sync/gen_statemachine.ysl2	Fri Nov 09 09:05:32 2018 +0100
    22.2 +++ b/sync/gen_statemachine.ysl2	Wed Nov 21 08:35:41 2018 +0100
    22.3 @@ -197,7 +197,8 @@
    22.4                      PEP_SESSION session, 
    22.5                      PEP_rating rating,
    22.6                      const char *data,
    22.7 -                    size_t size
    22.8 +                    size_t size,
    22.9 +                    const char *fpr
   22.10                  );
   22.11  
   22.12              #ifdef __cplusplus
   22.13 @@ -310,7 +311,8 @@
   22.14                      PEP_SESSION session, 
   22.15                      PEP_rating rating,
   22.16                      const char *data,
   22.17 -                    size_t size
   22.18 +                    size_t size,
   22.19 +                    const char *fpr
   22.20                  )
   22.21              {
   22.22                  assert(session && data && size);
   22.23 @@ -337,6 +339,17 @@
   22.24                          goto the_end;
   22.25                  }
   22.26  
   22.27 +                if (fpr) {
   22.28 +                    if (session->«yml:lcase(@name)»_state.common.from->fpr)
   22.29 +                        free(session->«yml:lcase(@name)»_state.common.from->fpr);
   22.30 +                    session->«yml:lcase(@name)»_state.common.from->fpr = strdup(fpr);
   22.31 +                    assert(session->«yml:lcase(@name)»_state.common.from->fpr);
   22.32 +                    if (!session->«yml:lcase(@name)»_state.common.from->fpr) {
   22.33 +                        status = PEP_OUT_OF_MEMORY;
   22.34 +                        goto the_end;
   22.35 +                    }
   22.36 +                }
   22.37 +
   22.38                  ev = new_«@name»_event(fsm, event, msg);
   22.39                  if (!ev) {
   22.40                      status = PEP_OUT_OF_MEMORY;
   22.41 @@ -349,6 +362,7 @@
   22.42                      status = PEP_STATEMACHINE_ERROR;
   22.43                      goto the_end;
   22.44                  }
   22.45 +
   22.46                  return PEP_STATUS_OK;
   22.47  
   22.48              the_end:
   22.49 @@ -451,25 +465,40 @@
   22.50                          goto the_end;
   22.51                      }
   22.52                      memcpy(_data, data, size);
   22.53 -                    status = base_prepare_message(
   22.54 -                            li->ident,
   22.55 -                            li->ident,
   22.56 -                            _data,
   22.57 -                            size,
   22.58 -                            &_m
   22.59 -                        );
   22.60 -                    if (status) {
   22.61 -                        free(_data);
   22.62 -                        goto the_end;
   22.63 -                    }
   22.64  
   22.65                      switch (message_type) {
   22.66                      `` for "fsm/message[@security='unencrypted']" |>>> case «../@name»__payload_PR_«yml:mixedCase(@name)»:
   22.67 +                            status = base_prepare_message(
   22.68 +                                    session,
   22.69 +                                    li->ident,
   22.70 +                                    li->ident,
   22.71 +                                    _data,
   22.72 +                                    size,
   22.73 +                                    li->ident->fpr,
   22.74 +                                    &_m
   22.75 +                                );
   22.76 +                            if (status) {
   22.77 +                                free(_data);
   22.78 +                                goto the_end;
   22.79 +                            }
   22.80                              attach_own_key(session, _m);
   22.81                              m = _m;
   22.82                              break;
   22.83  
   22.84                          default:
   22.85 +                            status = base_prepare_message(
   22.86 +                                    session,
   22.87 +                                    li->ident,
   22.88 +                                    li->ident,
   22.89 +                                    _data,
   22.90 +                                    size,
   22.91 +                                    NULL,
   22.92 +                                    &_m
   22.93 +                                );
   22.94 +                            if (status) {
   22.95 +                                free(_data);
   22.96 +                                goto the_end;
   22.97 +                            }
   22.98                              status = encrypt_message(session, _m, NULL, &m, PEP_enc_PEP, 0);
   22.99                              if (status) {
  22.100                                  status = PEP_«yml:ucase(@name)»_CANNOT_ENCRYPT;
  22.101 @@ -596,10 +625,14 @@
  22.102              switch (event) {
  22.103          ||
  22.104          if "message[@security='unencrypted']" {
  22.105 -            |         // these messages are going untested
  22.106 +            |         // these messages require a detached signature
  22.107              for "message[@security='unencrypted']"
  22.108                  |>> case «../@name»__payload_PR_«yml:mixedCase(@name)»:
  22.109              ||
  22.110 +                        if (!fpr) {
  22.111 +                            status = PEP_«yml:ucase(ancestor::protocol/@name)»_ILLEGAL_MESSAGE;
  22.112 +                            goto the_end;
  22.113 +                        }
  22.114                          break;
  22.115  
  22.116              ||
  22.117 @@ -608,7 +641,7 @@
  22.118          ||
  22.119                  // these messages must arrive encrypted
  22.120          `` for "message[@security='untrusted']" |>> case «../@name»__payload_PR_«yml:mixedCase(@name)»:
  22.121 -                    if (rating < PEP_rating_reliable) {
  22.122 +                    if (fpr || rating < PEP_rating_reliable) {
  22.123                          status = PEP_«yml:ucase(ancestor::protocol/@name)»_ILLEGAL_MESSAGE;
  22.124                          goto the_end;
  22.125                      }
  22.126 @@ -619,7 +652,7 @@
  22.127          ||
  22.128                  // these messages must come through a trusted channel
  22.129          `` for "message[@security='trusted']" |>> case «ancestor::fsm/@name»__payload_PR_«yml:mixedCase(@name)»:
  22.130 -                    if (rating < PEP_rating_trusted) {
  22.131 +                    if (fpr || rating < PEP_rating_trusted) {
  22.132                          status = PEP_«yml:ucase(ancestor::protocol/@name)»_ILLEGAL_MESSAGE;
  22.133                          goto the_end;
  22.134                      }
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/test/convenience_scripts/quickadd_testcalls.py	Wed Nov 21 08:35:41 2018 +0100
    23.3 @@ -0,0 +1,53 @@
    23.4 +# very fragile, for Krista's convenience only. DANGER, USE AT OWN RISK.
    23.5 +import sys
    23.6 +import os
    23.7 +
    23.8 +calls_added_file = sys.argv[1]
    23.9 +class_name = sys.argv[2]
   23.10 +
   23.11 +f = open(calls_added_file, "r")
   23.12 +calls = f.readlines()
   23.13 +f.close()
   23.14 +
   23.15 +class_file_path = "src/engine_tests/" + class_name + ".cc"
   23.16 +class_file = open(class_file_path, "r")
   23.17 +class_file_lines = class_file.readlines();
   23.18 +class_file.close();
   23.19 +
   23.20 +accumulator = ""
   23.21 +call_part_1 = "    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string(\""
   23.22 +call_part_3 = "                                                                      static_cast<Func>("
   23.23 +
   23.24 +counter = 0
   23.25 +index = 0
   23.26 +for l in class_file_lines:
   23.27 +    if "add_test_to_suite" in l:
   23.28 +        index = counter;
   23.29 +    counter += 1;    
   23.30 +
   23.31 +if counter == 0:
   23.32 +    for l in class_file_lines:
   23.33 +        if (l.startswith(class_name)):
   23.34 +            index = counter + 2;
   23.35 +            break;
   23.36 +        counter += 1;
   23.37 +    if (counter == 0):
   23.38 +        os.exit(-1)
   23.39 +else:
   23.40 +    index += 2
   23.41 +            
   23.42 +for c in calls:
   23.43 +    if not c:
   23.44 +        continue
   23.45 +    c = c.rstrip()
   23.46 +    call_part_2 = class_name + "::" + c + "\"),\n"
   23.47 +    call_part_4 = "&" + class_name + "::" + c + ")));\n"
   23.48 +
   23.49 +    accumulator += call_part_1 + call_part_2 + call_part_3 + call_part_4
   23.50 +    
   23.51 +class_file_lines.insert(index, accumulator);    
   23.52 +
   23.53 +class_file = open(class_file_path, "w")
   23.54 +class_file.writelines(class_file_lines)
   23.55 +class_file.close()
   23.56 +
    24.1 --- a/test/include/AppleMailTests.h	Fri Nov 09 09:05:32 2018 +0100
    24.2 +++ b/test/include/AppleMailTests.h	Wed Nov 21 08:35:41 2018 +0100
    24.3 @@ -5,15 +5,16 @@
    24.4  #define APPLE_MAIL_TESTS_H
    24.5  
    24.6  #include <string.h>
    24.7 -#include "EngineTestSessionSuite.h"
    24.8 +#include "EngineTestIndividualSuite.h"
    24.9  
   24.10  using namespace std;
   24.11  
   24.12 -class AppleMailTests : public EngineTestSessionSuite {
   24.13 +class AppleMailTests : public EngineTestIndividualSuite {
   24.14      public:
   24.15          AppleMailTests(string suitename, string test_home_dir);
   24.16      private:
   24.17 -        void check_apple_mail();
   24.18 +        void check_apple_mail_text_signed_encrypted();
   24.19 +        void check_apple_mail_html_signed_encrypted();
   24.20  };
   24.21  
   24.22  #endif
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/test/include/CheckRenewedExpiredKeyTrustStatusTests.h	Wed Nov 21 08:35:41 2018 +0100
    25.3 @@ -0,0 +1,22 @@
    25.4 +// This file is under GNU General Public License 3.0
    25.5 +// see LICENSE.txt
    25.6 +
    25.7 +#ifndef CHECK_RENEWED_EXPIRED_KEY_TRUST_STATUS_H
    25.8 +#define CHECK_RENEWED_EXPIRED_KEY_TRUST_STATUS_H
    25.9 +
   25.10 +#include <string>
   25.11 +#include "EngineTestIndividualSuite.h"
   25.12 +
   25.13 +using namespace std;
   25.14 +
   25.15 +class CheckRenewedExpiredKeyTrustStatusTests : public EngineTestIndividualSuite {
   25.16 +    public:
   25.17 +        CheckRenewedExpiredKeyTrustStatusTests(string test_suite, string test_home_dir);
   25.18 +    private:
   25.19 +        void check_renewed_expired_key_trust_status();
   25.20 +        void check_renewed_expired_key_trust_status_trusted_user();
   25.21 +        void check_renewed_expired_key_trust_status_pEp_user();
   25.22 +        void check_renewed_expired_key_trust_status_trusted_pEp_user();        
   25.23 +};
   25.24 +
   25.25 +#endif
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/test/include/Engine358Tests.h	Wed Nov 21 08:35:41 2018 +0100
    26.3 @@ -0,0 +1,19 @@
    26.4 +// This file is under GNU General Public License 3.0
    26.5 +// see LICENSE.txt
    26.6 +
    26.7 +#ifndef ENGINE358_H
    26.8 +#define ENGINE358_H
    26.9 +
   26.10 +#include <string>
   26.11 +#include "EngineTestIndividualSuite.h"
   26.12 +
   26.13 +using namespace std;
   26.14 +
   26.15 +class Engine358Tests : public EngineTestIndividualSuite {
   26.16 +    public:
   26.17 +        Engine358Tests(string test_suite, string test_home_dir);
   26.18 +    private:
   26.19 +        void check_engine358();
   26.20 +};
   26.21 +
   26.22 +#endif
    27.1 --- a/test/include/Engine463Tests.h	Fri Nov 09 09:05:32 2018 +0100
    27.2 +++ b/test/include/Engine463Tests.h	Wed Nov 21 08:35:41 2018 +0100
    27.3 @@ -15,6 +15,8 @@
    27.4      private:
    27.5          void check_engine_463_no_own_key();
    27.6          void check_engine_463_own_key();
    27.7 +        void check_engine_463_sender_expired_and_renewed();
    27.8 +	void check_engine_463_reply_recip_expired_and_renewed();
    27.9  };
   27.10  
   27.11  #endif
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/test/include/ExpiredSubkeyTests.h	Wed Nov 21 08:35:41 2018 +0100
    28.3 @@ -0,0 +1,22 @@
    28.4 +// This file is under GNU General Public License 3.0
    28.5 +// see LICENSE.txt
    28.6 +
    28.7 +#ifndef EXPIRED_SUBKEY_H
    28.8 +#define EXPIRED_SUBKEY_H
    28.9 +
   28.10 +#include <string>
   28.11 +#include "EngineTestIndividualSuite.h"
   28.12 +
   28.13 +using namespace std;
   28.14 +
   28.15 +class ExpiredSubkeyTests : public EngineTestIndividualSuite {
   28.16 +    public:
   28.17 +        ExpiredSubkeyTests(string test_suite, string test_home_dir);
   28.18 +    private:
   28.19 +        void expired_subkey_with_valid_subkeys_and_main_key();
   28.20 +        void expired_subkey_with_valid_subkeys_expired_main();        
   28.21 +        void all_valid_with_leftover_expired_subkeys();         
   28.22 +        void no_valid_encryption_subkey();       
   28.23 +};
   28.24 +
   28.25 +#endif
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/test/include/HeaderKeyImportTests.h	Wed Nov 21 08:35:41 2018 +0100
    29.3 @@ -0,0 +1,61 @@
    29.4 +// This file is under GNU General Public License 3.0
    29.5 +// see LICENSE.txt
    29.6 +
    29.7 +#ifndef HEADER_KEY_IMPORT_H
    29.8 +#define HEADER_KEY_IMPORT_H
    29.9 +
   29.10 +#include <string>
   29.11 +#include "EngineTestIndividualSuite.h"
   29.12 +
   29.13 +using namespace std;
   29.14 +
   29.15 +class HeaderKeyImportTests : public EngineTestIndividualSuite {
   29.16 +    public:
   29.17 +        HeaderKeyImportTests(string test_suite, string test_home_dir);
   29.18 +    private:
   29.19 +        void base_64_minimal_round();
   29.20 +        void base_64_minimal_padded_1();
   29.21 +        void base_64_minimal_padded_2();
   29.22 +        void base_64_minimal_unpadded_1();
   29.23 +        void base_64_minimal_unpadded_2();    
   29.24 +        void base_64_minimal_leading_whitespace_round();
   29.25 +        void base_64_minimal_leading_whitespace_padded_1();
   29.26 +        void base_64_minimal_leading_whitespace_padded_2();
   29.27 +        void base_64_minimal_leading_whitespace_unpadded_1();        
   29.28 +        void base_64_minimal_leading_whitespace_unpadded_2();
   29.29 +        void base_64_minimal_trailing_whitespace_round();
   29.30 +        void base_64_minimal_trailing_whitespace_padded_1();
   29.31 +        void base_64_minimal_trailing_whitespace_padded_2();
   29.32 +        void base_64_minimal_trailing_whitespace_unpadded_1();        
   29.33 +        void base_64_minimal_trailing_whitespace_unpadded_2();
   29.34 +        void base_64_minimal_internal_whitespace_round();
   29.35 +        void base_64_minimal_internal_whitespace_padded_1();
   29.36 +        void base_64_minimal_internal_whitespace_padded_2();
   29.37 +        void base_64_minimal_internal_whitespace_unpadded_1();        
   29.38 +        void base_64_minimal_internal_whitespace_unpadded_2();
   29.39 +        void base_64_round();
   29.40 +        void base_64_padded_1();
   29.41 +        void base_64_padded_2();
   29.42 +        void base_64_unpadded_1();        
   29.43 +        void base_64_unpadded_2();
   29.44 +        void base_64_leading_whitespace_round();
   29.45 +        void base_64_leading_whitespace_padded_1();
   29.46 +        void base_64_leading_whitespace_padded_2();
   29.47 +        void base_64_leading_whitespace_unpadded_1();        
   29.48 +        void base_64_leading_whitespace_unpadded_2();
   29.49 +        void base_64_trailing_whitespace_round();
   29.50 +        void base_64_trailing_whitespace_padded_1();
   29.51 +        void base_64_trailing_whitespace_padded_2();
   29.52 +        void base_64_trailing_whitespace_unpadded_1();        
   29.53 +        void base_64_trailing_whitespace_unpadded_2();
   29.54 +        void base_64_kitchen_sink_round();
   29.55 +        void base_64_kitchen_sink_padded_1();
   29.56 +        void base_64_kitchen_sink_padded_2();
   29.57 +        void base_64_kitchen_sink_unpadded_1();        
   29.58 +        void base_64_kitchen_sink_unpadded_2();
   29.59 +        void check_header_key_import();
   29.60 +        
   29.61 +        bool verify_base_64_test(const char* input, const char* desired_output);
   29.62 +};
   29.63 +
   29.64 +#endif
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/test/include/SignOnlyTests.h	Wed Nov 21 08:35:41 2018 +0100
    30.3 @@ -0,0 +1,19 @@
    30.4 +// This file is under GNU General Public License 3.0
    30.5 +// see LICENSE.txt
    30.6 +
    30.7 +#ifndef SIGN_ONLY_H
    30.8 +#define SIGN_ONLY_H
    30.9 +
   30.10 +#include <string>
   30.11 +#include "EngineTestIndividualSuite.h"
   30.12 +
   30.13 +using namespace std;
   30.14 +
   30.15 +class SignOnlyTests : public EngineTestIndividualSuite {
   30.16 +    public:
   30.17 +        SignOnlyTests(string test_suite, string test_home_dir);
   30.18 +    private:
   30.19 +        void check_sign_only();
   30.20 +};
   30.21 +
   30.22 +#endif
    31.1 --- a/test/src/SuiteMaker.cc	Fri Nov 09 09:05:32 2018 +0100
    31.2 +++ b/test/src/SuiteMaker.cc	Wed Nov 21 08:35:41 2018 +0100
    31.3 @@ -12,175 +12,187 @@
    31.4  #include "SuiteMaker.h"
    31.5  
    31.6  // Begin where we generate stuff
    31.7 +#include "DecorateTests.h"
    31.8 +#include "UserIdCollisionTests.h"
    31.9 +#include "ReencryptPlusExtraKeysTests.h"
   31.10 +#include "BlacklistTests.h"
   31.11 +#include "AppleMailTests.h"
   31.12 +#include "MessageTwoPointOhTests.h"
   31.13 +#include "IdentityListTests.h"
   31.14 +#include "I18nTests.h"
   31.15 +#include "Engine463Tests.h"
   31.16 +#include "DecryptAttachPrivateKeyUntrustedTests.h"
   31.17 +#include "BCCTests.h"
   31.18 +#include "LeastColorGroupTests.h"
   31.19 +#include "Engine358Tests.h"
   31.20 +#include "BlacklistAcceptNewKeyTests.h"
   31.21 +#include "MessageApiTests.h"
   31.22 +#include "StringlistTests.h"
   31.23 +#include "HeaderKeyImportTests.h"
   31.24 +#include "StringpairListTests.h"
   31.25 +#include "TrustManipulationTests.h"
   31.26 +#include "SignOnlyTests.h"
   31.27 +#include "EncryptAttachPrivateKeyTests.h"
   31.28 +#include "BloblistTests.h"
   31.29 +#include "KeyResetMessageTests.h"
   31.30 +#include "SequenceTests.h"
   31.31 +#include "TrustwordsTests.h"
   31.32 +#include "RevokeRegenAttachTests.h"
   31.33 +#include "CheckRenewedExpiredKeyTrustStatusTests.h"
   31.34 +#include "EncryptMissingPrivateKeyTests.h"
   31.35 +#include "PepSubjectReceivedTests.h"
   31.36 +#include "KeyeditTests.h"
   31.37 +#include "MapAsn1Tests.h"
   31.38 +#include "PgpBinaryTests.h"
   31.39 +#include "DecryptAttachPrivateKeyTrustedTests.h"
   31.40 +#include "MessageNullFromTests.h"
   31.41  #include "MimeTests.h"
   31.42 -#include "UserIdCollisionTests.h"
   31.43 -#include "Engine463Tests.h"
   31.44 -#include "BloblistTests.h"
   31.45 +#include "PgpListKeysTests.h"
   31.46  #include "NewUpdateIdAndMyselfTests.h"
   31.47 -#include "I18nTests.h"
   31.48 -#include "IdentityListTests.h"
   31.49 -#include "PgpBinaryTests.h"
   31.50 -#include "MessageNullFromTests.h"
   31.51 -#include "LeastCommonDenomColorTests.h"
   31.52 -#include "StringlistTests.h"
   31.53 -#include "PgpListKeysTests.h"
   31.54 -#include "MessageApiTests.h"
   31.55 -#include "EncryptMissingPrivateKeyTests.h"
   31.56 +#include "EncryptForIdentityTests.h"
   31.57 +#include "CrashdumpTests.h"
   31.58  #include "CaseAndDotAddressTests.h"
   31.59 +#include "ExpiredSubkeyTests.h"
   31.60 +#include "ExternalRevokeTests.h"
   31.61  #include "UserIDAliasTests.h"
   31.62 -#include "BCCTests.h"
   31.63 -#include "BlacklistAcceptNewKeyTests.h"
   31.64 -#include "DecryptAttachPrivateKeyUntrustedTests.h"
   31.65 -#include "BlacklistTests.h"
   31.66 -#include "RevokeRegenAttachTests.h"
   31.67 -#include "PepSubjectReceivedTests.h"
   31.68 -#include "SequenceTests.h"
   31.69 -#include "EncryptAttachPrivateKeyTests.h"
   31.70 -#include "ExternalRevokeTests.h"
   31.71 -#include "KeyeditTests.h"
   31.72 -#include "LeastColorGroupTests.h"
   31.73 -#include "DecryptAttachPrivateKeyTrustedTests.h"
   31.74 -#include "TrustwordsTests.h"
   31.75 -#include "ReencryptPlusExtraKeysTests.h"
   31.76 -#include "MapAsn1Tests.h"
   31.77 -#include "DecorateTests.h"
   31.78 -#include "MessageTwoPointOhTests.h"
   31.79 -#include "CrashdumpTests.h"
   31.80 -#include "StringpairListTests.h"
   31.81 -#include "EncryptForIdentityTests.h"
   31.82 -#include "KeyResetMessageTests.h"
   31.83 -#include "TrustManipulationTests.h"
   31.84 -#include "SyncTests.h"
   31.85 -#include "AppleMailTests.h"
   31.86  
   31.87  
   31.88  const char* SuiteMaker::all_suites[] = {
   31.89 +    "DecorateTests",
   31.90 +    "UserIdCollisionTests",
   31.91 +    "ReencryptPlusExtraKeysTests",
   31.92 +    "BlacklistTests",
   31.93 +    "AppleMailTests",
   31.94 +    "MessageTwoPointOhTests",
   31.95 +    "IdentityListTests",
   31.96 +    "I18nTests",
   31.97 +    "Engine463Tests",
   31.98 +    "DecryptAttachPrivateKeyUntrustedTests",
   31.99 +    "BCCTests",
  31.100 +    "LeastColorGroupTests",
  31.101 +    "Engine358Tests",
  31.102 +    "BlacklistAcceptNewKeyTests",
  31.103 +    "MessageApiTests",
  31.104 +    "StringlistTests",
  31.105 +    "HeaderKeyImportTests",
  31.106 +    "StringpairListTests",
  31.107 +    "TrustManipulationTests",
  31.108 +    "SignOnlyTests",
  31.109 +    "EncryptAttachPrivateKeyTests",
  31.110 +    "BloblistTests",
  31.111 +    "KeyResetMessageTests",
  31.112 +    "SequenceTests",
  31.113 +    "TrustwordsTests",
  31.114 +    "RevokeRegenAttachTests",
  31.115 +    "CheckRenewedExpiredKeyTrustStatusTests",
  31.116 +    "EncryptMissingPrivateKeyTests",
  31.117 +    "PepSubjectReceivedTests",
  31.118 +    "KeyeditTests",
  31.119 +    "MapAsn1Tests",
  31.120 +    "PgpBinaryTests",
  31.121 +    "DecryptAttachPrivateKeyTrustedTests",
  31.122 +    "MessageNullFromTests",
  31.123      "MimeTests",
  31.124 -    "UserIdCollisionTests",
  31.125 -    "Engine463Tests",
  31.126 -    "BloblistTests",
  31.127 +    "PgpListKeysTests",
  31.128      "NewUpdateIdAndMyselfTests",
  31.129 -    "I18nTests",
  31.130 -    "IdentityListTests",
  31.131 -    "PgpBinaryTests",
  31.132 -    "MessageNullFromTests",
  31.133 -    "LeastCommonDenomColorTests",
  31.134 -    "StringlistTests",
  31.135 -    "PgpListKeysTests",
  31.136 -    "MessageApiTests",
  31.137 -    "EncryptMissingPrivateKeyTests",
  31.138 +    "EncryptForIdentityTests",
  31.139 +    "CrashdumpTests",
  31.140      "CaseAndDotAddressTests",
  31.141 +    "ExpiredSubkeyTests",
  31.142 +    "ExternalRevokeTests",
  31.143      "UserIDAliasTests",
  31.144 -    "BCCTests",
  31.145 -    "BlacklistAcceptNewKeyTests",
  31.146 -    "DecryptAttachPrivateKeyUntrustedTests",
  31.147 -    "BlacklistTests",
  31.148 -    "RevokeRegenAttachTests",
  31.149 -    "PepSubjectReceivedTests",
  31.150 -    "SequenceTests",
  31.151 -    "EncryptAttachPrivateKeyTests",
  31.152 -    "ExternalRevokeTests",
  31.153 -    "KeyeditTests",
  31.154 -    "LeastColorGroupTests",
  31.155 -    "DecryptAttachPrivateKeyTrustedTests",
  31.156 -    "TrustwordsTests",
  31.157 -    "ReencryptPlusExtraKeysTests",
  31.158 -    "MapAsn1Tests",
  31.159 -    "DecorateTests",
  31.160 -    "MessageTwoPointOhTests",
  31.161 -    "CrashdumpTests",
  31.162 -    "StringpairListTests",
  31.163 -    "EncryptForIdentityTests",
  31.164 -    "KeyResetMessageTests",
  31.165 -    "TrustManipulationTests",
  31.166 -    "SyncTests",
  31.167 -    "AppleMailTests",
  31.168  };
  31.169  
  31.170  // This file is generated, so magic constants are ok.
  31.171 -int SuiteMaker::num_suites = 40;
  31.172 +int SuiteMaker::num_suites = 43;
  31.173  
  31.174  void SuiteMaker::suitemaker_build(const char* test_class_name, const char* test_home, Test::Suite** test_suite) {
  31.175 -    if (strcmp(test_class_name, "MimeTests") == 0)
  31.176 -        *test_suite = new MimeTests(test_class_name, test_home);
  31.177 +    if (strcmp(test_class_name, "DecorateTests") == 0)
  31.178 +        *test_suite = new DecorateTests(test_class_name, test_home);
  31.179      else if (strcmp(test_class_name, "UserIdCollisionTests") == 0)
  31.180          *test_suite = new UserIdCollisionTests(test_class_name, test_home);
  31.181 +    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  31.182 +        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  31.183 +    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  31.184 +        *test_suite = new BlacklistTests(test_class_name, test_home);
  31.185 +    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  31.186 +        *test_suite = new AppleMailTests(test_class_name, test_home);
  31.187 +    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  31.188 +        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  31.189 +    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  31.190 +        *test_suite = new IdentityListTests(test_class_name, test_home);
  31.191 +    else if (strcmp(test_class_name, "I18nTests") == 0)
  31.192 +        *test_suite = new I18nTests(test_class_name, test_home);
  31.193      else if (strcmp(test_class_name, "Engine463Tests") == 0)
  31.194          *test_suite = new Engine463Tests(test_class_name, test_home);
  31.195 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  31.196 +        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  31.197 +    else if (strcmp(test_class_name, "BCCTests") == 0)
  31.198 +        *test_suite = new BCCTests(test_class_name, test_home);
  31.199 +    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  31.200 +        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  31.201 +    else if (strcmp(test_class_name, "Engine358Tests") == 0)
  31.202 +        *test_suite = new Engine358Tests(test_class_name, test_home);
  31.203 +    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  31.204 +        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  31.205 +    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  31.206 +        *test_suite = new MessageApiTests(test_class_name, test_home);
  31.207 +    else if (strcmp(test_class_name, "StringlistTests") == 0)
  31.208 +        *test_suite = new StringlistTests(test_class_name, test_home);
  31.209 +    else if (strcmp(test_class_name, "HeaderKeyImportTests") == 0)
  31.210 +        *test_suite = new HeaderKeyImportTests(test_class_name, test_home);
  31.211 +    else if (strcmp(test_class_name, "StringpairListTests") == 0)
  31.212 +        *test_suite = new StringpairListTests(test_class_name, test_home);
  31.213 +    else if (strcmp(test_class_name, "TrustManipulationTests") == 0)
  31.214 +        *test_suite = new TrustManipulationTests(test_class_name, test_home);
  31.215 +    else if (strcmp(test_class_name, "SignOnlyTests") == 0)
  31.216 +        *test_suite = new SignOnlyTests(test_class_name, test_home);
  31.217 +    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  31.218 +        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  31.219      else if (strcmp(test_class_name, "BloblistTests") == 0)
  31.220          *test_suite = new BloblistTests(test_class_name, test_home);
  31.221 +    else if (strcmp(test_class_name, "KeyResetMessageTests") == 0)
  31.222 +        *test_suite = new KeyResetMessageTests(test_class_name, test_home);
  31.223 +    else if (strcmp(test_class_name, "SequenceTests") == 0)
  31.224 +        *test_suite = new SequenceTests(test_class_name, test_home);
  31.225 +    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  31.226 +        *test_suite = new TrustwordsTests(test_class_name, test_home);
  31.227 +    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  31.228 +        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  31.229 +    else if (strcmp(test_class_name, "CheckRenewedExpiredKeyTrustStatusTests") == 0)
  31.230 +        *test_suite = new CheckRenewedExpiredKeyTrustStatusTests(test_class_name, test_home);
  31.231 +    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  31.232 +        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  31.233 +    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  31.234 +        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  31.235 +    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  31.236 +        *test_suite = new KeyeditTests(test_class_name, test_home);
  31.237 +    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  31.238 +        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  31.239 +    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  31.240 +        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  31.241 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  31.242 +        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  31.243 +    else if (strcmp(test_class_name, "MessageNullFromTests") == 0)
  31.244 +        *test_suite = new MessageNullFromTests(test_class_name, test_home);
  31.245 +    else if (strcmp(test_class_name, "MimeTests") == 0)
  31.246 +        *test_suite = new MimeTests(test_class_name, test_home);
  31.247 +    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  31.248 +        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  31.249      else if (strcmp(test_class_name, "NewUpdateIdAndMyselfTests") == 0)
  31.250          *test_suite = new NewUpdateIdAndMyselfTests(test_class_name, test_home);
  31.251 -    else if (strcmp(test_class_name, "I18nTests") == 0)
  31.252 -        *test_suite = new I18nTests(test_class_name, test_home);
  31.253 -    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  31.254 -        *test_suite = new IdentityListTests(test_class_name, test_home);
  31.255 -    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  31.256 -        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  31.257 -    else if (strcmp(test_class_name, "MessageNullFromTests") == 0)
  31.258 -        *test_suite = new MessageNullFromTests(test_class_name, test_home);
  31.259 -    else if (strcmp(test_class_name, "LeastCommonDenomColorTests") == 0)
  31.260 -        *test_suite = new LeastCommonDenomColorTests(test_class_name, test_home);
  31.261 -    else if (strcmp(test_class_name, "StringlistTests") == 0)
  31.262 -        *test_suite = new StringlistTests(test_class_name, test_home);
  31.263 -    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  31.264 -        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  31.265 -    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  31.266 -        *test_suite = new MessageApiTests(test_class_name, test_home);
  31.267 -    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  31.268 -        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  31.269 +    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  31.270 +        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  31.271 +    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  31.272 +        *test_suite = new CrashdumpTests(test_class_name, test_home);
  31.273      else if (strcmp(test_class_name, "CaseAndDotAddressTests") == 0)
  31.274          *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
  31.275 +    else if (strcmp(test_class_name, "ExpiredSubkeyTests") == 0)
  31.276 +        *test_suite = new ExpiredSubkeyTests(test_class_name, test_home);
  31.277 +    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  31.278 +        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  31.279      else if (strcmp(test_class_name, "UserIDAliasTests") == 0)
  31.280          *test_suite = new UserIDAliasTests(test_class_name, test_home);
  31.281 -    else if (strcmp(test_class_name, "BCCTests") == 0)
  31.282 -        *test_suite = new BCCTests(test_class_name, test_home);
  31.283 -    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  31.284 -        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  31.285 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  31.286 -        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  31.287 -    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  31.288 -        *test_suite = new BlacklistTests(test_class_name, test_home);
  31.289 -    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  31.290 -        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  31.291 -    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  31.292 -        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  31.293 -    else if (strcmp(test_class_name, "SequenceTests") == 0)
  31.294 -        *test_suite = new SequenceTests(test_class_name, test_home);
  31.295 -    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  31.296 -        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  31.297 -    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  31.298 -        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  31.299 -    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  31.300 -        *test_suite = new KeyeditTests(test_class_name, test_home);
  31.301 -    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  31.302 -        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  31.303 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  31.304 -        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  31.305 -    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  31.306 -        *test_suite = new TrustwordsTests(test_class_name, test_home);
  31.307 -    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  31.308 -        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  31.309 -    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  31.310 -        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  31.311 -    else if (strcmp(test_class_name, "DecorateTests") == 0)
  31.312 -        *test_suite = new DecorateTests(test_class_name, test_home);
  31.313 -    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  31.314 -        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  31.315 -    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  31.316 -        *test_suite = new CrashdumpTests(test_class_name, test_home);
  31.317 -    else if (strcmp(test_class_name, "StringpairListTests") == 0)
  31.318 -        *test_suite = new StringpairListTests(test_class_name, test_home);
  31.319 -    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  31.320 -        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  31.321 -    else if (strcmp(test_class_name, "KeyResetMessageTests") == 0)
  31.322 -        *test_suite = new KeyResetMessageTests(test_class_name, test_home);
  31.323 -    else if (strcmp(test_class_name, "TrustManipulationTests") == 0)
  31.324 -        *test_suite = new TrustManipulationTests(test_class_name, test_home);
  31.325 -    else if (strcmp(test_class_name, "SyncTests") == 0)
  31.326 -        *test_suite = new SyncTests(test_class_name, test_home);
  31.327 -    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  31.328 -        *test_suite = new AppleMailTests(test_class_name, test_home);
  31.329  }
  31.330  
  31.331  void SuiteMaker::suitemaker_buildlist(const char** test_class_names, int num_to_run, const char* test_home, std::vector<Test::Suite*>& test_suites) {
    32.1 --- a/test/src/engine_tests/AppleMailTests.cc	Fri Nov 09 09:05:32 2018 +0100
    32.2 +++ b/test/src/engine_tests/AppleMailTests.cc	Wed Nov 21 08:35:41 2018 +0100
    32.3 @@ -20,18 +20,21 @@
    32.4  #include "test_util.h" // for slurp()
    32.5  
    32.6  #include "EngineTestSuite.h"
    32.7 -#include "EngineTestSessionSuite.h"
    32.8 +#include "EngineTestIndividualSuite.h"
    32.9  #include "AppleMailTests.h"
   32.10  
   32.11  using namespace std;
   32.12  
   32.13  AppleMailTests::AppleMailTests(string suitename, string test_home_dir) : 
   32.14 -    EngineTestSessionSuite::EngineTestSessionSuite(suitename, test_home_dir) {            
   32.15 -    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("AppleMailTests::check_apple_mail"),
   32.16 -                                                                      static_cast<Func>(&AppleMailTests::check_apple_mail)));
   32.17 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {            
   32.18 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("AppleMailTests::check_apple_mail_text_signed_encrypted"),
   32.19 +                                                                      static_cast<Func>(&AppleMailTests::check_apple_mail_text_signed_encrypted)));
   32.20 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("AppleMailTests::check_apple_mail_html_signed_encrypted"),
   32.21 +                                                                      static_cast<Func>(&AppleMailTests::check_apple_mail_html_signed_encrypted)));
   32.22 +                                                                  
   32.23  }
   32.24  
   32.25 -void AppleMailTests::check_apple_mail() {
   32.26 +void AppleMailTests::check_apple_mail_text_signed_encrypted() {
   32.27      
   32.28      const char* mailfile = "test_mails/apple_mail_TC_signed_encrypted.eml";
   32.29      
   32.30 @@ -58,11 +61,11 @@
   32.31      
   32.32      message* msg_ptr = nullptr;
   32.33      message* dest_msg = nullptr;
   32.34 -    message* final_ptr = nullptr;
   32.35      stringlist_t* keylist = nullptr;
   32.36      PEP_rating rating;
   32.37      PEP_decrypt_flags_t flags = 0;
   32.38      
   32.39 +    message* final_ptr = nullptr;
   32.40      status = mime_decode_message(mailtext.c_str(), mailtext.length(), &msg_ptr);
   32.41      TEST_ASSERT_MSG((status == PEP_STATUS_OK), "status == PEP_STATUS_OK");
   32.42      TEST_ASSERT_MSG((msg_ptr), "msg_ptr");
   32.43 @@ -85,14 +88,43 @@
   32.44      	free_message(dest_msg);
   32.45      free_message(msg_ptr);
   32.46      free_stringlist(keylist);
   32.47 +}
   32.48  
   32.49 -    msg_ptr = nullptr;
   32.50 -    dest_msg = nullptr;
   32.51 -    final_ptr = nullptr;
   32.52 -    keylist = nullptr;
   32.53 -    rating = PEP_rating_unreliable;
   32.54 -    flags = 0;
   32.55 +void AppleMailTests::check_apple_mail_html_signed_encrypted() {
   32.56 +
   32.57 +    // Start state copy
   32.58 +    // N.B. As part of breaking up formerly monolith tests into individual tests, I've copied state setup from the
   32.59 +    // original functions into many functions. It should, when there's time, either be refactored (if necessary for this 
   32.60 +    // test) or removed (if not).
   32.61 +    const string keytextkey1 = slurp("test_keys/pub/pep-test-apple-0x1CCBC7D7_pub.asc");
   32.62 +    const string keytextkey2 = slurp("test_keys/priv/pep-test-recip-0x08DB0AEE_priv.asc");
   32.63 +    const string keytextkey3 = slurp("test_keys/pub/pep-test-recip-0x08DB0AEE_pub.asc");
   32.64 +
   32.65 +    PEP_STATUS statuskey1 = import_key(session, keytextkey1.c_str(), keytextkey1.length(), NULL);
   32.66 +    PEP_STATUS statuskey2 = import_key(session, keytextkey2.c_str(), keytextkey2.length(), NULL);
   32.67 +    PEP_STATUS statuskey3 = import_key(session, keytextkey3.c_str(), keytextkey3.length(), NULL);
   32.68 +
   32.69 +    pEp_identity * me = new_identity("pep.test.recip@kgrothoff.org", "93D19F24AD6F4C4BA9134AAF84D9217908DB0AEE", PEP_OWN_USERID, "pEp Test Recipient");    
   32.70 +    me->me = true;    
   32.71 +    PEP_STATUS status = set_own_key(session, me, "93D19F24AD6F4C4BA9134AAF84D9217908DB0AEE");
   32.72      
   32.73 +    pEp_identity * you = new_identity("pep.test.apple@pep-project.org", NULL, "pep.test.apple@pep-project.org", "pEp Apple Test");    
   32.74 +    you->me = false;    
   32.75 +    status = update_identity(session, you);
   32.76 +
   32.77 +    trust_personal_key(session, you);
   32.78 +    
   32.79 +    status = update_identity(session, you);
   32.80 +
   32.81 +    // End state copy
   32.82 +    
   32.83 +    message* msg_ptr = nullptr;
   32.84 +    message* dest_msg = nullptr;
   32.85 +    message* final_ptr = nullptr;
   32.86 +    stringlist_t* keylist = nullptr;
   32.87 +    PEP_rating rating;
   32.88 +    PEP_decrypt_flags_t flags = 0;
   32.89 +     
   32.90      const char* mailfile2 = "test_mails/apple_mail_TC_html_signed_encrypted.eml";
   32.91      const string mailtext2 = slurp(mailfile2);
   32.92      
    33.1 --- a/test/src/engine_tests/BlacklistAcceptNewKeyTests.cc	Fri Nov 09 09:05:32 2018 +0100
    33.2 +++ b/test/src/engine_tests/BlacklistAcceptNewKeyTests.cc	Wed Nov 21 08:35:41 2018 +0100
    33.3 @@ -91,11 +91,6 @@
    33.4      PEP_STATUS status13 = blacklist_delete(session, bl_fpr_1);
    33.5      PEP_STATUS status14 = update_identity(session, blacklisted_identity);
    33.6  
    33.7 -    status = delete_keypair(session, new_key);
    33.8 -    update_identity(session, blacklisted_identity);
    33.9 -    status = delete_keypair(session, bl_fpr_1);
   33.10 -    update_identity(session, blacklisted_identity);
   33.11 -    
   33.12      free_message(msg_ptr);
   33.13      free_message(dest_msg);
   33.14      free_stringlist(keylist);
    34.1 --- a/test/src/engine_tests/BlacklistTests.cc	Fri Nov 09 09:05:32 2018 +0100
    34.2 +++ b/test/src/engine_tests/BlacklistTests.cc	Wed Nov 21 08:35:41 2018 +0100
    34.3 @@ -20,6 +20,8 @@
    34.4  
    34.5  #include <cpptest.h>
    34.6  
    34.7 +#include <assert.h>
    34.8 +
    34.9  #include "pEpEngine.h"
   34.10  
   34.11  #include "blacklist.h"
   34.12 @@ -189,12 +191,7 @@
   34.13      // 
   34.14      // // FIXME
   34.15      // // TEST_ASSERT_MSG((stored_identity->comm_type == PEP_ct_pEp), "stored_identity->comm_type == PEP_ct_pEp");    
   34.16 -    
   34.17 -    PEP_STATUS status16 = delete_keypair(session, bl_fpr_1);
   34.18 -    update_identity(session, blacklisted_identity);
   34.19 -    PEP_STATUS status17 = delete_keypair(session, bl_fpr_2);
   34.20 -    update_identity(session, blacklisted_identity2);
   34.21 -        
   34.22 +            
   34.23      free_identity(blacklisted_identity);
   34.24      free_identity(blacklisted_identity2);
   34.25  }
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/test/src/engine_tests/CheckRenewedExpiredKeyTrustStatusTests.cc	Wed Nov 21 08:35:41 2018 +0100
    35.3 @@ -0,0 +1,293 @@
    35.4 +// This file is under GNU General Public License 3.0
    35.5 +// see LICENSE.txt
    35.6 +
    35.7 +#include <stdlib.h>
    35.8 +#include <string>
    35.9 +#include <cstring>
   35.10 +
   35.11 +#include "pEpEngine.h"
   35.12 +
   35.13 +#include <cpptest.h>
   35.14 +#include "test_util.h"
   35.15 +#include "EngineTestIndividualSuite.h"
   35.16 +#include "CheckRenewedExpiredKeyTrustStatusTests.h"
   35.17 +
   35.18 +using namespace std;
   35.19 +
   35.20 +CheckRenewedExpiredKeyTrustStatusTests::CheckRenewedExpiredKeyTrustStatusTests(string suitename, string test_home_dir) :
   35.21 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   35.22 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status"),
   35.23 +                                                                      static_cast<Func>(&CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status)));
   35.24 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_user"),
   35.25 +                                                                      static_cast<Func>(&CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_user)));
   35.26 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_pEp_user"),
   35.27 +                                                                      static_cast<Func>(&CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_pEp_user)));
   35.28 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_pEp_user"),
   35.29 +                                                                      static_cast<Func>(&CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_pEp_user)));                                                                  
   35.30 +}
   35.31 +
   35.32 +void CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status() {
   35.33 +    bool ok = false;
   35.34 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   35.35 +    TEST_ASSERT(ok);    
   35.36 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   35.37 +    TEST_ASSERT(ok);
   35.38 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
   35.39 +    TEST_ASSERT(ok);
   35.40 +
   35.41 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   35.42 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
   35.43 +
   35.44 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
   35.45 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   35.46 +
   35.47 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
   35.48 +    // the expired key:
   35.49 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
   35.50 +    
   35.51 +    char* decrypted_msg = NULL;
   35.52 +    stringlist_t* keylist_used = nullptr;
   35.53 +    char* modified_src = NULL;
   35.54 +    
   35.55 +    PEP_rating rating;
   35.56 +    PEP_decrypt_flags_t flags = 0;
   35.57 +     
   35.58 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   35.59 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
   35.60 +
   35.61 +    free(decrypted_msg);
   35.62 +    decrypted_msg = NULL;
   35.63 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
   35.64 +    TEST_ASSERT(ok);    
   35.65 +
   35.66 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
   35.67 +    message* msg2 = new_message(PEP_dir_outgoing);    
   35.68 +
   35.69 +    msg2->from = alice_from;
   35.70 +    msg2->to = new_identity_list(expired_inquisitor);
   35.71 +    msg2->shortmsg = strdup("Blah!");
   35.72 +    msg2->longmsg = strdup("Blahblahblah!");
   35.73 +    msg2->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
   35.74 +
   35.75 +    status = outgoing_message_rating(session, msg2, &rating);
   35.76 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   35.77 +    TEST_ASSERT_MSG((rating == PEP_rating_reliable), tl_rating_string(rating));    
   35.78 +
   35.79 +    status = get_trust(session, expired_inquisitor);
   35.80 +    TEST_ASSERT_MSG(expired_inquisitor->comm_type == PEP_ct_OpenPGP_unconfirmed, tl_ct_string(expired_inquisitor->comm_type));
   35.81 +    free_message(msg2);
   35.82 +}
   35.83 +
   35.84 +void CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_user() {
   35.85 +    bool ok = false;
   35.86 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   35.87 +    TEST_ASSERT(ok);    
   35.88 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   35.89 +    TEST_ASSERT(ok);
   35.90 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
   35.91 +    TEST_ASSERT(ok);
   35.92 +
   35.93 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   35.94 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
   35.95 +
   35.96 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
   35.97 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   35.98 +
   35.99 +    const char* inquisitor_fpr = "8E8D2381AE066ABE1FEE509821BA977CA4728718";
  35.100 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", "8E8D2381AE066ABE1FEE509821BA977CA4728718", "TOFU_inquisitor@darthmama.org", "Lady Claire Trevelyan");
  35.101 +    status = set_identity(session, expired_inquisitor);
  35.102 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.103 +    expired_inquisitor->comm_type = PEP_ct_OpenPGP; // confirmed 
  35.104 +    status = set_trust(session, expired_inquisitor);
  35.105 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.106 +    status = get_trust(session, expired_inquisitor);
  35.107 +    TEST_ASSERT_MSG(expired_inquisitor->comm_type == PEP_ct_OpenPGP, tl_ct_string(expired_inquisitor->comm_type));
  35.108 +    
  35.109 +    // Ok, now update_identity - we'll discover it's expired
  35.110 +    status = update_identity(session, expired_inquisitor);
  35.111 +    TEST_ASSERT_MSG((status == PEP_KEY_UNSUITABLE), tl_status_string(status));
  35.112 +    PEP_comm_type ct = expired_inquisitor->comm_type;    
  35.113 +    TEST_ASSERT_MSG(ct == PEP_ct_key_expired_but_confirmed, tl_ct_string(ct));
  35.114 +    
  35.115 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
  35.116 +    // the expired key:
  35.117 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
  35.118 +    
  35.119 +    char* decrypted_msg = NULL;
  35.120 +    stringlist_t* keylist_used = nullptr;
  35.121 +    char* modified_src = NULL;
  35.122 +    
  35.123 +    PEP_rating rating;
  35.124 +    PEP_decrypt_flags_t flags = 0;
  35.125 +     
  35.126 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
  35.127 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
  35.128 +
  35.129 +    free(decrypted_msg);
  35.130 +    decrypted_msg = NULL;
  35.131 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
  35.132 +    TEST_ASSERT(ok);    
  35.133 +
  35.134 +    pEp_identity* expired_inquisitor1 = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
  35.135 +    
  35.136 +    status = update_identity(session, expired_inquisitor1);
  35.137 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
  35.138 +    status = get_trust(session, expired_inquisitor1);
  35.139 +    TEST_ASSERT_MSG(expired_inquisitor1->comm_type == PEP_ct_OpenPGP, tl_ct_string(expired_inquisitor1->comm_type));
  35.140 +
  35.141 +    message* msg2 = new_message(PEP_dir_outgoing);    
  35.142 +
  35.143 +    msg2->from = alice_from;
  35.144 +    msg2->to = new_identity_list(expired_inquisitor1);
  35.145 +    msg2->shortmsg = strdup("Blah!");
  35.146 +    msg2->longmsg = strdup("Blahblahblah!");
  35.147 +    msg2->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
  35.148 +
  35.149 +    status = outgoing_message_rating(session, msg2, &rating);
  35.150 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.151 +    TEST_ASSERT_MSG((rating >= PEP_rating_trusted), tl_rating_string(rating));    
  35.152 +
  35.153 +    free_message(msg2);
  35.154 +}
  35.155 +
  35.156 +void CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_pEp_user() {
  35.157 +    bool ok = false;
  35.158 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
  35.159 +    TEST_ASSERT(ok);    
  35.160 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
  35.161 +    TEST_ASSERT(ok);
  35.162 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
  35.163 +    TEST_ASSERT(ok);
  35.164 +
  35.165 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
  35.166 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
  35.167 +
  35.168 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
  35.169 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.170 +
  35.171 +    const char* inquisitor_fpr = "8E8D2381AE066ABE1FEE509821BA977CA4728718";
  35.172 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", "8E8D2381AE066ABE1FEE509821BA977CA4728718", "TOFU_inquisitor@darthmama.org", "Lady Claire Trevelyan");
  35.173 +    status = set_identity(session, expired_inquisitor);
  35.174 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.175 +    expired_inquisitor->comm_type = PEP_ct_pEp_unconfirmed;  
  35.176 +    status = set_trust(session, expired_inquisitor);
  35.177 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.178 +    
  35.179 +    bool pEp_user = false;
  35.180 +    status = is_pEp_user(session, expired_inquisitor, &pEp_user);
  35.181 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.182 +    TEST_ASSERT(pEp_user);
  35.183 +
  35.184 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
  35.185 +    // the expired key:
  35.186 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
  35.187 +
  35.188 +    char* decrypted_msg = NULL;
  35.189 +    stringlist_t* keylist_used = nullptr;
  35.190 +    char* modified_src = NULL;
  35.191 +
  35.192 +    PEP_rating rating;
  35.193 +    PEP_decrypt_flags_t flags = 0;
  35.194 +
  35.195 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
  35.196 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
  35.197 +
  35.198 +    free(decrypted_msg);
  35.199 +    decrypted_msg = NULL;
  35.200 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
  35.201 +    TEST_ASSERT(ok);    
  35.202 +
  35.203 +    pEp_identity* expired_inquisitor1 = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
  35.204 +    message* msg2 = new_message(PEP_dir_outgoing);    
  35.205 +
  35.206 +    msg2->from = alice_from;
  35.207 +    msg2->to = new_identity_list(expired_inquisitor1);
  35.208 +    msg2->shortmsg = strdup("Blah!");
  35.209 +    msg2->longmsg = strdup("Blahblahblah!");
  35.210 +    msg2->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
  35.211 +
  35.212 +    status = outgoing_message_rating(session, msg2, &rating);
  35.213 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.214 +    TEST_ASSERT_MSG((rating == PEP_rating_reliable), tl_rating_string(rating));    
  35.215 +
  35.216 +    status = get_trust(session, expired_inquisitor);
  35.217 +    TEST_ASSERT_MSG(expired_inquisitor1->comm_type == PEP_ct_pEp_unconfirmed, tl_ct_string(expired_inquisitor1->comm_type));
  35.218 +    free_message(msg2);
  35.219 +}
  35.220 +
  35.221 +void CheckRenewedExpiredKeyTrustStatusTests::check_renewed_expired_key_trust_status_trusted_pEp_user() {
  35.222 +    bool ok = false;
  35.223 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
  35.224 +    TEST_ASSERT(ok);    
  35.225 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
  35.226 +    TEST_ASSERT(ok);
  35.227 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
  35.228 +    TEST_ASSERT(ok);
  35.229 +
  35.230 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
  35.231 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
  35.232 +
  35.233 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
  35.234 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.235 +
  35.236 +    const char* inquisitor_fpr = "8E8D2381AE066ABE1FEE509821BA977CA4728718";
  35.237 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", "8E8D2381AE066ABE1FEE509821BA977CA4728718", "TOFU_inquisitor@darthmama.org", "Lady Claire Trevelyan");
  35.238 +    status = set_identity(session, expired_inquisitor);
  35.239 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.240 +    expired_inquisitor->comm_type = PEP_ct_pEp; // confirmed 
  35.241 +    status = set_trust(session, expired_inquisitor);
  35.242 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.243 +    status = get_trust(session, expired_inquisitor);
  35.244 +    TEST_ASSERT_MSG(expired_inquisitor->comm_type == PEP_ct_pEp, tl_ct_string(expired_inquisitor->comm_type));
  35.245 +
  35.246 +    bool pEp_user = false;
  35.247 +    status = is_pEp_user(session, expired_inquisitor, &pEp_user);
  35.248 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.249 +    TEST_ASSERT(pEp_user);
  35.250 +    
  35.251 +    // Ok, now update_identity - we'll discover it's expired
  35.252 +    status = update_identity(session, expired_inquisitor);
  35.253 +    TEST_ASSERT_MSG((status == PEP_KEY_UNSUITABLE), tl_status_string(status));
  35.254 +    PEP_comm_type ct = expired_inquisitor->comm_type;    
  35.255 +    TEST_ASSERT_MSG(ct == PEP_ct_key_expired_but_confirmed, tl_ct_string(ct));
  35.256 +    
  35.257 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
  35.258 +    // the expired key:
  35.259 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
  35.260 +    
  35.261 +    char* decrypted_msg = NULL;
  35.262 +    stringlist_t* keylist_used = nullptr;
  35.263 +    char* modified_src = NULL;
  35.264 +    
  35.265 +    PEP_rating rating;
  35.266 +    PEP_decrypt_flags_t flags = 0;
  35.267 +     
  35.268 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
  35.269 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
  35.270 +
  35.271 +    free(decrypted_msg);
  35.272 +    decrypted_msg = NULL;
  35.273 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
  35.274 +    TEST_ASSERT(ok);    
  35.275 +
  35.276 +    pEp_identity* expired_inquisitor1 = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
  35.277 +    
  35.278 +    status = update_identity(session, expired_inquisitor1);
  35.279 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
  35.280 +    status = get_trust(session, expired_inquisitor1);
  35.281 +    TEST_ASSERT_MSG(expired_inquisitor1->comm_type == PEP_ct_pEp, tl_ct_string(expired_inquisitor1->comm_type));
  35.282 +
  35.283 +    message* msg2 = new_message(PEP_dir_outgoing);    
  35.284 +
  35.285 +    msg2->from = alice_from;
  35.286 +    msg2->to = new_identity_list(expired_inquisitor1);
  35.287 +    msg2->shortmsg = strdup("Blah!");
  35.288 +    msg2->longmsg = strdup("Blahblahblah!");
  35.289 +    msg2->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
  35.290 +
  35.291 +    status = outgoing_message_rating(session, msg2, &rating);
  35.292 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  35.293 +    TEST_ASSERT_MSG((rating >= PEP_rating_trusted), tl_rating_string(rating));    
  35.294 +
  35.295 +    free_message(msg2);
  35.296 +}
    36.1 --- a/test/src/engine_tests/DecorateTests.cc	Fri Nov 09 09:05:32 2018 +0100
    36.2 +++ b/test/src/engine_tests/DecorateTests.cc	Wed Nov 21 08:35:41 2018 +0100
    36.3 @@ -21,9 +21,9 @@
    36.4  
    36.5  using namespace std;
    36.6  
    36.7 -DecorateTests::DecorateTests(string suitename, string test_home_dir) : 
    36.8 -    EngineTestSessionSuite::EngineTestSessionSuite(suitename, test_home_dir) {               
    36.9 -    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("DecorateTests::check_decorate"), 
   36.10 +DecorateTests::DecorateTests(string suitename, string test_home_dir) :
   36.11 +    EngineTestSessionSuite::EngineTestSessionSuite(suitename, test_home_dir) {
   36.12 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("DecorateTests::check_decorate"),
   36.13                                                                        static_cast<Func>(&DecorateTests::check_decorate)));
   36.14  }
   36.15  
   36.16 @@ -41,6 +41,11 @@
   36.17  
   36.18      cout << "creating message…\n";
   36.19      pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, PEP_OWN_USERID, "Alice Test");
   36.20 +    pEp_identity* alice_dup = identity_dup(alice);
   36.21 +    PEP_STATUS status = set_own_key(session, alice_dup, "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97");
   36.22 +    TEST_ASSERT(status == PEP_STATUS_OK);
   36.23 +    free_identity(alice_dup);
   36.24 +
   36.25      pEp_identity* bob = new_identity("pep.test.bob@pep-project.org", NULL, "42", "Bob Test");
   36.26      alice->me = true;
   36.27      identity_list* to_list = new_identity_list(bob); // to bob
   36.28 @@ -58,21 +63,21 @@
   36.29  
   36.30      message* encrypted_msg = nullptr;
   36.31      cout << "calling encrypt_message\n";
   36.32 -    PEP_STATUS status = encrypt_message (session, outgoing_message, NULL, &encrypted_msg, PEP_enc_PGP_MIME, 0);
   36.33 +    status = encrypt_message (session, outgoing_message, NULL, &encrypted_msg, PEP_enc_PGP_MIME, 0);
   36.34      cout << "encrypt_message() returns " << tl_status_string(status) << '.' << endl;
   36.35      TEST_ASSERT_MSG((status == PEP_STATUS_OK), "status == PEP_STATUS_OK");
   36.36      TEST_ASSERT_MSG((encrypted_msg), "encrypted_msg");
   36.37      cout << "message encrypted.\n";
   36.38 -    
   36.39 +
   36.40      status = mime_encode_message(encrypted_msg, false, &encoded_text);
   36.41      TEST_ASSERT_MSG((status == PEP_STATUS_OK), "status == PEP_STATUS_OK");
   36.42      TEST_ASSERT_MSG((encoded_text), "encoded_text");
   36.43 -    
   36.44 +
   36.45      bool contains_version = false;
   36.46 -    
   36.47 +
   36.48      const char* version_str = "X-pEp-Version: ";
   36.49      size_t version_prefix_len = strlen(version_str);
   36.50 -    
   36.51 +
   36.52      istringstream f(encoded_text);
   36.53      string enc_string;
   36.54      while (getline(f, enc_string)) {
   36.55 @@ -80,7 +85,7 @@
   36.56              contains_version = true;
   36.57      }
   36.58      TEST_ASSERT_MSG((contains_version), "contains_version");
   36.59 -    
   36.60 +
   36.61      if (contains_version)
   36.62 -        cout << "Version string in encrypted message, as it should be." << endl;    
   36.63 +        cout << "Version string in encrypted message, as it should be." << endl;
   36.64  }
    37.1 --- a/test/src/engine_tests/EncryptMissingPrivateKeyTests.cc	Fri Nov 09 09:05:32 2018 +0100
    37.2 +++ b/test/src/engine_tests/EncryptMissingPrivateKeyTests.cc	Wed Nov 21 08:35:41 2018 +0100
    37.3 @@ -80,9 +80,6 @@
    37.4      char* new_key = enc_msg->from->fpr;
    37.5      cout << "Encrypted with key " << new_key << endl;
    37.6      
    37.7 -    status = delete_keypair(session, new_key);
    37.8 -    PEP_STATUS status14 = myself(session, no_key_identity);
    37.9 -
   37.10      free_message(tmp_msg);    
   37.11      free_message(enc_msg);
   37.12  }
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/test/src/engine_tests/Engine358Tests.cc	Wed Nov 21 08:35:41 2018 +0100
    38.3 @@ -0,0 +1,54 @@
    38.4 +// This file is under GNU General Public License 3.0
    38.5 +// see LICENSE.txt
    38.6 +
    38.7 +#include <stdlib.h>
    38.8 +#include <string>
    38.9 +#include <cstring>
   38.10 +#include <cpptest.h>
   38.11 +
   38.12 +#include "pEpEngine.h"
   38.13 +
   38.14 +#include "test_util.h"
   38.15 +#include "EngineTestIndividualSuite.h"
   38.16 +#include "Engine358Tests.h"
   38.17 +
   38.18 +using namespace std;
   38.19 +
   38.20 +Engine358Tests::Engine358Tests(string suitename, string test_home_dir) :
   38.21 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   38.22 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine358Tests::check_engine358"),
   38.23 +                                                                      static_cast<Func>(&Engine358Tests::check_engine358)));
   38.24 +}
   38.25 +
   38.26 +void Engine358Tests::check_engine358() {
   38.27 +    bool ok = false;
   38.28 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   38.29 +    TEST_ASSERT(ok);    
   38.30 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   38.31 +    TEST_ASSERT(ok);
   38.32 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
   38.33 +    TEST_ASSERT(ok);
   38.34 +
   38.35 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   38.36 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
   38.37 +
   38.38 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
   38.39 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   38.40 +
   38.41 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
   38.42 +    message* msg = new_message(PEP_dir_outgoing);    
   38.43 +
   38.44 +    msg->from = alice_from;
   38.45 +    msg->to = new_identity_list(expired_inquisitor);
   38.46 +    msg->shortmsg = strdup("Blah!");
   38.47 +    msg->longmsg = strdup("Blahblahblah!");
   38.48 +    msg->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
   38.49 +
   38.50 +    message* enc_msg = NULL;
   38.51 +    
   38.52 +    status = encrypt_message(session, msg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
   38.53 +    TEST_ASSERT(!enc_msg);
   38.54 +    TEST_ASSERT(msg->to && msg->to->ident);
   38.55 +    TEST_ASSERT_MSG((status == PEP_UNENCRYPTED), tl_status_string(status));
   38.56 +}
   38.57 +
    39.1 --- a/test/src/engine_tests/Engine463Tests.cc	Fri Nov 09 09:05:32 2018 +0100
    39.2 +++ b/test/src/engine_tests/Engine463Tests.cc	Wed Nov 21 08:35:41 2018 +0100
    39.3 @@ -7,6 +7,7 @@
    39.4  #include "pEpEngine.h"
    39.5  #include "pEp_internal.h"
    39.6  #include "test_util.h"
    39.7 +#include "message.h"
    39.8  
    39.9  #include "EngineTestIndividualSuite.h"
   39.10  #include "Engine463Tests.h"
   39.11 @@ -19,6 +20,10 @@
   39.12                                                                        static_cast<Func>(&Engine463Tests::check_engine_463_no_own_key)));
   39.13      add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_own_key"),
   39.14                                                                        static_cast<Func>(&Engine463Tests::check_engine_463_own_key)));                                                                  
   39.15 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_sender_expired_and_renewed"),
   39.16 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_sender_expired_and_renewed)));                                                                                                                                    
   39.17 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_reply_recip_expired_and_renewed"),
   39.18 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_reply_recip_expired_and_renewed)));                                                                                                                                    
   39.19  }
   39.20  
   39.21  void Engine463Tests::check_engine_463_no_own_key() {
   39.22 @@ -38,11 +43,10 @@
   39.23      char* modified_src = NULL;
   39.24      
   39.25      PEP_rating rating;
   39.26 -    PEP_decrypt_flags_t flags;
   39.27 +    PEP_decrypt_flags_t flags = 0;
   39.28       
   39.29      status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   39.30      TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   39.31 -    cout << decrypted_msg << endl;        
   39.32  }
   39.33  
   39.34  void Engine463Tests::check_engine_463_own_key() {
   39.35 @@ -66,9 +70,103 @@
   39.36      char* modified_src = NULL;
   39.37      
   39.38      PEP_rating rating;
   39.39 -    PEP_decrypt_flags_t flags;
   39.40 +    PEP_decrypt_flags_t flags = 0;
   39.41       
   39.42      status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   39.43      TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   39.44 -    cout << decrypted_msg << endl;        
   39.45  }
   39.46 +
   39.47 +void Engine463Tests::check_engine_463_sender_expired_and_renewed() {
   39.48 +    bool ok = false;
   39.49 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   39.50 +    TEST_ASSERT(ok);    
   39.51 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   39.52 +    TEST_ASSERT(ok);
   39.53 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
   39.54 +    TEST_ASSERT(ok);
   39.55 +
   39.56 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
   39.57 +    // the expired key:
   39.58 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
   39.59 +    
   39.60 +    char* decrypted_msg = NULL;
   39.61 +    stringlist_t* keylist_used = nullptr;
   39.62 +    char* modified_src = NULL;
   39.63 +    
   39.64 +    PEP_rating rating;
   39.65 +    PEP_decrypt_flags_t flags = 0;
   39.66 +     
   39.67 +    PEP_STATUS status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   39.68 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
   39.69 +
   39.70 +    free(decrypted_msg);
   39.71 +    decrypted_msg = NULL;
   39.72 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
   39.73 +    TEST_ASSERT(ok);    
   39.74 +
   39.75 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
   39.76 +    
   39.77 +    status = identity_rating(session, expired_inquisitor, &rating);
   39.78 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   39.79 +    TEST_ASSERT_MSG((rating == PEP_rating_reliable), tl_rating_string(rating));
   39.80 +        
   39.81 +    flags = 0;
   39.82 +    
   39.83 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);    
   39.84 +    TEST_ASSERT(decrypted_msg);
   39.85 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   39.86 +    TEST_ASSERT_MSG((rating == PEP_rating_reliable), tl_rating_string(rating));
   39.87 +
   39.88 +    free_identity(expired_inquisitor);
   39.89 +
   39.90 +}
   39.91 +
   39.92 + void Engine463Tests::check_engine_463_reply_recip_expired_and_renewed() {
   39.93 +    bool ok = false;
   39.94 +    ok = slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   39.95 +    TEST_ASSERT(ok);    
   39.96 +    ok = slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   39.97 +    TEST_ASSERT(ok);
   39.98 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc");    
   39.99 +    TEST_ASSERT(ok);
  39.100 +
  39.101 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
  39.102 +    pEp_identity* alice_from = new_identity("pep.test.alice@pep-project.org", alice_fpr, PEP_OWN_USERID, "Alice Cooper");
  39.103 +
  39.104 +    PEP_STATUS status = set_own_key(session, alice_from, alice_fpr); 
  39.105 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  39.106 +
  39.107 +    // Ok, so I want to make sure we make an entry, so I'll try to decrypt the message WITH
  39.108 +    // the expired key:
  39.109 +    const string msg = slurp("test_mails/ENGINE-463-attempt-numero-dos.eml");
  39.110 +    
  39.111 +    char* decrypted_msg = NULL;
  39.112 +    stringlist_t* keylist_used = nullptr;
  39.113 +    char* modified_src = NULL;
  39.114 +    
  39.115 +    PEP_rating rating;
  39.116 +    PEP_decrypt_flags_t flags = 0;
  39.117 +     
  39.118 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
  39.119 +    TEST_ASSERT_MSG((status == PEP_DECRYPTED), tl_status_string(status));
  39.120 +
  39.121 +    free(decrypted_msg);
  39.122 +    decrypted_msg = NULL;
  39.123 +    ok = slurp_and_import_key(session, "test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc");    
  39.124 +    TEST_ASSERT(ok);    
  39.125 +
  39.126 +    pEp_identity* expired_inquisitor = new_identity("inquisitor@darthmama.org", NULL, NULL, "Lady Claire Trevelyan");
  39.127 +    message* msg2 = new_message(PEP_dir_outgoing);    
  39.128 +
  39.129 +    msg2->from = alice_from;
  39.130 +    msg2->to = new_identity_list(expired_inquisitor);
  39.131 +    msg2->shortmsg = strdup("Blah!");
  39.132 +    msg2->longmsg = strdup("Blahblahblah!");
  39.133 +    msg2->attachments = new_bloblist(NULL, 0, "application/octet-stream", NULL);
  39.134 +
  39.135 +    status = outgoing_message_rating(session, msg2, &rating);
  39.136 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
  39.137 +    TEST_ASSERT_MSG((rating == PEP_rating_reliable), tl_rating_string(rating));    
  39.138 +
  39.139 +    free_message(msg2);
  39.140 +}
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/test/src/engine_tests/ExpiredSubkeyTests.cc	Wed Nov 21 08:35:41 2018 +0100
    40.3 @@ -0,0 +1,79 @@
    40.4 +// This file is under GNU General Public License 3.0
    40.5 +// see LICENSE.txt
    40.6 +
    40.7 +#include <stdlib.h>
    40.8 +#include <string>
    40.9 +#include <cpptest.h>
   40.10 +#include "test_util.h"
   40.11 +
   40.12 +#include "pEpEngine.h"
   40.13 +
   40.14 +#include "EngineTestIndividualSuite.h"
   40.15 +#include "ExpiredSubkeyTests.h"
   40.16 +
   40.17 +using namespace std;
   40.18 +
   40.19 +ExpiredSubkeyTests::ExpiredSubkeyTests(string suitename, string test_home_dir) :
   40.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   40.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_and_main_key"),
   40.22 +                                                                      static_cast<Func>(&ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_and_main_key)));
   40.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_expired_main"),
   40.24 +                                                                      static_cast<Func>(&ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_expired_main)));                                                                      
   40.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("ExpiredSubkeyTests::all_valid_with_leftover_expired_subkeys"),
   40.26 +                                                                      static_cast<Func>(&ExpiredSubkeyTests::all_valid_with_leftover_expired_subkeys)));                                                                                                                                            
   40.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("ExpiredSubkeyTests::no_valid_encryption_subkey"),
   40.28 +                                                                      static_cast<Func>(&ExpiredSubkeyTests::no_valid_encryption_subkey)));                                                                                                                                            
   40.29 +}
   40.30 +
   40.31 +void ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_and_main_key() {
   40.32 +    slurp_and_import_key(session,"test_keys/pub/eb_0_valid_pub.asc");
   40.33 +    pEp_identity* expired_0 = new_identity("expired_in_bits_0@darthmama.org",
   40.34 +                                           NULL, NULL, "Expired 0");
   40.35 +    PEP_STATUS status = update_identity(session, expired_0);
   40.36 +    TEST_ASSERT(status == PEP_STATUS_OK);
   40.37 +    TEST_ASSERT(expired_0->fpr);
   40.38 +    PEP_rating rating;
   40.39 +    status = identity_rating(session, expired_0, &rating);
   40.40 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
   40.41 +    TEST_ASSERT(rating == PEP_rating_reliable);    
   40.42 +}
   40.43 +
   40.44 +void ExpiredSubkeyTests::expired_subkey_with_valid_subkeys_expired_main() {
   40.45 +    slurp_and_import_key(session,"test_keys/pub/master_key_test_sign_and_encrypt_added.asc");
   40.46 +    pEp_identity* expired_0 = new_identity("master_key_test@darthmama.org",
   40.47 +                                           NULL, NULL, "Master Key Test");
   40.48 +    PEP_STATUS status = update_identity(session, expired_0);
   40.49 +    TEST_ASSERT(status == PEP_STATUS_OK);
   40.50 +    TEST_ASSERT(expired_0->fpr);
   40.51 +    PEP_rating rating;
   40.52 +    status = identity_rating(session, expired_0, &rating);
   40.53 +    TEST_ASSERT_MSG(status == PEP_KEY_UNSUITABLE, tl_status_string(status));
   40.54 +    TEST_ASSERT(rating == PEP_rating_undefined);        
   40.55 +}
   40.56 +
   40.57 +void ExpiredSubkeyTests::all_valid_with_leftover_expired_subkeys() {
   40.58 +    slurp_and_import_key(session,"test_keys/pub/master_key_test_certify_extended_pub.asc");
   40.59 +    pEp_identity* expired_0 = new_identity("master_key_test@darthmama.org",
   40.60 +                                           NULL, NULL, "Master Key Test");
   40.61 +    PEP_STATUS status = update_identity(session, expired_0);
   40.62 +    TEST_ASSERT(status == PEP_STATUS_OK);
   40.63 +    TEST_ASSERT(expired_0->fpr);
   40.64 +    PEP_rating rating;
   40.65 +    status = identity_rating(session, expired_0, &rating);
   40.66 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
   40.67 +    TEST_ASSERT(rating == PEP_rating_reliable);        
   40.68 +}
   40.69 +
   40.70 +void ExpiredSubkeyTests::no_valid_encryption_subkey() {
   40.71 +    slurp_and_import_key(session,"test_keys/pub/master_key_test_deleted_valid_enc_key_pub.asc");
   40.72 +    pEp_identity* expired_0 = new_identity("master_key_test@darthmama.org",
   40.73 +                                           NULL, NULL, "Master Key Test");
   40.74 +    PEP_STATUS status = update_identity(session, expired_0);
   40.75 +    TEST_ASSERT(status == PEP_STATUS_OK);
   40.76 +    TEST_ASSERT(expired_0->fpr);
   40.77 +    PEP_rating rating;
   40.78 +    status = identity_rating(session, expired_0, &rating);
   40.79 +    TEST_ASSERT_MSG(status == PEP_KEY_UNSUITABLE, tl_status_string(status));
   40.80 +    TEST_ASSERT_MSG(rating == PEP_rating_undefined, tl_rating_string(rating));        
   40.81 +}
   40.82 +
    41.1 --- a/test/src/engine_tests/ExternalRevokeTests.cc	Fri Nov 09 09:05:32 2018 +0100
    41.2 +++ b/test/src/engine_tests/ExternalRevokeTests.cc	Wed Nov 21 08:35:41 2018 +0100
    41.3 @@ -297,10 +297,7 @@
    41.4      free_identity(me);
    41.5      free_identity(recip1);
    41.6      free(uniqname);
    41.7 -    
    41.8 -    delete_keypair(session, fprs[0]);    
    41.9 -    delete_keypair(session, fprs[1]);
   41.10 -    
   41.11 +        
   41.12      free(fprs[0]);
   41.13      free(fprs[1]);
   41.14      
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/test/src/engine_tests/HeaderKeyImportTests.cc	Wed Nov 21 08:35:41 2018 +0100
    42.3 @@ -0,0 +1,763 @@
    42.4 +// This file is under GNU General Public License 3.0
    42.5 +// see LICENSE.txt
    42.6 +
    42.7 +#include <stdlib.h>
    42.8 +#include <string>
    42.9 +#include <cstring>
   42.10 +
   42.11 +#include <cpptest.h>
   42.12 +
   42.13 +#include "pEpEngine.h"
   42.14 +#include "bloblist.h"
   42.15 +#include "base64.h"
   42.16 +
   42.17 +#include "test_util.h"
   42.18 +#include "EngineTestIndividualSuite.h"
   42.19 +#include "HeaderKeyImportTests.h"
   42.20 +
   42.21 +using namespace std;
   42.22 +
   42.23 +HeaderKeyImportTests::HeaderKeyImportTests(string suitename, string test_home_dir) :
   42.24 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   42.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_round"),
   42.26 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_round)));
   42.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_padded_1"),
   42.28 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_padded_1)));
   42.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_padded_2"),
   42.30 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_padded_2)));                                                                      
   42.31 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_unpadded_1"),
   42.32 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_unpadded_1)));
   42.33 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_unpadded_2"),
   42.34 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_unpadded_2)));                                                                      
   42.35 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_leading_whitespace_round"),
   42.36 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_leading_whitespace_round)));
   42.37 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_1"),
   42.38 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_1)));                                                                      
   42.39 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_2"),
   42.40 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_2)));                                                                      
   42.41 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_1"),    
   42.42 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_1)));
   42.43 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_2"),    
   42.44 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_2)));
   42.45 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_trailing_whitespace_round"),
   42.46 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_trailing_whitespace_round)));
   42.47 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_1"),
   42.48 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_1)));
   42.49 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_2"),
   42.50 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_2)));
   42.51 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_1"),
   42.52 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_1)));
   42.53 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_2"),
   42.54 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_2)));
   42.55 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_internal_whitespace_round"),
   42.56 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_internal_whitespace_round)));
   42.57 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_1"),
   42.58 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_1)));
   42.59 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_2"),
   42.60 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_2)));
   42.61 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_1"),
   42.62 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_1)));
   42.63 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_2"),
   42.64 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_2)));
   42.65 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_round"),
   42.66 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_round)));
   42.67 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_padded_1"),
   42.68 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_padded_1)));
   42.69 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_padded_2"),
   42.70 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_padded_2)));
   42.71 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_unpadded_1"),
   42.72 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_unpadded_1)));                                                                      
   42.73 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_unpadded_2"),
   42.74 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_unpadded_2)));
   42.75 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_leading_whitespace_round"),
   42.76 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_leading_whitespace_round)));
   42.77 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_leading_whitespace_padded_1"),
   42.78 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_leading_whitespace_padded_1)));
   42.79 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_leading_whitespace_padded_2"),
   42.80 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_leading_whitespace_padded_2)));
   42.81 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_leading_whitespace_unpadded_1"),
   42.82 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_leading_whitespace_unpadded_1)));                                                                      
   42.83 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_leading_whitespace_unpadded_2"),
   42.84 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_leading_whitespace_unpadded_2)));
   42.85 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_trailing_whitespace_round"),
   42.86 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_trailing_whitespace_round)));
   42.87 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_trailing_whitespace_padded_1"),
   42.88 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_trailing_whitespace_padded_1)));
   42.89 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_trailing_whitespace_padded_2"),
   42.90 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_trailing_whitespace_padded_2)));
   42.91 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_1"),
   42.92 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_1)));
   42.93 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_2"),
   42.94 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_2)));
   42.95 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_kitchen_sink_round"),
   42.96 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_kitchen_sink_round)));
   42.97 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_kitchen_sink_padded_1"),
   42.98 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_kitchen_sink_padded_1)));
   42.99 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_kitchen_sink_padded_2"),
  42.100 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_kitchen_sink_padded_2)));
  42.101 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_kitchen_sink_unpadded_1"),
  42.102 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_kitchen_sink_unpadded_1)));
  42.103 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::base_64_kitchen_sink_unpadded_2"),
  42.104 +                                                                      static_cast<Func>(&HeaderKeyImportTests::base_64_kitchen_sink_unpadded_2)));
  42.105 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("HeaderKeyImportTests::check_header_key_import"),
  42.106 +                                                                      static_cast<Func>(&HeaderKeyImportTests::check_header_key_import)));                                                                  
  42.107 +}
  42.108 +
  42.109 +bool HeaderKeyImportTests::verify_base_64_test(const char* input, const char* desired_output) {
  42.110 +    bloblist_t* blobby = NULL;
  42.111 +    bool retval = false;
  42.112 +    size_t desired_output_length = 0;
  42.113 +    const char* blobval;
  42.114 +    
  42.115 +    blobby = base64_str_to_binary_blob(input, strlen(input));    
  42.116 +    if (!blobby)
  42.117 +        goto pEp_free;
  42.118 +
  42.119 +    blobval = blobby->value;
  42.120 +    
  42.121 +    // N.B. Actual output will NOT be null-terminated!!!!
  42.122 +    desired_output_length = strlen(desired_output);
  42.123 +    if (blobby->size != desired_output_length) 
  42.124 +        goto pEp_free;
  42.125 +        
  42.126 +    int i;
  42.127 +    for (i = 0; i < desired_output_length; i++) {
  42.128 +        if (*blobval++ != *desired_output++)
  42.129 +        goto pEp_free;
  42.130 +    }
  42.131 +    
  42.132 +    retval = true;    
  42.133 +    
  42.134 +pEp_free:
  42.135 +    free_bloblist(blobby);
  42.136 +    return retval;
  42.137 +}
  42.138 +
  42.139 +void HeaderKeyImportTests::base_64_minimal_round() {
  42.140 +    TEST_ASSERT(verify_base_64_test("TWFu", "Man"));
  42.141 +}
  42.142 +
  42.143 +void HeaderKeyImportTests::base_64_minimal_padded_1() {
  42.144 +    TEST_ASSERT(verify_base_64_test("TWE=", "Ma"));
  42.145 +}
  42.146 +
  42.147 +void HeaderKeyImportTests::base_64_minimal_padded_2() {
  42.148 +    TEST_ASSERT(verify_base_64_test("TQ==", "M"));
  42.149 +}
  42.150 +
  42.151 +void HeaderKeyImportTests::base_64_minimal_unpadded_1() {
  42.152 +    TEST_ASSERT(verify_base_64_test("TWE", "Ma"));
  42.153 +}
  42.154 +
  42.155 +void HeaderKeyImportTests::base_64_minimal_unpadded_2() {
  42.156 +    TEST_ASSERT(verify_base_64_test("TQ", "M"));
  42.157 +}
  42.158 +
  42.159 +void HeaderKeyImportTests::base_64_minimal_leading_whitespace_round() {
  42.160 +    TEST_ASSERT(verify_base_64_test(" \tTWFu", "Man"));
  42.161 +}
  42.162 +
  42.163 +void HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_1() {
  42.164 +    TEST_ASSERT(verify_base_64_test(" TWE=", "Ma"));
  42.165 +}
  42.166 +
  42.167 +void HeaderKeyImportTests::base_64_minimal_leading_whitespace_padded_2() {
  42.168 +    TEST_ASSERT(verify_base_64_test("\nTQ==", "M"));
  42.169 +}
  42.170 +
  42.171 +void HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_1() {
  42.172 +    TEST_ASSERT(verify_base_64_test("\n TWE", "Ma"));
  42.173 +}
  42.174 +void HeaderKeyImportTests::base_64_minimal_leading_whitespace_unpadded_2() {
  42.175 +    TEST_ASSERT(verify_base_64_test(" TQ", "M"));
  42.176 +}
  42.177 +
  42.178 +void HeaderKeyImportTests::base_64_minimal_trailing_whitespace_round() {
  42.179 +    TEST_ASSERT(verify_base_64_test("TWFu ", "Man"));
  42.180 +}
  42.181 +
  42.182 +void HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_1() {
  42.183 +    TEST_ASSERT(verify_base_64_test("TWE=\n ", "Ma"));
  42.184 +}
  42.185 +
  42.186 +void HeaderKeyImportTests::base_64_minimal_trailing_whitespace_padded_2() {
  42.187 +    TEST_ASSERT(verify_base_64_test("TQ==                 \n \t", "M"));
  42.188 +}
  42.189 +
  42.190 +void HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_1() {
  42.191 +    TEST_ASSERT(verify_base_64_test("TWE           ", "Ma"));
  42.192 +}
  42.193 +
  42.194 +void HeaderKeyImportTests::base_64_minimal_trailing_whitespace_unpadded_2() {
  42.195 +    TEST_ASSERT(verify_base_64_test("TQ\n", "M"));
  42.196 +}
  42.197 +
  42.198 +void HeaderKeyImportTests::base_64_minimal_internal_whitespace_round() {
  42.199 +    TEST_ASSERT(verify_base_64_test("T\nWF\nu", "Man"));
  42.200 +}
  42.201 +
  42.202 +void HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_1() {
  42.203 +    TEST_ASSERT(verify_base_64_test("T    W E =", "Ma"));
  42.204 +}
  42.205 +
  42.206 +void HeaderKeyImportTests::base_64_minimal_internal_whitespace_padded_2() {
  42.207 +    TEST_ASSERT(verify_base_64_test("T  Q==", "M"));
  42.208 +}
  42.209 +
  42.210 +void HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_1() {
  42.211 +    TEST_ASSERT(verify_base_64_test("T\nWE", "Ma"));
  42.212 +}
  42.213 +
  42.214 +void HeaderKeyImportTests::base_64_minimal_internal_whitespace_unpadded_2() {
  42.215 +    TEST_ASSERT(verify_base_64_test("T\r\nQ", "M"));
  42.216 +}
  42.217 +
  42.218 +void HeaderKeyImportTests::base_64_round() {
  42.219 +    const char* input = "V2hlbiB0aGluZ3MgZ28gd3JvbmcsIGFzIHRoZX"
  42.220 +                        "kgdXN1YWxseSB3aWxsCkFuZCB5b3VyIGRhaWx5"
  42.221 +                        "IHJvYWQgc2VlbXMgYWxsIHVwaGlsbApXaGVuIG"
  42.222 +                        "Z1bmRzIGFyZSBsb3csIGFuZCBkZWJ0cyBhcmUg"
  42.223 +                        "aGlnaApZb3UgdHJ5IHRvIHNtaWxlLCBidXQgY2"
  42.224 +                        "FuIG9ubHkgY3J5CldoZW4geW91IHJlYWxseSBm"
  42.225 +                        "ZWVsIHlvdSdkIGxpa2UgdG8gcXVpdCwKRG9uJ3"
  42.226 +                        "QgcnVuIHRvIG1lLCBJIGRvbid0IGdpdmUgYSBI"
  42.227 +                        "SSBOT1RISU5HIFRPIFNFRSBIRVJFISEh";
  42.228 +    
  42.229 +    const char* output = "When things go wrong, as they usually will\n"
  42.230 +                         "And your daily road seems all uphill\n"
  42.231 +                         "When funds are low, and debts are high\n"
  42.232 +                         "You try to smile, but can only cry\n"
  42.233 +                         "When you really feel you'd like to quit,\n"
  42.234 +                         "Don't run to me, I don't give a HI NOTHING TO SEE HERE!!!";
  42.235 +    
  42.236 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.237 +}
  42.238 +
  42.239 +void HeaderKeyImportTests::base_64_padded_1() {
  42.240 +    const char* input =
  42.241 +        "U2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.242 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.243 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.244 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4=";
  42.245 +    
  42.246 +    const char* output =
  42.247 +        "Sinterklaas Kapoentje,\n"
  42.248 +        "Gooi wat in m’n schoentje,\n"
  42.249 +        "Gooi wat in m’n laarsje.\n"
  42.250 +        "Dank u, Sinterklaasje.\n"
  42.251 +        "Sinterklaas Kapoentje,\n"
  42.252 +        "Gooi wat in m’n schoentje,\n"
  42.253 +        "Gooi wat in m’n laarsje.\n"
  42.254 +        "Dank u, Sinterklaasje.";
  42.255 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.256 +}
  42.257 +
  42.258 +void HeaderKeyImportTests::base_64_padded_2() {
  42.259 +    const char* input = 
  42.260 +        "V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.261 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.262 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.263 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.264 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.265 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.266 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.267 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.268 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.269 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.270 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.271 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.272 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.273 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.274 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg==";
  42.275 +
  42.276 +    const char* output = 
  42.277 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.278 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.279 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.280 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.281 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.282 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.283 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.284 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.285 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.286 +        "Ahem.";
  42.287 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.288 +    
  42.289 +}
  42.290 +
  42.291 +void HeaderKeyImportTests::base_64_unpadded_1() {
  42.292 +    const char* input =
  42.293 +        "U2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.294 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.295 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.296 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4=";
  42.297 +    
  42.298 +    const char* output =
  42.299 +        "Sinterklaas Kapoentje,\n"
  42.300 +        "Gooi wat in m’n schoentje,\n"
  42.301 +        "Gooi wat in m’n laarsje.\n"
  42.302 +        "Dank u, Sinterklaasje.\n"
  42.303 +        "Sinterklaas Kapoentje,\n"
  42.304 +        "Gooi wat in m’n schoentje,\n"
  42.305 +        "Gooi wat in m’n laarsje.\n"
  42.306 +        "Dank u, Sinterklaasje.";
  42.307 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.308 +
  42.309 +}
  42.310 +
  42.311 +void HeaderKeyImportTests::base_64_unpadded_2() {
  42.312 +    const char* input =
  42.313 +        "V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.314 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.315 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.316 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.317 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.318 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.319 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.320 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.321 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.322 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.323 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.324 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.325 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.326 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.327 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg";
  42.328 +
  42.329 +    const char* output = 
  42.330 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.331 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.332 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.333 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.334 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.335 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.336 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.337 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.338 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.339 +        "Ahem.";
  42.340 +
  42.341 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.342 +
  42.343 +}
  42.344 +
  42.345 +void HeaderKeyImportTests::base_64_leading_whitespace_round() {
  42.346 +    const char* input = "\r\nV2hlbiB0aGluZ3MgZ28gd3JvbmcsIGFzIHRoZX"
  42.347 +                        "kgdXN1YWxseSB3aWxsCkFuZCB5b3VyIGRhaWx5"
  42.348 +                        "IHJvYWQgc2VlbXMgYWxsIHVwaGlsbApXaGVuIG"
  42.349 +                        "Z1bmRzIGFyZSBsb3csIGFuZCBkZWJ0cyBhcmUg"
  42.350 +                        "aGlnaApZb3UgdHJ5IHRvIHNtaWxlLCBidXQgY2"
  42.351 +                        "FuIG9ubHkgY3J5CldoZW4geW91IHJlYWxseSBm"
  42.352 +                        "ZWVsIHlvdSdkIGxpa2UgdG8gcXVpdCwKRG9uJ3"
  42.353 +                        "QgcnVuIHRvIG1lLCBJIGRvbid0IGdpdmUgYSBI"
  42.354 +                        "SSBOT1RISU5HIFRPIFNFRSBIRVJFISEh";
  42.355 +    
  42.356 +    const char* output = "When things go wrong, as they usually will\n"
  42.357 +                         "And your daily road seems all uphill\n"
  42.358 +                         "When funds are low, and debts are high\n"
  42.359 +                         "You try to smile, but can only cry\n"
  42.360 +                         "When you really feel you'd like to quit,\n"
  42.361 +                         "Don't run to me, I don't give a HI NOTHING TO SEE HERE!!!";
  42.362 +    
  42.363 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.364 +}
  42.365 +
  42.366 +void HeaderKeyImportTests::base_64_leading_whitespace_padded_1() {
  42.367 +    const char* input =
  42.368 +        "\tU2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.369 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.370 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.371 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4=";
  42.372 +    
  42.373 +    const char* output =
  42.374 +        "Sinterklaas Kapoentje,\n"
  42.375 +        "Gooi wat in m’n schoentje,\n"
  42.376 +        "Gooi wat in m’n laarsje.\n"
  42.377 +        "Dank u, Sinterklaasje.\n"
  42.378 +        "Sinterklaas Kapoentje,\n"
  42.379 +        "Gooi wat in m’n schoentje,\n"
  42.380 +        "Gooi wat in m’n laarsje.\n"
  42.381 +        "Dank u, Sinterklaasje.";
  42.382 +        
  42.383 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.384 +        
  42.385 +}
  42.386 +
  42.387 +void HeaderKeyImportTests::base_64_leading_whitespace_padded_2() {
  42.388 +    const char* input = 
  42.389 +        " V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.390 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.391 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.392 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.393 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.394 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.395 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.396 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.397 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.398 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.399 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.400 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.401 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.402 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.403 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg==";
  42.404 +
  42.405 +    const char* output = 
  42.406 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.407 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.408 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.409 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.410 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.411 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.412 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.413 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.414 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.415 +        "Ahem.";
  42.416 +        
  42.417 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.418 +        
  42.419 +}
  42.420 +
  42.421 +void HeaderKeyImportTests::base_64_leading_whitespace_unpadded_1() {
  42.422 +    const char* input =
  42.423 +        "\n\nU2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.424 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.425 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.426 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4";
  42.427 +    
  42.428 +    const char* output =
  42.429 +        "Sinterklaas Kapoentje,\n"
  42.430 +        "Gooi wat in m’n schoentje,\n"
  42.431 +        "Gooi wat in m’n laarsje.\n"
  42.432 +        "Dank u, Sinterklaasje.\n"
  42.433 +        "Sinterklaas Kapoentje,\n"
  42.434 +        "Gooi wat in m’n schoentje,\n"
  42.435 +        "Gooi wat in m’n laarsje.\n"
  42.436 +        "Dank u, Sinterklaasje.";
  42.437 +
  42.438 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.439 +
  42.440 +}
  42.441 +
  42.442 +void HeaderKeyImportTests::base_64_leading_whitespace_unpadded_2() {
  42.443 +    const char* input = 
  42.444 +        "   V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.445 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.446 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.447 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.448 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.449 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.450 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.451 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.452 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.453 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.454 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.455 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.456 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.457 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.458 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg";
  42.459 +
  42.460 +    const char* output = 
  42.461 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.462 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.463 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.464 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.465 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.466 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.467 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.468 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.469 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.470 +        "Ahem.";
  42.471 +
  42.472 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.473 +
  42.474 +}
  42.475 +
  42.476 +void HeaderKeyImportTests::base_64_trailing_whitespace_round() {
  42.477 +    const char* input = "V2hlbiB0aGluZ3MgZ28gd3JvbmcsIGFzIHRoZX"
  42.478 +                        "kgdXN1YWxseSB3aWxsCkFuZCB5b3VyIGRhaWx5"
  42.479 +                        "IHJvYWQgc2VlbXMgYWxsIHVwaGlsbApXaGVuIG"
  42.480 +                        "Z1bmRzIGFyZSBsb3csIGFuZCBkZWJ0cyBhcmUg"
  42.481 +                        "aGlnaApZb3UgdHJ5IHRvIHNtaWxlLCBidXQgY2"
  42.482 +                        "FuIG9ubHkgY3J5CldoZW4geW91IHJlYWxseSBm"
  42.483 +                        "ZWVsIHlvdSdkIGxpa2UgdG8gcXVpdCwKRG9uJ3"
  42.484 +                        "QgcnVuIHRvIG1lLCBJIGRvbid0IGdpdmUgYSBI"
  42.485 +                        "SSBOT1RISU5HIFRPIFNFRSBIRVJFISEh\n";
  42.486 +    
  42.487 +    const char* output = "When things go wrong, as they usually will\n"
  42.488 +                         "And your daily road seems all uphill\n"
  42.489 +                         "When funds are low, and debts are high\n"
  42.490 +                         "You try to smile, but can only cry\n"
  42.491 +                         "When you really feel you'd like to quit,\n"
  42.492 +                         "Don't run to me, I don't give a HI NOTHING TO SEE HERE!!!";
  42.493 +    
  42.494 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.495 +}
  42.496 +
  42.497 +void HeaderKeyImportTests::base_64_trailing_whitespace_padded_1() {
  42.498 +    const char* input =
  42.499 +        "U2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.500 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.501 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.502 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4=   \n";
  42.503 +    
  42.504 +    const char* output =
  42.505 +        "Sinterklaas Kapoentje,\n"
  42.506 +        "Gooi wat in m’n schoentje,\n"
  42.507 +        "Gooi wat in m’n laarsje.\n"
  42.508 +        "Dank u, Sinterklaasje.\n"
  42.509 +        "Sinterklaas Kapoentje,\n"
  42.510 +        "Gooi wat in m’n schoentje,\n"
  42.511 +        "Gooi wat in m’n laarsje.\n"
  42.512 +        "Dank u, Sinterklaasje.";
  42.513 +
  42.514 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.515 +
  42.516 +}
  42.517 +
  42.518 +void HeaderKeyImportTests::base_64_trailing_whitespace_padded_2() {
  42.519 +    const char* input = 
  42.520 +        "V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.521 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.522 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.523 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.524 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.525 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.526 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.527 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.528 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.529 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.530 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.531 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.532 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.533 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.534 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg==         \n";
  42.535 +
  42.536 +    const char* output = 
  42.537 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.538 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.539 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.540 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.541 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.542 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.543 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.544 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.545 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.546 +        "Ahem.";
  42.547 +
  42.548 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.549 +
  42.550 +}
  42.551 +
  42.552 +void HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_1() {
  42.553 +    const char* input =
  42.554 +        "U2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg"
  42.555 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg"
  42.556 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu"
  42.557 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4   \n";
  42.558 +    
  42.559 +    const char* output =
  42.560 +        "Sinterklaas Kapoentje,\n"
  42.561 +        "Gooi wat in m’n schoentje,\n"
  42.562 +        "Gooi wat in m’n laarsje.\n"
  42.563 +        "Dank u, Sinterklaasje.\n"
  42.564 +        "Sinterklaas Kapoentje,\n"
  42.565 +        "Gooi wat in m’n schoentje,\n"
  42.566 +        "Gooi wat in m’n laarsje.\n"
  42.567 +        "Dank u, Sinterklaasje.";
  42.568 +
  42.569 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.570 +
  42.571 +}
  42.572 +
  42.573 +void HeaderKeyImportTests::base_64_trailing_whitespace_unpadded_2() {
  42.574 +    const char* input = 
  42.575 +        "V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg"
  42.576 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg"
  42.577 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg"
  42.578 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz"
  42.579 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg"
  42.580 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu"
  42.581 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g"
  42.582 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg"
  42.583 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp"
  42.584 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv"
  42.585 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo"
  42.586 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs"
  42.587 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv"
  42.588 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl"
  42.589 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg\r\n";
  42.590 +
  42.591 +    const char* output = 
  42.592 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.593 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.594 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.595 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.596 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.597 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.598 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.599 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.600 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.601 +        "Ahem.";
  42.602 +
  42.603 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.604 +
  42.605 +}
  42.606 +
  42.607 +void HeaderKeyImportTests::base_64_kitchen_sink_round() {
  42.608 +    const char* input = "\r\nV2hlbiB0aGluZ3MgZ28gd3JvbmcsIGFzIHRoZX\n"
  42.609 +                        "kgdXN1YWxseSB3aWxsCkFuZCB5b3VyIGRhaWx5\n"
  42.610 +                        "IHJvYWQgc2VlbXMgYWxsIHVwaGlsbApXaGVuIG\n"
  42.611 +                        "Z1bmRzIGFyZSBsb3csIGFuZCBkZWJ0cyBhcmUg\n"
  42.612 +                        "aGlnaApZb3UgdHJ5IHRvIHNtaWxlLCBidXQgY2\n"
  42.613 +                        "FuIG9ubHkgY3J5CldoZW4geW91IHJlYWxseSBm\n"
  42.614 +                        "ZWVsIHlvdSdkIGxpa2UgdG8gcXVpdCwKRG9uJ3\n"
  42.615 +                        "QgcnVuIHRvIG1lLCBJIGRvbid0IGdpdmUgYSBI\n"
  42.616 +                        "SSBOT1RISU5HIFRPIFNFRSBIRVJFISEh\r\n";
  42.617 +    
  42.618 +    const char* output = "When things go wrong, as they usually will\n"
  42.619 +                         "And your daily road seems all uphill\n"
  42.620 +                         "When funds are low, and debts are high\n"
  42.621 +                         "You try to smile, but can only cry\n"
  42.622 +                         "When you really feel you'd like to quit,\n"
  42.623 +                         "Don't run to me, I don't give a HI NOTHING TO SEE HERE!!!";
  42.624 +    
  42.625 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.626 +}
  42.627 +
  42.628 +void HeaderKeyImportTests::base_64_kitchen_sink_padded_1() {
  42.629 +    const char* input =
  42.630 +        "\r\nU2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg\n"
  42.631 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg\n"
  42.632 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu\n"
  42.633 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4=   \n";
  42.634 +    
  42.635 +    const char* output =
  42.636 +        "Sinterklaas Kapoentje,\n"
  42.637 +        "Gooi wat in m’n schoentje,\n"
  42.638 +        "Gooi wat in m’n laarsje.\n"
  42.639 +        "Dank u, Sinterklaasje.\n"
  42.640 +        "Sinterklaas Kapoentje,\n"
  42.641 +        "Gooi wat in m’n schoentje,\n"
  42.642 +        "Gooi wat in m’n laarsje.\n"
  42.643 +        "Dank u, Sinterklaasje.";
  42.644 +
  42.645 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.646 +
  42.647 +}
  42.648 +
  42.649 +void HeaderKeyImportTests::base_64_kitchen_sink_padded_2() {
  42.650 +    const char* input = 
  42.651 +        "                                                                                                 V2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg\n"
  42.652 +        "dGhlIEFyaXNob2s gcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg\n"
  42.653 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg\n"
  42.654 +        "ZW5vdWdoIGRvaW5n IHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz\n"
  42.655 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg\n"
  42.656 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyB\tjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu\r\n"
  42.657 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g\n"
  42.658 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg\n"
  42.659 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp\n"
  42.660 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv\n"
  42.661 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbm cgYXQ/IExvb255LiBZZWFo\n"
  42.662 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4\n\n\ngQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs\n"
  42.663 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv\n"
  42.664 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl\n"
  42.665 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg==\n\n\n\n  \t";
  42.666 +
  42.667 +    const char* output = 
  42.668 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.669 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.670 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.671 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.672 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.673 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.674 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.675 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.676 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.677 +        "Ahem.";
  42.678 +
  42.679 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.680 +
  42.681 +}
  42.682 +
  42.683 +void HeaderKeyImportTests::base_64_kitchen_sink_unpadded_1() {
  42.684 +    const char* input =
  42.685 +        "\r\nU2ludGVya2xhYXMgS2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kg\n"
  42.686 +        "d2F0IGluIG3igJluIGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4KU2ludGVya2xhYXMg\n"
  42.687 +        "S2Fwb2VudGplLApHb29pIHdhdCBpbiBt4oCZbiBzY2hvZW50amUsCkdvb2kgd2F0IGluIG3igJlu\n"
  42.688 +        "IGxhYXJzamUuCkRhbmsgdSwgU2ludGVya2xhYXNqZS4   \n";
  42.689 +    
  42.690 +    const char* output =
  42.691 +        "Sinterklaas Kapoentje,\n"
  42.692 +        "Gooi wat in m’n schoentje,\n"
  42.693 +        "Gooi wat in m’n laarsje.\n"
  42.694 +        "Dank u, Sinterklaasje.\n"
  42.695 +        "Sinterklaas Kapoentje,\n"
  42.696 +        "Gooi wat in m’n schoentje,\n"
  42.697 +        "Gooi wat in m’n laarsje.\n"
  42.698 +        "Dank u, Sinterklaasje.";
  42.699 +
  42.700 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.701 +
  42.702 +}
  42.703 +
  42.704 +void HeaderKeyImportTests::base_64_kitchen_sink_unpadded_2() {
  42.705 +    const char* input = 
  42.706 +        "\r\n\r\n\r\nV2VsbCwgdGhhdCB3YXMgYSBtZXNzLiBCZXR0ZXIgZ2V0IHRoaW5ncyBpbiBvcmRlciBiZWZvcmUg\r\n"
  42.707 +        "dGhlIEFyaXNob2sgcmVzcG9uZHMuIENhbid0IGJlIGdvb2QuIFRoZSB2aXNjb3VudCdzIHNvbiwg\r\n"
  42.708 +        "UXVuYXJpIGluIHRoZSBDaGFudHJ5LiBCZXQgaXQncyBnb2luZyB0byByYWluLCB0b28uIEhhcmQg\r\n"
  42.709 +        "ZW5vdWdoIGRvaW5nIHRoaXMgd2l0aG91dCBzb2FraW5nIG15IGhpZGVzLiBUaGlydHkgcG91bmRz\r\n"
  42.710 +        "IG9mIHdhdGVyIGFuZCBpdCdzIGEgbWFyY2ggd2l0aCBubyByYXRpb25zLiBXaGVuIHdhcyB0aGUg\r\n"
  42.711 +        "bGFzdCB0aW1lIEkgYXRlPyBXaG8ncyBjb29raW5nIHRvbmlnaHQ/IFNhbmRhbD8gTWFrZXIuIEVu\r\n"
  42.712 +        "Y2hhbnRtZW50IHNvdXAgYWdhaW4uIFRodW1iIHJpZ2h0IGluIHRoZSBib3dsIGxhc3QgdGltZS4g\r\n"
  42.713 +        "SGlzIGVuY2hhbnRpbmcgaGFuZCwgdG9vLiBZZWFoLCBJIHNhdyB5b3UsIHlvdSBzcXVpcnJlbHkg\r\n"
  42.714 +        "bGl0dGxlIGtub3QtaGVhZC4gRGlkIEkgbG9jayBteSBjaGFtYmVycz8gSSdsbCBiZXQgaGUncyBp\r\n"
  42.715 +        "biB0aGVyZSBub3cuIFVnaC4gVGhhdCBndXkgbG9va2luZyBhdCBtZT8gVGhlcmUncyBhIGxvdCBv\r\n"
  42.716 +        "ZiBpbGxuZXNzIGluIHRoaXMgY2l0eS4gV2hhdCdzIGhlIGxvb2tpbmcgYXQ/IExvb255LiBZZWFo\r\n"
  42.717 +        "LCB0aGF0J3MgaXQsIGtlZXAgd2Fsa2luZy4gQ2FuJ3QgdHJ1c3QgYW55b25lLiBDb3VsZCBiZSBs\r\n"
  42.718 +        "eXJpdW0tYWRkbGVkLiBGYWRlLWNyYXplZC4gU3RpbGwsIGdvdCB0byBoYXZlIHNvbWUgY29udHJv\r\n"
  42.719 +        "bC4gV2hhdCBraW5kIG9mIGRhbWFnZSBzZW5kcyB0aGVzZSBkYWZ0IGZyZWFrcyBvdXQgaW4gdGhl\r\n"
  42.720 +        "IHN0cmVldHMgdGFsa2luZyB0byB0aGVtLi4uc2VsdmVzPyBBaGVtLg\r\n";
  42.721 +
  42.722 +    const char* output = 
  42.723 +        "Well, that was a mess. Better get things in order before the Arishok responds. "
  42.724 +        "Can't be good. The viscount's son, Qunari in the Chantry. Bet it's going to rain, too. "
  42.725 +        "Hard enough doing this without soaking my hides. Thirty pounds of water and it's a march with no rations. "
  42.726 +        "When was the last time I ate? Who's cooking tonight? Sandal? Maker. Enchantment soup again. "
  42.727 +        "Thumb right in the bowl last time. His enchanting hand, too. Yeah, I saw you, you squirrely little knot-head. "
  42.728 +        "Did I lock my chambers? I'll bet he's in there now. Ugh. "
  42.729 +        "That guy looking at me? There's a lot of illness in this city. What's he looking at? Loony. "
  42.730 +        "Yeah, that's it, keep walking. Can't trust anyone. Could be lyrium-addled. Fade-crazed. "
  42.731 +        "Still, got to have some control. What kind of damage sends these daft freaks out in the streets talking to them...selves? "
  42.732 +        "Ahem.";
  42.733 +
  42.734 +    TEST_ASSERT(verify_base_64_test(input, output));
  42.735 +
  42.736 +}
  42.737 +
  42.738 +void HeaderKeyImportTests::check_header_key_import() {
  42.739 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
  42.740 +    slurp_and_import_key(session, "test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");
  42.741 +    slurp_and_import_key(session, "test_keys/priv/pep-test-bob-0xC9C2EE39_priv.asc");
  42.742 +    
  42.743 +    string message = slurp("test_mails/Header_key_import.eml");
  42.744 +    
  42.745 +    char* dec_msg = NULL;
  42.746 +
  42.747 +    stringlist_t* keylist = NULL;
  42.748 +
  42.749 +    PEP_rating rating;
  42.750 +    PEP_decrypt_flags_t flags;
  42.751 +
  42.752 +    flags = 0;
  42.753 +    char* modified_src = NULL;
  42.754 +    PEP_STATUS status = MIME_decrypt_message(session, message.c_str(), message.size(), &dec_msg, &keylist, &rating, &flags, &modified_src);
  42.755 +    TEST_ASSERT_MSG(rating == PEP_rating_reliable, tl_rating_string(rating));
  42.756 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
  42.757 +
  42.758 +    pEp_identity* alice_check = new_identity("pep.test.alice@pep-project.org", NULL, NULL, "pEp Test Alice");
  42.759 +    status = update_identity(session, alice_check);
  42.760 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));
  42.761 +    TEST_ASSERT(alice_check->fpr);
  42.762 +    TEST_ASSERT_MSG(strcmp(alice_check->fpr, alice_fpr) == 0, alice_check->fpr);
  42.763 +    free(dec_msg);
  42.764 +    free(modified_src);
  42.765 +    free_identity(alice_check);
  42.766 +}
    43.1 --- a/test/src/engine_tests/KeyeditTests.cc	Fri Nov 09 09:05:32 2018 +0100
    43.2 +++ b/test/src/engine_tests/KeyeditTests.cc	Wed Nov 21 08:35:41 2018 +0100
    43.3 @@ -63,8 +63,12 @@
    43.4      
    43.5      cout << "key revoked.\n";
    43.6  
    43.7 -    cout << "deleting key pair " << key.c_str() << "\n";
    43.8 -    PEP_STATUS delete_status = delete_keypair(session, key.c_str());
    43.9 -    cout << "delete_keypair() exits with " << delete_status << "\n";
   43.10 -    TEST_ASSERT_MSG((delete_status == PEP_STATUS_OK), "delete_status == PEP_STATUS_OK");
   43.11 +    // Because pEp's policy is never to delete keys from the keyring and delete_keypair
   43.12 +    // though gnupg makes responding to a dialog mandatory under Debian, we will not test
   43.13 +    // this anymore.
   43.14 +    
   43.15 +    // cout << "deleting key pair " << key.c_str() << "\n";
   43.16 +    // PEP_STATUS delete_status = delete_keypair(session, key.c_str());
   43.17 +    // cout << "delete_keypair() exits with " << delete_status << "\n";
   43.18 +    // TEST_ASSERT_MSG((delete_status == PEP_STATUS_OK), "delete_status == PEP_STATUS_OK");
   43.19  }
    44.1 --- a/test/src/engine_tests/MessageNullFromTests.cc	Fri Nov 09 09:05:32 2018 +0100
    44.2 +++ b/test/src/engine_tests/MessageNullFromTests.cc	Wed Nov 21 08:35:41 2018 +0100
    44.3 @@ -50,7 +50,7 @@
    44.4      string null_from_msg = slurp("test_files/432_no_from_2.eml");
    44.5      cout << null_from_msg << endl;
    44.6      stringlist_t* keylist = NULL;
    44.7 -    PEP_decrypt_flags_t flags;
    44.8 +    PEP_decrypt_flags_t flags = 0;
    44.9      PEP_rating rating;
   44.10      char* mime_plaintext = NULL;
   44.11      char* modified_src = NULL;
   44.12 @@ -68,7 +68,7 @@
   44.13      string null_from_msg = slurp("test_files/432_no_from.eml");
   44.14      cout << null_from_msg << endl;
   44.15      stringlist_t* keylist = NULL;
   44.16 -    PEP_decrypt_flags_t flags;
   44.17 +    PEP_decrypt_flags_t flags = 0;
   44.18      PEP_rating rating;
   44.19      char* mime_plaintext = NULL;
   44.20      char* modified_src = NULL;
   44.21 @@ -87,7 +87,7 @@
   44.22      string null_from_msg = slurp("test_files/432_no_from_encrypted_not_signed.eml");
   44.23      cout << null_from_msg << endl;
   44.24      stringlist_t* keylist = NULL;
   44.25 -    PEP_decrypt_flags_t flags;
   44.26 +    PEP_decrypt_flags_t flags = 0;
   44.27      PEP_rating rating;
   44.28      char* mime_plaintext = NULL;
   44.29      char* modified_src = NULL;
   44.30 @@ -107,7 +107,7 @@
   44.31      string null_from_msg = slurp("test_files/432_no_from_encrypted_and_signed.eml");
   44.32      cout << null_from_msg << endl;
   44.33      stringlist_t* keylist = NULL;
   44.34 -    PEP_decrypt_flags_t flags;
   44.35 +    PEP_decrypt_flags_t flags = 0;
   44.36      PEP_rating rating;
   44.37      char* mime_plaintext = NULL;
   44.38      char* modified_src = NULL;
    45.1 --- a/test/src/engine_tests/MessageTwoPointOhTests.cc	Fri Nov 09 09:05:32 2018 +0100
    45.2 +++ b/test/src/engine_tests/MessageTwoPointOhTests.cc	Wed Nov 21 08:35:41 2018 +0100
    45.3 @@ -112,7 +112,7 @@
    45.4      stringlist_t* keylist_used = nullptr;
    45.5      
    45.6      PEP_rating rating;
    45.7 -    PEP_decrypt_flags_t flags;
    45.8 +    PEP_decrypt_flags_t flags = 0;
    45.9       
   45.10  //    MIME_decrypt_message(session, encoded_text, strlen(encoded_text), &decrypted_text, &keylist_used, &rating, &flags);
   45.11      
    46.1 --- a/test/src/engine_tests/ReencryptPlusExtraKeysTests.cc	Fri Nov 09 09:05:32 2018 +0100
    46.2 +++ b/test/src/engine_tests/ReencryptPlusExtraKeysTests.cc	Wed Nov 21 08:35:41 2018 +0100
    46.3 @@ -91,7 +91,7 @@
    46.4      
    46.5      // In: extra keys; Out: keys that were used to encrypt this.
    46.6      stringlist_t* keys = NULL;
    46.7 -    PEP_decrypt_flags_t flags;
    46.8 +    PEP_decrypt_flags_t flags = 0;
    46.9      PEP_rating rating;
   46.10  
   46.11      flags = PEP_decrypt_flag_untrusted_server;
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/test/src/engine_tests/SignOnlyTests.cc	Wed Nov 21 08:35:41 2018 +0100
    47.3 @@ -0,0 +1,47 @@
    47.4 +// This file is under GNU General Public License 3.0
    47.5 +// see LICENSE.txt
    47.6 +
    47.7 +#include <stdlib.h>
    47.8 +#include <string>
    47.9 +#include <cstring>
   47.10 +#include <cpptest.h>
   47.11 +
   47.12 +#include "pEpEngine.h"
   47.13 +
   47.14 +#include "test_util.h"
   47.15 +#include "EngineTestIndividualSuite.h"
   47.16 +#include "SignOnlyTests.h"
   47.17 +
   47.18 +using namespace std;
   47.19 +
   47.20 +SignOnlyTests::SignOnlyTests(string suitename, string test_home_dir) :
   47.21 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   47.22 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("SignOnlyTests::check_sign_only"),
   47.23 +                                                                      static_cast<Func>(&SignOnlyTests::check_sign_only)));
   47.24 +}
   47.25 +
   47.26 +void SignOnlyTests::check_sign_only() {
   47.27 +    slurp_and_import_key(session, "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   47.28 +    slurp_and_import_key(session, "test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");    
   47.29 +    const char* alice_fpr = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   47.30 +    string msg_text = "Grrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr! I mean, yo. Greetings to Meesti.\n - Alice";
   47.31 +    char* signed_text = NULL;
   47.32 +    size_t signed_text_size = 0;
   47.33 +
   47.34 +    stringlist_t* keylist = NULL;
   47.35 +    
   47.36 +    PEP_STATUS status = sign_only(session, msg_text.c_str(), msg_text.size(), alice_fpr, &signed_text, &signed_text_size);
   47.37 +    TEST_ASSERT(status == PEP_STATUS_OK);
   47.38 +    cout << signed_text << endl;
   47.39 +        
   47.40 +    status = verify_text(session, msg_text.c_str(), msg_text.size(),
   47.41 +                         signed_text, signed_text_size, &keylist);
   47.42 +    TEST_ASSERT(status == PEP_VERIFIED);
   47.43 +    TEST_ASSERT(keylist);
   47.44 +    TEST_ASSERT(keylist->value);
   47.45 +    TEST_ASSERT(strcmp(keylist->value, alice_fpr) == 0);
   47.46 +    
   47.47 +    // FIXME: free stuff
   47.48 +    
   47.49 +    TEST_ASSERT(true);
   47.50 +}
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/test/test_keys/priv/eb_0_priv_valid.asc	Wed Nov 21 08:35:41 2018 +0100
    48.3 @@ -0,0 +1,166 @@
    48.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    48.5 +
    48.6 +lQVYBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    48.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    48.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    48.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   48.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   48.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   48.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   48.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   48.14 +TYxhzNxyHaNqrzMAEQEAAQAL/AuUBZDloEslY13rCEwXRjGZ9NZAp2crdrJp8neV
   48.15 +UCXYXijXgACwGKiH/kXW30GOaD9xB5y0TYN3hgoiYiOA+Sq58WVAYOeGnj/FjHkw
   48.16 +vBcziLSsAFtx8xxv6Ueb8ZZ/81f1t5umL1NxUuUrepWleQIiTCmH/54JiOu2vEi4
   48.17 +qAefGw3PUUpS5DPncEyMzvldLy0fyw9ScFCSh80aYyj1Ey1oIQbaXivL0QBc16/S
   48.18 +D+/PH+1qq4ud3nOm36tYDmw86if6mZHzJNQcBW13G68NKBgmip18vWNGZCgDctZi
   48.19 +a5XPDLDSTLfQrbuW6ZpTvJrXphGPJJ+CQb1QoO4gQjws+STn8v3TnJcxAIWTWnwg
   48.20 +E5jLV4DblujLM/9o9lGLSEx0EqwgKg4lhFY/KBDpshRDTprWb/5b5GHEP2wPIC5o
   48.21 +kKsrN1H2PNSdO0zmTRhWUn7dC+byJjHgjR8lCY1t67GhzXlkcFvsjTlul0ll0HUb
   48.22 +QjYHV4TjxtvAwCcDUpmFcNwCeQYA6wSUQX8g65COFAX6aX+qcTtYWq/Zoub6HjTu
   48.23 +om3x6ZceMRqiWlrP+VNidn2vv2ZwXTAnGeFi+UuNSb7i9Dbac7p0I2KGRNK05gnh
   48.24 +vMtUEFGkdStQPkELTtVsVk+nzRTqU6fM9mth04itviTs2R8TEQCApcOG+LDOKfwx
   48.25 +A4YyyS5pEBft8hjycbyOFW/2kg+uLkoxopck9UsW0IFTmLHuXKt2Y41oQ603qDga
   48.26 +Uujl++e2ChvY7TvSFjjzHj+TqotrBgDsH0zWj5OeDVdQsGbuLOzsPrN4BLpUJUv1
   48.27 +BKVAVmqFO0VdnsTDgXwmJkfs8s68prwsLyXz+Mx3YqlCo3+4cqX463v5WE6qd5s1
   48.28 +DBHKCeD3VsIp0NbMyD5GD2ph13gbHo7/ebGuuWhQseB7AyCxwFTcGx8fY/+ESUIj
   48.29 +kljCf0lnIeHMoLTxmerylLjuo2jWV96u1BnM/9q+zoBV4WgP5cHwn9Jlx8bHjOSF
   48.30 +9zVc46NjAhPlY54czjJlW9jiXOsdZVkGAI9wcpJew+fk1q48BiKGN69RY1WMXzBC
   48.31 +i0GeZOjGqR2b7l2TukhMdufwYSQFS0bCxwKKRmGCus5EjEBwmprIBcCyjGw4kVMj
   48.32 +9xKPqr86kQICCZnjLGGyftuPw0f3ZgzI8wm+cKwpZ4VfTksF1p8mgF3UctstQRuF
   48.33 +6U5+5lipOMEMxzyujOdBgttxdDlEPQgUyM78w2Os6QfeDO9tOKSHnyWTag/nIQmZ
   48.34 +gcNknW0hDxEb3SFdMENfpTA3VxtT5eeKx9fwtCtFeHBpcmVkIDAgPGV4cGlyZWRf
   48.35 +aW5fYml0c18wQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4AhsDBQsJCAcCBhUKCQgL
   48.36 +AgQWAgMBAh4BAheAFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlvQOOIACgkQDXLg
   48.37 +pU5wXEY81Qv+MkadiM81yd2TGcBAziIAzSXYXFBYuenDG+LQKz1HuTtg8+0SQ30u
   48.38 +FewOP6eOAyg4dZv5I3GiVF7zjTyAr9aSzUH8pIKlayZoFc1fTvr/sL+kDpagRtpu
   48.39 +ebqJaIrH4c/C7dSrfEAejEa6j00chwcbjgP0h4jQVs5W64+GwQBzApeFRswhj5w8
   48.40 +fduuJEFnB/bW5dVhAL/m2yND0DqGXL8qLRZXSsKJaOA03JQEkM28zcrZ+7IxLAe/
   48.41 +Frx8XFlkhf8ip/VjZNt+OKWB9lLVAsAsnzP3DvJRom+d5sfxoMqm0yEpa5K5p29c
   48.42 +T1F5FXFF36iXx2xjrrTbkqrXBex+0MMlNdFbHsMysRO8CK6UChSpbM9KwVVNetl6
   48.43 +GKzSLbePluWy65mp+NjtMRmR/LcPX44tOwGdbJDZllXsRuBoJzDhufc9S3khS9Dv
   48.44 +wSUEq5AwSjCU3UxLzeizJU4IZ1K4I0fKKaCP/vMTTIkuDPyiy/PxIVYbU8qSYgfW
   48.45 +NumgaLPeHDAAnQVYBFgNzIMBDADBZGQsFMqLK6YwmKrcik/R+/XGMLHc4v6MOFDx
   48.46 +WldMKkwB/EhbqWEUNBv3Umdpryj+/mX+Oho5mSJcJG8WXqtRgJl5MqPglEdj/nfP
   48.47 +F6Axp0qUxs/Wea5KCKPbaaH7QdaBFYvRqZojsO/8a269EdPMCBIT5wtIq1WzG+JN
   48.48 +oUC1PfX+spvO6U8RuNuH2TziTb35j3JrSx5IaaH84sjIZlTgf+au39bKUohVP3dZ
   48.49 +GdnCF5ah3yHUY61+7OgZCE4tnYKjPMqx84WhXX+RnmYaK+OvaONsFSHtC5eFDV68
   48.50 +krGTMZy4sfBKXsG11sep3u3dLl/suKFyTiZPtC8rb2HbmB4jbfGhb0tesjcoSZb1
   48.51 +JNZZsnKvplB0OyToXM0nchHxKPqgpAj43Wv+ELrxL4nKWqalZHVRwyqzg/FSEaJd
   48.52 +rRCB4pdnwPzFYx4hbD9FPZ4rkiQxxXFXz27w4r+nJ5beY/1kYBwo6PFkiuq+KVEP
   48.53 +tzHXxiX/bE+udU4HChEzzK7AvrUAEQEAAQAL+wYD7+O5H9W1XV18mi/y82mmKy5n
   48.54 +fFjRDLbi142yUC3T0Pps1PlY6uacelQ2kXXll2JbGmQOfZtWCo4QKg5pkm2eEOgG
   48.55 +rbdCFXhkRWjBJN/2gqjfCD71GPk/jI06G2o70YbBW1CBtIQwsD5LPy4NXGenxpws
   48.56 +3xp7Ddbc4qyke+VHUJwEBTmp4yY7eESg+rZVUbfuANKaiw4YjwvVKAanvDMhd1Tw
   48.57 +LHetmoUATN+OIMpbPnm5fY1kLlTY3J1Ot1PO5uACGq/7s9WnJ4oqoX1Niefb8j/F
   48.58 +fE2jO2xakggX9XIS6EHl69H21/o6O/k4U7pYoivVQnGenMUo7oHznXp5K/l7lDx6
   48.59 +im05PyZlV11NsLIN3HjMUOS8lGTumvfej/J+IQqrDfxXByZ40FUNp4DnVXQIwKZ1
   48.60 +O57yxsH64TO8IaXeG9H1iVnm65G39MEM03xpcE17FxGXepHcK4yD1q4gSyb6c6l5
   48.61 +WQPQUM9KhkY1+DcCUhMA9AsgYPiJKt/m7SlewQYA26EB6/aVSiqkUZ0qXNF24Mi0
   48.62 +al/3hzX7Hoq9ecuztOJeCVsE5XIwX8DW3FZvJpC75qLvTS1V8T9JTN+zEzDXftgB
   48.63 +c0QpGe6utA+ov43FxyAL/OVv1AXFNjgzbAXxpVXABRqSr3AQ9XAAz+3AsmOSsyFd
   48.64 +DU6FTYpkEQIoOq9kMuhbMebfmEVURums3EcVdoeA98k4EKIyg6hjoECL0YaP3v8J
   48.65 +icvK9X/4SK7EPIDl+/IHSs1U+NVYtqFYyT1yd9nVBgDhaxiyGNdOGGWqGcPhJAWH
   48.66 +QCmEOKQidHcXdPSwmbbY7ZAWO2O3eVpijfjonwsn2Ilni6VZzZEKisqBzZqNjJSc
   48.67 +OkxZxg1DXFHu6+k7C8s4ZYCMWhBnQps4dBtWIt8su93DxilxjJBoAyVEvFjQx8BT
   48.68 +L5s5Ow58+CT9Ck4rHKTWIoYLXD3FymfBlCgqmemQcZadle44OfZfMgUJrfD/Dd4i
   48.69 +aDacOWhYJS2oXEbIgcffx61Dh82tmOnVglm34WvX4WEGANx0JO2eXWj6PbouEX7D
   48.70 +Xyv9U4n7zDdUzYcKYgtKLRNJXFt1x/rwu2UiulOvUSQffrIM4T78ScEbTN5NxWvZ
   48.71 +dZs12g17LU92DHEzyhVfiXgemIOaLepUW9qw5NvnNvgDgxL5/h9141ZGmVDvc+Oi
   48.72 +O55DpzH7H5Vrh3I4dKmKNNRx26QkDEOEsphhYaEE15S0Ya2bAEPDD2+H11zg/apd
   48.73 +sIb5p0PwKzLUzAT4GoP9jQ0S1t83Akuq7xsGp4UuLPQ6p98HiQG8BBgBCAAmFiEE
   48.74 +D/YjkHUrompk2L0nDXLgpU5wXEYFAlgNzIMCGwwFCQPCZwAACgkQDXLgpU5wXEbt
   48.75 +iwwAgqxDlCaD/MJwpXfkovm65GkTqIyWOzsO/kcDtYMaCGosJeMjKlYn7CFMJ+I5
   48.76 +weRGrn5AIf68Qe/zk7cbwgrn7ensIskacT6fxuo/cNYcAMwxEL/98uAuVPLyhild
   48.77 +LkbBfCqRSzWJb9qfstuBIVrd08o9Q4cVnv68I+YQy8quwnFH1t60iwATBdoktdf7
   48.78 +ppUojsGScnflMmEdfcFxboy1K7VDGP1v70lruzjA/cy/xU4jQyHVh2RmKfBiZZCP
   48.79 +WhL9mL0/v7ptWnpbKBP8SrN8Dm5ZSrCUYmdmsGA8qU9AwCSsJms5aqNDxYmQZBSI
   48.80 +MVYFZT1Nw4yn8i1s6+KB/uqBtGY4sCFddWgHZe58qzKRRaYJe8CdD6qccmi3DsNg
   48.81 +DD4k94JlaqqvfuvrDTCAlR4XYJHDPOFk0FG/nU6obGDLo+Qi7EzQK2dyC030x6Qu
   48.82 +ECGAfY55Z983hy0kL0ldwDqNPlbeMyUWL0Te7KJ7+MoztBStNzkT+E57QLRmiHrw
   48.83 +Vtn4nQVYBFvQNUoBDADNPDDPt75vPOCBQUX8D91RMGXQaGHjZ56O+HZL0W4brFVz
   48.84 +h3e3Ekl76juezij84e11beKA3Le+MIOdlSxNe3g1M1ITypWVVab4vFaSN12kGgTY
   48.85 +VtaU2sDvYAklhkBq2gReURrIkj5eI+w4rUGq+svxPRmGvmJAyzNdxxof1zmbaAdY
   48.86 +iER8kNewbEaOfiWiAjx/b/6vq4sEYo9rxBz/NV6RidTEA/laJgowN+UQMH4J9/Ad
   48.87 +ePjXSUZ1dirfaIrrolliAxAApU1HsDBdxeGbOydNFL821/Ewk4X0OR0K3gejq35u
   48.88 +LwtAUg6zhRsXKTmWGjD/5msz7aGS5BRrEjdklARaqdO+X5cDjZl1iD3AXGL19tbR
   48.89 +YjUptpxNuSf5l6CbakLsUejBAxJic3fV+9gtV9ifurIK7eqKz4/WWNAWzwu7iVJE
   48.90 +UKXuR/ms7BcsNLiAxPO8Z0IE/d9/g+vVjmQPG6WV+9G/hQ1yFexwwdzUI3y1d+FO
   48.91 +e2MyosKa6D/fBzAu5q0AEQEAAQAL+wWUIEOIXBD/MTilaV1iCDY5WY5VRNJLy7+/
   48.92 +hmYMyeOb4JeLIOu4ZiG/JGKIE6ckDcwf8eszLkkC92Dkk1eCOd2mvBFoc7GjQ8gF
   48.93 +3ou+g4YYl8JSdSZT3kpJ0vw5IceFwfg9iu8IXDehqr2Ac1Hn26+xmHlujV8ms6O8
   48.94 +UlWq1P8INqlNmVPFebqeIG2l68HzZTX7+YriEwPjssBPWVzUISW7/sbBN0yGNWEW
   48.95 +jXYBZQh1iKPuDBC8bI54aTWFzIwXiPsunEdzTs902WPjareIcI2g7cxBGhPrzQcR
   48.96 +E4M2tAWwGaFib8T4bljeXmyfUH+Do1MkkgFIJecZkuRkjQO3a/xW5kq/UA9f91iC
   48.97 +6QkMlJaoefApOrMT7sDtGfHHdf5FaXRrDJ0/DdjWoWBf1ACBKAY/IVgr+Pobwacn
   48.98 +L09XQSst6P90tU30KqutGrFdt6MRYllTUaqdBL6Mpu5TPMGBEz2Ywb/8y3pJ5GXG
   48.99 +2c6CvqPAonUbBLyQRh3o+WYbcNT9JQYA4sKMnL/dWow4rREDElBH4cHeNNEALuie
  48.100 +Z7no00z85zoPy/Lue5+DcuBxio2EtozmACqcTMmLjZcPTDewfiA6KRj4SUl4uQ+B
  48.101 +QHoeVX7dJtWY2o8Pfe6AA0RJLGg5WwCvWg2OhX7OY55tlzpt7zOZ3RarwTDrlEE9
  48.102 +djHilQNMUPiITnb1+TZ4txWQh/B5Ef+3u9YmB2ukq2A0QJ30b9PE9UaNb0Y9bBZ/
  48.103 +MJyvsudRVrMlU19pJog/GU8kgBMz9s3jBgDnsxi41D24XNcT5Ggn8zlewH628K0z
  48.104 +wKtMCy2B48EwI3fnsXhlIdBcgXgsN97GLrMEWOqaJj5snYaiXkbTa5V1aYF2EBw8
  48.105 +3YcNRNqlHzhfxrUBfhev8c9QFPqN3fQ89nLqsIB5PlMDkDsa21fbnzYUeV+haV2g
  48.106 +Mo5QguQtPmGvgUWVCK9uWNYkzhvxfk4Xy7o/YseAGkTkjShsiIYp9ClcrW2YG11y
  48.107 +s8RTxMemOonM89cQXfYGq4CxH5KMyjuPni8GALlXEQNSCT9yA7KmlrAuMpn0dntZ
  48.108 +2y3tpm41deu85xZKUIS1tqXbLgIULacJ3JyH2XyYz65XGHLcNo+FpRUk+ClxiA+B
  48.109 +yaVmQ/TrzUVX6Cb6xbCNIi4ciXMmOsb32GJNunGAP/QBwMR6QodMqsO8faocldtV
  48.110 +/X2AuL++9UAl9w+Gj21RRukrQuGyfOo13QTpd9KErj+MYx09kzzLl2ME9HD8DEWi
  48.111 +er7Pw3IHad77B12hXi7J1xRh6jbvH5uNajHiHdhOiQG2BBgBCAAgFiEED/YjkHUr
  48.112 +ompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQDXLgpU5wXEYZjQwA1mv/l8e1tJr9
  48.113 +PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gkyVUboKeu35LqWMlEX0aKFhwn/3nY7
  48.114 +rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anpZ94aMnGKqUkuVL3hr5GDfUH8vCZr
  48.115 +oEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963rJrKc62CwtYUI5y6BlRqCeRHhZlU
  48.116 +NUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM/UpFX7DTfEabDuXJvuE62PzcXKMW
  48.117 +ULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1ssD2veVxWC/ljqxwSK7gv7YFWhCp
  48.118 +8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPkut/t1qVpSsTPPRGMaYpguFJN5/35
  48.119 +BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CCBmPw/V4wcAyZPLoihbDeUYK3tyic
  48.120 +Mozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXiNsWORBDJGNxegsAdnQVYBFvQNmoB
  48.121 +DAC4B17T6KIsP4OUyrjWXcFI9bjsAxtt8MgV2O0afI5Q4q2BHETdObex3bAEjEUM
  48.122 +7MO8cHIo9hsecUH0HhDYFgiW0NTMiMvWsBvbeMR8q7MlYWZtCOvINBfwDMcGzxx8
  48.123 +q1iRt9y81MhWT/ChwGJb8c4PoEm7vvKF0hIjfnReF8XeBDXpsVoWDC2TIAs93oTD
  48.124 +3tVIbWyjMtlGkUudHR6afMM9U48RulhHhN8vQkqq9mzht9aQtjZqCPeC1oIcJ/rR
  48.125 +XShnH3w5ZiW2giJQBJaco4pKnSlM3caEf5+68BlZTcHztvg3rpeOJSmTVqR17d4a
  48.126 +BBo66WYDpJZRxJ1ZXfFQPzvncUXeaW7faZNe6XVFzx+ROiruD3wmvjGlVpRd2A7W
  48.127 +fKR2lQb7xWpotF8/4qcnAK46tfLNzCaLeO7f5s8E7RcTj0Hk2HnavVKdtU6DpVsx
  48.128 +MeEFYXOQ92ieOKkrdQ60IAx6fOxTIxBfnoRImYFim3bHE9SRRy6boMuhSUlcJi4E
  48.129 +E2sAEQEAAQAL/0ANuLDziPbzyH3SrdFXYr5dYNctIa/7nfkUvzp33iVDMPb+eu2x
  48.130 +eEG9ktWSaTpdcqe1T9b4CmpnK3inul8sFCNCXr8uYhzAwYF7oJBwRvOc2kTbVQ4j
  48.131 +K63PFLtG/XhbP4HAyGElgvGf83apetLb8Eg6F0/03386pjuaeTCC/8kOGCHWLC/+
  48.132 +XyKVhbQsLnPqrLv/8k8/lKbeTb5K82r8QAypd+PIw49pLTHK1ih5i15pWZKXCYuQ
  48.133 +wW3V8gWQ2NlkneMS3N6KUDjOdNpSfq3cUMRlc3gA3XSM7163oIPNwl6taOCZbIlZ
  48.134 +Wu1jC2cZCh3vfguinMWVAT+hIMswTHCSu+KXpV7kKfgN09LWdJHkX5zAJJLwUA6m
  48.135 +ZL3dfjFwiX6cQJoeAthJSVU9ziP8voymM/KBOZGYUHJ1BrdaC62DkAkqg9zdavNQ
  48.136 +ZtFIoXJgdXbp9SGUuciHq6LFxbdmk/Ee4Gz6KGoRLOkoLYZWrC9FuZGTAdVoHBjn
  48.137 +BtYvFzq5hqJt6QYAy0gRRhn3aazS9BaoKcMYdUlsCCtwqI476W9BO5eucIKulMFs
  48.138 +2ZLUTWbW04YeVAx1apXUZ8Dn12BcDHys+frMgc28mDXz+tABjGLz/o7sXy1i+FiI
  48.139 +oqWnPoz1HKytZbLDreofdl4nXKUb/1OFwOqnHHEVZ2HoW2b8R1+HCZYOUSSoDTK6
  48.140 +9D+MbYolA/z7isfAEw+YfjhO0gOO0aZrwN4NIjwGe8neOKGStw4CDxjd4Ck1mfgi
  48.141 +/obB8DmsFYHvLjBvBgDnwRuXKFO/sIPFeX8SNHBvB7f0dkzded6ZHubHfAfbxqLV
  48.142 +gOlbvtmrdQp+Rkq+ZX3KihV5FEcN4CMhWKKhlKNpDkZ7b3SbGAFj+qen6YKyBk1O
  48.143 +dvWusSczmTIXsYxX1+0rZcuyYd46YpvsuibwN58qgtAl63LqFI+BugeaNIeUGCXU
  48.144 +WyaZx879gScyq92b5OpPAl9xC51vOSBaXXDjq+wFXh4CEQMUq/QK/ojx1EQtx/X4
  48.145 +fN9/Td30YBN/Wjd/EsUF/j44MeiNFZQVcpU7MnuP2uqTfuHeuxWxTc5LJEQOp4d6
  48.146 +l7A5Vipm3ol1vUfbx5NOcWoE6cGqAEhF5PfLaY/47RExHNmFlTkaR6+hhvfjm5Su
  48.147 +SKb9toss1W7vDweLDGwkC8ywkY4+Xyi2+4TDWv08zt/xdt+M/APu0iIY2Lux8TH3
  48.148 +DB0EPqMdisqvCiC5QX4ZXaYP87Wl2s701HorvNoiv15GGg1ypKO6Kb8LEqcI96jR
  48.149 +1fj3XQoMg4DOTK/Zj0oMX+ixiQNsBBgBCAAgFiEED/YjkHUrompk2L0nDXLgpU5w
  48.150 +XEYFAlvQNmoCGwIBwAkQDXLgpU5wXEbA9CAEGQEIAB0WIQS3H5qpwpDEVDwIfKXm
  48.151 +jR2jQCaKngUCW9A2agAKCRDmjR2jQCaKnk03DACRcO+WTRZAa0eNdNLtuwf6lwII
  48.152 +BgP98dwvkiboCO1tbuTx26tY8qHhnPBWD5j94TPdN8yLY+TGiIt3joOM0VTNPj6y
  48.153 +cb+6uIvEO7++Oc4ITjvbOBiLpzw8OKjmxllN4mF6anGAMP4lzv5BQ1+mJeRs3zfQ
  48.154 +dhg3Gn+snZwFlwAzpuenvNxLe2iTTUaYB8tF7CO32GnrdKc3dQ9flc7e/t38dM0v
  48.155 +PPbjlnxSsDD7ZaDbj1AlOZkChKLAI+M3auO1DEDU2RYWQ+/lsmO2sb8VTAVcIXkz
  48.156 +6Ps5ubvqObyS53bhOubGkEH9WKwImL2CvLoz+hnQNjAHT1cPUbKFC1kNXy26ADt0
  48.157 +3bO/p6V74+H/tbCBis9Mtz5QobG0s/9HU9k/FoE4qzb/DJ/n2GBs7iyOARpq1exe
  48.158 +bx66wGi6YP/2OP3GOKOzYbaypQhxXDIxAEdVk9UAaK1XjqGV4pPy0kyk1SFcVD6M
  48.159 +sFqWcPBJyOj4Wj90CAuGXVvfhj4V440pHqY9T8YttAv/W6q31NckKsbIpP3SHUoX
  48.160 +A1kQqEJP9YVa0BBKqe5VbEB62zNn2GEKMmv0fouf3CEomn+iH+NyF4Q1jQN/EDFi
  48.161 +s84UDJxoTPFG5gEgaasJkdhPbD+VtNbauRMxAPYvd/PAmPdEAOPgFWfrzrkl8dwy
  48.162 +OxReaUkTorBGnAXnjgpBuOhTBSa+/NB122DUDGbCZJ7a/goV/2B7eBstiVpBm08Z
  48.163 +ai9kJ95ysiWP8B6AHbo9hPyUghz4e0RKEJAvTTQVaodnGSeE77fuMh/blsOo2wws
  48.164 +BmzB+y/yZEchwz410+furnTzFp+SedURmaBZ7FoeuDlElJ4qtFB1mWf6Ws4yDmWU
  48.165 +jLIWqVU/JFq5Y1zsSuR5R+rxO+niNXWOxJ3k/O8VrD/EUFlo24xjDMwm1QetIin3
  48.166 +imExHRZkG/ZlZqPgTT5AfMoV4LzGWJ6mZ+3SnAg2ldvFF0pnsteQ9W3ycJHlzXj3
  48.167 +IoGEu5kK/ZqDBh1jF4fBUmMQvSCNTVfWlJFHd3ddaSqT
  48.168 +=aXtd
  48.169 +-----END PGP PRIVATE KEY BLOCK-----
    49.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.2 +++ b/test/test_keys/priv/eb_0_priv_valid_subk.asc	Wed Nov 21 08:35:41 2018 +0100
    49.3 @@ -0,0 +1,166 @@
    49.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    49.5 +
    49.6 +lQVYBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    49.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    49.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    49.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   49.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   49.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   49.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   49.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   49.14 +TYxhzNxyHaNqrzMAEQEAAQAL/AuUBZDloEslY13rCEwXRjGZ9NZAp2crdrJp8neV
   49.15 +UCXYXijXgACwGKiH/kXW30GOaD9xB5y0TYN3hgoiYiOA+Sq58WVAYOeGnj/FjHkw
   49.16 +vBcziLSsAFtx8xxv6Ueb8ZZ/81f1t5umL1NxUuUrepWleQIiTCmH/54JiOu2vEi4
   49.17 +qAefGw3PUUpS5DPncEyMzvldLy0fyw9ScFCSh80aYyj1Ey1oIQbaXivL0QBc16/S
   49.18 +D+/PH+1qq4ud3nOm36tYDmw86if6mZHzJNQcBW13G68NKBgmip18vWNGZCgDctZi
   49.19 +a5XPDLDSTLfQrbuW6ZpTvJrXphGPJJ+CQb1QoO4gQjws+STn8v3TnJcxAIWTWnwg
   49.20 +E5jLV4DblujLM/9o9lGLSEx0EqwgKg4lhFY/KBDpshRDTprWb/5b5GHEP2wPIC5o
   49.21 +kKsrN1H2PNSdO0zmTRhWUn7dC+byJjHgjR8lCY1t67GhzXlkcFvsjTlul0ll0HUb
   49.22 +QjYHV4TjxtvAwCcDUpmFcNwCeQYA6wSUQX8g65COFAX6aX+qcTtYWq/Zoub6HjTu
   49.23 +om3x6ZceMRqiWlrP+VNidn2vv2ZwXTAnGeFi+UuNSb7i9Dbac7p0I2KGRNK05gnh
   49.24 +vMtUEFGkdStQPkELTtVsVk+nzRTqU6fM9mth04itviTs2R8TEQCApcOG+LDOKfwx
   49.25 +A4YyyS5pEBft8hjycbyOFW/2kg+uLkoxopck9UsW0IFTmLHuXKt2Y41oQ603qDga
   49.26 +Uujl++e2ChvY7TvSFjjzHj+TqotrBgDsH0zWj5OeDVdQsGbuLOzsPrN4BLpUJUv1
   49.27 +BKVAVmqFO0VdnsTDgXwmJkfs8s68prwsLyXz+Mx3YqlCo3+4cqX463v5WE6qd5s1
   49.28 +DBHKCeD3VsIp0NbMyD5GD2ph13gbHo7/ebGuuWhQseB7AyCxwFTcGx8fY/+ESUIj
   49.29 +kljCf0lnIeHMoLTxmerylLjuo2jWV96u1BnM/9q+zoBV4WgP5cHwn9Jlx8bHjOSF
   49.30 +9zVc46NjAhPlY54czjJlW9jiXOsdZVkGAI9wcpJew+fk1q48BiKGN69RY1WMXzBC
   49.31 +i0GeZOjGqR2b7l2TukhMdufwYSQFS0bCxwKKRmGCus5EjEBwmprIBcCyjGw4kVMj
   49.32 +9xKPqr86kQICCZnjLGGyftuPw0f3ZgzI8wm+cKwpZ4VfTksF1p8mgF3UctstQRuF
   49.33 +6U5+5lipOMEMxzyujOdBgttxdDlEPQgUyM78w2Os6QfeDO9tOKSHnyWTag/nIQmZ
   49.34 +gcNknW0hDxEb3SFdMENfpTA3VxtT5eeKx9fwtCtFeHBpcmVkIDAgPGV4cGlyZWRf
   49.35 +aW5fYml0c18wQGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+FiEED/YjkHUrompk2L0n
   49.36 +DXLgpU5wXEYFAlgNzIMCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
   49.37 +CgkQDXLgpU5wXEamVAwAsE1XtfLyy+uj57zNP06fABLyQsar+cswhUJ07gNOgsyk
   49.38 +NYCO8jlAPpqwTzz+msB26CmGUCqmXnLKOiM59VN+I50BaFwkHFiv46CiEwGZGalM
   49.39 +PSSCtScwEhdhwAd16REjBkRxPnrTwr71BF8U9pz6UvlD/ePUA6VIF76OZSL6F//P
   49.40 +K8CUJbXA7151vNRBtGUVpgt+FLWAqngIRFRpIEc7x4faXwk579az1HKfn1gHJtxA
   49.41 +Ur+4jGrT/ibtJnYScRI8doS6Rvk56Wgo5Jo2ha4MFJozzsmiYv46VGlC5NtPQYPp
   49.42 +9bFnNZGI66OY6NMVaE2S2oiOpKggbIHrbVcFs+Jmi3iuSW7Q5OQYP81RW7jWPLf3
   49.43 +XuT8h0xH85DWHfzCLPHtSf/wldMRqJbpQh2qDHOdKph9xzqVsAKmfTPawlfMTBCq
   49.44 +RoPjuUO5CaVZ8BzRxTt907WN8opVC/XyXXwh7w0IH7OgaA0pT5I9EAlVpKSsliGR
   49.45 +poREgISJZ2YIOXgM1ywsnQVYBFgNzIMBDADBZGQsFMqLK6YwmKrcik/R+/XGMLHc
   49.46 +4v6MOFDxWldMKkwB/EhbqWEUNBv3Umdpryj+/mX+Oho5mSJcJG8WXqtRgJl5MqPg
   49.47 +lEdj/nfPF6Axp0qUxs/Wea5KCKPbaaH7QdaBFYvRqZojsO/8a269EdPMCBIT5wtI
   49.48 +q1WzG+JNoUC1PfX+spvO6U8RuNuH2TziTb35j3JrSx5IaaH84sjIZlTgf+au39bK
   49.49 +UohVP3dZGdnCF5ah3yHUY61+7OgZCE4tnYKjPMqx84WhXX+RnmYaK+OvaONsFSHt
   49.50 +C5eFDV68krGTMZy4sfBKXsG11sep3u3dLl/suKFyTiZPtC8rb2HbmB4jbfGhb0te
   49.51 +sjcoSZb1JNZZsnKvplB0OyToXM0nchHxKPqgpAj43Wv+ELrxL4nKWqalZHVRwyqz
   49.52 +g/FSEaJdrRCB4pdnwPzFYx4hbD9FPZ4rkiQxxXFXz27w4r+nJ5beY/1kYBwo6PFk
   49.53 +iuq+KVEPtzHXxiX/bE+udU4HChEzzK7AvrUAEQEAAQAL+wYD7+O5H9W1XV18mi/y
   49.54 +82mmKy5nfFjRDLbi142yUC3T0Pps1PlY6uacelQ2kXXll2JbGmQOfZtWCo4QKg5p
   49.55 +km2eEOgGrbdCFXhkRWjBJN/2gqjfCD71GPk/jI06G2o70YbBW1CBtIQwsD5LPy4N
   49.56 +XGenxpws3xp7Ddbc4qyke+VHUJwEBTmp4yY7eESg+rZVUbfuANKaiw4YjwvVKAan
   49.57 +vDMhd1TwLHetmoUATN+OIMpbPnm5fY1kLlTY3J1Ot1PO5uACGq/7s9WnJ4oqoX1N
   49.58 +iefb8j/FfE2jO2xakggX9XIS6EHl69H21/o6O/k4U7pYoivVQnGenMUo7oHznXp5
   49.59 +K/l7lDx6im05PyZlV11NsLIN3HjMUOS8lGTumvfej/J+IQqrDfxXByZ40FUNp4Dn
   49.60 +VXQIwKZ1O57yxsH64TO8IaXeG9H1iVnm65G39MEM03xpcE17FxGXepHcK4yD1q4g
   49.61 +Syb6c6l5WQPQUM9KhkY1+DcCUhMA9AsgYPiJKt/m7SlewQYA26EB6/aVSiqkUZ0q
   49.62 +XNF24Mi0al/3hzX7Hoq9ecuztOJeCVsE5XIwX8DW3FZvJpC75qLvTS1V8T9JTN+z
   49.63 +EzDXftgBc0QpGe6utA+ov43FxyAL/OVv1AXFNjgzbAXxpVXABRqSr3AQ9XAAz+3A
   49.64 +smOSsyFdDU6FTYpkEQIoOq9kMuhbMebfmEVURums3EcVdoeA98k4EKIyg6hjoECL
   49.65 +0YaP3v8JicvK9X/4SK7EPIDl+/IHSs1U+NVYtqFYyT1yd9nVBgDhaxiyGNdOGGWq
   49.66 +GcPhJAWHQCmEOKQidHcXdPSwmbbY7ZAWO2O3eVpijfjonwsn2Ilni6VZzZEKisqB
   49.67 +zZqNjJScOkxZxg1DXFHu6+k7C8s4ZYCMWhBnQps4dBtWIt8su93DxilxjJBoAyVE
   49.68 +vFjQx8BTL5s5Ow58+CT9Ck4rHKTWIoYLXD3FymfBlCgqmemQcZadle44OfZfMgUJ
   49.69 +rfD/Dd4iaDacOWhYJS2oXEbIgcffx61Dh82tmOnVglm34WvX4WEGANx0JO2eXWj6
   49.70 +PbouEX7DXyv9U4n7zDdUzYcKYgtKLRNJXFt1x/rwu2UiulOvUSQffrIM4T78ScEb
   49.71 +TN5NxWvZdZs12g17LU92DHEzyhVfiXgemIOaLepUW9qw5NvnNvgDgxL5/h9141ZG
   49.72 +mVDvc+OiO55DpzH7H5Vrh3I4dKmKNNRx26QkDEOEsphhYaEE15S0Ya2bAEPDD2+H
   49.73 +11zg/apdsIb5p0PwKzLUzAT4GoP9jQ0S1t83Akuq7xsGp4UuLPQ6p98HiQG8BBgB
   49.74 +CAAmFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlgNzIMCGwwFCQPCZwAACgkQDXLg
   49.75 +pU5wXEbtiwwAgqxDlCaD/MJwpXfkovm65GkTqIyWOzsO/kcDtYMaCGosJeMjKlYn
   49.76 +7CFMJ+I5weRGrn5AIf68Qe/zk7cbwgrn7ensIskacT6fxuo/cNYcAMwxEL/98uAu
   49.77 +VPLyhildLkbBfCqRSzWJb9qfstuBIVrd08o9Q4cVnv68I+YQy8quwnFH1t60iwAT
   49.78 +Bdoktdf7ppUojsGScnflMmEdfcFxboy1K7VDGP1v70lruzjA/cy/xU4jQyHVh2Rm
   49.79 +KfBiZZCPWhL9mL0/v7ptWnpbKBP8SrN8Dm5ZSrCUYmdmsGA8qU9AwCSsJms5aqND
   49.80 +xYmQZBSIMVYFZT1Nw4yn8i1s6+KB/uqBtGY4sCFddWgHZe58qzKRRaYJe8CdD6qc
   49.81 +cmi3DsNgDD4k94JlaqqvfuvrDTCAlR4XYJHDPOFk0FG/nU6obGDLo+Qi7EzQK2dy
   49.82 +C030x6QuECGAfY55Z983hy0kL0ldwDqNPlbeMyUWL0Te7KJ7+MoztBStNzkT+E57
   49.83 +QLRmiHrwVtn4nQVYBFvQNUoBDADNPDDPt75vPOCBQUX8D91RMGXQaGHjZ56O+HZL
   49.84 +0W4brFVzh3e3Ekl76juezij84e11beKA3Le+MIOdlSxNe3g1M1ITypWVVab4vFaS
   49.85 +N12kGgTYVtaU2sDvYAklhkBq2gReURrIkj5eI+w4rUGq+svxPRmGvmJAyzNdxxof
   49.86 +1zmbaAdYiER8kNewbEaOfiWiAjx/b/6vq4sEYo9rxBz/NV6RidTEA/laJgowN+UQ
   49.87 +MH4J9/AdePjXSUZ1dirfaIrrolliAxAApU1HsDBdxeGbOydNFL821/Ewk4X0OR0K
   49.88 +3gejq35uLwtAUg6zhRsXKTmWGjD/5msz7aGS5BRrEjdklARaqdO+X5cDjZl1iD3A
   49.89 +XGL19tbRYjUptpxNuSf5l6CbakLsUejBAxJic3fV+9gtV9ifurIK7eqKz4/WWNAW
   49.90 +zwu7iVJEUKXuR/ms7BcsNLiAxPO8Z0IE/d9/g+vVjmQPG6WV+9G/hQ1yFexwwdzU
   49.91 +I3y1d+FOe2MyosKa6D/fBzAu5q0AEQEAAQAL+wWUIEOIXBD/MTilaV1iCDY5WY5V
   49.92 +RNJLy7+/hmYMyeOb4JeLIOu4ZiG/JGKIE6ckDcwf8eszLkkC92Dkk1eCOd2mvBFo
   49.93 +c7GjQ8gF3ou+g4YYl8JSdSZT3kpJ0vw5IceFwfg9iu8IXDehqr2Ac1Hn26+xmHlu
   49.94 +jV8ms6O8UlWq1P8INqlNmVPFebqeIG2l68HzZTX7+YriEwPjssBPWVzUISW7/sbB
   49.95 +N0yGNWEWjXYBZQh1iKPuDBC8bI54aTWFzIwXiPsunEdzTs902WPjareIcI2g7cxB
   49.96 +GhPrzQcRE4M2tAWwGaFib8T4bljeXmyfUH+Do1MkkgFIJecZkuRkjQO3a/xW5kq/
   49.97 +UA9f91iC6QkMlJaoefApOrMT7sDtGfHHdf5FaXRrDJ0/DdjWoWBf1ACBKAY/IVgr
   49.98 ++PobwacnL09XQSst6P90tU30KqutGrFdt6MRYllTUaqdBL6Mpu5TPMGBEz2Ywb/8
   49.99 +y3pJ5GXG2c6CvqPAonUbBLyQRh3o+WYbcNT9JQYA4sKMnL/dWow4rREDElBH4cHe
  49.100 +NNEALuieZ7no00z85zoPy/Lue5+DcuBxio2EtozmACqcTMmLjZcPTDewfiA6KRj4
  49.101 +SUl4uQ+BQHoeVX7dJtWY2o8Pfe6AA0RJLGg5WwCvWg2OhX7OY55tlzpt7zOZ3Rar
  49.102 +wTDrlEE9djHilQNMUPiITnb1+TZ4txWQh/B5Ef+3u9YmB2ukq2A0QJ30b9PE9UaN
  49.103 +b0Y9bBZ/MJyvsudRVrMlU19pJog/GU8kgBMz9s3jBgDnsxi41D24XNcT5Ggn8zle
  49.104 +wH628K0zwKtMCy2B48EwI3fnsXhlIdBcgXgsN97GLrMEWOqaJj5snYaiXkbTa5V1
  49.105 +aYF2EBw83YcNRNqlHzhfxrUBfhev8c9QFPqN3fQ89nLqsIB5PlMDkDsa21fbnzYU
  49.106 +eV+haV2gMo5QguQtPmGvgUWVCK9uWNYkzhvxfk4Xy7o/YseAGkTkjShsiIYp9Clc
  49.107 +rW2YG11ys8RTxMemOonM89cQXfYGq4CxH5KMyjuPni8GALlXEQNSCT9yA7KmlrAu
  49.108 +Mpn0dntZ2y3tpm41deu85xZKUIS1tqXbLgIULacJ3JyH2XyYz65XGHLcNo+FpRUk
  49.109 ++ClxiA+ByaVmQ/TrzUVX6Cb6xbCNIi4ciXMmOsb32GJNunGAP/QBwMR6QodMqsO8
  49.110 +faocldtV/X2AuL++9UAl9w+Gj21RRukrQuGyfOo13QTpd9KErj+MYx09kzzLl2ME
  49.111 +9HD8DEWier7Pw3IHad77B12hXi7J1xRh6jbvH5uNajHiHdhOiQG2BBgBCAAgFiEE
  49.112 +D/YjkHUrompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQDXLgpU5wXEYZjQwA1mv/
  49.113 +l8e1tJr9PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gkyVUboKeu35LqWMlEX0aKF
  49.114 +hwn/3nY7rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anpZ94aMnGKqUkuVL3hr5GD
  49.115 +fUH8vCZroEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963rJrKc62CwtYUI5y6BlRq
  49.116 +CeRHhZlUNUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM/UpFX7DTfEabDuXJvuE6
  49.117 +2PzcXKMWULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1ssD2veVxWC/ljqxwSK7g
  49.118 +v7YFWhCp8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPkut/t1qVpSsTPPRGMaYpg
  49.119 +uFJN5/35BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CCBmPw/V4wcAyZPLoihbDe
  49.120 +UYK3tyicMozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXiNsWORBDJGNxegsAdnQVY
  49.121 +BFvQNmoBDAC4B17T6KIsP4OUyrjWXcFI9bjsAxtt8MgV2O0afI5Q4q2BHETdObex
  49.122 +3bAEjEUM7MO8cHIo9hsecUH0HhDYFgiW0NTMiMvWsBvbeMR8q7MlYWZtCOvINBfw
  49.123 +DMcGzxx8q1iRt9y81MhWT/ChwGJb8c4PoEm7vvKF0hIjfnReF8XeBDXpsVoWDC2T
  49.124 +IAs93oTD3tVIbWyjMtlGkUudHR6afMM9U48RulhHhN8vQkqq9mzht9aQtjZqCPeC
  49.125 +1oIcJ/rRXShnH3w5ZiW2giJQBJaco4pKnSlM3caEf5+68BlZTcHztvg3rpeOJSmT
  49.126 +VqR17d4aBBo66WYDpJZRxJ1ZXfFQPzvncUXeaW7faZNe6XVFzx+ROiruD3wmvjGl
  49.127 +VpRd2A7WfKR2lQb7xWpotF8/4qcnAK46tfLNzCaLeO7f5s8E7RcTj0Hk2HnavVKd
  49.128 +tU6DpVsxMeEFYXOQ92ieOKkrdQ60IAx6fOxTIxBfnoRImYFim3bHE9SRRy6boMuh
  49.129 +SUlcJi4EE2sAEQEAAQAL/0ANuLDziPbzyH3SrdFXYr5dYNctIa/7nfkUvzp33iVD
  49.130 +MPb+eu2xeEG9ktWSaTpdcqe1T9b4CmpnK3inul8sFCNCXr8uYhzAwYF7oJBwRvOc
  49.131 +2kTbVQ4jK63PFLtG/XhbP4HAyGElgvGf83apetLb8Eg6F0/03386pjuaeTCC/8kO
  49.132 +GCHWLC/+XyKVhbQsLnPqrLv/8k8/lKbeTb5K82r8QAypd+PIw49pLTHK1ih5i15p
  49.133 +WZKXCYuQwW3V8gWQ2NlkneMS3N6KUDjOdNpSfq3cUMRlc3gA3XSM7163oIPNwl6t
  49.134 +aOCZbIlZWu1jC2cZCh3vfguinMWVAT+hIMswTHCSu+KXpV7kKfgN09LWdJHkX5zA
  49.135 +JJLwUA6mZL3dfjFwiX6cQJoeAthJSVU9ziP8voymM/KBOZGYUHJ1BrdaC62DkAkq
  49.136 +g9zdavNQZtFIoXJgdXbp9SGUuciHq6LFxbdmk/Ee4Gz6KGoRLOkoLYZWrC9FuZGT
  49.137 +AdVoHBjnBtYvFzq5hqJt6QYAy0gRRhn3aazS9BaoKcMYdUlsCCtwqI476W9BO5eu
  49.138 +cIKulMFs2ZLUTWbW04YeVAx1apXUZ8Dn12BcDHys+frMgc28mDXz+tABjGLz/o7s
  49.139 +Xy1i+FiIoqWnPoz1HKytZbLDreofdl4nXKUb/1OFwOqnHHEVZ2HoW2b8R1+HCZYO
  49.140 +USSoDTK69D+MbYolA/z7isfAEw+YfjhO0gOO0aZrwN4NIjwGe8neOKGStw4CDxjd
  49.141 +4Ck1mfgi/obB8DmsFYHvLjBvBgDnwRuXKFO/sIPFeX8SNHBvB7f0dkzded6ZHubH
  49.142 +fAfbxqLVgOlbvtmrdQp+Rkq+ZX3KihV5FEcN4CMhWKKhlKNpDkZ7b3SbGAFj+qen
  49.143 +6YKyBk1OdvWusSczmTIXsYxX1+0rZcuyYd46YpvsuibwN58qgtAl63LqFI+Bugea
  49.144 +NIeUGCXUWyaZx879gScyq92b5OpPAl9xC51vOSBaXXDjq+wFXh4CEQMUq/QK/ojx
  49.145 +1EQtx/X4fN9/Td30YBN/Wjd/EsUF/j44MeiNFZQVcpU7MnuP2uqTfuHeuxWxTc5L
  49.146 +JEQOp4d6l7A5Vipm3ol1vUfbx5NOcWoE6cGqAEhF5PfLaY/47RExHNmFlTkaR6+h
  49.147 +hvfjm5SuSKb9toss1W7vDweLDGwkC8ywkY4+Xyi2+4TDWv08zt/xdt+M/APu0iIY
  49.148 +2Lux8TH3DB0EPqMdisqvCiC5QX4ZXaYP87Wl2s701HorvNoiv15GGg1ypKO6Kb8L
  49.149 +EqcI96jR1fj3XQoMg4DOTK/Zj0oMX+ixiQNsBBgBCAAgFiEED/YjkHUrompk2L0n
  49.150 +DXLgpU5wXEYFAlvQNmoCGwIBwAkQDXLgpU5wXEbA9CAEGQEIAB0WIQS3H5qpwpDE
  49.151 +VDwIfKXmjR2jQCaKngUCW9A2agAKCRDmjR2jQCaKnk03DACRcO+WTRZAa0eNdNLt
  49.152 +uwf6lwIIBgP98dwvkiboCO1tbuTx26tY8qHhnPBWD5j94TPdN8yLY+TGiIt3joOM
  49.153 +0VTNPj6ycb+6uIvEO7++Oc4ITjvbOBiLpzw8OKjmxllN4mF6anGAMP4lzv5BQ1+m
  49.154 +JeRs3zfQdhg3Gn+snZwFlwAzpuenvNxLe2iTTUaYB8tF7CO32GnrdKc3dQ9flc7e
  49.155 +/t38dM0vPPbjlnxSsDD7ZaDbj1AlOZkChKLAI+M3auO1DEDU2RYWQ+/lsmO2sb8V
  49.156 +TAVcIXkz6Ps5ubvqObyS53bhOubGkEH9WKwImL2CvLoz+hnQNjAHT1cPUbKFC1kN
  49.157 +Xy26ADt03bO/p6V74+H/tbCBis9Mtz5QobG0s/9HU9k/FoE4qzb/DJ/n2GBs7iyO
  49.158 +ARpq1exebx66wGi6YP/2OP3GOKOzYbaypQhxXDIxAEdVk9UAaK1XjqGV4pPy0kyk
  49.159 +1SFcVD6MsFqWcPBJyOj4Wj90CAuGXVvfhj4V440pHqY9T8YttAv/W6q31NckKsbI
  49.160 +pP3SHUoXA1kQqEJP9YVa0BBKqe5VbEB62zNn2GEKMmv0fouf3CEomn+iH+NyF4Q1
  49.161 +jQN/EDFis84UDJxoTPFG5gEgaasJkdhPbD+VtNbauRMxAPYvd/PAmPdEAOPgFWfr
  49.162 +zrkl8dwyOxReaUkTorBGnAXnjgpBuOhTBSa+/NB122DUDGbCZJ7a/goV/2B7eBst
  49.163 +iVpBm08Zai9kJ95ysiWP8B6AHbo9hPyUghz4e0RKEJAvTTQVaodnGSeE77fuMh/b
  49.164 +lsOo2wwsBmzB+y/yZEchwz410+furnTzFp+SedURmaBZ7FoeuDlElJ4qtFB1mWf6
  49.165 +Ws4yDmWUjLIWqVU/JFq5Y1zsSuR5R+rxO+niNXWOxJ3k/O8VrD/EUFlo24xjDMwm
  49.166 +1QetIin3imExHRZkG/ZlZqPgTT5AfMoV4LzGWJ6mZ+3SnAg2ldvFF0pnsteQ9W3y
  49.167 +cJHlzXj3IoGEu5kK/ZqDBh1jF4fBUmMQvSCNTVfWlJFHd3ddaSqT
  49.168 +=F4Oc
  49.169 +-----END PGP PRIVATE KEY BLOCK-----
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/test/test_keys/priv/eb_0_priv_w_v_enc.asc	Wed Nov 21 08:35:41 2018 +0100
    50.3 @@ -0,0 +1,119 @@
    50.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    50.5 +
    50.6 +lQVYBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    50.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    50.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    50.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   50.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   50.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   50.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   50.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   50.14 +TYxhzNxyHaNqrzMAEQEAAQAL/AuUBZDloEslY13rCEwXRjGZ9NZAp2crdrJp8neV
   50.15 +UCXYXijXgACwGKiH/kXW30GOaD9xB5y0TYN3hgoiYiOA+Sq58WVAYOeGnj/FjHkw
   50.16 +vBcziLSsAFtx8xxv6Ueb8ZZ/81f1t5umL1NxUuUrepWleQIiTCmH/54JiOu2vEi4
   50.17 +qAefGw3PUUpS5DPncEyMzvldLy0fyw9ScFCSh80aYyj1Ey1oIQbaXivL0QBc16/S
   50.18 +D+/PH+1qq4ud3nOm36tYDmw86if6mZHzJNQcBW13G68NKBgmip18vWNGZCgDctZi
   50.19 +a5XPDLDSTLfQrbuW6ZpTvJrXphGPJJ+CQb1QoO4gQjws+STn8v3TnJcxAIWTWnwg
   50.20 +E5jLV4DblujLM/9o9lGLSEx0EqwgKg4lhFY/KBDpshRDTprWb/5b5GHEP2wPIC5o
   50.21 +kKsrN1H2PNSdO0zmTRhWUn7dC+byJjHgjR8lCY1t67GhzXlkcFvsjTlul0ll0HUb
   50.22 +QjYHV4TjxtvAwCcDUpmFcNwCeQYA6wSUQX8g65COFAX6aX+qcTtYWq/Zoub6HjTu
   50.23 +om3x6ZceMRqiWlrP+VNidn2vv2ZwXTAnGeFi+UuNSb7i9Dbac7p0I2KGRNK05gnh
   50.24 +vMtUEFGkdStQPkELTtVsVk+nzRTqU6fM9mth04itviTs2R8TEQCApcOG+LDOKfwx
   50.25 +A4YyyS5pEBft8hjycbyOFW/2kg+uLkoxopck9UsW0IFTmLHuXKt2Y41oQ603qDga
   50.26 +Uujl++e2ChvY7TvSFjjzHj+TqotrBgDsH0zWj5OeDVdQsGbuLOzsPrN4BLpUJUv1
   50.27 +BKVAVmqFO0VdnsTDgXwmJkfs8s68prwsLyXz+Mx3YqlCo3+4cqX463v5WE6qd5s1
   50.28 +DBHKCeD3VsIp0NbMyD5GD2ph13gbHo7/ebGuuWhQseB7AyCxwFTcGx8fY/+ESUIj
   50.29 +kljCf0lnIeHMoLTxmerylLjuo2jWV96u1BnM/9q+zoBV4WgP5cHwn9Jlx8bHjOSF
   50.30 +9zVc46NjAhPlY54czjJlW9jiXOsdZVkGAI9wcpJew+fk1q48BiKGN69RY1WMXzBC
   50.31 +i0GeZOjGqR2b7l2TukhMdufwYSQFS0bCxwKKRmGCus5EjEBwmprIBcCyjGw4kVMj
   50.32 +9xKPqr86kQICCZnjLGGyftuPw0f3ZgzI8wm+cKwpZ4VfTksF1p8mgF3UctstQRuF
   50.33 +6U5+5lipOMEMxzyujOdBgttxdDlEPQgUyM78w2Os6QfeDO9tOKSHnyWTag/nIQmZ
   50.34 +gcNknW0hDxEb3SFdMENfpTA3VxtT5eeKx9fwtCtFeHBpcmVkIDAgPGV4cGlyZWRf
   50.35 +aW5fYml0c18wQGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+FiEED/YjkHUrompk2L0n
   50.36 +DXLgpU5wXEYFAlgNzIMCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
   50.37 +CgkQDXLgpU5wXEamVAwAsE1XtfLyy+uj57zNP06fABLyQsar+cswhUJ07gNOgsyk
   50.38 +NYCO8jlAPpqwTzz+msB26CmGUCqmXnLKOiM59VN+I50BaFwkHFiv46CiEwGZGalM
   50.39 +PSSCtScwEhdhwAd16REjBkRxPnrTwr71BF8U9pz6UvlD/ePUA6VIF76OZSL6F//P
   50.40 +K8CUJbXA7151vNRBtGUVpgt+FLWAqngIRFRpIEc7x4faXwk579az1HKfn1gHJtxA
   50.41 +Ur+4jGrT/ibtJnYScRI8doS6Rvk56Wgo5Jo2ha4MFJozzsmiYv46VGlC5NtPQYPp
   50.42 +9bFnNZGI66OY6NMVaE2S2oiOpKggbIHrbVcFs+Jmi3iuSW7Q5OQYP81RW7jWPLf3
   50.43 +XuT8h0xH85DWHfzCLPHtSf/wldMRqJbpQh2qDHOdKph9xzqVsAKmfTPawlfMTBCq
   50.44 +RoPjuUO5CaVZ8BzRxTt907WN8opVC/XyXXwh7w0IH7OgaA0pT5I9EAlVpKSsliGR
   50.45 +poREgISJZ2YIOXgM1ywsnQVYBFgNzIMBDADBZGQsFMqLK6YwmKrcik/R+/XGMLHc
   50.46 +4v6MOFDxWldMKkwB/EhbqWEUNBv3Umdpryj+/mX+Oho5mSJcJG8WXqtRgJl5MqPg
   50.47 +lEdj/nfPF6Axp0qUxs/Wea5KCKPbaaH7QdaBFYvRqZojsO/8a269EdPMCBIT5wtI
   50.48 +q1WzG+JNoUC1PfX+spvO6U8RuNuH2TziTb35j3JrSx5IaaH84sjIZlTgf+au39bK
   50.49 +UohVP3dZGdnCF5ah3yHUY61+7OgZCE4tnYKjPMqx84WhXX+RnmYaK+OvaONsFSHt
   50.50 +C5eFDV68krGTMZy4sfBKXsG11sep3u3dLl/suKFyTiZPtC8rb2HbmB4jbfGhb0te
   50.51 +sjcoSZb1JNZZsnKvplB0OyToXM0nchHxKPqgpAj43Wv+ELrxL4nKWqalZHVRwyqz
   50.52 +g/FSEaJdrRCB4pdnwPzFYx4hbD9FPZ4rkiQxxXFXz27w4r+nJ5beY/1kYBwo6PFk
   50.53 +iuq+KVEPtzHXxiX/bE+udU4HChEzzK7AvrUAEQEAAQAL+wYD7+O5H9W1XV18mi/y
   50.54 +82mmKy5nfFjRDLbi142yUC3T0Pps1PlY6uacelQ2kXXll2JbGmQOfZtWCo4QKg5p
   50.55 +km2eEOgGrbdCFXhkRWjBJN/2gqjfCD71GPk/jI06G2o70YbBW1CBtIQwsD5LPy4N
   50.56 +XGenxpws3xp7Ddbc4qyke+VHUJwEBTmp4yY7eESg+rZVUbfuANKaiw4YjwvVKAan
   50.57 +vDMhd1TwLHetmoUATN+OIMpbPnm5fY1kLlTY3J1Ot1PO5uACGq/7s9WnJ4oqoX1N
   50.58 +iefb8j/FfE2jO2xakggX9XIS6EHl69H21/o6O/k4U7pYoivVQnGenMUo7oHznXp5
   50.59 +K/l7lDx6im05PyZlV11NsLIN3HjMUOS8lGTumvfej/J+IQqrDfxXByZ40FUNp4Dn
   50.60 +VXQIwKZ1O57yxsH64TO8IaXeG9H1iVnm65G39MEM03xpcE17FxGXepHcK4yD1q4g
   50.61 +Syb6c6l5WQPQUM9KhkY1+DcCUhMA9AsgYPiJKt/m7SlewQYA26EB6/aVSiqkUZ0q
   50.62 +XNF24Mi0al/3hzX7Hoq9ecuztOJeCVsE5XIwX8DW3FZvJpC75qLvTS1V8T9JTN+z
   50.63 +EzDXftgBc0QpGe6utA+ov43FxyAL/OVv1AXFNjgzbAXxpVXABRqSr3AQ9XAAz+3A
   50.64 +smOSsyFdDU6FTYpkEQIoOq9kMuhbMebfmEVURums3EcVdoeA98k4EKIyg6hjoECL
   50.65 +0YaP3v8JicvK9X/4SK7EPIDl+/IHSs1U+NVYtqFYyT1yd9nVBgDhaxiyGNdOGGWq
   50.66 +GcPhJAWHQCmEOKQidHcXdPSwmbbY7ZAWO2O3eVpijfjonwsn2Ilni6VZzZEKisqB
   50.67 +zZqNjJScOkxZxg1DXFHu6+k7C8s4ZYCMWhBnQps4dBtWIt8su93DxilxjJBoAyVE
   50.68 +vFjQx8BTL5s5Ow58+CT9Ck4rHKTWIoYLXD3FymfBlCgqmemQcZadle44OfZfMgUJ
   50.69 +rfD/Dd4iaDacOWhYJS2oXEbIgcffx61Dh82tmOnVglm34WvX4WEGANx0JO2eXWj6
   50.70 +PbouEX7DXyv9U4n7zDdUzYcKYgtKLRNJXFt1x/rwu2UiulOvUSQffrIM4T78ScEb
   50.71 +TN5NxWvZdZs12g17LU92DHEzyhVfiXgemIOaLepUW9qw5NvnNvgDgxL5/h9141ZG
   50.72 +mVDvc+OiO55DpzH7H5Vrh3I4dKmKNNRx26QkDEOEsphhYaEE15S0Ya2bAEPDD2+H
   50.73 +11zg/apdsIb5p0PwKzLUzAT4GoP9jQ0S1t83Akuq7xsGp4UuLPQ6p98HiQG8BBgB
   50.74 +CAAmFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlgNzIMCGwwFCQPCZwAACgkQDXLg
   50.75 +pU5wXEbtiwwAgqxDlCaD/MJwpXfkovm65GkTqIyWOzsO/kcDtYMaCGosJeMjKlYn
   50.76 +7CFMJ+I5weRGrn5AIf68Qe/zk7cbwgrn7ensIskacT6fxuo/cNYcAMwxEL/98uAu
   50.77 +VPLyhildLkbBfCqRSzWJb9qfstuBIVrd08o9Q4cVnv68I+YQy8quwnFH1t60iwAT
   50.78 +Bdoktdf7ppUojsGScnflMmEdfcFxboy1K7VDGP1v70lruzjA/cy/xU4jQyHVh2Rm
   50.79 +KfBiZZCPWhL9mL0/v7ptWnpbKBP8SrN8Dm5ZSrCUYmdmsGA8qU9AwCSsJms5aqND
   50.80 +xYmQZBSIMVYFZT1Nw4yn8i1s6+KB/uqBtGY4sCFddWgHZe58qzKRRaYJe8CdD6qc
   50.81 +cmi3DsNgDD4k94JlaqqvfuvrDTCAlR4XYJHDPOFk0FG/nU6obGDLo+Qi7EzQK2dy
   50.82 +C030x6QuECGAfY55Z983hy0kL0ldwDqNPlbeMyUWL0Te7KJ7+MoztBStNzkT+E57
   50.83 +QLRmiHrwVtn4nQVYBFvQNUoBDADNPDDPt75vPOCBQUX8D91RMGXQaGHjZ56O+HZL
   50.84 +0W4brFVzh3e3Ekl76juezij84e11beKA3Le+MIOdlSxNe3g1M1ITypWVVab4vFaS
   50.85 +N12kGgTYVtaU2sDvYAklhkBq2gReURrIkj5eI+w4rUGq+svxPRmGvmJAyzNdxxof
   50.86 +1zmbaAdYiER8kNewbEaOfiWiAjx/b/6vq4sEYo9rxBz/NV6RidTEA/laJgowN+UQ
   50.87 +MH4J9/AdePjXSUZ1dirfaIrrolliAxAApU1HsDBdxeGbOydNFL821/Ewk4X0OR0K
   50.88 +3gejq35uLwtAUg6zhRsXKTmWGjD/5msz7aGS5BRrEjdklARaqdO+X5cDjZl1iD3A
   50.89 +XGL19tbRYjUptpxNuSf5l6CbakLsUejBAxJic3fV+9gtV9ifurIK7eqKz4/WWNAW
   50.90 +zwu7iVJEUKXuR/ms7BcsNLiAxPO8Z0IE/d9/g+vVjmQPG6WV+9G/hQ1yFexwwdzU
   50.91 +I3y1d+FOe2MyosKa6D/fBzAu5q0AEQEAAQAL+wWUIEOIXBD/MTilaV1iCDY5WY5V
   50.92 +RNJLy7+/hmYMyeOb4JeLIOu4ZiG/JGKIE6ckDcwf8eszLkkC92Dkk1eCOd2mvBFo
   50.93 +c7GjQ8gF3ou+g4YYl8JSdSZT3kpJ0vw5IceFwfg9iu8IXDehqr2Ac1Hn26+xmHlu
   50.94 +jV8ms6O8UlWq1P8INqlNmVPFebqeIG2l68HzZTX7+YriEwPjssBPWVzUISW7/sbB
   50.95 +N0yGNWEWjXYBZQh1iKPuDBC8bI54aTWFzIwXiPsunEdzTs902WPjareIcI2g7cxB
   50.96 +GhPrzQcRE4M2tAWwGaFib8T4bljeXmyfUH+Do1MkkgFIJecZkuRkjQO3a/xW5kq/
   50.97 +UA9f91iC6QkMlJaoefApOrMT7sDtGfHHdf5FaXRrDJ0/DdjWoWBf1ACBKAY/IVgr
   50.98 ++PobwacnL09XQSst6P90tU30KqutGrFdt6MRYllTUaqdBL6Mpu5TPMGBEz2Ywb/8
   50.99 +y3pJ5GXG2c6CvqPAonUbBLyQRh3o+WYbcNT9JQYA4sKMnL/dWow4rREDElBH4cHe
  50.100 +NNEALuieZ7no00z85zoPy/Lue5+DcuBxio2EtozmACqcTMmLjZcPTDewfiA6KRj4
  50.101 +SUl4uQ+BQHoeVX7dJtWY2o8Pfe6AA0RJLGg5WwCvWg2OhX7OY55tlzpt7zOZ3Rar
  50.102 +wTDrlEE9djHilQNMUPiITnb1+TZ4txWQh/B5Ef+3u9YmB2ukq2A0QJ30b9PE9UaN
  50.103 +b0Y9bBZ/MJyvsudRVrMlU19pJog/GU8kgBMz9s3jBgDnsxi41D24XNcT5Ggn8zle
  50.104 +wH628K0zwKtMCy2B48EwI3fnsXhlIdBcgXgsN97GLrMEWOqaJj5snYaiXkbTa5V1
  50.105 +aYF2EBw83YcNRNqlHzhfxrUBfhev8c9QFPqN3fQ89nLqsIB5PlMDkDsa21fbnzYU
  50.106 +eV+haV2gMo5QguQtPmGvgUWVCK9uWNYkzhvxfk4Xy7o/YseAGkTkjShsiIYp9Clc
  50.107 +rW2YG11ys8RTxMemOonM89cQXfYGq4CxH5KMyjuPni8GALlXEQNSCT9yA7KmlrAu
  50.108 +Mpn0dntZ2y3tpm41deu85xZKUIS1tqXbLgIULacJ3JyH2XyYz65XGHLcNo+FpRUk
  50.109 ++ClxiA+ByaVmQ/TrzUVX6Cb6xbCNIi4ciXMmOsb32GJNunGAP/QBwMR6QodMqsO8
  50.110 +faocldtV/X2AuL++9UAl9w+Gj21RRukrQuGyfOo13QTpd9KErj+MYx09kzzLl2ME
  50.111 +9HD8DEWier7Pw3IHad77B12hXi7J1xRh6jbvH5uNajHiHdhOiQG2BBgBCAAgFiEE
  50.112 +D/YjkHUrompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQDXLgpU5wXEYZjQwA1mv/
  50.113 +l8e1tJr9PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gkyVUboKeu35LqWMlEX0aKF
  50.114 +hwn/3nY7rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anpZ94aMnGKqUkuVL3hr5GD
  50.115 +fUH8vCZroEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963rJrKc62CwtYUI5y6BlRq
  50.116 +CeRHhZlUNUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM/UpFX7DTfEabDuXJvuE6
  50.117 +2PzcXKMWULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1ssD2veVxWC/ljqxwSK7g
  50.118 +v7YFWhCp8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPkut/t1qVpSsTPPRGMaYpg
  50.119 +uFJN5/35BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CCBmPw/V4wcAyZPLoihbDe
  50.120 +UYK3tyicMozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXiNsWORBDJGNxegsAd
  50.121 +=oMV3
  50.122 +-----END PGP PRIVATE KEY BLOCK-----
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/test/test_keys/priv/eb_0_sec.asc	Wed Nov 21 08:35:41 2018 +0100
    51.3 @@ -0,0 +1,82 @@
    51.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    51.5 +
    51.6 +lQVYBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    51.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    51.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    51.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   51.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   51.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   51.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   51.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   51.14 +TYxhzNxyHaNqrzMAEQEAAQAL/AuUBZDloEslY13rCEwXRjGZ9NZAp2crdrJp8neV
   51.15 +UCXYXijXgACwGKiH/kXW30GOaD9xB5y0TYN3hgoiYiOA+Sq58WVAYOeGnj/FjHkw
   51.16 +vBcziLSsAFtx8xxv6Ueb8ZZ/81f1t5umL1NxUuUrepWleQIiTCmH/54JiOu2vEi4
   51.17 +qAefGw3PUUpS5DPncEyMzvldLy0fyw9ScFCSh80aYyj1Ey1oIQbaXivL0QBc16/S
   51.18 +D+/PH+1qq4ud3nOm36tYDmw86if6mZHzJNQcBW13G68NKBgmip18vWNGZCgDctZi
   51.19 +a5XPDLDSTLfQrbuW6ZpTvJrXphGPJJ+CQb1QoO4gQjws+STn8v3TnJcxAIWTWnwg
   51.20 +E5jLV4DblujLM/9o9lGLSEx0EqwgKg4lhFY/KBDpshRDTprWb/5b5GHEP2wPIC5o
   51.21 +kKsrN1H2PNSdO0zmTRhWUn7dC+byJjHgjR8lCY1t67GhzXlkcFvsjTlul0ll0HUb
   51.22 +QjYHV4TjxtvAwCcDUpmFcNwCeQYA6wSUQX8g65COFAX6aX+qcTtYWq/Zoub6HjTu
   51.23 +om3x6ZceMRqiWlrP+VNidn2vv2ZwXTAnGeFi+UuNSb7i9Dbac7p0I2KGRNK05gnh
   51.24 +vMtUEFGkdStQPkELTtVsVk+nzRTqU6fM9mth04itviTs2R8TEQCApcOG+LDOKfwx
   51.25 +A4YyyS5pEBft8hjycbyOFW/2kg+uLkoxopck9UsW0IFTmLHuXKt2Y41oQ603qDga
   51.26 +Uujl++e2ChvY7TvSFjjzHj+TqotrBgDsH0zWj5OeDVdQsGbuLOzsPrN4BLpUJUv1
   51.27 +BKVAVmqFO0VdnsTDgXwmJkfs8s68prwsLyXz+Mx3YqlCo3+4cqX463v5WE6qd5s1
   51.28 +DBHKCeD3VsIp0NbMyD5GD2ph13gbHo7/ebGuuWhQseB7AyCxwFTcGx8fY/+ESUIj
   51.29 +kljCf0lnIeHMoLTxmerylLjuo2jWV96u1BnM/9q+zoBV4WgP5cHwn9Jlx8bHjOSF
   51.30 +9zVc46NjAhPlY54czjJlW9jiXOsdZVkGAI9wcpJew+fk1q48BiKGN69RY1WMXzBC
   51.31 +i0GeZOjGqR2b7l2TukhMdufwYSQFS0bCxwKKRmGCus5EjEBwmprIBcCyjGw4kVMj
   51.32 +9xKPqr86kQICCZnjLGGyftuPw0f3ZgzI8wm+cKwpZ4VfTksF1p8mgF3UctstQRuF
   51.33 +6U5+5lipOMEMxzyujOdBgttxdDlEPQgUyM78w2Os6QfeDO9tOKSHnyWTag/nIQmZ
   51.34 +gcNknW0hDxEb3SFdMENfpTA3VxtT5eeKx9fwtCtFeHBpcmVkIDAgPGV4cGlyZWRf
   51.35 +aW5fYml0c18wQGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+FiEED/YjkHUrompk2L0n
   51.36 +DXLgpU5wXEYFAlgNzIMCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
   51.37 +CgkQDXLgpU5wXEamVAwAsE1XtfLyy+uj57zNP06fABLyQsar+cswhUJ07gNOgsyk
   51.38 +NYCO8jlAPpqwTzz+msB26CmGUCqmXnLKOiM59VN+I50BaFwkHFiv46CiEwGZGalM
   51.39 +PSSCtScwEhdhwAd16REjBkRxPnrTwr71BF8U9pz6UvlD/ePUA6VIF76OZSL6F//P
   51.40 +K8CUJbXA7151vNRBtGUVpgt+FLWAqngIRFRpIEc7x4faXwk579az1HKfn1gHJtxA
   51.41 +Ur+4jGrT/ibtJnYScRI8doS6Rvk56Wgo5Jo2ha4MFJozzsmiYv46VGlC5NtPQYPp
   51.42 +9bFnNZGI66OY6NMVaE2S2oiOpKggbIHrbVcFs+Jmi3iuSW7Q5OQYP81RW7jWPLf3
   51.43 +XuT8h0xH85DWHfzCLPHtSf/wldMRqJbpQh2qDHOdKph9xzqVsAKmfTPawlfMTBCq
   51.44 +RoPjuUO5CaVZ8BzRxTt907WN8opVC/XyXXwh7w0IH7OgaA0pT5I9EAlVpKSsliGR
   51.45 +poREgISJZ2YIOXgM1ywsnQVYBFgNzIMBDADBZGQsFMqLK6YwmKrcik/R+/XGMLHc
   51.46 +4v6MOFDxWldMKkwB/EhbqWEUNBv3Umdpryj+/mX+Oho5mSJcJG8WXqtRgJl5MqPg
   51.47 +lEdj/nfPF6Axp0qUxs/Wea5KCKPbaaH7QdaBFYvRqZojsO/8a269EdPMCBIT5wtI
   51.48 +q1WzG+JNoUC1PfX+spvO6U8RuNuH2TziTb35j3JrSx5IaaH84sjIZlTgf+au39bK
   51.49 +UohVP3dZGdnCF5ah3yHUY61+7OgZCE4tnYKjPMqx84WhXX+RnmYaK+OvaONsFSHt
   51.50 +C5eFDV68krGTMZy4sfBKXsG11sep3u3dLl/suKFyTiZPtC8rb2HbmB4jbfGhb0te
   51.51 +sjcoSZb1JNZZsnKvplB0OyToXM0nchHxKPqgpAj43Wv+ELrxL4nKWqalZHVRwyqz
   51.52 +g/FSEaJdrRCB4pdnwPzFYx4hbD9FPZ4rkiQxxXFXz27w4r+nJ5beY/1kYBwo6PFk
   51.53 +iuq+KVEPtzHXxiX/bE+udU4HChEzzK7AvrUAEQEAAQAL+wYD7+O5H9W1XV18mi/y
   51.54 +82mmKy5nfFjRDLbi142yUC3T0Pps1PlY6uacelQ2kXXll2JbGmQOfZtWCo4QKg5p
   51.55 +km2eEOgGrbdCFXhkRWjBJN/2gqjfCD71GPk/jI06G2o70YbBW1CBtIQwsD5LPy4N
   51.56 +XGenxpws3xp7Ddbc4qyke+VHUJwEBTmp4yY7eESg+rZVUbfuANKaiw4YjwvVKAan
   51.57 +vDMhd1TwLHetmoUATN+OIMpbPnm5fY1kLlTY3J1Ot1PO5uACGq/7s9WnJ4oqoX1N
   51.58 +iefb8j/FfE2jO2xakggX9XIS6EHl69H21/o6O/k4U7pYoivVQnGenMUo7oHznXp5
   51.59 +K/l7lDx6im05PyZlV11NsLIN3HjMUOS8lGTumvfej/J+IQqrDfxXByZ40FUNp4Dn
   51.60 +VXQIwKZ1O57yxsH64TO8IaXeG9H1iVnm65G39MEM03xpcE17FxGXepHcK4yD1q4g
   51.61 +Syb6c6l5WQPQUM9KhkY1+DcCUhMA9AsgYPiJKt/m7SlewQYA26EB6/aVSiqkUZ0q
   51.62 +XNF24Mi0al/3hzX7Hoq9ecuztOJeCVsE5XIwX8DW3FZvJpC75qLvTS1V8T9JTN+z
   51.63 +EzDXftgBc0QpGe6utA+ov43FxyAL/OVv1AXFNjgzbAXxpVXABRqSr3AQ9XAAz+3A
   51.64 +smOSsyFdDU6FTYpkEQIoOq9kMuhbMebfmEVURums3EcVdoeA98k4EKIyg6hjoECL
   51.65 +0YaP3v8JicvK9X/4SK7EPIDl+/IHSs1U+NVYtqFYyT1yd9nVBgDhaxiyGNdOGGWq
   51.66 +GcPhJAWHQCmEOKQidHcXdPSwmbbY7ZAWO2O3eVpijfjonwsn2Ilni6VZzZEKisqB
   51.67 +zZqNjJScOkxZxg1DXFHu6+k7C8s4ZYCMWhBnQps4dBtWIt8su93DxilxjJBoAyVE
   51.68 +vFjQx8BTL5s5Ow58+CT9Ck4rHKTWIoYLXD3FymfBlCgqmemQcZadle44OfZfMgUJ
   51.69 +rfD/Dd4iaDacOWhYJS2oXEbIgcffx61Dh82tmOnVglm34WvX4WEGANx0JO2eXWj6
   51.70 +PbouEX7DXyv9U4n7zDdUzYcKYgtKLRNJXFt1x/rwu2UiulOvUSQffrIM4T78ScEb
   51.71 +TN5NxWvZdZs12g17LU92DHEzyhVfiXgemIOaLepUW9qw5NvnNvgDgxL5/h9141ZG
   51.72 +mVDvc+OiO55DpzH7H5Vrh3I4dKmKNNRx26QkDEOEsphhYaEE15S0Ya2bAEPDD2+H
   51.73 +11zg/apdsIb5p0PwKzLUzAT4GoP9jQ0S1t83Akuq7xsGp4UuLPQ6p98HiQG8BBgB
   51.74 +CAAmFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlgNzIMCGwwFCQPCZwAACgkQDXLg
   51.75 +pU5wXEbtiwwAgqxDlCaD/MJwpXfkovm65GkTqIyWOzsO/kcDtYMaCGosJeMjKlYn
   51.76 +7CFMJ+I5weRGrn5AIf68Qe/zk7cbwgrn7ensIskacT6fxuo/cNYcAMwxEL/98uAu
   51.77 +VPLyhildLkbBfCqRSzWJb9qfstuBIVrd08o9Q4cVnv68I+YQy8quwnFH1t60iwAT
   51.78 +Bdoktdf7ppUojsGScnflMmEdfcFxboy1K7VDGP1v70lruzjA/cy/xU4jQyHVh2Rm
   51.79 +KfBiZZCPWhL9mL0/v7ptWnpbKBP8SrN8Dm5ZSrCUYmdmsGA8qU9AwCSsJms5aqND
   51.80 +xYmQZBSIMVYFZT1Nw4yn8i1s6+KB/uqBtGY4sCFddWgHZe58qzKRRaYJe8CdD6qc
   51.81 +cmi3DsNgDD4k94JlaqqvfuvrDTCAlR4XYJHDPOFk0FG/nU6obGDLo+Qi7EzQK2dy
   51.82 +C030x6QuECGAfY55Z983hy0kL0ldwDqNPlbeMyUWL0Te7KJ7+MoztBStNzkT+E57
   51.83 +QLRmiHrwVtn4
   51.84 +=2YWv
   51.85 +-----END PGP PRIVATE KEY BLOCK-----
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/test/test_keys/priv/inquisitor-0xA4728718_full_expired.priv.asc	Wed Nov 21 08:35:41 2018 +0100
    52.3 @@ -0,0 +1,129 @@
    52.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    52.5 +
    52.6 +lQVYBEdLUwABDAC2bTz7s8V9CDu/K3PtSXDvNCtx+84tdQEoNnmzQh9bkdnHWIzO
    52.7 +cscoO/YcJIQFJJ7WWdCudLLj+qaHS1t2EomW8ZRYe/HdIcIW/qO0ydGDShiJxEZN
    52.8 +4ZrNPz+BfEAhatbsN46z7DyzZjGHPPdIdLic2QAuDbv/z2/11ABDYa58vZINOp1r
    52.9 +pkmytOJps92K8hpY+PmfWTdNSWaNTCiQoel0MyyV/AgNLv/HUJRlN5QvqCQWqcAN
   52.10 +lHE5JmVZQK9wzlzs8T8pnoJJRPMG3GeiiMWMXjPUI01DdX+Fv69wkFavUOOV/JND
   52.11 +0nKl42xqajbkDL+Hc9veNlR4+hVykdVOlFgEY3x37wiI3gklHGoRZmex4MOL9+oB
   52.12 +LEiOARhtduG1w3bukOphhBfc1W4We12WIblKWfzRr/YhIgiNCD5rCL8kvcaFyKUe
   52.13 +3a9BQWayRewPmY8IdxcUHoKwhNS5a+52Aqgd/1ki+VvWRX3uTVAZA0rIiECGTioQ
   52.14 +MkSHr1F00bZ+1QEAEQEAAQAL/is5gfgf1fz0vPdki+DfBG/hPCQTZnx121LUaYy0
   52.15 +b6qqSeBGloJ6Rr89SejMLC3tyeb/PAeCJjsHknq/O8ojxU8rKZu3rozXaV46cr6t
   52.16 +DUQfA+Zsx72/ZYcZY+pB7w4b+xXYaisuoAlf/v9MzkjwQygC8Nx4q6GG3L/yPie5
   52.17 +Fvd+kYMp7s/phE/gNT+Xezhneh+3yqnboVNiP3beY0Q14ROD5p4ZLC03hCqNaMP8
   52.18 +4dNS804dZaCyGgvREbWOsqM3ef0rljKfTSLZ9eFoLU0CMw/dw764IXWnjEo4bkl6
   52.19 +ialKwjSyaPIShgjSMx/IcH2iYI6GcEXkzl6O+j8cn2Q62lEuQijQ0T1jn/Gq36kT
   52.20 +hRPcx3lumR9Dsc1CHyIuHZFWUy8+ZRoVKDSvv4EjjZN8YsqB7wLLvT5/yMI1wnku
   52.21 +ITPCn/TMMGNCzKuiIucC7T/Kj3yDsotpFX6RTRiq1H+Z3iN+Ml1Ih+D7CoJMUkBS
   52.22 +42JfwYhCLDhC6JCk2HAUQpzTywYAwUFFl3u8oR8PA/EYwBiS/UUm616hMTAOOM4u
   52.23 +uF9Iai75BW4mfLGd1mmqZknIAKmYYNN9A8IjvkA81/Y5wdyBo/oLOhQuewnou7Uf
   52.24 +zJ9R7IY8LWToc0LgOBjvxL3ucxYz1Ub1YJiaQxw9sm8L97H+HZCER0k3pDXNWvhB
   52.25 +yT7jrRlvOLIpU/EOTRx2SbWWyUXCM+b5MNzmk4sDxH/reIhhgbqfEjV7FeOAnaiB
   52.26 +F2zTz7JtEz94gS1KOXYJFrlMpzRrBgDxp/TrHBuJhAmPXn/WCnqVnNP1klAzD7l2
   52.27 +ecp6gSysNhyGkoC3vT84gL2Sz3VkAwd7tbb5CKQKqw/Bea4EJ2Ex4z4AopwH7c5X
   52.28 +LFTYWxFDlGNxf68Np7XiuMOOCTtpUkKR8oCY/TEPNdfnsdU3XiT7kJxo9Kt51Mra
   52.29 +YeCKiJeF2wd2KwezTAy9M0PCIDVx/CP05ZhAfV099Yb4CfjPsMQHUEcJOYBmY1VR
   52.30 +pveqg/9H2XZvrKcdsZ6+EsEFLyCzl0MGAJRBb5J6Y/il3aYw5Vijv7hSg5zsgMRx
   52.31 +JqqmOCLG+iDPhkuN4HAZgpED1zMA5SRgYjNKk3sFy6lkMHFi4hzi7gpXhksVSIQD
   52.32 +rZieSXOxCLzRp2lyJR03w/q2XbkcOYX8aHbtZHzmNvXHmqLo+PtE0gvHT6VFcuoX
   52.33 +FVNcN4yjMTGMmTNX+BHIUVYRmSOvqEx9QaHcDtJfCe55VwVvW1shu2c22QHnxF+H
   52.34 +eDSUEM61YphvIvB+tfEj60sqwU6BWZnYW9M2tDBMYWR5IENsYWlyZSBUcmV2ZWx5
   52.35 +YW4gPGlucXVpc2l0b3JAZGFydGhtYW1hLm9yZz6JAdQEEwEIAD4WIQSOjSOBrgZq
   52.36 +vh/uUJghupd8pHKHGAUCR0tTAAIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIe
   52.37 +AQIXgAAKCRAhupd8pHKHGOJxC/9qpPHanMKIJOPxLNr5Yp7AZhcOlzX7IXlp1hwt
   52.38 +m6MPXMRz76wDeDjQSlDUo80eOIaDmq6Q3yHL3XbaDBXoHsj5HO2F1oaQnNgByq6r
   52.39 +loOFjjQ4zcPp7Z6U3vKP++cE1CTTA/wZKsW5EDg2opd5BCq0MYj2H7KoisXLpM6N
   52.40 +k0zDWeZrdmewXvhNmlnf2r3e7N6FS3cReWiSQvFxVcNHYK3QEAb3JZe172kpf/ko
   52.41 +PQA24hIyjY+JjTLGFQ74WPSsXCo423s6Yjj80FtJOSwJQ+JgUfgKB6mv4adLDEN2
   52.42 +Lsbylumci9rv7VF3UWUWwgo4Fhwxr6O3bH7eTc4EjjWexB14hovRGmgNJBiyzAKs
   52.43 +i2QBAd+UY5Y5xaqh+Ed4zMpvs5HobuEPPf31sUVkt9J7HIbKPeDJkowQ8UO8AeS1
   52.44 +fEy+iacwlH/3Ve07xUyGDztnS/vQ6MBzIZm12bvedXALOqdXr61e+rx05Fww/Q0F
   52.45 +x98fBWUDan5vXKCvNSx3yzBodcedBVgER0tTAAEMAMW5zC5ogzpPKaIrnhLypB+I
   52.46 +7slHiF3kt8iGmgUePr9GVuRkLr2vWJz3+Tvd3L8UjXeNEdZ2z/fqxDD08pk3gY/f
   52.47 +/JhGQeNnvsZ4nsaVUnc3Xz640W6ufH+aJtgCW+Y+rvo0zLXZ+hlhcJ9FeroRODji
   52.48 +t5Pwu0tgBcjOpnPu/p1Vc+Yj145qw9HQR/sQ2tnj02m31/a8POf6efGRgIRhDMJ1
   52.49 +KeuVzLqsXEWJIOi651OOvtOG0tKOemxmm8cOqMqRBW7bVbSsqKcD0/7sQw6mprFW
   52.50 +YKp9WKKu+XM3sHTk2NZhKqAfyloZLnhgiC30LgQS9QMJdC4/QDfZY2srEKlod1tX
   52.51 +8Gj07E7P5PG/e6X+rjPKEoqJmTUxqjEAk8++yvPGQRncT8V9dEbpGU9zm7qmYdtZ
   52.52 +TjQFLHJ//mRcx2zqTSExoETg3IWgyt5e6bQypO+2xr5NC0Jf3Ubj7RhD6hHzPaSP
   52.53 +PyJ5ZxnyXAePsKPsDWJRVc2JYiMQTqBg9sCkZWccRQARAQABAAv8C8qN9NmKM9y7
   52.54 +Lp7bxST/qRrFJK81oGXOmPB/+FyqoMT80w9vYyP1DJ1UGWAcdS+wVQgOX4QD2HTB
   52.55 +YOsGmaEAAri4i0srTDioXZUdYNnQSmg8r5SddrSEm6ZxeRHA8bzcufKSn6ihW8ie
   52.56 +Cv19eWGkAO5yRKoHPVI7XhOGxSSkPfU13WxXQzi2N0mstTn21yYZOjV6tU3Z8vqS
   52.57 +sZd7+sj/1gvfJVuwUxSKxyHLmt1khKzfT+V7Jo/VGKhQ02DaK4RU2+u0JF6YM+mj
   52.58 +2FjjuqtYvtYVfMHESy/MkPdInNgddMdJRshwpvRxCELJtGYc6fonAHZKzcW7iZfL
   52.59 +ytKQ/kAET2GbJ3bmCHs8mEsrbGYNYipnX8G0M+SLxuECYL8ngfkMz02VRmZC0W3U
   52.60 +CfYg6+cfhymQnXJoRUPkiVjMA7zF57Z5Zqo9+QGGpy9wflU+7CD4uBMaZ71Oh1Lf
   52.61 +odVxL5oGph+IjvOErUIKCOUXsew9ZvxreJd/CTzB768mXheJs9lBBgDNsi3sGJP9
   52.62 +K7xrIxsulwWZbzr0T7o02PDkwyj8LuECwSvjvVqHRM+Xdw4GhaDVt7+cf0MoBxC4
   52.63 +dd7LYohP5wf2Bmp725gPuW/fdjq73OM/HHgzoZeRSyPFM0jcjM40nMAyTTyJDzID
   52.64 +Yyi1nU5qWd7o6STgfFnT0hslW+fs/h+mTD9/4MJh2g2xCgH3f3RHw04aSdPJI9At
   52.65 +rhenA/dp+sSa1H511B/tS+hpdW4uw5ooHfUqWAo0QjQSASP1/6lmYgUGAPYUofUK
   52.66 +A17OEdi+lqcFEpSuDp22d3EWt4doOde9bpshLb7olxEAa/+gyb5gufI0TS/TdHii
   52.67 +LlR6qhFCXOaY5b/ABgL5KuO14qOBEFcMPYm+MFRhG1PGUct3RW5WeMzQy3CIE+A3
   52.68 +nZP/8LaEJzjQNXBcS8ei2ID2k13VTn3KkMhgf7Gmw5xyxVF7o2JCFVVX0Iq9gcvi
   52.69 +ghPL3rrrOBotN/fJSEP3uIqEeCygqi4Gz0a5K0jy6Uir7s3n81SZDj+lQQX/U2lS
   52.70 +0YxQH3jxZwLNnC07CcZh+uSYxALb8SplVkm6B1rU3lsnmLf4I9h7JwIIK6tiBFiE
   52.71 +o44MrH9A9IEKUCIGqgfwcFJwItlqHTd3rkHKy/FOoVpa2cwyX5h+NbqNCjCGZgrl
   52.72 +c369/9L1c+qlz0Zush5Q/18hTwFjFrWqyBTil0Qh6qcsHQRVcSWm9SJQIwDA3i1q
   52.73 +BRlpoCih2r/ilZcc3M52vgCrmqMfRRkhzyiuEQE3kH4drMY9VuHJwsZSnpfX3VmJ
   52.74 +AbwEGAEIACYWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCR0tTAAIbDAUJA8JnAAAK
   52.75 +CRAhupd8pHKHGOjDC/4xEU1ewAMks7sMoCsgaYu0i7fyYo9FooItRTp1qUC3zJIh
   52.76 +QV9Wo7e0+1SX8ZAVSbjNIVTQC3P2SElTdtifejJdZa76KcCyMzbg6hI9ickU1il6
   52.77 +LGjPr5xXxrWUYGcS21XFgt7yk8L2FYzwMcUWG/ailn31zj3w9UGaEHK82+Wasbkn
   52.78 +YmobxQNcjbp1QZGatSUQHfA+yTBlxyDyvUR2riTUOhx6jX6HDQNiOauHZi0zRP0F
   52.79 +nMk7tHa4r+AQ0g/M4+t8aCsClj5ws7AiM9jU7YaX4VIC3r/H+pJGEmw6RNqGxHa/
   52.80 +MM399A9HWyrpP/LdMChxUGkUDc8VIs2XGw5j3VMNXcEYJhb4PDTqIJSaJ2SY/HxU
   52.81 +VzCp1re+HTPBUAYogWpD2dQdtrs8yqdNf4+OEZZOHYmErUsfCLFTh0qAD5WkL2Cj
   52.82 +Sl2KlL7y+s9YW5fHZSycu6/oLpUWccIAl3A1h/dLaO3Ukh2rDkJsjD1X5hLas96v
   52.83 +WGub8+IbexOlWL9VX02dBVgER0tTRwEMAMS1DPt9Y/bjUDIxBG7/1tN/5MdBeiU2
   52.84 +pvZVpIy34a2vNWFnUNUu7vPEUXoTu3ZJcQj8uBDzq3ikJ57O17gyFQYsIUbdJrVV
   52.85 +hsr4sh7mByR/fqq7G+CrJwzPtVcnszCilRnzK+3G/vYd4mW9vM8L58E4J8rc/Nlw
   52.86 +GUbqrKkbAP5oUNyRtUASgHgBnSnTWeGIbRVPjY6dt8TfpY9XEuh3ghs77jkyiknw
   52.87 +NTopYnaqeIDHQ/5BGmw1B0Fj1CbyJz+UiQ3QEpAvOmCrmE0hfyHiyhrpq+eewasL
   52.88 +4axBHLaFxYB5DyZ2ch+D4D4Nqbtxd5vWDR33yzgJT57WFrUrG9adyruxpfG9v6CR
   52.89 +UFkA+o9f+UI8E+Pr3s67rau1ZurZtjKuWgNt3yPE4Sb/JlwLTqK6F4QcXfDLbsav
   52.90 +YvuyX9juUhE63ApfOh3I0NAZIVt6u1/nRc9X8x2Ae8zLZbIhcswUd7IbzIgmqngq
   52.91 ++t5tw5fhQNaNUjvUGtNAdwltMu8FaJMYlQARAQABAAv9EOTNvyGXPsJqBk2AaHoP
   52.92 +fK2cu+IrN9v4PerADZfTSYPlLT7eydhUjFn9d2MPdAq9qvxtYINU5DEQ+Aoiq76d
   52.93 +YKDUoM3of6VfRLpULeQqk99hRQ95xvNcELUcCWau9IvaC1b/nFW9WuzZH0zK1Otc
   52.94 +VZNZk4okKxZ+DUGlX4aisLbLzw2yh9Su9N+KnGd67iw11iE1cpyoBkAA640aYh21
   52.95 +blpYzM/C4bPAFoUsYC2m2MSEWedEeiuZumt08n1UkpjSf+J+czamLAxOda09hhwl
   52.96 +TYjRSDRydH15JAXZFhlnuNKTNwVh4Bi7gRRI8+v1ZxQufVvnOPmhljAUOnDjEK76
   52.97 +5T9LarVEttGOBWYY6acZvE2Rx+Ax5bjsoD7+3P1O4f1XoapBJsJIYcb1xGLQxikG
   52.98 +n7Zf5es8+7HPgicQE/mv59ya91UaYeD7dSQrU/zzsr1zBRM8DTOar/xVCHJBCXNi
   52.99 +PAqFuYM/tJ4otde2MbGdEpYWHDFnLDrZ7emLyxOJuZcnBgDUJaOnNN4fD8/S9S/s
  52.100 +hM0a1iu4h58rbsDuOhiUDI/Yxql6xbZGDiHC8owgf7gSjb42KBh1eDX8ioZe7bUF
  52.101 +MPHJzfHw0Jsz8eyXtI4CQqmGNpeB9t3z5WoT/KPNMgo3ay0ZiiiYsvZ4SVR81/jD
  52.102 +9PM1MAvdsNnHN0eHv/QImoP8+4wbfCxxa+2pP/jLiDa+j2TvCRR+U1knsL5o7dya
  52.103 +7IrzjK/qQQjQ9TrGWWCvRt4HAz0f3fJyIYZJRwq+IVWvB8sGAO1eXunWbyU6bUMh
  52.104 +OagLWZhY3s9WsJEgv8u9sWGO+zMFGx62Q8DH1gEKJitbNURNzvu3BShdLb7fow1Z
  52.105 +MPxnhblHB7bwq7V/IHz0iX1apm3YaJmhDWlvBmNGRucopOU3Ow72kvPMEkuWb0Wr
  52.106 +Zxv57zgRbfcI5McgFrlxAxZ+yqpohwnVFJZmmvcEb83QX/CLfVYBiwb71kZ0GDUE
  52.107 +Tt2bjnBuPQWNtAjG2S2BbgK934nIxYY7RmRZWxmjObJAb4iVHwX/T8s55lWNjKam
  52.108 +jIHSdjKes8nXe3cDk51GWBu91IQpnwG5A8wGJJb/rZuIEKs1h3Fr06q4dVB6my6P
  52.109 +qlTdT5WL5Kqa7arlHQHbnkGpPhUi5K7od1KnHa1HjQHGqEVvlAAOQRZdp2bdzOO8
  52.110 +UbL6POh6P8QJzGBog/lTWxSsR9CvShD/3+MJe9hqSYtwo3DWHMjYSup68GJhF8qz
  52.111 +8lPf5s6+MfIReaBxogj/ELhvAjLDbJJcdezU5/e47LkEnxc9+BP15TmJA3IEGAEI
  52.112 +ACYWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCR0tTRwIbAgUJAeEzgAHACRAhupd8
  52.113 +pHKHGMD0IAQZAQgAHRYhBOEnUeYHkpl5OllbbeH52cCAwQuBBQJHS1NHAAoJEOH5
  52.114 +2cCAwQuBrcoMAKxYGeOOXJfDau0rXvyNxPHqTYgLJkzWipofizqjruP52w7vef/F
  52.115 +iVHOHhxRNaCMgKFhiBNzM7GVNlrBcXmgwkUo7PLhC+DVgSr0gkAdFQ01Ic/EjfyK
  52.116 +znxS49nxuziFfOM63BsBo7MNQB7eklDRsfz2OLgDB/SE3svv5A31QBTdYQpBZNZL
  52.117 +FhYDo+JQsZKx+YMsXoro7rBGcN1aF4ogyXYcaOm+DJp+ZwZUIi3/7wgRHdTOUwr7
  52.118 +PBTxlNLqBG0RdOvb2iKjxQmCY8kc4Se13CPuQvEKb4LOjlHsRp+N2GP0b6Rr7XPJ
  52.119 +o9YbBA6xo4ICrtaXCkJd6qMux96P7t6SWh4ZYvMGP2XOeHLGe8OiZjo6cEOsYvda
  52.120 +vmOZM0X+A814uNalEzcl027Q8NtcGW0oBn/C3AOKKR69fRzwBfZTY1E8G9kYNO9x
  52.121 +j+GBFwudjs7l/DSX71g1XQWkMpXNn8SoODh15UoIfjkR2Ic8LdpgYlTYsaapOxLo
  52.122 +ulFmyTJn6bRy028+C/9SwTIAmlGRP7rneycRdCOUmqN7dQJ5pcU6M9FQiqyLr4pv
  52.123 +oED7ambIC438ZelwkacPu0Uc+KFVqOUGwng5Ldz62smHnFwVn1BrasjhP+ilN3c9
  52.124 +iSHr8flQeVRU288ywKWXKV/VlHkND+sKGxDpWF53y3fFrKjukG7sIkd7k/RHtYv5
  52.125 +mMuYx9O2gcG8mnzP+zk9YBjgbeow+Se0SdlSnRIGXLl0mk2CfJKZp5hd+sMXq+Gw
  52.126 +78MBCBNv0cfQCfBfhPFbm44oDUgotFQliEBU1ey5fOUjtEOPpvvQzAA4KRK4BMd6
  52.127 +RHnJI657X9ffWiX900IggFYIC+yCTaKmm9LVMgPZ5KS/C+MdvZlkWzH8jv7gKFHP
  52.128 +1JV1c//vSuxq0khtAIkffl0KxLQBHoov8LcFsADafhnYUZFXASOsZOdv1sp5HqLr
  52.129 +kJmOk28sw0+6HrVXa4PItghG5jOVG1CgWaCCtC24zQj5zhXYfmh/aGIdBf1vPe9b
  52.130 +Zi5tJqJFwNBceGW3kZI=
  52.131 +=jOL5
  52.132 +-----END PGP PRIVATE KEY BLOCK-----
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/test/test_keys/priv/inquisitor-0xA4728718_renewed_priv.asc	Wed Nov 21 08:35:41 2018 +0100
    53.3 @@ -0,0 +1,129 @@
    53.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    53.5 +
    53.6 +lQVYBEdLUwABDAC2bTz7s8V9CDu/K3PtSXDvNCtx+84tdQEoNnmzQh9bkdnHWIzO
    53.7 +cscoO/YcJIQFJJ7WWdCudLLj+qaHS1t2EomW8ZRYe/HdIcIW/qO0ydGDShiJxEZN
    53.8 +4ZrNPz+BfEAhatbsN46z7DyzZjGHPPdIdLic2QAuDbv/z2/11ABDYa58vZINOp1r
    53.9 +pkmytOJps92K8hpY+PmfWTdNSWaNTCiQoel0MyyV/AgNLv/HUJRlN5QvqCQWqcAN
   53.10 +lHE5JmVZQK9wzlzs8T8pnoJJRPMG3GeiiMWMXjPUI01DdX+Fv69wkFavUOOV/JND
   53.11 +0nKl42xqajbkDL+Hc9veNlR4+hVykdVOlFgEY3x37wiI3gklHGoRZmex4MOL9+oB
   53.12 +LEiOARhtduG1w3bukOphhBfc1W4We12WIblKWfzRr/YhIgiNCD5rCL8kvcaFyKUe
   53.13 +3a9BQWayRewPmY8IdxcUHoKwhNS5a+52Aqgd/1ki+VvWRX3uTVAZA0rIiECGTioQ
   53.14 +MkSHr1F00bZ+1QEAEQEAAQAL/is5gfgf1fz0vPdki+DfBG/hPCQTZnx121LUaYy0
   53.15 +b6qqSeBGloJ6Rr89SejMLC3tyeb/PAeCJjsHknq/O8ojxU8rKZu3rozXaV46cr6t
   53.16 +DUQfA+Zsx72/ZYcZY+pB7w4b+xXYaisuoAlf/v9MzkjwQygC8Nx4q6GG3L/yPie5
   53.17 +Fvd+kYMp7s/phE/gNT+Xezhneh+3yqnboVNiP3beY0Q14ROD5p4ZLC03hCqNaMP8
   53.18 +4dNS804dZaCyGgvREbWOsqM3ef0rljKfTSLZ9eFoLU0CMw/dw764IXWnjEo4bkl6
   53.19 +ialKwjSyaPIShgjSMx/IcH2iYI6GcEXkzl6O+j8cn2Q62lEuQijQ0T1jn/Gq36kT
   53.20 +hRPcx3lumR9Dsc1CHyIuHZFWUy8+ZRoVKDSvv4EjjZN8YsqB7wLLvT5/yMI1wnku
   53.21 +ITPCn/TMMGNCzKuiIucC7T/Kj3yDsotpFX6RTRiq1H+Z3iN+Ml1Ih+D7CoJMUkBS
   53.22 +42JfwYhCLDhC6JCk2HAUQpzTywYAwUFFl3u8oR8PA/EYwBiS/UUm616hMTAOOM4u
   53.23 +uF9Iai75BW4mfLGd1mmqZknIAKmYYNN9A8IjvkA81/Y5wdyBo/oLOhQuewnou7Uf
   53.24 +zJ9R7IY8LWToc0LgOBjvxL3ucxYz1Ub1YJiaQxw9sm8L97H+HZCER0k3pDXNWvhB
   53.25 +yT7jrRlvOLIpU/EOTRx2SbWWyUXCM+b5MNzmk4sDxH/reIhhgbqfEjV7FeOAnaiB
   53.26 +F2zTz7JtEz94gS1KOXYJFrlMpzRrBgDxp/TrHBuJhAmPXn/WCnqVnNP1klAzD7l2
   53.27 +ecp6gSysNhyGkoC3vT84gL2Sz3VkAwd7tbb5CKQKqw/Bea4EJ2Ex4z4AopwH7c5X
   53.28 +LFTYWxFDlGNxf68Np7XiuMOOCTtpUkKR8oCY/TEPNdfnsdU3XiT7kJxo9Kt51Mra
   53.29 +YeCKiJeF2wd2KwezTAy9M0PCIDVx/CP05ZhAfV099Yb4CfjPsMQHUEcJOYBmY1VR
   53.30 +pveqg/9H2XZvrKcdsZ6+EsEFLyCzl0MGAJRBb5J6Y/il3aYw5Vijv7hSg5zsgMRx
   53.31 +JqqmOCLG+iDPhkuN4HAZgpED1zMA5SRgYjNKk3sFy6lkMHFi4hzi7gpXhksVSIQD
   53.32 +rZieSXOxCLzRp2lyJR03w/q2XbkcOYX8aHbtZHzmNvXHmqLo+PtE0gvHT6VFcuoX
   53.33 +FVNcN4yjMTGMmTNX+BHIUVYRmSOvqEx9QaHcDtJfCe55VwVvW1shu2c22QHnxF+H
   53.34 +eDSUEM61YphvIvB+tfEj60sqwU6BWZnYW9M2tDBMYWR5IENsYWlyZSBUcmV2ZWx5
   53.35 +YW4gPGlucXVpc2l0b3JAZGFydGhtYW1hLm9yZz6JAdQEEwEIAD4CGwMFCwkIBwIG
   53.36 +FQoJCAsCBBYCAwECHgECF4AWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCW8RgGwUJ
   53.37 +J0UQGwAKCRAhupd8pHKHGLCGC/49L1ei9NsL2QyqS7azyaJhjefcGJ1sxu3+AiVS
   53.38 +iy3Uwb6V1tuchtUeITqRmXChbFX8ricSsQ0QiA3Ess9xvaY+0lzP4+pRZl7NAe7m
   53.39 +yDmxZ+DyQfGG1Oyug/4N5Rl+Yru7WGu8Tt9wcjkjw6gZbajKp+kqv2Ab1V+3cLx+
   53.40 +BO6ifaIZ2JXRPiLSiB1WNI6lJVjEbQwZoBzvqDieG6HULVq/aWSYYPLvrsEhAYMC
   53.41 +IoaT9PqU8C0va2FSpOMB2Fu2wfcMZ/E7H5DCDNX2Dw6302UftQjVIrl+aZ3m92VK
   53.42 +Fri5HaJMGV2VtxLEtc9N+Z8aViu7aM+crriHhzUlLfpFfcvYdCbtQagy/S0ZbXPR
   53.43 +zo3ZEGz8FGW/SLzKbbo7ZeipgjEhKZyVWqL804kVic+1offMY42UMML6Kvvep/xj
   53.44 +H3IeVhQbmA4jah27VB+zQtfnmnzJUo9XKMwjyzRfmcUCotJ5fs1O13A6h7nzEGHf
   53.45 +TgEJI5rHJRxL4LXBn812fXyXv36dBVgER0tTAAEMAMW5zC5ogzpPKaIrnhLypB+I
   53.46 +7slHiF3kt8iGmgUePr9GVuRkLr2vWJz3+Tvd3L8UjXeNEdZ2z/fqxDD08pk3gY/f
   53.47 +/JhGQeNnvsZ4nsaVUnc3Xz640W6ufH+aJtgCW+Y+rvo0zLXZ+hlhcJ9FeroRODji
   53.48 +t5Pwu0tgBcjOpnPu/p1Vc+Yj145qw9HQR/sQ2tnj02m31/a8POf6efGRgIRhDMJ1
   53.49 +KeuVzLqsXEWJIOi651OOvtOG0tKOemxmm8cOqMqRBW7bVbSsqKcD0/7sQw6mprFW
   53.50 +YKp9WKKu+XM3sHTk2NZhKqAfyloZLnhgiC30LgQS9QMJdC4/QDfZY2srEKlod1tX
   53.51 +8Gj07E7P5PG/e6X+rjPKEoqJmTUxqjEAk8++yvPGQRncT8V9dEbpGU9zm7qmYdtZ
   53.52 +TjQFLHJ//mRcx2zqTSExoETg3IWgyt5e6bQypO+2xr5NC0Jf3Ubj7RhD6hHzPaSP
   53.53 +PyJ5ZxnyXAePsKPsDWJRVc2JYiMQTqBg9sCkZWccRQARAQABAAv8C8qN9NmKM9y7
   53.54 +Lp7bxST/qRrFJK81oGXOmPB/+FyqoMT80w9vYyP1DJ1UGWAcdS+wVQgOX4QD2HTB
   53.55 +YOsGmaEAAri4i0srTDioXZUdYNnQSmg8r5SddrSEm6ZxeRHA8bzcufKSn6ihW8ie
   53.56 +Cv19eWGkAO5yRKoHPVI7XhOGxSSkPfU13WxXQzi2N0mstTn21yYZOjV6tU3Z8vqS
   53.57 +sZd7+sj/1gvfJVuwUxSKxyHLmt1khKzfT+V7Jo/VGKhQ02DaK4RU2+u0JF6YM+mj
   53.58 +2FjjuqtYvtYVfMHESy/MkPdInNgddMdJRshwpvRxCELJtGYc6fonAHZKzcW7iZfL
   53.59 +ytKQ/kAET2GbJ3bmCHs8mEsrbGYNYipnX8G0M+SLxuECYL8ngfkMz02VRmZC0W3U
   53.60 +CfYg6+cfhymQnXJoRUPkiVjMA7zF57Z5Zqo9+QGGpy9wflU+7CD4uBMaZ71Oh1Lf
   53.61 +odVxL5oGph+IjvOErUIKCOUXsew9ZvxreJd/CTzB768mXheJs9lBBgDNsi3sGJP9
   53.62 +K7xrIxsulwWZbzr0T7o02PDkwyj8LuECwSvjvVqHRM+Xdw4GhaDVt7+cf0MoBxC4
   53.63 +dd7LYohP5wf2Bmp725gPuW/fdjq73OM/HHgzoZeRSyPFM0jcjM40nMAyTTyJDzID
   53.64 +Yyi1nU5qWd7o6STgfFnT0hslW+fs/h+mTD9/4MJh2g2xCgH3f3RHw04aSdPJI9At
   53.65 +rhenA/dp+sSa1H511B/tS+hpdW4uw5ooHfUqWAo0QjQSASP1/6lmYgUGAPYUofUK
   53.66 +A17OEdi+lqcFEpSuDp22d3EWt4doOde9bpshLb7olxEAa/+gyb5gufI0TS/TdHii
   53.67 +LlR6qhFCXOaY5b/ABgL5KuO14qOBEFcMPYm+MFRhG1PGUct3RW5WeMzQy3CIE+A3
   53.68 +nZP/8LaEJzjQNXBcS8ei2ID2k13VTn3KkMhgf7Gmw5xyxVF7o2JCFVVX0Iq9gcvi
   53.69 +ghPL3rrrOBotN/fJSEP3uIqEeCygqi4Gz0a5K0jy6Uir7s3n81SZDj+lQQX/U2lS
   53.70 +0YxQH3jxZwLNnC07CcZh+uSYxALb8SplVkm6B1rU3lsnmLf4I9h7JwIIK6tiBFiE
   53.71 +o44MrH9A9IEKUCIGqgfwcFJwItlqHTd3rkHKy/FOoVpa2cwyX5h+NbqNCjCGZgrl
   53.72 +c369/9L1c+qlz0Zush5Q/18hTwFjFrWqyBTil0Qh6qcsHQRVcSWm9SJQIwDA3i1q
   53.73 +BRlpoCih2r/ilZcc3M52vgCrmqMfRRkhzyiuEQE3kH4drMY9VuHJwsZSnpfX3VmJ
   53.74 +AbwEGAEIACYCGwwWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCW8RgGwUJJ0UQGwAK
   53.75 +CRAhupd8pHKHGOgsDACa9dHpb9g8IMqwamjSqTPdp9VtaQgs8b999XK56D2A6yJE
   53.76 +1aMJAt9jaO9LPau4J2PPU6qMT/+nmOS7cbA6Os7N6OW2ZvJdcIZvr4HkasXH9hE/
   53.77 +hT3yONi+pxd/1OMOLdGsxXVIZAezvaMznKV0LXKCwaTDNus6N5eKm9ZxyAHm7cdg
   53.78 +QoATO31PkeNxKqtDpfgNWx5MoiCWHWqDtFTdbB+ACp+PDH/B4291/O858l70r9kv
   53.79 +VEDOUW2eaLVi8X7ahtp3ujj/xROMSMIm27uB4g22kRx46c5hInc2xuOzcnPBZewB
   53.80 +T2fZ1wC/8maLwErsl1e1F48A8mAFD2SpIZjSvGtaLSDr9sU0oXsodvgbUPsuZFb2
   53.81 +YUv5AVMJUZfLk7NE49fX7Q4I/yvyP9qDyJ0ADymIpKKc7BGfqtDbyx/ogBqCB7gQ
   53.82 +EAnUUN/s9deA3YktV0kxV5/yOQ7GwohwaiJP4toWOSufKF4xdGTL8IACc2cAJPy+
   53.83 +DTMafoww2NSoz0nVZPidBVgER0tTRwEMAMS1DPt9Y/bjUDIxBG7/1tN/5MdBeiU2
   53.84 +pvZVpIy34a2vNWFnUNUu7vPEUXoTu3ZJcQj8uBDzq3ikJ57O17gyFQYsIUbdJrVV
   53.85 +hsr4sh7mByR/fqq7G+CrJwzPtVcnszCilRnzK+3G/vYd4mW9vM8L58E4J8rc/Nlw
   53.86 +GUbqrKkbAP5oUNyRtUASgHgBnSnTWeGIbRVPjY6dt8TfpY9XEuh3ghs77jkyiknw
   53.87 +NTopYnaqeIDHQ/5BGmw1B0Fj1CbyJz+UiQ3QEpAvOmCrmE0hfyHiyhrpq+eewasL
   53.88 +4axBHLaFxYB5DyZ2ch+D4D4Nqbtxd5vWDR33yzgJT57WFrUrG9adyruxpfG9v6CR
   53.89 +UFkA+o9f+UI8E+Pr3s67rau1ZurZtjKuWgNt3yPE4Sb/JlwLTqK6F4QcXfDLbsav
   53.90 +YvuyX9juUhE63ApfOh3I0NAZIVt6u1/nRc9X8x2Ae8zLZbIhcswUd7IbzIgmqngq
   53.91 ++t5tw5fhQNaNUjvUGtNAdwltMu8FaJMYlQARAQABAAv9EOTNvyGXPsJqBk2AaHoP
   53.92 +fK2cu+IrN9v4PerADZfTSYPlLT7eydhUjFn9d2MPdAq9qvxtYINU5DEQ+Aoiq76d
   53.93 +YKDUoM3of6VfRLpULeQqk99hRQ95xvNcELUcCWau9IvaC1b/nFW9WuzZH0zK1Otc
   53.94 +VZNZk4okKxZ+DUGlX4aisLbLzw2yh9Su9N+KnGd67iw11iE1cpyoBkAA640aYh21
   53.95 +blpYzM/C4bPAFoUsYC2m2MSEWedEeiuZumt08n1UkpjSf+J+czamLAxOda09hhwl
   53.96 +TYjRSDRydH15JAXZFhlnuNKTNwVh4Bi7gRRI8+v1ZxQufVvnOPmhljAUOnDjEK76
   53.97 +5T9LarVEttGOBWYY6acZvE2Rx+Ax5bjsoD7+3P1O4f1XoapBJsJIYcb1xGLQxikG
   53.98 +n7Zf5es8+7HPgicQE/mv59ya91UaYeD7dSQrU/zzsr1zBRM8DTOar/xVCHJBCXNi
   53.99 +PAqFuYM/tJ4otde2MbGdEpYWHDFnLDrZ7emLyxOJuZcnBgDUJaOnNN4fD8/S9S/s
  53.100 +hM0a1iu4h58rbsDuOhiUDI/Yxql6xbZGDiHC8owgf7gSjb42KBh1eDX8ioZe7bUF
  53.101 +MPHJzfHw0Jsz8eyXtI4CQqmGNpeB9t3z5WoT/KPNMgo3ay0ZiiiYsvZ4SVR81/jD
  53.102 +9PM1MAvdsNnHN0eHv/QImoP8+4wbfCxxa+2pP/jLiDa+j2TvCRR+U1knsL5o7dya
  53.103 +7IrzjK/qQQjQ9TrGWWCvRt4HAz0f3fJyIYZJRwq+IVWvB8sGAO1eXunWbyU6bUMh
  53.104 +OagLWZhY3s9WsJEgv8u9sWGO+zMFGx62Q8DH1gEKJitbNURNzvu3BShdLb7fow1Z
  53.105 +MPxnhblHB7bwq7V/IHz0iX1apm3YaJmhDWlvBmNGRucopOU3Ow72kvPMEkuWb0Wr
  53.106 +Zxv57zgRbfcI5McgFrlxAxZ+yqpohwnVFJZmmvcEb83QX/CLfVYBiwb71kZ0GDUE
  53.107 +Tt2bjnBuPQWNtAjG2S2BbgK934nIxYY7RmRZWxmjObJAb4iVHwX/T8s55lWNjKam
  53.108 +jIHSdjKes8nXe3cDk51GWBu91IQpnwG5A8wGJJb/rZuIEKs1h3Fr06q4dVB6my6P
  53.109 +qlTdT5WL5Kqa7arlHQHbnkGpPhUi5K7od1KnHa1HjQHGqEVvlAAOQRZdp2bdzOO8
  53.110 +UbL6POh6P8QJzGBog/lTWxSsR9CvShD/3+MJe9hqSYtwo3DWHMjYSup68GJhF8qz
  53.111 +8lPf5s6+MfIReaBxogj/ELhvAjLDbJJcdezU5/e47LkEnxc9+BP15TmJA3IEGAEI
  53.112 +ACYCGwIWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCW8RgGwUJJ0UP1AHAwPQgBBkB
  53.113 +CAAdFiEE4SdR5geSmXk6WVtt4fnZwIDBC4EFAkdLU0cACgkQ4fnZwIDBC4GtygwA
  53.114 +rFgZ445cl8Nq7Ste/I3E8epNiAsmTNaKmh+LOqOu4/nbDu95/8WJUc4eHFE1oIyA
  53.115 +oWGIE3MzsZU2WsFxeaDCRSjs8uEL4NWBKvSCQB0VDTUhz8SN/IrOfFLj2fG7OIV8
  53.116 +4zrcGwGjsw1AHt6SUNGx/PY4uAMH9ITey+/kDfVAFN1hCkFk1ksWFgOj4lCxkrH5
  53.117 +gyxeiujusEZw3VoXiiDJdhxo6b4Mmn5nBlQiLf/vCBEd1M5TCvs8FPGU0uoEbRF0
  53.118 +69vaIqPFCYJjyRzhJ7XcI+5C8Qpvgs6OUexGn43YY/RvpGvtc8mj1hsEDrGjggKu
  53.119 +1pcKQl3qoy7H3o/u3pJaHhli8wY/Zc54csZ7w6JmOjpwQ6xi91q+Y5kzRf4DzXi4
  53.120 +1qUTNyXTbtDw21wZbSgGf8LcA4opHr19HPAF9lNjUTwb2Rg073GP4YEXC52OzuX8
  53.121 +NJfvWDVdBaQylc2fxKg4OHXlSgh+ORHYhzwt2mBiVNixpqk7Eui6UWbJMmfptHLT
  53.122 +CRAhupd8pHKHGMl6C/4/yRB2wZ+xUOpSW3UWJnWur2TDnkwPCPioSEt1k+G5F/CG
  53.123 +YkIG6209FYVTpfcsBXKekEUiMuKGq+A2mKKsDJ72ahBP0gAuEpz//cKBS0T07Man
  53.124 +wc+nTFcuPgJfZxBgCor7gmj4geWHjG6KrwOwk33cI5spY9PdB48u/ogsJvWT9ruQ
  53.125 +xvVPbzJ6BLuRSbNN1C/aXTATbE4yXqwmqfigx46f6KkApwC5M/xGvI8xYLlv4hOt
  53.126 +xzRcyEvWge3cws3Zc/i2s/Rq52RSGX/PuopHXLztGPuOmUqzfIepiMCrKSXwALmq
  53.127 +J5F8JTdiXGy9WV3YfVTnqgG2JUHoxpL2QcSaXHjYlgKRgK75RwzaMSi/GaMxwpqu
  53.128 +Qhg5eTuNn1RW9GtXrtdOwGiB+tiAg+w7/GFtr+kKzNKpDAkCHKpjh66oouA199s2
  53.129 +S+B1bhfcRhUyCJKQxfcP4k1kOjOiqMJNYVnEBNo/6j1TXPU4sBxUaJ9xG2LeAlTb
  53.130 +QbzKx/SKOyLA+parX5g=
  53.131 +=vvV7
  53.132 +-----END PGP PRIVATE KEY BLOCK-----
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/test/test_keys/priv/inquisitor-0xA4728718_subkeys_expired.priv.asc	Wed Nov 21 08:35:41 2018 +0100
    54.3 @@ -0,0 +1,109 @@
    54.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    54.5 +
    54.6 +lQGVBEdLUwABDAC2bTz7s8V9CDu/K3PtSXDvNCtx+84tdQEoNnmzQh9bkdnHWIzO
    54.7 +cscoO/YcJIQFJJ7WWdCudLLj+qaHS1t2EomW8ZRYe/HdIcIW/qO0ydGDShiJxEZN
    54.8 +4ZrNPz+BfEAhatbsN46z7DyzZjGHPPdIdLic2QAuDbv/z2/11ABDYa58vZINOp1r
    54.9 +pkmytOJps92K8hpY+PmfWTdNSWaNTCiQoel0MyyV/AgNLv/HUJRlN5QvqCQWqcAN
   54.10 +lHE5JmVZQK9wzlzs8T8pnoJJRPMG3GeiiMWMXjPUI01DdX+Fv69wkFavUOOV/JND
   54.11 +0nKl42xqajbkDL+Hc9veNlR4+hVykdVOlFgEY3x37wiI3gklHGoRZmex4MOL9+oB
   54.12 +LEiOARhtduG1w3bukOphhBfc1W4We12WIblKWfzRr/YhIgiNCD5rCL8kvcaFyKUe
   54.13 +3a9BQWayRewPmY8IdxcUHoKwhNS5a+52Aqgd/1ki+VvWRX3uTVAZA0rIiECGTioQ
   54.14 +MkSHr1F00bZ+1QEAEQEAAf8AZQBHTlUBtDBMYWR5IENsYWlyZSBUcmV2ZWx5YW4g
   54.15 +PGlucXVpc2l0b3JAZGFydGhtYW1hLm9yZz6JAdQEEwEIAD4WIQSOjSOBrgZqvh/u
   54.16 +UJghupd8pHKHGAUCR0tTAAIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIX
   54.17 +gAAKCRAhupd8pHKHGOJxC/9qpPHanMKIJOPxLNr5Yp7AZhcOlzX7IXlp1hwtm6MP
   54.18 +XMRz76wDeDjQSlDUo80eOIaDmq6Q3yHL3XbaDBXoHsj5HO2F1oaQnNgByq6rloOF
   54.19 +jjQ4zcPp7Z6U3vKP++cE1CTTA/wZKsW5EDg2opd5BCq0MYj2H7KoisXLpM6Nk0zD
   54.20 +WeZrdmewXvhNmlnf2r3e7N6FS3cReWiSQvFxVcNHYK3QEAb3JZe172kpf/koPQA2
   54.21 +4hIyjY+JjTLGFQ74WPSsXCo423s6Yjj80FtJOSwJQ+JgUfgKB6mv4adLDEN2Lsby
   54.22 +lumci9rv7VF3UWUWwgo4Fhwxr6O3bH7eTc4EjjWexB14hovRGmgNJBiyzAKsi2QB
   54.23 +Ad+UY5Y5xaqh+Ed4zMpvs5HobuEPPf31sUVkt9J7HIbKPeDJkowQ8UO8AeS1fEy+
   54.24 +iacwlH/3Ve07xUyGDztnS/vQ6MBzIZm12bvedXALOqdXr61e+rx05Fww/Q0Fx98f
   54.25 +BWUDan5vXKCvNSx3yzBodcedBVgER0tTAAEMAMW5zC5ogzpPKaIrnhLypB+I7slH
   54.26 +iF3kt8iGmgUePr9GVuRkLr2vWJz3+Tvd3L8UjXeNEdZ2z/fqxDD08pk3gY/f/JhG
   54.27 +QeNnvsZ4nsaVUnc3Xz640W6ufH+aJtgCW+Y+rvo0zLXZ+hlhcJ9FeroRODjit5Pw
   54.28 +u0tgBcjOpnPu/p1Vc+Yj145qw9HQR/sQ2tnj02m31/a8POf6efGRgIRhDMJ1KeuV
   54.29 +zLqsXEWJIOi651OOvtOG0tKOemxmm8cOqMqRBW7bVbSsqKcD0/7sQw6mprFWYKp9
   54.30 +WKKu+XM3sHTk2NZhKqAfyloZLnhgiC30LgQS9QMJdC4/QDfZY2srEKlod1tX8Gj0
   54.31 +7E7P5PG/e6X+rjPKEoqJmTUxqjEAk8++yvPGQRncT8V9dEbpGU9zm7qmYdtZTjQF
   54.32 +LHJ//mRcx2zqTSExoETg3IWgyt5e6bQypO+2xr5NC0Jf3Ubj7RhD6hHzPaSPPyJ5
   54.33 +ZxnyXAePsKPsDWJRVc2JYiMQTqBg9sCkZWccRQARAQABAAv8C8qN9NmKM9y7Lp7b
   54.34 +xST/qRrFJK81oGXOmPB/+FyqoMT80w9vYyP1DJ1UGWAcdS+wVQgOX4QD2HTBYOsG
   54.35 +maEAAri4i0srTDioXZUdYNnQSmg8r5SddrSEm6ZxeRHA8bzcufKSn6ihW8ieCv19
   54.36 +eWGkAO5yRKoHPVI7XhOGxSSkPfU13WxXQzi2N0mstTn21yYZOjV6tU3Z8vqSsZd7
   54.37 ++sj/1gvfJVuwUxSKxyHLmt1khKzfT+V7Jo/VGKhQ02DaK4RU2+u0JF6YM+mj2Fjj
   54.38 +uqtYvtYVfMHESy/MkPdInNgddMdJRshwpvRxCELJtGYc6fonAHZKzcW7iZfLytKQ
   54.39 +/kAET2GbJ3bmCHs8mEsrbGYNYipnX8G0M+SLxuECYL8ngfkMz02VRmZC0W3UCfYg
   54.40 +6+cfhymQnXJoRUPkiVjMA7zF57Z5Zqo9+QGGpy9wflU+7CD4uBMaZ71Oh1LfodVx
   54.41 +L5oGph+IjvOErUIKCOUXsew9ZvxreJd/CTzB768mXheJs9lBBgDNsi3sGJP9K7xr
   54.42 +IxsulwWZbzr0T7o02PDkwyj8LuECwSvjvVqHRM+Xdw4GhaDVt7+cf0MoBxC4dd7L
   54.43 +YohP5wf2Bmp725gPuW/fdjq73OM/HHgzoZeRSyPFM0jcjM40nMAyTTyJDzIDYyi1
   54.44 +nU5qWd7o6STgfFnT0hslW+fs/h+mTD9/4MJh2g2xCgH3f3RHw04aSdPJI9Atrhen
   54.45 +A/dp+sSa1H511B/tS+hpdW4uw5ooHfUqWAo0QjQSASP1/6lmYgUGAPYUofUKA17O
   54.46 +Edi+lqcFEpSuDp22d3EWt4doOde9bpshLb7olxEAa/+gyb5gufI0TS/TdHiiLlR6
   54.47 +qhFCXOaY5b/ABgL5KuO14qOBEFcMPYm+MFRhG1PGUct3RW5WeMzQy3CIE+A3nZP/
   54.48 +8LaEJzjQNXBcS8ei2ID2k13VTn3KkMhgf7Gmw5xyxVF7o2JCFVVX0Iq9gcvighPL
   54.49 +3rrrOBotN/fJSEP3uIqEeCygqi4Gz0a5K0jy6Uir7s3n81SZDj+lQQX/U2lS0YxQ
   54.50 +H3jxZwLNnC07CcZh+uSYxALb8SplVkm6B1rU3lsnmLf4I9h7JwIIK6tiBFiEo44M
   54.51 +rH9A9IEKUCIGqgfwcFJwItlqHTd3rkHKy/FOoVpa2cwyX5h+NbqNCjCGZgrlc369
   54.52 +/9L1c+qlz0Zush5Q/18hTwFjFrWqyBTil0Qh6qcsHQRVcSWm9SJQIwDA3i1qBRlp
   54.53 +oCih2r/ilZcc3M52vgCrmqMfRRkhzyiuEQE3kH4drMY9VuHJwsZSnpfX3VmJAbwE
   54.54 +GAEIACYWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCR0tTAAIbDAUJA8JnAAAKCRAh
   54.55 +upd8pHKHGOjDC/4xEU1ewAMks7sMoCsgaYu0i7fyYo9FooItRTp1qUC3zJIhQV9W
   54.56 +o7e0+1SX8ZAVSbjNIVTQC3P2SElTdtifejJdZa76KcCyMzbg6hI9ickU1il6LGjP
   54.57 +r5xXxrWUYGcS21XFgt7yk8L2FYzwMcUWG/ailn31zj3w9UGaEHK82+WasbknYmob
   54.58 +xQNcjbp1QZGatSUQHfA+yTBlxyDyvUR2riTUOhx6jX6HDQNiOauHZi0zRP0FnMk7
   54.59 +tHa4r+AQ0g/M4+t8aCsClj5ws7AiM9jU7YaX4VIC3r/H+pJGEmw6RNqGxHa/MM39
   54.60 +9A9HWyrpP/LdMChxUGkUDc8VIs2XGw5j3VMNXcEYJhb4PDTqIJSaJ2SY/HxUVzCp
   54.61 +1re+HTPBUAYogWpD2dQdtrs8yqdNf4+OEZZOHYmErUsfCLFTh0qAD5WkL2CjSl2K
   54.62 +lL7y+s9YW5fHZSycu6/oLpUWccIAl3A1h/dLaO3Ukh2rDkJsjD1X5hLas96vWGub
   54.63 +8+IbexOlWL9VX02dBVgER0tTRwEMAMS1DPt9Y/bjUDIxBG7/1tN/5MdBeiU2pvZV
   54.64 +pIy34a2vNWFnUNUu7vPEUXoTu3ZJcQj8uBDzq3ikJ57O17gyFQYsIUbdJrVVhsr4
   54.65 +sh7mByR/fqq7G+CrJwzPtVcnszCilRnzK+3G/vYd4mW9vM8L58E4J8rc/NlwGUbq
   54.66 +rKkbAP5oUNyRtUASgHgBnSnTWeGIbRVPjY6dt8TfpY9XEuh3ghs77jkyiknwNTop
   54.67 +YnaqeIDHQ/5BGmw1B0Fj1CbyJz+UiQ3QEpAvOmCrmE0hfyHiyhrpq+eewasL4axB
   54.68 +HLaFxYB5DyZ2ch+D4D4Nqbtxd5vWDR33yzgJT57WFrUrG9adyruxpfG9v6CRUFkA
   54.69 ++o9f+UI8E+Pr3s67rau1ZurZtjKuWgNt3yPE4Sb/JlwLTqK6F4QcXfDLbsavYvuy
   54.70 +X9juUhE63ApfOh3I0NAZIVt6u1/nRc9X8x2Ae8zLZbIhcswUd7IbzIgmqngq+t5t
   54.71 +w5fhQNaNUjvUGtNAdwltMu8FaJMYlQARAQABAAv9EOTNvyGXPsJqBk2AaHoPfK2c
   54.72 +u+IrN9v4PerADZfTSYPlLT7eydhUjFn9d2MPdAq9qvxtYINU5DEQ+Aoiq76dYKDU
   54.73 +oM3of6VfRLpULeQqk99hRQ95xvNcELUcCWau9IvaC1b/nFW9WuzZH0zK1OtcVZNZ
   54.74 +k4okKxZ+DUGlX4aisLbLzw2yh9Su9N+KnGd67iw11iE1cpyoBkAA640aYh21blpY
   54.75 +zM/C4bPAFoUsYC2m2MSEWedEeiuZumt08n1UkpjSf+J+czamLAxOda09hhwlTYjR
   54.76 +SDRydH15JAXZFhlnuNKTNwVh4Bi7gRRI8+v1ZxQufVvnOPmhljAUOnDjEK765T9L
   54.77 +arVEttGOBWYY6acZvE2Rx+Ax5bjsoD7+3P1O4f1XoapBJsJIYcb1xGLQxikGn7Zf
   54.78 +5es8+7HPgicQE/mv59ya91UaYeD7dSQrU/zzsr1zBRM8DTOar/xVCHJBCXNiPAqF
   54.79 +uYM/tJ4otde2MbGdEpYWHDFnLDrZ7emLyxOJuZcnBgDUJaOnNN4fD8/S9S/shM0a
   54.80 +1iu4h58rbsDuOhiUDI/Yxql6xbZGDiHC8owgf7gSjb42KBh1eDX8ioZe7bUFMPHJ
   54.81 +zfHw0Jsz8eyXtI4CQqmGNpeB9t3z5WoT/KPNMgo3ay0ZiiiYsvZ4SVR81/jD9PM1
   54.82 +MAvdsNnHN0eHv/QImoP8+4wbfCxxa+2pP/jLiDa+j2TvCRR+U1knsL5o7dya7Irz
   54.83 +jK/qQQjQ9TrGWWCvRt4HAz0f3fJyIYZJRwq+IVWvB8sGAO1eXunWbyU6bUMhOagL
   54.84 +WZhY3s9WsJEgv8u9sWGO+zMFGx62Q8DH1gEKJitbNURNzvu3BShdLb7fow1ZMPxn
   54.85 +hblHB7bwq7V/IHz0iX1apm3YaJmhDWlvBmNGRucopOU3Ow72kvPMEkuWb0WrZxv5
   54.86 +7zgRbfcI5McgFrlxAxZ+yqpohwnVFJZmmvcEb83QX/CLfVYBiwb71kZ0GDUETt2b
   54.87 +jnBuPQWNtAjG2S2BbgK934nIxYY7RmRZWxmjObJAb4iVHwX/T8s55lWNjKamjIHS
   54.88 +djKes8nXe3cDk51GWBu91IQpnwG5A8wGJJb/rZuIEKs1h3Fr06q4dVB6my6PqlTd
   54.89 +T5WL5Kqa7arlHQHbnkGpPhUi5K7od1KnHa1HjQHGqEVvlAAOQRZdp2bdzOO8UbL6
   54.90 +POh6P8QJzGBog/lTWxSsR9CvShD/3+MJe9hqSYtwo3DWHMjYSup68GJhF8qz8lPf
   54.91 +5s6+MfIReaBxogj/ELhvAjLDbJJcdezU5/e47LkEnxc9+BP15TmJA3IEGAEIACYW
   54.92 +IQSOjSOBrgZqvh/uUJghupd8pHKHGAUCR0tTRwIbAgUJAeEzgAHACRAhupd8pHKH
   54.93 +GMD0IAQZAQgAHRYhBOEnUeYHkpl5OllbbeH52cCAwQuBBQJHS1NHAAoJEOH52cCA
   54.94 +wQuBrcoMAKxYGeOOXJfDau0rXvyNxPHqTYgLJkzWipofizqjruP52w7vef/FiVHO
   54.95 +HhxRNaCMgKFhiBNzM7GVNlrBcXmgwkUo7PLhC+DVgSr0gkAdFQ01Ic/EjfyKznxS
   54.96 +49nxuziFfOM63BsBo7MNQB7eklDRsfz2OLgDB/SE3svv5A31QBTdYQpBZNZLFhYD
   54.97 +o+JQsZKx+YMsXoro7rBGcN1aF4ogyXYcaOm+DJp+ZwZUIi3/7wgRHdTOUwr7PBTx
   54.98 +lNLqBG0RdOvb2iKjxQmCY8kc4Se13CPuQvEKb4LOjlHsRp+N2GP0b6Rr7XPJo9Yb
   54.99 +BA6xo4ICrtaXCkJd6qMux96P7t6SWh4ZYvMGP2XOeHLGe8OiZjo6cEOsYvdavmOZ
  54.100 +M0X+A814uNalEzcl027Q8NtcGW0oBn/C3AOKKR69fRzwBfZTY1E8G9kYNO9xj+GB
  54.101 +Fwudjs7l/DSX71g1XQWkMpXNn8SoODh15UoIfjkR2Ic8LdpgYlTYsaapOxLoulFm
  54.102 +yTJn6bRy028+C/9SwTIAmlGRP7rneycRdCOUmqN7dQJ5pcU6M9FQiqyLr4pvoED7
  54.103 +ambIC438ZelwkacPu0Uc+KFVqOUGwng5Ldz62smHnFwVn1BrasjhP+ilN3c9iSHr
  54.104 +8flQeVRU288ywKWXKV/VlHkND+sKGxDpWF53y3fFrKjukG7sIkd7k/RHtYv5mMuY
  54.105 +x9O2gcG8mnzP+zk9YBjgbeow+Se0SdlSnRIGXLl0mk2CfJKZp5hd+sMXq+Gw78MB
  54.106 +CBNv0cfQCfBfhPFbm44oDUgotFQliEBU1ey5fOUjtEOPpvvQzAA4KRK4BMd6RHnJ
  54.107 +I657X9ffWiX900IggFYIC+yCTaKmm9LVMgPZ5KS/C+MdvZlkWzH8jv7gKFHP1JV1
  54.108 +c//vSuxq0khtAIkffl0KxLQBHoov8LcFsADafhnYUZFXASOsZOdv1sp5HqLrkJmO
  54.109 +k28sw0+6HrVXa4PItghG5jOVG1CgWaCCtC24zQj5zhXYfmh/aGIdBf1vPe9bZi5t
  54.110 +JqJFwNBceGW3kZI=
  54.111 +=9wgb
  54.112 +-----END PGP PRIVATE KEY BLOCK-----
    55.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.2 +++ b/test/test_keys/priv/master_key_test_certify_extended_priv.asc	Wed Nov 21 08:35:41 2018 +0100
    55.3 @@ -0,0 +1,252 @@
    55.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    55.5 +
    55.6 +lQVYBFgN2wQBDADlhIEuyCGBuRDUGBJsNJuhiF1PmttmKTfZH/y684FrdF2tD1P5
    55.7 +wEsU6wGE1oE/1eoBt4GidrUhyu5F/bvWAgrCR0Hh2+FWIFGWvnmpbpBxool58KmR
    55.8 +6jBkZ2enP92RkDU8YYPdryALvuEKB8D+pCpMHkWynU3DRt56//Ebq802kUuAJUA0
    55.9 +wQInSePni68nMSYKyysGolTT+7m4nEOtPwyid2hcVjGycm4bAEf1x5+3pJSEROQ2
   55.10 +yBrcnL9H37bhceXiXPI63LmesveiPk4zLNK68zKkYVDaRTRgdQEviCppvRF2a4Hc
   55.11 +8StZfRr7tWrnGIdJYX37qlynxzUqDVBJ+61D4068v3SYd4E9OIky+1bvwCgF1/YO
   55.12 +JPlfyUHrYRa6q/G1cxNr/EWQj+Vpz6u5DmnQe4UctKmVaItE148QabQReEc+3y01
   55.13 +6ggOng8WXFZde8rQRDNsLbuHS4XJWWo+6YjOdk0xAm87+eeDR5GuIpiFwYhtSd6V
   55.14 +seYSBLwWmED0C8EAEQEAAQAL/i33+f+qqbtXm50/LQFrD/isXTQCagruGndsRqwS
   55.15 +9UrWRaTRuxn8f40y/FzksYJdj77ESDyH1gNsp4hxJ1vXkNwUdYeNCHa9hlnQ0IE0
   55.16 +2c1Ipow7vVqyMvsJEuOWkQQEhAUR6t1No/d2RZBCuU7HBom0TnVVuCtyWED+XgYS
   55.17 +xMk3FI4X5+Io/gtsay8G9Q++ckYbJwTvIlpKwonNEmjyhc9MZySHRvDcplzWE5OQ
   55.18 +ZdbcKbrMKYEnVun0owL8NZ61ttodDTM5vHLU9ojAJeztaHIJJ1xikLnGxZ+7NOH6
   55.19 +UCEbdIueukktuvvwNUyPFuPpxz9K2uGTiKwe8t8X4RDNtg1whMFCHTxPmKafiMLq
   55.20 +yHiM+EjedGUSw2K6rb9GKrzUd6ouR2d6lCIL5DQMa8XhMzcjQSQGd4HmilWenBTu
   55.21 +Xfoz4GQn5zbgzcj/XiD9cGAd08zz2K+qbjPIvjD+X+hAvoXQMXIYmMKed/1UO04I
   55.22 +h62dgE9WxCrDpcXNzF7xib4MIQYA7Iy1XsefhZgimXnhGwiQKniRg166LDK7Gzvb
   55.23 +YzVF0ahcsJxta8bV42tAZVY9NPWZ6cX1U0W/C2/rmtDiEZIBrjlqdUs24Ju8kvUy
   55.24 +BCJleVlnVe7fQllON7xxnZJmtd/rFl7ug/7t5a6XMBvBr0+CRN41351jzXs4a3gS
   55.25 +U6gsKNRuRewufluLu14B0fivJTZTsnyfUhGEOqlX84/MfQLxKzfw+yEraGBL8x2w
   55.26 +E+f3HT6zd3kq7C7y45JX6+YwatcdBgD4Y8YeTBuHvSaaP5h81J7xVxE0KeyuyLlZ
   55.27 +Larxg0JMkoJQ9Z7C2ELIlZgG+eOkUKjHcOVyKnO5cn6bjCgmuke0la66O7/95eQj
   55.28 +m9vB6TiLocDYqG44DiB1hAwkEnEU7BRgyUx2rQkYmuTUs+DxlOl9Nj+wZuThq6HL
   55.29 +ldRG6I8JLKHHDdgB3Rwjj8xab7f2WKh7wNZiNihvBNO8MC+XNwI7UPEXxBxADaPq
   55.30 +G7+fYZCN+S3g9voUAMZLq842DFn0UfUF/R8gB1AFd0GZJTJ5dfGPTOEvXOLR5Fee
   55.31 +58KBvvvZ6YOAU12BTq8H4Xd2ITxxkx9HGNkQe4CdXxvj6ikOrUQaSW8vTvhgkF/B
   55.32 ++K8CCTtzZ90PYS4q/yAQVxsuBjysSsNKtQ3NODt/t0HYvrY67zkXUhBMCGiR9N+X
   55.33 +eWHlSjRYJ5pf4/hEIEPSvebC+meX349vQ2UhAUjGs8X5e6xIBt+7SfBaut2P7XzR
   55.34 +wyox5Sp4X9C+Ls8gtyJnDVejU07NwG5HMOHbtDdNYXN0ZXIgS2V5IFRlc3QgKEJv
   55.35 +Z3VzKSA8bWFzdGVyX2tleV90ZXN0QGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+AhsB
   55.36 +BQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecF
   55.37 +AlvQRD8FCSlabzsACgkQSHVZyzoHEecPJAv/TQUC8JrGlk2Zb5/BQFL5ey/AzEJW
   55.38 +dA7SikezzA0vImeUJoh3Un8y4uagQkYIJT18rErckn2ULlLwyT1/y4ro73N05BoO
   55.39 +zopzmoqhO+uLNq/yScA15NjC4uYzgI4x1d2mGTHB85O3eHBtHl1Tv5vJugV2zV4Y
   55.40 +KTR1yh70kcNjj4FPvqZxzIz2qtEXaxSvTvTnRVlCjol9XLDQ3+/oR3oOOVHmpqcE
   55.41 +JvElS6so7oNee8IOrUD08yHx2fDxpLuMKt7SAad8X6xGMaXTkVNWBvEbM4vTfkht
   55.42 +up3A7PogNW0J+oZVKsYTuj8dCH/Lm3pM4kosiujepCC9qAC1pi5nxbxEWv6xf5Fn
   55.43 +v7mpX5PjSBwLDAnWsiqpyOSl2ogGyX51jS9pIo9SCfnvh1yo0l8f/qQrUr1w6uAv
   55.44 +R2XsNWZptdzxdetTzoVwXgmR780Qifnntd30yPgC+LeRCPdO+i67zvxJZiAMshYh
   55.45 +OY72o2M3R/2nx/WvDsZbp7gjoDylPRnwN8LYnQVYBFgN20gBDAC1P5+TEhr+jfUS
   55.46 +mUlZyYH8j5xdLr+8BCQW6VYG6Fkf6Xh9Ij1fRJLhzBsFtPUTdaVqMGimTm7CjNMJ
   55.47 +VCUUabj+jD/qHZCsohN7TGdHIRcAMTags/3P6RkNwEl0bJ+BvG6FvtSIayoJIhM2
   55.48 +gha1k3NtVwWSrCAuiIwamLd6vMHlgAH71g1GvbCCCvOBWkq8y0mysa3uCixpu31D
   55.49 +9nlT2bx/pRiZHuXBa+DicBredFj4ZLI8/tbLH/ZTk94kkJpfqKa/K7qzpdayiTFL
   55.50 +G2JRq3yyzkelRXrY+tdEYFOxjq/WxEpKx8gNruKX+Js6tsAxVRxMhD/4IhKQKZ2c
   55.51 +wkvoNyavqHxhcqmvmkjLDvy1howPgHqYs2BbLcPQDFuAxKdQtmsr2bnPN3lAq0w1
   55.52 +JcX08osJhJKOfufIPGk3/92clDFXY8vaKCQzCMTp8+e8naiHKeJOb3xBgDRs36lz
   55.53 +kOG2juSKpV3+7TT+lXx7O9ykpYSK3Y3QGce3a1nXAkYTL2dk760AEQEAAQAL/AxV
   55.54 +4ITAQQloHJt/xpKPeK2kEdlJsDpEnIwupJs4abBr/GD6g+ty8v2JHaGyzNHej5Eo
   55.55 +QEcT+XfQ4SALvlui97iN+l+dqYCw+zBzZRKzOX8wL5lFBsDatXN5IxwDCeFo3gDI
   55.56 +7xVlwxOiDRAITzFbxV8ArYbA+OO8iVnaC6AVLqvG8tudQtljWZr60dMmPltBCVVZ
   55.57 +wGOor5h2mTJB7m9QLK28om2cFmOmoESTqqXPN1WYd4UCjG3V/AwjeS/143vKh4li
   55.58 +tOW51QxKWpOQf8kIRVgtq5LLdk4BcaQf6dyKlF55N0f7jFCLx2z/EjOXUu/4DeZ6
   55.59 +c42DrCGxTDZtBn4jX6g+DhqUCscrLvXqxJ0dx1WXyJx7bdoPHFzujilfZmEX7sCv
   55.60 +5CeuTwwCVXNW/N+g52RNcRJlJOkJJUo5ts/Rzd3LswSMVzX02wV+a0LiXvZZYFaI
   55.61 +piF+xgQ776fAqMS0tBT9jng8hIrb069YoBuyUZOOv2m0y0eGJdTow+RWkdDdgQYA
   55.62 +zxw2tQsP+Krv0iuppCg+bxmspRUju7hfnN66jaVlkLG0/ImqG21azI6YxDsjrKAM
   55.63 +YH/+WycA0T4xO6I78VL0T8FoRBxE3mqeVx0gDoM8CKIFDIpMrLubzSGdfosOlW+N
   55.64 +IuIpfaguLhpsp3xEw1k0ap/wWofAmItTr0vcHBEpQn5EkuG2UGJv2p2M2OeFA4um
   55.65 +DyWPskvzHcqm0X/8Z2Ged2iaCzIkCVdS1xX/suSyGeIZw1Tly+fGcvMTFZ6mQjNN
   55.66 +BgDgCJLfjOZTDQ8uG74F9HFDPth2iO7bxHfBb52DsnHpTuGIn3rTKWg4oIX5Rkyv
   55.67 +PMBEAHdpynAew3GZW8baaX+Xud6uk4SaDRZtCOKSGUTaDlV3ucACkdoue/vnUBcp
   55.68 +w1ir2tZOs57jk3LirUyzE0gz5kuzAYsK/n20EwLjGZO6H3g6DcGRrlSedGfcya5P
   55.69 +lHBUH7NiyTkBX0kX79g9lkLSOtNsG4V3i85HIaDGrr8CvxhExkepqFhsiebNcS2u
   55.70 +veEF/3a+v8gMI0h6ovTzcFF14WfMryEOplui11xkfpsKdtNCoCxgEC0fKzDeM3/c
   55.71 +iQ3HPkBNOq4nuJ2lrV1nBtjulM0qh4II3Vs1HLOxsWAGbkOGvH11Lb7B3EpG2DRX
   55.72 +wD8bO/DftXE9f6KyMbvuFPeizICTwpBbE5DuMxdoF1Ui9eGwEvV9LtgZWNqG9Fqk
   55.73 +1inqP2lLPCt1qrbkawYBmVDuzMvS7OWvV+sRspWWTVbL4FrDOfThDlflrZo/aSWg
   55.74 +0J5J896iiQG8BBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecFAlgN20gCGwwF
   55.75 +CQHhM4AACgkQSHVZyzoHEec+Egv/aYuJkFtXrH/OOwEKlSUbBtCQGAC7OZTe/fWT
   55.76 +Sl6DOcvedWbV8Y8MjvNNfK78SwQktQRMLAafHv1ZbYKFSoH0lIOyQe0KRGcZ0258
   55.77 +R11e4UPHpHVEcDxeSZF7veidzvc7X/0JZa69IN7Yqt8yrm/hYB3qAB+de0fS6fOd
   55.78 +7naqqCNMBYbGfCQce7p6G+by4i/3w+Nc2kUjL+u7vTGQDoh2iLVNUhp9mvW+vuVX
   55.79 +nLbnpjIDhb1OieH3h31Qr/7czIc/2Bt48km6pdppeBp2K3rjJ8vp2l2bAbasm/hc
   55.80 +cJpPmhb57HUuCs8J3hoUA46VaKfCslfu94MvYamNRiKUXEWpexoII7ZBewg54nHO
   55.81 +F8LqhFPs8cywLZEZJxdkygeOafBjtBWvqCMMzIQJYOIsiyKUskA1Z9CTaY607PwG
   55.82 +/fW/OquOdbNRtvcJ6K22ct6uWTv704vWQhf8WrtJ/e2qDnL2rKn/Y6O9G6hSXKRP
   55.83 +L5MDeT+UWvsJylNGPwFpPXmSwqNFnQVYBFgN234BDAC2LstsmsK7bBdNJhdImPVG
   55.84 +l3ofcrZVtKWj6b3a2wzEdAOoEH7M8y4NWrOmLTpMpJhPRRuIMoUuQHJAzZdpiG5A
   55.85 ++K5xvhiQLosGaGIOuQAjLsXzAFQg8if4ua8igjGiwCqPxrqfDegLunX7rBrww35S
   55.86 +bXj9e1u6si1Oi11Db9hjlLsQgjPHwQBS15Qo0PkZpUeu8BBksYPdijM8mptm7ddn
   55.87 +3Oqq2aJCH54cccdBGw2MPiBZJejbvejeEm9wdoEqNmhRkCZYieNcro43hCwi5+VL
   55.88 +zfR3CWCmujZYBwoR1mUrvCJfIJjOApdbjf8ajf3UERCTkiP/4KxL8ufbf+iHZ60z
   55.89 +vQKgyUq+jlcssMMbIJhydfl23dlS7akKukaSGjPELrsmTBl/EShEDj97sb/fRuaW
   55.90 +51G486aqNubDGgZMN8qDNM+nJPw/rCdkBv3Dp5QjYCgci5++ijRdYxCOKeTulCuT
   55.91 +z9ZeO7XRmfKCZfGN3ZA4jby3QNmMHvGGkQouoaTgSssAEQEAAQAL/Av7aJOxsLcP
   55.92 +n+S0vvlJCMYQy7kVHAWSW7E70VR7QwwKA/ziFi+NRZfJQbbfPfixJqH9Y0HXmMd2
   55.93 ++PdmzjDkW+QCtxkcremQYMJrdm+OHq0xtAE3IfwHZoucTXbRO0nUpmKjE75xoAkN
   55.94 +cBm9CF88wap9hWSeirpCYmp1Dg2Tu0FUFI2RvVgY9dgnp5ibo0EwNqu8dvI4c/oh
   55.95 +JHI1n5zrGFdoweJkwqA4tiHGy0UZQ2XYPDEWJjTgTlg0vDGYXwcTYY0gftAmECJ4
   55.96 +JkEQ4XHp94wluJVmlUD9soVzFP4bcjTz5sED4dad4jWQ2U2qSnBCd1BtybVNRZ6n
   55.97 +qKN3KxrRm2iFHQSySnVlNP8I7j4DQwlUb8ZA6Y0OfsUIMFMoWRAFf0pXzf5QK4OG
   55.98 +TVYPltXWvvCyOouXKvEMkbNCZ8TycMx0PZsPVamx2NZJV2bHUPYp5844GlfBME/v
   55.99 +XRlYIrxQmbnz7rqi1c8D+w5lMZrV9JFctZo2D9xmvXXt6z/eJ4k7oQYAwHo8baJ5
  55.100 +6548KG/Ay5WvJRiQW1FV/I90Ftw/nxdYrJkjyvTaEkQe9h3bLkN/JU9I7UsKBZ0Y
  55.101 +XyDOQVyDjBzzp7De+0adgPmLjO+kFO3ULw53Ee1aIaie/azLFwRZp5VHPTA2hG0D
  55.102 +cMzFOI1cfA/GusN1kyjSFEAEHBg3SQ6pqDlsI2ZAE2rb43nk9A+6XIBHC/GSwuri
  55.103 +NXWUaYjGDYpjdhGq0HmypNLp71vLIVKCyfddLrRgeeKIQfkck9O+86kRBgDyTsuR
  55.104 +zaN+3Y6B4HXdnzc7t6n3TTc23rTXzyl79zICP5RZ2X7ggSX5Cz2mHRLQR5N9WbkB
  55.105 +Mbmpyj4pFjwj7uksCejmMKCMnMpDcYn+K5PIsRwenjDgN2jACxXhPVCd4fjM1SaA
  55.106 +PnmJXPHgVntWNqmVeSH71sGliM6Wh4S7PnwqzX6tuBRtiU5YVQJ46swgtAKN++pY
  55.107 +jy6cwGJsf+96JqnkbgyYsS2R6j+wEUwEeYH/+5Rbh5QldpB3c0C0/fZGFhsGAMb+
  55.108 +X1jaFQfZYFgXH4yqDp5jZyp88Ci5xGCS6N8PiBgENETHrZ7dV/AnM5C/gG7yfxmO
  55.109 +UI2/KIvrM3lat48ZcXxhg4jUHDv+UPIG7SEI5tWUcq18gbBOAHUlwDPNvrkrImir
  55.110 +FR3FzPlZr4b2SE3iRZewqS+XZ9Hq5hHkKHGp/s5t/r3HfFiMkzSvp1hh9RdSMzI0
  55.111 +ICVFeJVsMeX/so3tc3jtdCVtnPvvWC6lKwWkVS2BMcpNiyufDnW8/ntyKSh4ONWv
  55.112 +iQNyBBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecFAlgN234CGwIFCQHhM4AB
  55.113 +wAkQSHVZyzoHEefA9CAEGQEIAB0WIQS4sS/iMBI0HSjhW1+YtRAXx391HQUCWA3b
  55.114 +fgAKCRCYtRAXx391HT4vC/4hzZg2vNd/7hG37Uo2rpvBZOssVEKUTNm584ik47jk
  55.115 +vCWCuPAjyueh5ko0HjJc+vQiuVyt8CIgSuDTUrWSKcafCzpzsGovuXewN0xqGlWp
  55.116 +C8PVQXEECpXHmxP3E4ihuqpdAwdsEqNcJ+Zpxk5tkT8vW2XwEIQPEOd8i1M23TTn
  55.117 +7pH8SXhR1A0gFq3Kqz2lHM0kN/BbCMz6WHxEq8Nljr/lUHEgdXY8stemw5uBuf/7
  55.118 +3WE6BzUPWGPLt3UkcaeUYlRNC0FswzPFkrLRdw5gpbpZq3hTeoL9wLaH3pmMIlDO
  55.119 +xjRZszSHvK8L9YX0Xp0HPRyX3rsCTUwFkZFwxK70noEc9tbU+OhkT7ENgepLYvNS
  55.120 +/xjN/rrp9KV6ihwaWdEvIx5iId3IE6vRzw0gV+GPu91E1tWCy96AaijJTj+ewigi
  55.121 +HfEZBeK6XLftqWKCFNwnEsHbfrnp5MVcUYwrc/QQxP1ksmCPK5CtzL7BrLwuS0ri
  55.122 +cm7J20UbcXIJXZgRK3FfQiDDZQwAtqqVR/8uLzIXkQi9OBBYsOlO4Lr+qapkBMva
  55.123 +o6Ef1oU10Ikd8msI/EqhyKX5zCkD3n+o8rUkwl8lLjwf4HnsphQY/N+MX+bJpBeW
  55.124 +2P6ZUls4TGsRSYcJ4sh8XF/7JgJC8RmMFHO7pxePbQzplZSZeCf3lyA1EvNKebCc
  55.125 +8sIjklJz9tqGdmeAVSh6cHwzNjBO0sn5c8O6vQ2LMI37703wi2+AnlcgdzbZIkPP
  55.126 +ccUrvTgEF/lSZTGOexuWbxEpJ0dLjpJGWDFBc039SX+EdtLpoHDinzGE6uN92pVF
  55.127 +dhGFrDf3qFAmzFSqva2LypjNU6/Cwbait3CQ8ElAChahlv+RMZ75fYkOXZUpG6Eu
  55.128 +myJ4ogDUrnKoS3v3HQQrjhtTWi6GmiXFBcOP82i6STbRZoMu9K/BDDDeph5+2mSY
  55.129 +I2eE1WV/BRq0uA/MPupU1WSzfAwNcCW0pxu8EPbnuRjBOTZl9LT+W6ti1Z6AsY7j
  55.130 +qNgUL+Rlzhgq5CJTfRrfEbpW++9JnQVYBFgN25UBDAC32TjNKES0bsmchKpG5x3a
  55.131 +O3Ye1BXKoVeM7OpqOYwzFAH2kVMRFasHhaTQgcRfgRR0GZTKvd/B8Uaq8iwl5zht
  55.132 +mEdLafpqirKzRbMTiHcyG0nZ6fWXNOhZ31+pBCXnY/hcRZHfKVVqoJTfc/6HcNTq
  55.133 +JyLuB751Ket1sZa+FMJnI1o8Nq3W9oe8lcfO5AirHj2Pr679hNHMAdxbIKOhDuTB
  55.134 +9nsHyuSMmPBBXcdQG4cv960mbWKf3am7RFInHxpWWxwl1go/CLC+/T0BXsNJvSpd
  55.135 +HMCIxWqwcboPm3FhGW1XyYV0MwdY1A7Wu1LGL6gEFQZ0k0a9W+5/dRYv++01NPNg
  55.136 +GGteVeTHM0g3HXnbSDZJ3CRCocnEynZSMFzoYeqwcAcJuj1BEZoWnRF9V7cuvrkM
  55.137 +Ie7w1Cvz6aT+Pg5LosCvg305NDu3HiwILgK3UVwlw7NKde8aNdQVAYxFy7Cn9Kus
  55.138 +YPsd4LATcxDuaFMACFq4/xDENf/hfsaUBvPFUr63cbUAEQEAAQAL/AqVv9q2AxCl
  55.139 +YUe47qnS5Cncqw4W1WNbezQyrsNraUpGkF9fGhp9diGifO0BT6pU/vW5RFMQ8AlV
  55.140 +SCWO+GI9SActUYuCwEdykVvXezo4bO5uWkfo27o3Mlp8TSBoy/rgy1uaqM2hrliL
  55.141 +gs7DuaeYJDYQB0ePnBRYU8VsslpizReNlkQpvMQH4SRHNmAPynz5qn8zlP5lL4QQ
  55.142 +plx7ylf7SMnvFEHMWXDL3GdTDCbtUtD88FPqT9eW9k8BHb7BYG2Q5Lq4jabUSW9/
  55.143 +OCpK0aj/EJCXN6v+Dg4JJL2//z8Sk6nBvgTU9Yh91fSihuKJBI0/DJzQS3S8YgsP
  55.144 +pMoViddlNaCcg+/RH9nFtE8ZcuP0hxiijN5c65p2KmMNNKUO63auphh3Shqv0wkK
  55.145 +JlOUIh3upY96d7yXUFnnAHxpsiMjCBvjj2WJC6rc6IrifVsVMAz/Ovnz5r7Q1bqL
  55.146 +NxKAzWmXtfbl/6xXQ3V7Qdn6nm4RquiRx4YP7VfsxQjfWhfkx3R4eQYAzkCgz55E
  55.147 +G2OLA75qiaD73954YvX5a8nuaDELOOXbYEjV8WN0/Ud4GZPKGKmNsiVtfbE3uHQL
  55.148 +zujM3dYh6iXMFxJVflCxQrGBnx95gjF7/eXUU8PMkhS0H41D+zeENuYO29CXUnyr
  55.149 +YHj2lGJqqdLSnZeRN+BTim9r7JDPHcreAAt1CUN/Al30kH0IAY44dwV+Rdh22n1c
  55.150 +qeJWIBs7eUH9pK+Xu8V01jJhMjBn679dHMHN9hL1s3EHnqxJo1Nyex5NBgDkMTqY
  55.151 +cyQ+vJum0YV03tySUwIIFBDEndZY0RnpDH3ponRGwGrS3YQIRzMeqecUEgn4ouje
  55.152 +45efLwZ1y6G98/ZuaglND8pytejv5zSuRmcsn9NFmwtVxKTj+vYr3jDV51c09aKb
  55.153 +7uXvRZRJue/0smavq7b8pHgsuzXEcEz66dS/mtFPcRrh7mAWYYhEDKQ4p6ZtXFdP
  55.154 +2HPuvzxFwUoOch7VZ5EfUPZKhNUI1ednHlWBdhe3fyFTT3l5dUM174irZQkF/0B+
  55.155 +lxPZL5v9RoLy3Rq/lyeciCGfk7zkQkS3Q4zBpUnYMK3J36/ZCBwURTJ0QjYxw01K
  55.156 +5zntDYRWVR9jN24zg1p+TNmJmK0EqQETDmEXEr6hKglsU6hIWMAaix6fHUYX6Cls
  55.157 +asrx8ozAk2/rJPOhRI1sgOpdlADWTO422RhfMIRGIL5dZhwsYm8GJtm2yfliOUPM
  55.158 +HEN7OTsKYyRFRb1DheR1s978NGxNtx81SEPjCEqj6bOcidfY/pro5hJLuL0lVOBu
  55.159 +iQG8BBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecFAlgN25UCGyAFCQHhM4AA
  55.160 +CgkQSHVZyzoHEedsAwv6AjxDuwYRYKlQRAW9oz+wlKyrKdWUKkOMCVast+phO4iM
  55.161 +ay7dvIrdmmDOfrMl8u3kNSpIHJxBl4g7RxFUK+pOYaMvo2SGv+UdjgXV155mjXcA
  55.162 +psfZvYJMORyepBXXWrYhdDlHpLGGO1Gdr36AYAN+DECNYgHzXjdjufMSA+vGwg3X
  55.163 +RBjy0SjhBsRwGq7pwv/0XHbtWMI6mZWgSU74OPPI2L3Tw/8cWlWBTcEfEc6d/4jf
  55.164 +TuAjkicAGCrGggDuEQjvq9KpvRdNeMBcwgsZanErq4eq10BtEFWaB+WMN8NNJocL
  55.165 +KmiAViIulmIEszK9lQaW8SrRistxW0XTzKvNSPraZ03XBvzF/uS8tA4GsLe+s8Nl
  55.166 +AUzPfSgl81hlq+0Zo41oeC/Z2Tu5UflF4nKFcDfiTwBeT2/XYuC34BU1i5PqrpuJ
  55.167 +oCj8pH4fQwZEbtvRbYjU/cZycdtBAZFyQ6V7XfhEK8vS7YsW1UsFNS0054eaX8r+
  55.168 +onwth04JVhgS/qU6L/5dnQVYBFvQQ0gBDADAirjFZ4F4wjr6kqW9MjpZz9Fo6RvJ
  55.169 +e0bb4ySRWm+X9bgC+siFdIZoxHPof8uBT2rVIO7FaWqKVVwS0gVftYe4IS2zO2Qp
  55.170 +PMZ6uLZatfY0uABqPhhcJsnV1CRKQLaD6U+xSL1+LcFZaGEDo9/VTuOPqTdYzux7
  55.171 +mkG5bSa9xjU280rJBFLRwqQaqrXi4kPUElexIw11vSgwHSNBXsnEs/g9DEEIkVDX
  55.172 +1Rw0q+BpxGGkW27/WW97eXlQE7T7CPA+va9WF0Fqrmr0UFkYr7qsnPgerlbvZPhO
  55.173 +507z3FsmwguXs/tpEYQwl3b9VEQFo8WsPbpiYXmxhEE+4dYaqASE73ky4sd3+lTL
  55.174 +MPOLeaLphiG1+vRfXi8SRRokHhmeSOWE3cu5jtjmBzigYIyQUw4d6Q4ukgf+m/Z+
  55.175 +jLcNBqH1AEZcEAWUetP1qU3al+P3deZX23XGUbIAm5R0SaLSHiRJ0cCojtaZvhji
  55.176 +45vtcL0yVr3ULk5N1AEmsUHHzg1j6McVN+MAEQEAAQAL/AoO9SodhyOnhJc/KU4M
  55.177 +nVnAbosm1QnIg+IhfUaOopJzXA05IVfqHMoaVofIgqQbDFSyp2aZZDRyfcs0kjf2
  55.178 +xBlNZRVzk9RHqtgRuuJa69AYkK+m1h+c8yGq4ckd6lWnzumkXX8wUA/QpnN0kHvp
  55.179 +5soZfUe0FPc8Dr+WFoEG0BQyei9YJ3odIJ+NWCUlzC9Rqf0Z/K5a7F+JwM69xJf0
  55.180 +YufQMmbf2Ij98Wma/6/mz3Gw88fT2ewUY3mtyIruDkbozR8oxVfl3UH1FHFNhH7i
  55.181 +X0SaadZjUB8Us/0iaWNUYfBl5/Z6Ov1yo+DVEaiSDCyEsxvIwAajD+ld1HXiwN6v
  55.182 +wMZiLekgM+pZA13xB7XgY+d/tzaj5uakwBkEHChefp6Kbi6R/Ygc+M98WvbPiGtu
  55.183 +JPFrnNqGMMAA7nKlr6LjVo1SuBNfap9J7gF5h8aK75hQ4xM02pi/tkSXbyRUZ+Qi
  55.184 +U3QKFyfpNaLxeHo/B3u6eQlzCUguLw27lNPM/liybbdksQYAzVRePp3KSw2dEZpe
  55.185 +VVvMcgp/EQCjnTPdIvGhjdD/7JzrXWxNU0mBQ7DzkFZkaQs1TSQt2Df2ra1XaZw3
  55.186 +WWRnhajfvZcgV1IdyfInjNDrFBSMMK7kEK+1E2dUghom+jFLgFkfc8f+AOOjz+nm
  55.187 +eAmQv+Xon2xhhr0Bj+kkohcBIFKPtjMrSU+GlMoJMm9pUbiuynWD4eATsUF9MHQW
  55.188 +5Tp4dgGbP6QpShfHX+FolEtPtIprqwJDwBQk0imTOyDeegnZBgDwDn7s6mG3EY2q
  55.189 +EWmrm+81kwk78omBNf6AmuCmC0vEBrXKOpoc9uyEgLUOQuGBvhNKiedS+RobVM9e
  55.190 +YVxah37JPqswP0kZTMxpo/jDtqaG6QVHs0pRPlpKWVCaE9oBgqX77rTtXIvEnPQU
  55.191 +ca/QQJ4w18UVut1b+2SQuIYhEGTc7oguU1+w+GavS2fcrOY2LeOqPM1q51gP8kIc
  55.192 +7M8EKqRQ8aNjC/yyHI3pvii362twBDBcBhBbIDllEY+XtkGM3hsF/2/u0pe/tHiY
  55.193 +FP1wOplFMEh9J/RX3jqbT+p5PqXUHBlfSeZlI8HFqD42MAwwpPZuzwmWd0L97Y5v
  55.194 +Yil9fzd445YiKyKs0D77wRdngRKSTScH4NtFp69rFW8sLzH86votPu/X9zDbtEWC
  55.195 +sB4zcjdxvSMO6M2aPOzshhiNoWThglekmM5yW24Off8vJid18SkpvS0Ag6uzvn5m
  55.196 +xDFrZSXIiC3WUJtDNwZ1r+dV9bagC2vI6msid094/02JKKiL8FrcmdvqiQNyBBgB
  55.197 +CAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecFAlvQQ0gCGwIFCSWYBgABwAkQSHVZ
  55.198 +yzoHEefA9CAEGQEIAB0WIQSAVmHIBGLSgcEvlhufh0UJ8i7aUQUCW9BDSAAKCRCf
  55.199 +h0UJ8i7aUTPgC/9P1i3LN48BRVAst8iHD80b/hLD5Ns01MOtoPgRiUIYCR9BCDQg
  55.200 +EYXrA2qFZU7rvY/Sq96VpSp9D5cxm/5+Sa7hr1F9Xh6ishvXW9KOqDX893ec/oAS
  55.201 +CFrfDCZ2N7Tkr1/yIkxLXRgTEhKyFqGBWqytPQzN5YQw2Q1/sdHs2rmO1755JusD
  55.202 +1/GuEx30DdJQej645bpERjXtlLynfglFBvLLJkfJyqQbwMTPZqj8b/e4hsnRMyQY
  55.203 +/2yb4L1Mc1KzsUYPPSTcp73BcEMSUz6BgFAh3o1BcGe8AfhfFe0AUIIEe/4bP8/D
  55.204 +bDyRYTlNtSkt8qqfRa8SI32uTVWIqJTwvEDLi+2S5I/QdwWAhAg0V1kU6ROrK2YT
  55.205 +SAJy7UhxCAsEGZj8NNzXtQJjeOUtPmf7mMI3TOqN8OeTrM8+zlv0eLKjcy1HBYeg
  55.206 +hOSfA/6s1gQ5B/PyZoLHhh1UEYTG/PTH7CU9+6+sb+sj4VdtKNL6cATNXYPXe2/4
  55.207 +P3xSNfPxsnGXNDyy9wwAtv0e2UPRgnj12463kvuTBh0ni2Jm7Y5l4IpClCR2ufmO
  55.208 +qS6mi7OsfT6mTu7ZBfpps17EMEisd/2orKC6gQh42DCtU0LX7T8E94OJ9fLx09wt
  55.209 +54BkqVFYBwmdfsbAbsg4dZ0ohYaevLX+4GlOkmxLqWMgjxuA91bk+WI2xHKxuQe9
  55.210 +hlkfW2S04GdhELm64JDhm6HbDvzlMSq0C5Chmr3xUsgzHP4ldHG989hdoVZxx41h
  55.211 +MoXmF8u0tfMs+UtMJoLreCPJj2RlI7CCSn9++rnYjTrLZE3wXCEIrH7KJxWSBNtS
  55.212 +EMl79krjpk3HwyeGklVGacCUsnB+CssX35L56h2eWYUve3VAXZIocJq6pUJhH7AV
  55.213 +vEpfqE9wLAeozwlG/1zzf0Fya5cSV82UFy1k6A9KHZKDBfaAXnZR091iisjV9OFh
  55.214 +7M5mLGW+uYJjiZRvg47PjeItReCiM1c0lUJkM5RaB6gHhETLmif3JufzRiTTZ5qW
  55.215 +p0I/jOg2TOcp0UjKu5DInQVYBFvQQ8QBDADmc8mpuUQnFrud/ygyqPMYcpsBgolF
  55.216 +MT3EcOxnyyVhwcXWZl8/eVTUgZSV6tSbtsTlgpmi7CLySZM2A9/kN925qU741vN0
  55.217 +pUyKeeArUi0eQdGxJf0jQ7/oNiGVfvyh8FLve91+FVfa7FVP6v77urccuv15lkOc
  55.218 +Fj470pDQiVKvDbfKPq0Yc3dXgBRFnj/caAivgvYzATLUls8GNYPX16YPK7jXDToz
  55.219 +W3i/2i5+NupqnNwSLxBspkRYrtBRgBoOUASUjCGqKDJRhagelrT2+T/qJUteVhSt
  55.220 +vFKS38fFRmhjDfaYCPB5qlLcFDb7/FLarqNuqZE80TGif8rx9ETaQdLDQh1sqF1c
  55.221 +1ixQ6WgiUjtEpZJzjZJhBS2ZhVmDK7qemwkAJK9aJEHHvHB3SrugtuT1ZldOEtvO
  55.222 +GrVP3oNF+nfcy/Yy3pjkjWnNiYL1Zhp+s5Za4Bd94C5xKmQXeTanS0MA3YJqNtMb
  55.223 +nL77zwg4m/lbjEibEFi2U5UBbnSTD6iyaG0AEQEAAQAL+wUxlNjrYPrUi1PrPTev
  55.224 +ERN6+b1V+MwDaRX1SY6pSGVknZXQZtMiY+QKK5QZX8NGojdd8yJ12e/F8rhj6/bT
  55.225 +v36Ar1PyXDhDxW7VglTXnEazSwuIBKV30GpmVeltnDn2FZhqHTrLNlirvNx5Olfo
  55.226 +BFp0aGQGG+33nl1wyGy6u49QatT3BqWnbIgfTdWn1F6eRZvXAr9xhni+EVpdeGQz
  55.227 +6v0qihbmqGoh5J3GSAf2KuBOOrN6Ng+My7uH7Q/5KB0sdnMD20+nDj5FE8mNjtQV
  55.228 +csUWYZ3IDxJMAvrDNcIhsV++SrM4jGCYgt9+iIKDuMZpH3vOH5zD59EAZ0qo8h55
  55.229 +NIdkRcp1wAQx54pZTmTrcCpxw4bxFZr15NOJF+kd21fCFqlrznPh5QI0oKZidiug
  55.230 +hmGAAj7LwyhSRlYZfarczuzQTYgSvFH6zgNXRfRLYNPpqeuyhoPxvumAvdSgfAMb
  55.231 +jiJT4e6/2NG3zAZLEpKKacS/HybbFasC1oVLroiywUy+zQYA8h1MH/SaKf6tjGFg
  55.232 +af6Qb6MZ3yXCXhQL9XFAnCka4xObA6tmD0MUyex9JKThtHeRKsJzzINUnNwtLLZA
  55.233 +cv6WdTBwMvAnht9r5Bnatr3/J9qnlvX8iYhdWSbNRc1LMjKIAr924IUM22qtnT4Y
  55.234 +P3DbVxXlzqS/LW7TXKQkGT0yiAe/ZdvjlBvsbkPiLRbFpGqmlt3iIYWKK+8qx0DS
  55.235 +kfaiWSgrUAqUGTWO2gjeqV7jXh5jdmHk/2VjIBjuGeTGia+fBgDzq0SNbl6N6AfO
  55.236 +z96UNfzclXvTIk7IczDQs/DUR9pWQ8U38MM9tHa/PFnPrNc23zbZYF6gvsUej0lZ
  55.237 +vXLpX3ytmur5q00+ff2QismGTM91X6J2kkpwGYkdMsryXBo28xcsdVyUma3i2X/F
  55.238 +7KZ8BLFkWzvNE/3C6ipVtMd0acPsYr738t4YQ7u+YJ2QcRvHTq9mVg9+oIQpjzp2
  55.239 +eGkB0eYtr2bwRD1Z/5WvMJtTyncGHVEg08ydBHYllrmJwa0I/HMGAIz0mJFtGAr9
  55.240 +NumLoaRUdA2mVXwypFY/I+chhu3TMzIpfZ4Um8X+hXAOj2E0ESNDOEdn5afWUV+s
  55.241 +TZ3vBgxatpex0FdUZyfyayR1YrMBUgUrI0Iq3qjJW2AM/wciUlrd/HT4GGEyQnaG
  55.242 +1meFkJeYVfTD7tg6xsCUxBT7gUyB5k7uGEu+Ewj6AqRcpn31M1Sv7cCBHfQMd1Lo
  55.243 +nCUeTCd65Z/A+4MtzvcAwgCa5GNOCz8iKL7rK3VQ/4tO3TnhMIYMi+THiQG8BBgB
  55.244 +CAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecFAlvQQ8QCGwwFCSWYBgAACgkQSHVZ
  55.245 +yzoHEeemogwA3ZqtuMf3WKNxDzL/QcTxyotYf3U9J1YoNIL/Xr5pJmP89JbVhA00
  55.246 +Uj+SlgZY/SsXJ4khP+lgLekyQ+gdkxpRO/UJYTPW617OSqxRJmlqRGNfhv5Z8P3O
  55.247 +0NwaVuASoy3LQG1zr4paKcgJtjKlypnUe2R/Eb8ZKCbcSJAN2Zqkwjl0zeuu+4nH
  55.248 +B/96vOteqGigGheQCOoFLML3aDTnrbgANZ96mAaGrXtNkiqEUaKeLlGLZoGaD56Y
  55.249 +FVC8uE0Oeo6Hu8HEfLJkOyqvT2oA2BXjMUKW2kRuM3IkzJ5IqGJ1t1yGxnY2KXhR
  55.250 +7LC2xVaXooTtpQWG+UDPpzGhCVMjl2EcRLAelIP0lQf576dQhiT2WvcyIiSpoj9I
  55.251 +Vbw9NeGF8lwzGXJzniiLIFRG+rL6+yvlkIPvNPTpP/h8lNfcGa3a1FyKTl48cs8Q
  55.252 +ES9a/EQLnXgzkEGmYFTVkkSOiejBxvGHMoSzLsmiZlOgdfhUqHC5FRp2mq8Ls1Xg
  55.253 +H8mE+79wZiQz
  55.254 +=MRqM
  55.255 +-----END PGP PRIVATE KEY BLOCK-----
    56.1 --- a/test/test_keys/priv/pep-test-gabrielle-0xE203586C_priv.asc	Fri Nov 09 09:05:32 2018 +0100
    56.2 +++ b/test/test_keys/priv/pep-test-gabrielle-0xE203586C_priv.asc	Wed Nov 21 08:35:41 2018 +0100
    56.3 @@ -20,38 +20,39 @@
    56.4  xMUMvvfLiNeHz/SuvZRpKrY6ohnvcTqtT7VXB7ZL60Eozvcepsd6gnpzv9Kd/GPI
    56.5  XIwnUtX36Wt6PAMQAFwgbkanvW9Xz7A+iGD6u0b9HXOotneH4nqfXWFfQBE9YJXr
    56.6  9NAO/6vgZGrUUhG0SXBFcCBUZXN0IEdhYnJpZWxsZSAoVGVzdCBEbyBOb3QgVXNl
    56.7 -KSA8cGVwLXRlc3QtZ2FicmllbGxlQHBlcC1wcm9qZWN0Lm9yZz6JAT8EEwEIACkF
    56.8 -AlgccIsCGwMFCQPCZwAHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRCMVBvU
    56.9 -4gNYbBUuB/9XdiclzH6Mn5iGG4stQDvZIKSH1/FVbDBavdDAwoEVRygjB3FYTdGV
   56.10 -DC09zewYtqO3a/Vi6h+KeWybkca35Izw+OQtRC7+Djt6OMoDK13VjniqW01xmFqs
   56.11 -/iJLSO6F+PlzcmyYor8o8Ev0GP8z/7d7ut3p8CFhz7DG65IYhluo3kc3Detl5MJ/
   56.12 -NEYLNwhmCamAJ5lTt9iGZ6xAhwSSKdG/OnAa/HO1Dc0tEffmvdqs/aAP7+Chhq6w
   56.13 -xknCyIxm+7nYRh5Voh9k0lLA47tFDmShMQyKDFYc/kIo5Tl0dlzre2Qtru+kIpaf
   56.14 -MkWN/3dDa1yayZ85xrsU7g7fWv4sH22ZnQOYBFgccIsBCADURXlBzvLOQVJlxEyB
   56.15 -UamK8UrsLGm9DE5DXBSr5nEf5Jjc/dq0euA6BMp7R+ck6Rq7jtvw/S8x9dEEXV8d
   56.16 -JBLqHDNg/GXK6YULgpaTHXqYhkdmgzKX0T87rWMzP/EpGXkOmJBYYfPC+h3qEANe
   56.17 -ENbOWVlHSarZgE5Bb1GG0kYQT3yCY2gzKcTzYq2K36jf2eoEgvDgOHRheC92S5b2
   56.18 -bxtfi8llxIez2s1pJkvHYA2TQ0Zw1Jsz/JTfP3wjXCdBERsPRqfXR72iVwQFGK12
   56.19 -R/N2t2bTvQ+WlOG1ywBUA+lRhH2L4MRIc0F0hqRmaE8LYLV0aHzHjtiAeP3l9+lZ
   56.20 -+TiDABEBAAEAB/oDIAeKqN6kyKoO+gaKrAhQwstOyqS3hwDDnUnB6nrQw6cDqLeT
   56.21 -1lmDC4LV3lWSVpJ1JxZsoGlhBhDjnzzhJ2R7xxpVP2idxdPS0bRkN26fmMOrz7ky
   56.22 -OWif4oCid42OoqsqNSuQRcgy+XR4Sm/iuaxyRigQ1IbKIjLEvmHICRcBn8sUUmx1
   56.23 -C3S+2r0WbqDkNz+oBz5RJ8SbrHps44iN5du4kARIvdTDe9I5AmpzhSsHXG9dXzk4
   56.24 -dqOMsHehWsaUBR8n1TJHOygV4tuS+u6wC78g8Kwd/Zk8rtbTw2PNPi0iT/Q6uT1Z
   56.25 -qymI/YiQWDAS8p/l1LC7pKs9JXRnSWcBZIUFBADbJVDpCTaDgIMVv8NaU4UC/7Sm
   56.26 -2CKvcA9iUplaJaEJzvHiL6brmhO547oaI5J27ZiFs/Zv/hPTogkn/mHqFLcRmDtC
   56.27 -Ref3zf6kRGTnjDE6CZVHABnvQRVVp+b6w1ArOQHJ2ZrgeZSk6+Ayo6rptRrzAn1K
   56.28 -aLp348rUwXnQ7DZc7wQA9/gzcqe2zS9eLyO//TptDLsSatt64c0HcortM6Qg7Yhm
   56.29 -HJsek3jd0umdz/hjBh92AqDyPR4FOCCHePRyqO8YJpG5v55GeZ14GUgYMXh6CNl6
   56.30 -Vm7FnOJZplFVxESNP5fZ56ctM+vzWq9Om3b8LrrXLumYm+ejgMH0OYFYdXDQRa0D
   56.31 -/R3FpiCTGp/LUrJEpA78M3RgD/bFin7HbDGpye440xtPkl2vtx2+qe3tnBLvL1aw
   56.32 -Sf4kLbhKS/XncLyjDZeohoBLuJzqEmon8OKILdfzeO1mt0Fv6CTxV27MrmoLmxwE
   56.33 -wFRd8mr701yLhRkrYtAyOkP4KrewOxz8RUe9BqD5uVbERdmJASUEGAEIAA8FAlgc
   56.34 -cIsCGwwFCQPCZwAACgkQjFQb1OIDWGyg7ggApI7HN+uQL6egyeAkpZ2KN4+8+b6H
   56.35 -BtlJUU56F4SALHbxpkXOG3Zqd3UlN7Ewlf995rvVfDAWnBozBm5G7IGAS4PRJ1rS
   56.36 -2dkunnJ54NsaO4bU9pCHSAssB9SWmKHPgQjWKflz5bu95Is4jhUTKvAK0wdKY+er
   56.37 -Va5uSw62o8iyHn3B3Qw6zAJKWtrucnMFD6LwIVVTzBVsdxIGFdQdxLwq96C+UaMA
   56.38 -wdfXqPgw6qu9xLrm1PDch6lbCYj0F+iWEBgmg+Os+AYjojwWQ3OKFgdXVGypB1HJ
   56.39 -Lxb2WwHaH+yO9Wm52wTqotjoruEuvcsb4dKRs+h3tIBDff99svXUo5St7Q==
   56.40 -=apX+
   56.41 +KSA8cGVwLXRlc3QtZ2FicmllbGxlQHBlcC1wcm9qZWN0Lm9yZz6JAVYEEwEIAEAC
   56.42 +GwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgBYhBJBsm4NJlU6CxWI8PIxUG9Ti
   56.43 +A1hsBQJb6TgcBQkWmMqRAAoJEIxUG9TiA1hsDC0H/idmpApBV9PuYo07BekmoYrP
   56.44 +tRq+Cuj6pq86Yra297kJChlvQKpkMKjhVrL7lCjdZL1RZxq4CwCBLJe6/Q795tJh
   56.45 +MC1VuMYBLaxKJ6qCccL7lj1YrQjkB7sd2/w3L+JaxcxJ+WiH/QybtQ4XPrKn217Q
   56.46 +fkxFFe7yHza0xgfDT0WeYGxqq8DXT+UhHS/nacOEp6Uo1y7AnhSgeROPSo7sP8O0
   56.47 +sRO1yTKKR7g35cijWiSF614nhn/kkzGlZsc3hive/S/fSNmbbpBzjvruWVh5yw/v
   56.48 +GPyKtYfXfBx5YFSnDmRrHQM4jA28A7CXIcY/XJ0Xct1zJL9qi9qqtfbPVsd4HTqd
   56.49 +A5gEWBxwiwEIANRFeUHO8s5BUmXETIFRqYrxSuwsab0MTkNcFKvmcR/kmNz92rR6
   56.50 +4DoEyntH5yTpGruO2/D9LzH10QRdXx0kEuocM2D8ZcrphQuClpMdepiGR2aDMpfR
   56.51 +PzutYzM/8SkZeQ6YkFhh88L6HeoQA14Q1s5ZWUdJqtmATkFvUYbSRhBPfIJjaDMp
   56.52 +xPNirYrfqN/Z6gSC8OA4dGF4L3ZLlvZvG1+LyWXEh7PazWkmS8dgDZNDRnDUmzP8
   56.53 +lN8/fCNcJ0ERGw9Gp9dHvaJXBAUYrXZH83a3ZtO9D5aU4bXLAFQD6VGEfYvgxEhz
   56.54 +QXSGpGZoTwtgtXRofMeO2IB4/eX36Vn5OIMAEQEAAQAH+gMgB4qo3qTIqg76Boqs
   56.55 +CFDCy07KpLeHAMOdScHqetDDpwOot5PWWYMLgtXeVZJWknUnFmygaWEGEOOfPOEn
   56.56 +ZHvHGlU/aJ3F09LRtGQ3bp+Yw6vPuTI5aJ/igKJ3jY6iqyo1K5BFyDL5dHhKb+K5
   56.57 +rHJGKBDUhsoiMsS+YcgJFwGfyxRSbHULdL7avRZuoOQ3P6gHPlEnxJusemzjiI3l
   56.58 +27iQBEi91MN70jkCanOFKwdcb11fOTh2o4ywd6FaxpQFHyfVMkc7KBXi25L67rAL
   56.59 +vyDwrB39mTyu1tPDY80+LSJP9Dq5PVmrKYj9iJBYMBLyn+XUsLukqz0ldGdJZwFk
   56.60 +hQUEANslUOkJNoOAgxW/w1pThQL/tKbYIq9wD2JSmVoloQnO8eIvpuuaE7njuhoj
   56.61 +knbtmIWz9m/+E9OiCSf+YeoUtxGYO0JF5/fN/qREZOeMMToJlUcAGe9BFVWn5vrD
   56.62 +UCs5AcnZmuB5lKTr4DKjqum1GvMCfUpounfjytTBedDsNlzvBAD3+DNyp7bNL14v
   56.63 +I7/9Om0MuxJq23rhzQdyiu0zpCDtiGYcmx6TeN3S6Z3P+GMGH3YCoPI9HgU4IId4
   56.64 +9HKo7xgmkbm/nkZ5nXgZSBgxeHoI2XpWbsWc4lmmUVXERI0/l9nnpy0z6/Nar06b
   56.65 +dvwuutcu6Zib56OAwfQ5gVh1cNBFrQP9HcWmIJMan8tSskSkDvwzdGAP9sWKfsds
   56.66 +ManJ7jjTG0+SXa+3Hb6p7e2cEu8vVrBJ/iQtuEpL9edwvKMNl6iGgEu4nOoSaifw
   56.67 +4ogt1/N47Wa3QW/oJPFXbsyuagubHATAVF3yavvTXIuFGSti0DI6Q/gqt7A7HPxF
   56.68 +R70GoPm5VsRF2YkBPAQYAQgAJgIbDBYhBJBsm4NJlU6CxWI8PIxUG9TiA1hsBQJb
   56.69 +6TgsBQkWmMqhAAoJEIxUG9TiA1hsEAYH/1pXWVEWsMeG7alnuRDSw1ge0SaKQzz8
   56.70 +edRkUJjeIj+uk9DaWUyNvD+I1nlzMgdT4q3isaqiRhwpjnGbf9uPJuZDC4LyvzFX
   56.71 +f5aywfPJ76Lb5QDUGrWqG2pc1EpfAcnYuxaoNPsSHbgljLqg0yQu/hDqLkwZ5Fzs
   56.72 +8encobT4aFq7i+VQ3eC0ZMUb+TW4mLAk9Sy/m+MlBSbSPB5ASmG6j5CyDWJZJDci
   56.73 +CkWdD3ZeR4ARn9tIOBJy1+4VGMVhLN6j9z7EB88I4OTXGKFOyhCFeEcvs459vjiS
   56.74 +S4znFqFR0inDvL1AuN+NhM9ivRFfYbKsYJXLQk9g5T6ZGu7pZOR1iX8=
   56.75 +=JAHf
   56.76  -----END PGP PRIVATE KEY BLOCK-----
    57.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    57.2 +++ b/test/test_keys/priv/sercullen-test-0xCEAADED4_priv.asc	Wed Nov 21 08:35:41 2018 +0100
    57.3 @@ -0,0 +1,82 @@
    57.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    57.5 +
    57.6 +lQVYBEdLUAgBDADAha/ZeyFZp8U2OfaaUH+TDBPDdte4D6Z/lakRYDpBLAdjWkoV
    57.7 +6CRjei7NJtYzTtOQIC2FjGd+DYCWQaW28Jj2DMhvUq/qhwUPNzK/mZ7tfA2rXRsY
    57.8 +34qNWn/g5OnVDw4e1JMv4qUAiaDOTEjrR9zO3iFrFppXhur2SF2ypbP61nG0J+wx
    57.9 +KJda6/n9H16Krtl4VXesOABSjX4Kn+eZxRcQdu1GXiBXs1YKyvN00za3g/73x+GR
   57.10 +ZzxAp+W+ns4AanCGpzFhTR72/ZTlwT5hUfx/0xisgRdo/m6ggCLX49kyAqfS6T1F
   57.11 +ZE0S4HdehFmNg/s5IqTCUt/0iceQpE1QrHJT/dHkF//Mgmvmb8gucXBvExrRYK9f
   57.12 +1QWFP0w0RJ9ftl3Zs7izTBE6od46rPr60EcJU0u0i0uJvL4Oq7XBxYNAg794ELIm
   57.13 +5riVmyhV9ZU7bTdeKMLGwByQYZPogchIoG4m2i+qW+9ckt0B4KNNR4s3T3HCBSTj
   57.14 +DO+ToGKJMWxKwLMAEQEAAQAL/AoOHBgA4amzFpynGQV6Q7on8jaHDOvr4ABRcdn+
   57.15 +QNre+2EillDf7QTV8mJ8LztfO7NIBZ++c43BMBz+P2vpDJeylzgFsAEYARkzAtZq
   57.16 ++18Y180JcdmHY11eLjnciRWC/HPQNuX+6mQpBOhk/OrgfxVopthlN9H9lbo8H5GR
   57.17 +SRpGUW350ZgAk9ckEOjknd5bhptNq3P9OaxrcaYJTHB3V96Y8GwG4oEcxrrGd0IK
   57.18 +GnjUlgrygV98w7n2iu+9Hc6YMkJGDOINWlei5lNE7NU5QD6F4Tn5ejU/M48za8Sw
   57.19 +kpdQq3i3cqd9fR085o66xhLfCZrQLDeleGcYVjfPMtJxRbF0Gjlqd10HSNBQVBU2
   57.20 +75jeGcX04fR/JGiQ5rQx11EMnA6Q66mE59txk3kyVgJFz2/ikxLBZRfMSwxZrbaB
   57.21 +ybGeXyXF89Xn4XrwGyTIp2BTpHBywjhEqLFTGNRURZp6AdUUB95FcZmyePhIqfTR
   57.22 +Whjji//f79AlNGQHq8cGGx7k8QYAwXYBLPPqLbAmakiF9SntjkI/R9h7oKTQ8Dh0
   57.23 +wj/rsDFIaclOEY1OY/5hEtlM2MqXBAneyIOQVJGvwb06lz5bmqp/UBk7pKSbFLWt
   57.24 +/85XGgzq4A7PWlm+h+3hwRn/qfwgHcyTsEfvHKvKgKRDrOWoWGJSObUtaDIuGG5K
   57.25 +yhvJBrPLwoY+43Whn2Z6chryEVjpiFDPYKfMN7LJpH782kBxoWKRoaIuDTMKXYfN
   57.26 +nZxdg5zk4x1PlhPYb4z0QTVxGzhtBgD+wf8EkIWRv4gdUx41r55osJACcovSrp4X
   57.27 +M6FP3lF4ETfiTMXQjpoo+TzVBGOn5LfAW2BS7wkDc6pNxkjEQmJf12CGcq7rdCPZ
   57.28 +q0fa8ercPCeg2I3/Ygv1wfSdPb2GuzSazjsEZythrkrlyuHOb9odRUAEFW9lutBV
   57.29 +WjuAyIJxc56i7VYKClcN4x49+8yXbhyiCDcumeEK5k50jx+fZnY3R50yddrWG7rm
   57.30 +1p1VNQYlBgiEmLYhvAEo7KMdUAB2aZ8GAOhg6Bsu+HU/tpTO6WAMpdbx9PI3W4A4
   57.31 +kyNco+ta22vmKKLZNpdDbwMVbOtmkeVPtNazEduaQVUpYsHJu9YPwFwku/1/+2Vp
   57.32 +XYBFy5uHuOLcwqKcSELXT9dtU7oBue3Yif87FhCmbLxScZIjYmYaWAYi0iZg8pOq
   57.33 +6YvfJJ+o91+GldNc5oY8lYLzXOMm0tdojmOkzt6FVAe4ticmxWjYTLamten1cAgj
   57.34 +nVHfoOWLiQfqQLdMe9IMJJwvPdm0cTqbeeLJtDRTZXIgQ3VsbGVuIFJ1dGhlcmZv
   57.35 +cmQgPHNlcmN1bGxlbi10ZXN0QGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+FiEEHJZm
   57.36 +2LPij0qjhH2omm51486q3tQFAkdLUAgCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYC
   57.37 +AwECHgECF4AACgkQmm51486q3tR6wQv/Y85s1dIOkbqJkO/juRouamzgDboTHcw+
   57.38 +5yNdrArwhJpd1CUUP4L4l6dTj9RYUxoj2hazDjVH3gC8lV1qdMc6eYjBPSO/g1Mg
   57.39 +1cF8sBqHmJaUtT7K54O5R6wl+77DmxVmbCLv7XKk6CLGlBQFe3YdlJ4lJ5EwTm4t
   57.40 +J0m5cvgZOlAqZOBOptwB5IAWZ4jemlllMTwAXzCwW4tPkTvi7qG4HjszOUYL5qd2
   57.41 +xksvWj0Qhf8nXgKSJctfuTTceVqIbtFgjAGIBa6DtrmqkVf6G8ANmxdjcSawCJNf
   57.42 +G+MFjm1KTS4CU6RCcrc55aQHqTZglbIfNeQPJeTOsoZLyFdTTX63WnWpgix08Jo/
   57.43 +YHo8ECWOofO/tKlI9Mq8ZoyAJyJpDhE7PX0UA5uQlxZHxuLTKIWWBB5nZqkkzclW
   57.44 +ebfKW9Qss2D2u/jQp29U7gTrgooNVZnXmumScr53JL2qDUs/cYB9ioXolMK6D0Ak
   57.45 +qmu8oM7PfgdC32Mye53M2cFg3vIuDXoPnQVYBEdLUAgBDADAwXe5Co+NyhUZGP1a
   57.46 +3iowKH6XcAZOIJUrlJtWU6DG+EeicLXquI+r7iwi9SRvJhSvy6RQwKgUsKc/WEcx
   57.47 +R5v9gsNH00lFzP+BVkOC0pjCqC9OH+H3FunoWjwLDM9FWusGCZGTcFFbteG9HimE
   57.48 +F4v6TydpPEqsB3x0xabE9Dn02MjFj0kb2qikKyACutd0qiKlX+4VON9qbudP3ENF
   57.49 +khrrVWeI4hlIi1Gko4nills6xpYnFLOCdQMyuYy+xhdPU9GHn6vfksLWvKCMzsnK
   57.50 +wBKH67q0dTmIZwPV9nlb4IgsRnaFs0YWjFaw8MIloocqbIS0arUbR5pkNjYJ1hOn
   57.51 +y3I6Pj+K3xoynpDo5uKnhJR5eSvDA0Ez89EDOnINJWLy0H1oENkhDFAIO/wsvL2V
   57.52 +fBZRjatkP//CKhNg4iiaIIyIM/kHCtSG5r/OLcliWmzVmRkgX8bQiQ+C+EvV7mw4
   57.53 +I2OeAE3GfO/Zll7fZgveE63PFUNn6axYwqk5h3Divz+riaEAEQEAAQAL+QE3Jxdc
   57.54 +XO/espfcK7rPNFJl6vhu/ScwduhVsU4PzG98wMziK499lvBVWeNlitOFmLNMFC7r
   57.55 +LBQnUgKo/pfttOraEHurNibRxlmtLtNMGyj9EQFL26uochSkPwUt0T/FdT5uQIP+
   57.56 +vRCYOsJrxoS99kS/i4bTGcBwcqU02tqalKP52vg98U7S5+XTHMpPncyvRvUmf/ST
   57.57 +zXrZFK3Q/H6bj35k5Th8fn7R3BOu8U9jtdMOzgMUkxYzQTAocd4BF0QJigGjZ/42
   57.58 +pa/lBuCsQddZtawMbBvAPxq53KXHhH/XzGf+i6WxBvY66iWckFgiOYp9Hq7cc3EK
   57.59 +9WI/PDYXOe2UcJTntBGQq4npkkgXV1DYZmNvjgbtskdj+eTm+tbGTfPwCE30R6TJ
   57.60 +xWarB8l4meGXzW7mYHAlvPMYbZXvGtmM2oGiUPLQrhOgy7znLbewW6sbi1O+7lVh
   57.61 +nPZH9F/kZz5vfFR7W066MgbrLDDD2PVGTGnLFyhUEIF5DripDq5SADAeAQYAz9LA
   57.62 +ej16U0G+awDF2hKRwaSXgZOWGt0AsMWsleyEaE8UdK76AofUJiwfxw3Zn5PBTjd4
   57.63 +EnrMC6IKSIEgRlNvy6KGh8M7J5o2ert6ikH93x+lFEwM80JoDRIKsRdedKq7PBcD
   57.64 +SOMa0Y6GOgZcHWdw8fDcrH44WxkwnTs14nyg0GjAi2eVegKybiiYG2DMHLgYde6/
   57.65 +pLO1/ImbHbCz2gRdsrFE47KAktnvHjRZtDO/sJDcZICj9i5VRrHepc+32WdhBgDt
   57.66 +cIkiV6r8JWGfAtE7I3/+vzgnWyVheunQX9zPris7F1p8Y3J7PM3K6Jdn/C18zw4O
   57.67 +7OUSdr5sBMmFR+4UlI91tel5l2SlC1tp6X1e8jiLNSeaSgwWaRBzhpHyMJFGP6Br
   57.68 +HE+Hrm8Eisw1r4DJlVOhtHK1yhTw0jTGoaleJ4Zw0YToRtsfjd9pDfIEfTNnwA5E
   57.69 +/yZC8SshMvgOBZKt5FFcZyuGVOK9FoDUODeV+EiBobQIsXWzOjpqOKGlXD5+ikEG
   57.70 +AJzaaX/zji0rWnTLtXliIh45KZWaFdVx310WsBhodBUXJoGCh6u5GorV5R8OsDMS
   57.71 +eGF/ZkWHrfJ15saC6SYz35T/XOqIaQBgDezDxND1Ww+S4cn3D26/PgOJOBE3SEg4
   57.72 +8Eq6cJhpxUaR7oA/8Q4gcre6H0hYFyESOHIT8c8bYjgt6gBZAzd01PPd5nEoa0gP
   57.73 +bjjsRM0oN+pW5hoSR1t07zzHe/U4Ldzk5TErB+A7Ssnmq+vqR3w4X7SYKVQ/+8uf
   57.74 +WtnkiQG8BBgBCAAmFiEEHJZm2LPij0qjhH2omm51486q3tQFAkdLUAgCGwwFCQPC
   57.75 +ZwAACgkQmm51486q3tSOEAwAtxGSZrVZvVB6WSwps/smJLt/k19ywqqTEgzuYSIy
   57.76 +MZ6Y7iqlRy73tFUjRPmWduFWYHeAtAl36KHVGxAr4ZT9raj3af94JORnm5uyCXGt
   57.77 +UduIhMuwh8iQKZ1f9pI8iFxB3rBh25v7KNHZRZ9BU42CjsvWt3brWoKtjeEm9htP
   57.78 +lA9+bZY5KBF+JVwo/7VkFqxX1egDJsNpYfephZWrTOfqXO1/agBD1woUyeShihNw
   57.79 +fWiZ384Nz2iwmvBUUBZUhMLhoSEWCdkDtHg+gct/0cy0BCmMHG/p2DRwmmAwqY/7
   57.80 +h05kMDnDHFugI62hX2Um+nUcIpKTFXmwf3haev5su2eCE4D6stIL5XECcsaJnr31
   57.81 +mJIhPwjDlvLI7Erh/EiSJ3O7a0Q6uUqOz05aXuvbY+Xtg3qvY1JuobA+Gk6VL2/U
   57.82 +mifHMgsgYRlWZhohjK0hAFw1u8rpib2TTyG8FQJluB0rJ8+nVIjyQtVsWXoj+sEY
   57.83 +YaxF8MSCzkTmFnhdIPMPkTXB
   57.84 +=6nmY
   57.85 +-----END PGP PRIVATE KEY BLOCK-----
    58.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    58.2 +++ b/test/test_keys/pub/eb_0_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    58.3 @@ -0,0 +1,41 @@
    58.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    58.5 +
    58.6 +mQGNBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    58.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    58.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    58.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   58.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   58.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   58.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   58.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   58.14 +TYxhzNxyHaNqrzMAEQEAAbQrRXhwaXJlZCAwIDxleHBpcmVkX2luX2JpdHNfMEBk
   58.15 +YXJ0aG1hbWEub3JnPokB1AQTAQgAPhYhBA/2I5B1K6JqZNi9Jw1y4KVOcFxGBQJY
   58.16 +DcyDAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEA1y4KVOcFxG
   58.17 +plQMALBNV7Xy8svro+e8zT9OnwAS8kLGq/nLMIVCdO4DToLMpDWAjvI5QD6asE88
   58.18 +/prAdugphlAqpl5yyjojOfVTfiOdAWhcJBxYr+OgohMBmRmpTD0kgrUnMBIXYcAH
   58.19 +dekRIwZEcT5608K+9QRfFPac+lL5Q/3j1AOlSBe+jmUi+hf/zyvAlCW1wO9edbzU
   58.20 +QbRlFaYLfhS1gKp4CERUaSBHO8eH2l8JOe/Ws9Ryn59YBybcQFK/uIxq0/4m7SZ2
   58.21 +EnESPHaEukb5OeloKOSaNoWuDBSaM87JomL+OlRpQuTbT0GD6fWxZzWRiOujmOjT
   58.22 +FWhNktqIjqSoIGyB621XBbPiZot4rklu0OTkGD/NUVu41jy3917k/IdMR/OQ1h38
   58.23 +wizx7Un/8JXTEaiW6UIdqgxznSqYfcc6lbACpn0z2sJXzEwQqkaD47lDuQmlWfAc
   58.24 +0cU7fdO1jfKKVQv18l18Ie8NCB+zoGgNKU+SPRAJVaSkrJYhkaaERICEiWdmCDl4
   58.25 +DNcsLLkBjQRYDcyDAQwAwWRkLBTKiyumMJiq3IpP0fv1xjCx3OL+jDhQ8VpXTCpM
   58.26 +AfxIW6lhFDQb91Jnaa8o/v5l/joaOZkiXCRvFl6rUYCZeTKj4JRHY/53zxegMadK
   58.27 +lMbP1nmuSgij22mh+0HWgRWL0amaI7Dv/GtuvRHTzAgSE+cLSKtVsxviTaFAtT31
   58.28 +/rKbzulPEbjbh9k84k29+Y9ya0seSGmh/OLIyGZU4H/mrt/WylKIVT93WRnZwheW
   58.29 +od8h1GOtfuzoGQhOLZ2CozzKsfOFoV1/kZ5mGivjr2jjbBUh7QuXhQ1evJKxkzGc
   58.30 +uLHwSl7BtdbHqd7t3S5f7Lihck4mT7QvK29h25geI23xoW9LXrI3KEmW9STWWbJy
   58.31 +r6ZQdDsk6FzNJ3IR8Sj6oKQI+N1r/hC68S+JylqmpWR1UcMqs4PxUhGiXa0QgeKX
   58.32 +Z8D8xWMeIWw/RT2eK5IkMcVxV89u8OK/pyeW3mP9ZGAcKOjxZIrqvilRD7cx18Yl
   58.33 +/2xPrnVOBwoRM8yuwL61ABEBAAGJAbwEGAEIACYWIQQP9iOQdSuiamTYvScNcuCl
   58.34 +TnBcRgUCWA3MgwIbDAUJA8JnAAAKCRANcuClTnBcRu2LDACCrEOUJoP8wnCld+Si
   58.35 ++brkaROojJY7Ow7+RwO1gxoIaiwl4yMqVifsIUwn4jnB5EaufkAh/rxB7/OTtxvC
   58.36 +Cuft6ewiyRpxPp/G6j9w1hwAzDEQv/3y4C5U8vKGKV0uRsF8KpFLNYlv2p+y24Eh
   58.37 +Wt3Tyj1DhxWe/rwj5hDLyq7CcUfW3rSLABMF2iS11/umlSiOwZJyd+UyYR19wXFu
   58.38 +jLUrtUMY/W/vSWu7OMD9zL/FTiNDIdWHZGYp8GJlkI9aEv2YvT+/um1aelsoE/xK
   58.39 +s3wObllKsJRiZ2awYDypT0DAJKwmazlqo0PFiZBkFIgxVgVlPU3DjKfyLWzr4oH+
   58.40 +6oG0ZjiwIV11aAdl7nyrMpFFpgl7wJ0PqpxyaLcOw2AMPiT3gmVqqq9+6+sNMICV
   58.41 +HhdgkcM84WTQUb+dTqhsYMuj5CLsTNArZ3ILTfTHpC4QIYB9jnln3zeHLSQvSV3A
   58.42 +Oo0+Vt4zJRYvRN7sonv4yjO0FK03ORP4TntAtGaIevBW2fg=
   58.43 +=lEpg
   58.44 +-----END PGP PUBLIC KEY BLOCK-----
    59.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    59.2 +++ b/test/test_keys/pub/eb_0_pub_valid_subk.asc	Wed Nov 21 08:35:41 2018 +0100
    59.3 @@ -0,0 +1,85 @@
    59.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    59.5 +
    59.6 +mQGNBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    59.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    59.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    59.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   59.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   59.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   59.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   59.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   59.14 +TYxhzNxyHaNqrzMAEQEAAbQrRXhwaXJlZCAwIDxleHBpcmVkX2luX2JpdHNfMEBk
   59.15 +YXJ0aG1hbWEub3JnPokB1AQTAQgAPhYhBA/2I5B1K6JqZNi9Jw1y4KVOcFxGBQJY
   59.16 +DcyDAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEA1y4KVOcFxG
   59.17 +plQMALBNV7Xy8svro+e8zT9OnwAS8kLGq/nLMIVCdO4DToLMpDWAjvI5QD6asE88
   59.18 +/prAdugphlAqpl5yyjojOfVTfiOdAWhcJBxYr+OgohMBmRmpTD0kgrUnMBIXYcAH
   59.19 +dekRIwZEcT5608K+9QRfFPac+lL5Q/3j1AOlSBe+jmUi+hf/zyvAlCW1wO9edbzU
   59.20 +QbRlFaYLfhS1gKp4CERUaSBHO8eH2l8JOe/Ws9Ryn59YBybcQFK/uIxq0/4m7SZ2
   59.21 +EnESPHaEukb5OeloKOSaNoWuDBSaM87JomL+OlRpQuTbT0GD6fWxZzWRiOujmOjT
   59.22 +FWhNktqIjqSoIGyB621XBbPiZot4rklu0OTkGD/NUVu41jy3917k/IdMR/OQ1h38
   59.23 +wizx7Un/8JXTEaiW6UIdqgxznSqYfcc6lbACpn0z2sJXzEwQqkaD47lDuQmlWfAc
   59.24 +0cU7fdO1jfKKVQv18l18Ie8NCB+zoGgNKU+SPRAJVaSkrJYhkaaERICEiWdmCDl4
   59.25 +DNcsLLkBjQRYDcyDAQwAwWRkLBTKiyumMJiq3IpP0fv1xjCx3OL+jDhQ8VpXTCpM
   59.26 +AfxIW6lhFDQb91Jnaa8o/v5l/joaOZkiXCRvFl6rUYCZeTKj4JRHY/53zxegMadK
   59.27 +lMbP1nmuSgij22mh+0HWgRWL0amaI7Dv/GtuvRHTzAgSE+cLSKtVsxviTaFAtT31
   59.28 +/rKbzulPEbjbh9k84k29+Y9ya0seSGmh/OLIyGZU4H/mrt/WylKIVT93WRnZwheW
   59.29 +od8h1GOtfuzoGQhOLZ2CozzKsfOFoV1/kZ5mGivjr2jjbBUh7QuXhQ1evJKxkzGc
   59.30 +uLHwSl7BtdbHqd7t3S5f7Lihck4mT7QvK29h25geI23xoW9LXrI3KEmW9STWWbJy
   59.31 +r6ZQdDsk6FzNJ3IR8Sj6oKQI+N1r/hC68S+JylqmpWR1UcMqs4PxUhGiXa0QgeKX
   59.32 +Z8D8xWMeIWw/RT2eK5IkMcVxV89u8OK/pyeW3mP9ZGAcKOjxZIrqvilRD7cx18Yl
   59.33 +/2xPrnVOBwoRM8yuwL61ABEBAAGJAbwEGAEIACYWIQQP9iOQdSuiamTYvScNcuCl
   59.34 +TnBcRgUCWA3MgwIbDAUJA8JnAAAKCRANcuClTnBcRu2LDACCrEOUJoP8wnCld+Si
   59.35 ++brkaROojJY7Ow7+RwO1gxoIaiwl4yMqVifsIUwn4jnB5EaufkAh/rxB7/OTtxvC
   59.36 +Cuft6ewiyRpxPp/G6j9w1hwAzDEQv/3y4C5U8vKGKV0uRsF8KpFLNYlv2p+y24Eh
   59.37 +Wt3Tyj1DhxWe/rwj5hDLyq7CcUfW3rSLABMF2iS11/umlSiOwZJyd+UyYR19wXFu
   59.38 +jLUrtUMY/W/vSWu7OMD9zL/FTiNDIdWHZGYp8GJlkI9aEv2YvT+/um1aelsoE/xK
   59.39 +s3wObllKsJRiZ2awYDypT0DAJKwmazlqo0PFiZBkFIgxVgVlPU3DjKfyLWzr4oH+
   59.40 +6oG0ZjiwIV11aAdl7nyrMpFFpgl7wJ0PqpxyaLcOw2AMPiT3gmVqqq9+6+sNMICV
   59.41 +HhdgkcM84WTQUb+dTqhsYMuj5CLsTNArZ3ILTfTHpC4QIYB9jnln3zeHLSQvSV3A
   59.42 +Oo0+Vt4zJRYvRN7sonv4yjO0FK03ORP4TntAtGaIevBW2fi5AY0EW9A1SgEMAM08
   59.43 +MM+3vm884IFBRfwP3VEwZdBoYeNnno74dkvRbhusVXOHd7cSSXvqO57OKPzh7XVt
   59.44 +4oDct74wg52VLE17eDUzUhPKlZVVpvi8VpI3XaQaBNhW1pTawO9gCSWGQGraBF5R
   59.45 +GsiSPl4j7DitQar6y/E9GYa+YkDLM13HGh/XOZtoB1iIRHyQ17BsRo5+JaICPH9v
   59.46 +/q+riwRij2vEHP81XpGJ1MQD+VomCjA35RAwfgn38B14+NdJRnV2Kt9oiuuiWWID
   59.47 +EAClTUewMF3F4Zs7J00UvzbX8TCThfQ5HQreB6Orfm4vC0BSDrOFGxcpOZYaMP/m
   59.48 +azPtoZLkFGsSN2SUBFqp075flwONmXWIPcBcYvX21tFiNSm2nE25J/mXoJtqQuxR
   59.49 +6MEDEmJzd9X72C1X2J+6sgrt6orPj9ZY0BbPC7uJUkRQpe5H+azsFyw0uIDE87xn
   59.50 +QgT933+D69WOZA8bpZX70b+FDXIV7HDB3NQjfLV34U57YzKiwproP98HMC7mrQAR
   59.51 +AQABiQG2BBgBCAAgFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQ
   59.52 +DXLgpU5wXEYZjQwA1mv/l8e1tJr9PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gky
   59.53 +VUboKeu35LqWMlEX0aKFhwn/3nY7rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anp
   59.54 +Z94aMnGKqUkuVL3hr5GDfUH8vCZroEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963
   59.55 +rJrKc62CwtYUI5y6BlRqCeRHhZlUNUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM
   59.56 +/UpFX7DTfEabDuXJvuE62PzcXKMWULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1
   59.57 +ssD2veVxWC/ljqxwSK7gv7YFWhCp8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPk
   59.58 +ut/t1qVpSsTPPRGMaYpguFJN5/35BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CC
   59.59 +BmPw/V4wcAyZPLoihbDeUYK3tyicMozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXi
   59.60 +NsWORBDJGNxegsAduQGNBFvQNmoBDAC4B17T6KIsP4OUyrjWXcFI9bjsAxtt8MgV
   59.61 +2O0afI5Q4q2BHETdObex3bAEjEUM7MO8cHIo9hsecUH0HhDYFgiW0NTMiMvWsBvb
   59.62 +eMR8q7MlYWZtCOvINBfwDMcGzxx8q1iRt9y81MhWT/ChwGJb8c4PoEm7vvKF0hIj
   59.63 +fnReF8XeBDXpsVoWDC2TIAs93oTD3tVIbWyjMtlGkUudHR6afMM9U48RulhHhN8v
   59.64 +Qkqq9mzht9aQtjZqCPeC1oIcJ/rRXShnH3w5ZiW2giJQBJaco4pKnSlM3caEf5+6
   59.65 +8BlZTcHztvg3rpeOJSmTVqR17d4aBBo66WYDpJZRxJ1ZXfFQPzvncUXeaW7faZNe
   59.66 +6XVFzx+ROiruD3wmvjGlVpRd2A7WfKR2lQb7xWpotF8/4qcnAK46tfLNzCaLeO7f
   59.67 +5s8E7RcTj0Hk2HnavVKdtU6DpVsxMeEFYXOQ92ieOKkrdQ60IAx6fOxTIxBfnoRI
   59.68 +mYFim3bHE9SRRy6boMuhSUlcJi4EE2sAEQEAAYkDbAQYAQgAIBYhBA/2I5B1K6Jq
   59.69 +ZNi9Jw1y4KVOcFxGBQJb0DZqAhsCAcAJEA1y4KVOcFxGwPQgBBkBCAAdFiEEtx+a
   59.70 +qcKQxFQ8CHyl5o0do0Amip4FAlvQNmoACgkQ5o0do0Amip5NNwwAkXDvlk0WQGtH
   59.71 +jXTS7bsH+pcCCAYD/fHcL5Im6AjtbW7k8durWPKh4ZzwVg+Y/eEz3TfMi2PkxoiL
   59.72 +d46DjNFUzT4+snG/uriLxDu/vjnOCE472zgYi6c8PDio5sZZTeJhempxgDD+Jc7+
   59.73 +QUNfpiXkbN830HYYNxp/rJ2cBZcAM6bnp7zcS3tok01GmAfLRewjt9hp63SnN3UP
   59.74 +X5XO3v7d/HTNLzz245Z8UrAw+2Wg249QJTmZAoSiwCPjN2rjtQxA1NkWFkPv5bJj
   59.75 +trG/FUwFXCF5M+j7Obm76jm8kud24TrmxpBB/VisCJi9gry6M/oZ0DYwB09XD1Gy
   59.76 +hQtZDV8tugA7dN2zv6ele+Ph/7WwgYrPTLc+UKGxtLP/R1PZPxaBOKs2/wyf59hg
   59.77 +bO4sjgEaatXsXm8eusBoumD/9jj9xjijs2G2sqUIcVwyMQBHVZPVAGitV46hleKT
   59.78 +8tJMpNUhXFQ+jLBalnDwScjo+Fo/dAgLhl1b34Y+FeONKR6mPU/GLbQL/1uqt9TX
   59.79 +JCrGyKT90h1KFwNZEKhCT/WFWtAQSqnuVWxAetszZ9hhCjJr9H6Ln9whKJp/oh/j
   59.80 +cheENY0DfxAxYrPOFAycaEzxRuYBIGmrCZHYT2w/lbTW2rkTMQD2L3fzwJj3RADj
   59.81 +4BVn6865JfHcMjsUXmlJE6KwRpwF544KQbjoUwUmvvzQddtg1AxmwmSe2v4KFf9g
   59.82 +e3gbLYlaQZtPGWovZCfecrIlj/AegB26PYT8lIIc+HtEShCQL000FWqHZxknhO+3
   59.83 +7jIf25bDqNsMLAZswfsv8mRHIcM+NdPn7q508xafknnVEZmgWexaHrg5RJSeKrRQ
   59.84 +dZln+lrOMg5llIyyFqlVPyRauWNc7ErkeUfq8Tvp4jV1jsSd5PzvFaw/xFBZaNuM
   59.85 +YwzMJtUHrSIp94phMR0WZBv2ZWaj4E0+QHzKFeC8xliepmft0pwINpXbxRdKZ7LX
   59.86 +kPVt8nCR5c149yKBhLuZCv2agwYdYxeHwVJjEL0gjU1X1pSRR3d3XWkqkw==
   59.87 +=bUQn
   59.88 +-----END PGP PUBLIC KEY BLOCK-----
    60.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    60.2 +++ b/test/test_keys/pub/eb_0_pub_w_v_enc.asc	Wed Nov 21 08:35:41 2018 +0100
    60.3 @@ -0,0 +1,59 @@
    60.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    60.5 +
    60.6 +mQGNBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    60.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    60.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    60.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   60.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   60.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   60.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   60.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   60.14 +TYxhzNxyHaNqrzMAEQEAAbQrRXhwaXJlZCAwIDxleHBpcmVkX2luX2JpdHNfMEBk
   60.15 +YXJ0aG1hbWEub3JnPokB1AQTAQgAPhYhBA/2I5B1K6JqZNi9Jw1y4KVOcFxGBQJY
   60.16 +DcyDAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEA1y4KVOcFxG
   60.17 +plQMALBNV7Xy8svro+e8zT9OnwAS8kLGq/nLMIVCdO4DToLMpDWAjvI5QD6asE88
   60.18 +/prAdugphlAqpl5yyjojOfVTfiOdAWhcJBxYr+OgohMBmRmpTD0kgrUnMBIXYcAH
   60.19 +dekRIwZEcT5608K+9QRfFPac+lL5Q/3j1AOlSBe+jmUi+hf/zyvAlCW1wO9edbzU
   60.20 +QbRlFaYLfhS1gKp4CERUaSBHO8eH2l8JOe/Ws9Ryn59YBybcQFK/uIxq0/4m7SZ2
   60.21 +EnESPHaEukb5OeloKOSaNoWuDBSaM87JomL+OlRpQuTbT0GD6fWxZzWRiOujmOjT
   60.22 +FWhNktqIjqSoIGyB621XBbPiZot4rklu0OTkGD/NUVu41jy3917k/IdMR/OQ1h38
   60.23 +wizx7Un/8JXTEaiW6UIdqgxznSqYfcc6lbACpn0z2sJXzEwQqkaD47lDuQmlWfAc
   60.24 +0cU7fdO1jfKKVQv18l18Ie8NCB+zoGgNKU+SPRAJVaSkrJYhkaaERICEiWdmCDl4
   60.25 +DNcsLLkBjQRYDcyDAQwAwWRkLBTKiyumMJiq3IpP0fv1xjCx3OL+jDhQ8VpXTCpM
   60.26 +AfxIW6lhFDQb91Jnaa8o/v5l/joaOZkiXCRvFl6rUYCZeTKj4JRHY/53zxegMadK
   60.27 +lMbP1nmuSgij22mh+0HWgRWL0amaI7Dv/GtuvRHTzAgSE+cLSKtVsxviTaFAtT31
   60.28 +/rKbzulPEbjbh9k84k29+Y9ya0seSGmh/OLIyGZU4H/mrt/WylKIVT93WRnZwheW
   60.29 +od8h1GOtfuzoGQhOLZ2CozzKsfOFoV1/kZ5mGivjr2jjbBUh7QuXhQ1evJKxkzGc
   60.30 +uLHwSl7BtdbHqd7t3S5f7Lihck4mT7QvK29h25geI23xoW9LXrI3KEmW9STWWbJy
   60.31 +r6ZQdDsk6FzNJ3IR8Sj6oKQI+N1r/hC68S+JylqmpWR1UcMqs4PxUhGiXa0QgeKX
   60.32 +Z8D8xWMeIWw/RT2eK5IkMcVxV89u8OK/pyeW3mP9ZGAcKOjxZIrqvilRD7cx18Yl
   60.33 +/2xPrnVOBwoRM8yuwL61ABEBAAGJAbwEGAEIACYWIQQP9iOQdSuiamTYvScNcuCl
   60.34 +TnBcRgUCWA3MgwIbDAUJA8JnAAAKCRANcuClTnBcRu2LDACCrEOUJoP8wnCld+Si
   60.35 ++brkaROojJY7Ow7+RwO1gxoIaiwl4yMqVifsIUwn4jnB5EaufkAh/rxB7/OTtxvC
   60.36 +Cuft6ewiyRpxPp/G6j9w1hwAzDEQv/3y4C5U8vKGKV0uRsF8KpFLNYlv2p+y24Eh
   60.37 +Wt3Tyj1DhxWe/rwj5hDLyq7CcUfW3rSLABMF2iS11/umlSiOwZJyd+UyYR19wXFu
   60.38 +jLUrtUMY/W/vSWu7OMD9zL/FTiNDIdWHZGYp8GJlkI9aEv2YvT+/um1aelsoE/xK
   60.39 +s3wObllKsJRiZ2awYDypT0DAJKwmazlqo0PFiZBkFIgxVgVlPU3DjKfyLWzr4oH+
   60.40 +6oG0ZjiwIV11aAdl7nyrMpFFpgl7wJ0PqpxyaLcOw2AMPiT3gmVqqq9+6+sNMICV
   60.41 +HhdgkcM84WTQUb+dTqhsYMuj5CLsTNArZ3ILTfTHpC4QIYB9jnln3zeHLSQvSV3A
   60.42 +Oo0+Vt4zJRYvRN7sonv4yjO0FK03ORP4TntAtGaIevBW2fi5AY0EW9A1SgEMAM08
   60.43 +MM+3vm884IFBRfwP3VEwZdBoYeNnno74dkvRbhusVXOHd7cSSXvqO57OKPzh7XVt
   60.44 +4oDct74wg52VLE17eDUzUhPKlZVVpvi8VpI3XaQaBNhW1pTawO9gCSWGQGraBF5R
   60.45 +GsiSPl4j7DitQar6y/E9GYa+YkDLM13HGh/XOZtoB1iIRHyQ17BsRo5+JaICPH9v
   60.46 +/q+riwRij2vEHP81XpGJ1MQD+VomCjA35RAwfgn38B14+NdJRnV2Kt9oiuuiWWID
   60.47 +EAClTUewMF3F4Zs7J00UvzbX8TCThfQ5HQreB6Orfm4vC0BSDrOFGxcpOZYaMP/m
   60.48 +azPtoZLkFGsSN2SUBFqp075flwONmXWIPcBcYvX21tFiNSm2nE25J/mXoJtqQuxR
   60.49 +6MEDEmJzd9X72C1X2J+6sgrt6orPj9ZY0BbPC7uJUkRQpe5H+azsFyw0uIDE87xn
   60.50 +QgT933+D69WOZA8bpZX70b+FDXIV7HDB3NQjfLV34U57YzKiwproP98HMC7mrQAR
   60.51 +AQABiQG2BBgBCAAgFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQ
   60.52 +DXLgpU5wXEYZjQwA1mv/l8e1tJr9PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gky
   60.53 +VUboKeu35LqWMlEX0aKFhwn/3nY7rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anp
   60.54 +Z94aMnGKqUkuVL3hr5GDfUH8vCZroEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963
   60.55 +rJrKc62CwtYUI5y6BlRqCeRHhZlUNUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM
   60.56 +/UpFX7DTfEabDuXJvuE62PzcXKMWULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1
   60.57 +ssD2veVxWC/ljqxwSK7gv7YFWhCp8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPk
   60.58 +ut/t1qVpSsTPPRGMaYpguFJN5/35BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CC
   60.59 +BmPw/V4wcAyZPLoihbDeUYK3tyicMozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXi
   60.60 +NsWORBDJGNxegsAd
   60.61 +=KWOb
   60.62 +-----END PGP PUBLIC KEY BLOCK-----
    61.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.2 +++ b/test/test_keys/pub/eb_0_valid_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    61.3 @@ -0,0 +1,85 @@
    61.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    61.5 +
    61.6 +mQGNBFgNzIMBDADYxPTEqscyLp9zd/1NmUUQgJlNAfxnU4tFjzibUTGhxSD2I4fu
    61.7 +KbX2d6FauznXre5dMOSXq58Cc+D3gtE5O/smu00PKJA1ymCi7JnstVDX3AMWLJzm
    61.8 +1A0xLuTL1hwKyjMc7aYS7RfscrJCgTT+W9Q88RDq6b32y+PcuZwicOXy2Jgur4Zt
    61.9 +fhUME8K21sFNM+1M+DmQSkalj3n+n9BFDd5SOSXq93tZjLqAMJBD/qp2VS4Tke7V
   61.10 +uSPDZaQWpqbWKAoYuNqEBDsoArY41elFTmhKU3Oi+dNDIEU6I5cqIGVfLm0OKCDO
   61.11 +6BM+3BRNO2UdCNDquhuzak+WTCkS9jZjU1aoL09HFL307aIXySFOV7ENk7nlmeHQ
   61.12 +kzyJJzkelQf5MekooQOou4OpQZAFJFKTkS5hrx6tMfbeJIflmkHG9B8ucLnRK6iL
   61.13 +3wfReZwK3vYJoMJcCxuSmgij1vHU6gl5rYbG6Cv2VtcQeqD88AEsW/j0i8fU5jvz
   61.14 +TYxhzNxyHaNqrzMAEQEAAbQrRXhwaXJlZCAwIDxleHBpcmVkX2luX2JpdHNfMEBk
   61.15 +YXJ0aG1hbWEub3JnPokBzgQTAQgAOAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX
   61.16 +gBYhBA/2I5B1K6JqZNi9Jw1y4KVOcFxGBQJb0DjiAAoJEA1y4KVOcFxGPNUL/jJG
   61.17 +nYjPNcndkxnAQM4iAM0l2FxQWLnpwxvi0Cs9R7k7YPPtEkN9LhXsDj+njgMoOHWb
   61.18 ++SNxolRe8408gK/Wks1B/KSCpWsmaBXNX076/7C/pA6WoEbabnm6iWiKx+HPwu3U
   61.19 +q3xAHoxGuo9NHIcHG44D9IeI0FbOVuuPhsEAcwKXhUbMIY+cPH3briRBZwf21uXV
   61.20 +YQC/5tsjQ9A6hly/Ki0WV0rCiWjgNNyUBJDNvM3K2fuyMSwHvxa8fFxZZIX/Iqf1
   61.21 +Y2TbfjilgfZS1QLALJ8z9w7yUaJvnebH8aDKptMhKWuSuadvXE9ReRVxRd+ol8ds
   61.22 +Y66025Kq1wXsftDDJTXRWx7DMrETvAiulAoUqWzPSsFVTXrZehis0i23j5blsuuZ
   61.23 +qfjY7TEZkfy3D1+OLTsBnWyQ2ZZV7EbgaCcw4bn3PUt5IUvQ78ElBKuQMEowlN1M
   61.24 +S83osyVOCGdSuCNHyimgj/7zE0yJLgz8osvz8SFWG1PKkmIH1jbpoGiz3hwwALkB
   61.25 +jQRYDcyDAQwAwWRkLBTKiyumMJiq3IpP0fv1xjCx3OL+jDhQ8VpXTCpMAfxIW6lh
   61.26 +FDQb91Jnaa8o/v5l/joaOZkiXCRvFl6rUYCZeTKj4JRHY/53zxegMadKlMbP1nmu
   61.27 +Sgij22mh+0HWgRWL0amaI7Dv/GtuvRHTzAgSE+cLSKtVsxviTaFAtT31/rKbzulP
   61.28 +Ebjbh9k84k29+Y9ya0seSGmh/OLIyGZU4H/mrt/WylKIVT93WRnZwheWod8h1GOt
   61.29 +fuzoGQhOLZ2CozzKsfOFoV1/kZ5mGivjr2jjbBUh7QuXhQ1evJKxkzGcuLHwSl7B
   61.30 +tdbHqd7t3S5f7Lihck4mT7QvK29h25geI23xoW9LXrI3KEmW9STWWbJyr6ZQdDsk
   61.31 +6FzNJ3IR8Sj6oKQI+N1r/hC68S+JylqmpWR1UcMqs4PxUhGiXa0QgeKXZ8D8xWMe
   61.32 +IWw/RT2eK5IkMcVxV89u8OK/pyeW3mP9ZGAcKOjxZIrqvilRD7cx18Yl/2xPrnVO
   61.33 +BwoRM8yuwL61ABEBAAGJAbwEGAEIACYWIQQP9iOQdSuiamTYvScNcuClTnBcRgUC
   61.34 +WA3MgwIbDAUJA8JnAAAKCRANcuClTnBcRu2LDACCrEOUJoP8wnCld+Si+brkaROo
   61.35 +jJY7Ow7+RwO1gxoIaiwl4yMqVifsIUwn4jnB5EaufkAh/rxB7/OTtxvCCuft6ewi
   61.36 +yRpxPp/G6j9w1hwAzDEQv/3y4C5U8vKGKV0uRsF8KpFLNYlv2p+y24EhWt3Tyj1D
   61.37 +hxWe/rwj5hDLyq7CcUfW3rSLABMF2iS11/umlSiOwZJyd+UyYR19wXFujLUrtUMY
   61.38 +/W/vSWu7OMD9zL/FTiNDIdWHZGYp8GJlkI9aEv2YvT+/um1aelsoE/xKs3wObllK
   61.39 +sJRiZ2awYDypT0DAJKwmazlqo0PFiZBkFIgxVgVlPU3DjKfyLWzr4oH+6oG0Zjiw
   61.40 +IV11aAdl7nyrMpFFpgl7wJ0PqpxyaLcOw2AMPiT3gmVqqq9+6+sNMICVHhdgkcM8
   61.41 +4WTQUb+dTqhsYMuj5CLsTNArZ3ILTfTHpC4QIYB9jnln3zeHLSQvSV3AOo0+Vt4z
   61.42 +JRYvRN7sonv4yjO0FK03ORP4TntAtGaIevBW2fi5AY0EW9A1SgEMAM08MM+3vm88
   61.43 +4IFBRfwP3VEwZdBoYeNnno74dkvRbhusVXOHd7cSSXvqO57OKPzh7XVt4oDct74w
   61.44 +g52VLE17eDUzUhPKlZVVpvi8VpI3XaQaBNhW1pTawO9gCSWGQGraBF5RGsiSPl4j
   61.45 +7DitQar6y/E9GYa+YkDLM13HGh/XOZtoB1iIRHyQ17BsRo5+JaICPH9v/q+riwRi
   61.46 +j2vEHP81XpGJ1MQD+VomCjA35RAwfgn38B14+NdJRnV2Kt9oiuuiWWIDEAClTUew
   61.47 +MF3F4Zs7J00UvzbX8TCThfQ5HQreB6Orfm4vC0BSDrOFGxcpOZYaMP/mazPtoZLk
   61.48 +FGsSN2SUBFqp075flwONmXWIPcBcYvX21tFiNSm2nE25J/mXoJtqQuxR6MEDEmJz
   61.49 +d9X72C1X2J+6sgrt6orPj9ZY0BbPC7uJUkRQpe5H+azsFyw0uIDE87xnQgT933+D
   61.50 +69WOZA8bpZX70b+FDXIV7HDB3NQjfLV34U57YzKiwproP98HMC7mrQARAQABiQG2
   61.51 +BBgBCAAgFiEED/YjkHUrompk2L0nDXLgpU5wXEYFAlvQNUoCGwwACgkQDXLgpU5w
   61.52 +XEYZjQwA1mv/l8e1tJr9PFueL3Af+KHHrMpiSafUp5eYUKBhdzky3gkyVUboKeu3
   61.53 +5LqWMlEX0aKFhwn/3nY7rSlydZ+AnsAaDaeKDLe/TgGBF+iSPl6v+anpZ94aMnGK
   61.54 +qUkuVL3hr5GDfUH8vCZroEWkWgU6gxMSyC0RWh8tcYad6Rxb/clar963rJrKc62C
   61.55 +wtYUI5y6BlRqCeRHhZlUNUHPPBxQJa6bxEAtg5CJZy9IsLVPYAVrXdsM/UpFX7DT
   61.56 +fEabDuXJvuE62PzcXKMWULom76arUUGxh8oiMDhoxw0qjDwpDfEIotK1ssD2veVx
   61.57 +WC/ljqxwSK7gv7YFWhCp8ihddvJIl/qdAWpELd/FaxKF7IY9MkqyhbPkut/t1qVp
   61.58 +SsTPPRGMaYpguFJN5/35BrPhiHjYK8DNKDE3BR4V4lKVgBcMVWuGR0CCBmPw/V4w
   61.59 +cAyZPLoihbDeUYK3tyicMozr9LSEoUov7yviRWc9tItT9oc8xFGSQdXiNsWORBDJ
   61.60 +GNxegsAduQGNBFvQNmoBDAC4B17T6KIsP4OUyrjWXcFI9bjsAxtt8MgV2O0afI5Q
   61.61 +4q2BHETdObex3bAEjEUM7MO8cHIo9hsecUH0HhDYFgiW0NTMiMvWsBvbeMR8q7Ml
   61.62 +YWZtCOvINBfwDMcGzxx8q1iRt9y81MhWT/ChwGJb8c4PoEm7vvKF0hIjfnReF8Xe
   61.63 +BDXpsVoWDC2TIAs93oTD3tVIbWyjMtlGkUudHR6afMM9U48RulhHhN8vQkqq9mzh
   61.64 +t9aQtjZqCPeC1oIcJ/rRXShnH3w5ZiW2giJQBJaco4pKnSlM3caEf5+68BlZTcHz
   61.65 +tvg3rpeOJSmTVqR17d4aBBo66WYDpJZRxJ1ZXfFQPzvncUXeaW7faZNe6XVFzx+R
   61.66 +OiruD3wmvjGlVpRd2A7WfKR2lQb7xWpotF8/4qcnAK46tfLNzCaLeO7f5s8E7RcT
   61.67 +j0Hk2HnavVKdtU6DpVsxMeEFYXOQ92ieOKkrdQ60IAx6fOxTIxBfnoRImYFim3bH
   61.68 +E9SRRy6boMuhSUlcJi4EE2sAEQEAAYkDbAQYAQgAIBYhBA/2I5B1K6JqZNi9Jw1y
   61.69 +4KVOcFxGBQJb0DZqAhsCAcAJEA1y4KVOcFxGwPQgBBkBCAAdFiEEtx+aqcKQxFQ8
   61.70 +CHyl5o0do0Amip4FAlvQNmoACgkQ5o0do0Amip5NNwwAkXDvlk0WQGtHjXTS7bsH
   61.71 ++pcCCAYD/fHcL5Im6AjtbW7k8durWPKh4ZzwVg+Y/eEz3TfMi2PkxoiLd46DjNFU
   61.72 +zT4+snG/uriLxDu/vjnOCE472zgYi6c8PDio5sZZTeJhempxgDD+Jc7+QUNfpiXk
   61.73 +bN830HYYNxp/rJ2cBZcAM6bnp7zcS3tok01GmAfLRewjt9hp63SnN3UPX5XO3v7d
   61.74 +/HTNLzz245Z8UrAw+2Wg249QJTmZAoSiwCPjN2rjtQxA1NkWFkPv5bJjtrG/FUwF
   61.75 +XCF5M+j7Obm76jm8kud24TrmxpBB/VisCJi9gry6M/oZ0DYwB09XD1GyhQtZDV8t
   61.76 +ugA7dN2zv6ele+Ph/7WwgYrPTLc+UKGxtLP/R1PZPxaBOKs2/wyf59hgbO4sjgEa
   61.77 +atXsXm8eusBoumD/9jj9xjijs2G2sqUIcVwyMQBHVZPVAGitV46hleKT8tJMpNUh
   61.78 +XFQ+jLBalnDwScjo+Fo/dAgLhl1b34Y+FeONKR6mPU/GLbQL/1uqt9TXJCrGyKT9
   61.79 +0h1KFwNZEKhCT/WFWtAQSqnuVWxAetszZ9hhCjJr9H6Ln9whKJp/oh/jcheENY0D
   61.80 +fxAxYrPOFAycaEzxRuYBIGmrCZHYT2w/lbTW2rkTMQD2L3fzwJj3RADj4BVn6865
   61.81 +JfHcMjsUXmlJE6KwRpwF544KQbjoUwUmvvzQddtg1AxmwmSe2v4KFf9ge3gbLYla
   61.82 +QZtPGWovZCfecrIlj/AegB26PYT8lIIc+HtEShCQL000FWqHZxknhO+37jIf25bD
   61.83 +qNsMLAZswfsv8mRHIcM+NdPn7q508xafknnVEZmgWexaHrg5RJSeKrRQdZln+lrO
   61.84 +Mg5llIyyFqlVPyRauWNc7ErkeUfq8Tvp4jV1jsSd5PzvFaw/xFBZaNuMYwzMJtUH
   61.85 +rSIp94phMR0WZBv2ZWaj4E0+QHzKFeC8xliepmft0pwINpXbxRdKZ7LXkPVt8nCR
   61.86 +5c149yKBhLuZCv2agwYdYxeHwVJjEL0gjU1X1pSRR3d3XWkqkw==
   61.87 +=8qZl
   61.88 +-----END PGP PUBLIC KEY BLOCK-----
    62.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    62.2 +++ b/test/test_keys/pub/inquisitor-0xA4728718_full_expired.pub.asc	Wed Nov 21 08:35:41 2018 +0100
    62.3 @@ -0,0 +1,68 @@
    62.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    62.5 +
    62.6 +mQGNBEdLUwABDAC2bTz7s8V9CDu/K3PtSXDvNCtx+84tdQEoNnmzQh9bkdnHWIzO
    62.7 +cscoO/YcJIQFJJ7WWdCudLLj+qaHS1t2EomW8ZRYe/HdIcIW/qO0ydGDShiJxEZN
    62.8 +4ZrNPz+BfEAhatbsN46z7DyzZjGHPPdIdLic2QAuDbv/z2/11ABDYa58vZINOp1r
    62.9 +pkmytOJps92K8hpY+PmfWTdNSWaNTCiQoel0MyyV/AgNLv/HUJRlN5QvqCQWqcAN
   62.10 +lHE5JmVZQK9wzlzs8T8pnoJJRPMG3GeiiMWMXjPUI01DdX+Fv69wkFavUOOV/JND
   62.11 +0nKl42xqajbkDL+Hc9veNlR4+hVykdVOlFgEY3x37wiI3gklHGoRZmex4MOL9+oB
   62.12 +LEiOARhtduG1w3bukOphhBfc1W4We12WIblKWfzRr/YhIgiNCD5rCL8kvcaFyKUe
   62.13 +3a9BQWayRewPmY8IdxcUHoKwhNS5a+52Aqgd/1ki+VvWRX3uTVAZA0rIiECGTioQ
   62.14 +MkSHr1F00bZ+1QEAEQEAAbQwTGFkeSBDbGFpcmUgVHJldmVseWFuIDxpbnF1aXNp
   62.15 +dG9yQGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+FiEEjo0jga4Gar4f7lCYIbqXfKRy
   62.16 +hxgFAkdLUwACGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQIbqX
   62.17 +fKRyhxjicQv/aqTx2pzCiCTj8Sza+WKewGYXDpc1+yF5adYcLZujD1zEc++sA3g4
   62.18 +0EpQ1KPNHjiGg5qukN8hy9122gwV6B7I+RzthdaGkJzYAcquq5aDhY40OM3D6e2e
   62.19 +lN7yj/vnBNQk0wP8GSrFuRA4NqKXeQQqtDGI9h+yqIrFy6TOjZNMw1nma3ZnsF74
   62.20 +TZpZ39q93uzehUt3EXlokkLxcVXDR2Ct0BAG9yWXte9pKX/5KD0ANuISMo2PiY0y
   62.21 +xhUO+Fj0rFwqONt7OmI4/NBbSTksCUPiYFH4Cgepr+GnSwxDdi7G8pbpnIva7+1R
   62.22 +d1FlFsIKOBYcMa+jt2x+3k3OBI41nsQdeIaL0RpoDSQYsswCrItkAQHflGOWOcWq
   62.23 +ofhHeMzKb7OR6G7hDz399bFFZLfSexyGyj3gyZKMEPFDvAHktXxMvomnMJR/91Xt
   62.24 +O8VMhg87Z0v70OjAcyGZtdm73nVwCzqnV6+tXvq8dORcMP0NBcffHwVlA2p+b1yg
   62.25 +rzUsd8swaHXHuQGNBEdLUwABDADFucwuaIM6TymiK54S8qQfiO7JR4hd5LfIhpoF
   62.26 +Hj6/RlbkZC69r1ic9/k73dy/FI13jRHWds/36sQw9PKZN4GP3/yYRkHjZ77GeJ7G
   62.27 +lVJ3N18+uNFurnx/mibYAlvmPq76NMy12foZYXCfRXq6ETg44reT8LtLYAXIzqZz
   62.28 +7v6dVXPmI9eOasPR0Ef7ENrZ49Npt9f2vDzn+nnxkYCEYQzCdSnrlcy6rFxFiSDo
   62.29 +uudTjr7ThtLSjnpsZpvHDqjKkQVu21W0rKinA9P+7EMOpqaxVmCqfViirvlzN7B0
   62.30 +5NjWYSqgH8paGS54YIgt9C4EEvUDCXQuP0A32WNrKxCpaHdbV/Bo9OxOz+Txv3ul
   62.31 +/q4zyhKKiZk1MaoxAJPPvsrzxkEZ3E/FfXRG6RlPc5u6pmHbWU40BSxyf/5kXMds
   62.32 +6k0hMaBE4NyFoMreXum0MqTvtsa+TQtCX91G4+0YQ+oR8z2kjz8ieWcZ8lwHj7Cj
   62.33 +7A1iUVXNiWIjEE6gYPbApGVnHEUAEQEAAYkBvAQYAQgAJhYhBI6NI4GuBmq+H+5Q
   62.34 +mCG6l3ykcocYBQJHS1MAAhsMBQkDwmcAAAoJECG6l3ykcocY6MML/jERTV7AAySz
   62.35 +uwygKyBpi7SLt/Jij0Wigi1FOnWpQLfMkiFBX1ajt7T7VJfxkBVJuM0hVNALc/ZI
   62.36 +SVN22J96Ml1lrvopwLIzNuDqEj2JyRTWKXosaM+vnFfGtZRgZxLbVcWC3vKTwvYV
   62.37 +jPAxxRYb9qKWffXOPfD1QZoQcrzb5ZqxuSdiahvFA1yNunVBkZq1JRAd8D7JMGXH
   62.38 +IPK9RHauJNQ6HHqNfocNA2I5q4dmLTNE/QWcyTu0driv4BDSD8zj63xoKwKWPnCz
   62.39 +sCIz2NTthpfhUgLev8f6kkYSbDpE2obEdr8wzf30D0dbKuk/8t0wKHFQaRQNzxUi
   62.40 +zZcbDmPdUw1dwRgmFvg8NOoglJonZJj8fFRXMKnWt74dM8FQBiiBakPZ1B22uzzK
   62.41 +p01/j44Rlk4diYStSx8IsVOHSoAPlaQvYKNKXYqUvvL6z1hbl8dlLJy7r+gulRZx
   62.42 +wgCXcDWH90to7dSSHasOQmyMPVfmEtqz3q9Ya5vz4ht7E6VYv1VfTbkBjQRHS1NH
   62.43 +AQwAxLUM+31j9uNQMjEEbv/W03/kx0F6JTam9lWkjLfhra81YWdQ1S7u88RRehO7
   62.44 +dklxCPy4EPOreKQnns7XuDIVBiwhRt0mtVWGyviyHuYHJH9+qrsb4KsnDM+1Vyez
   62.45 +MKKVGfMr7cb+9h3iZb28zwvnwTgnytz82XAZRuqsqRsA/mhQ3JG1QBKAeAGdKdNZ
   62.46 +4YhtFU+Njp23xN+lj1cS6HeCGzvuOTKKSfA1Oilidqp4gMdD/kEabDUHQWPUJvIn
   62.47 +P5SJDdASkC86YKuYTSF/IeLKGumr557BqwvhrEEctoXFgHkPJnZyH4PgPg2pu3F3
   62.48 +m9YNHffLOAlPntYWtSsb1p3Ku7Gl8b2/oJFQWQD6j1/5QjwT4+vezrutq7Vm6tm2
   62.49 +Mq5aA23fI8ThJv8mXAtOoroXhBxd8Mtuxq9i+7Jf2O5SETrcCl86HcjQ0BkhW3q7
   62.50 +X+dFz1fzHYB7zMtlsiFyzBR3shvMiCaqeCr63m3Dl+FA1o1SO9Qa00B3CW0y7wVo
   62.51 +kxiVABEBAAGJA3IEGAEIACYWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCR0tTRwIb
   62.52 +AgUJAeEzgAHACRAhupd8pHKHGMD0IAQZAQgAHRYhBOEnUeYHkpl5OllbbeH52cCA
   62.53 +wQuBBQJHS1NHAAoJEOH52cCAwQuBrcoMAKxYGeOOXJfDau0rXvyNxPHqTYgLJkzW
   62.54 +ipofizqjruP52w7vef/FiVHOHhxRNaCMgKFhiBNzM7GVNlrBcXmgwkUo7PLhC+DV
   62.55 +gSr0gkAdFQ01Ic/EjfyKznxS49nxuziFfOM63BsBo7MNQB7eklDRsfz2OLgDB/SE
   62.56 +3svv5A31QBTdYQpBZNZLFhYDo+JQsZKx+YMsXoro7rBGcN1aF4ogyXYcaOm+DJp+
   62.57 +ZwZUIi3/7wgRHdTOUwr7PBTxlNLqBG0RdOvb2iKjxQmCY8kc4Se13CPuQvEKb4LO
   62.58 +jlHsRp+N2GP0b6Rr7XPJo9YbBA6xo4ICrtaXCkJd6qMux96P7t6SWh4ZYvMGP2XO
   62.59 +eHLGe8OiZjo6cEOsYvdavmOZM0X+A814uNalEzcl027Q8NtcGW0oBn/C3AOKKR69
   62.60 +fRzwBfZTY1E8G9kYNO9xj+GBFwudjs7l/DSX71g1XQWkMpXNn8SoODh15UoIfjkR
   62.61 +2Ic8LdpgYlTYsaapOxLoulFmyTJn6bRy028+C/9SwTIAmlGRP7rneycRdCOUmqN7
   62.62 +dQJ5pcU6M9FQiqyLr4pvoED7ambIC438ZelwkacPu0Uc+KFVqOUGwng5Ldz62smH
   62.63 +nFwVn1BrasjhP+ilN3c9iSHr8flQeVRU288ywKWXKV/VlHkND+sKGxDpWF53y3fF
   62.64 +rKjukG7sIkd7k/RHtYv5mMuYx9O2gcG8mnzP+zk9YBjgbeow+Se0SdlSnRIGXLl0
   62.65 +mk2CfJKZp5hd+sMXq+Gw78MBCBNv0cfQCfBfhPFbm44oDUgotFQliEBU1ey5fOUj
   62.66 +tEOPpvvQzAA4KRK4BMd6RHnJI657X9ffWiX900IggFYIC+yCTaKmm9LVMgPZ5KS/
   62.67 +C+MdvZlkWzH8jv7gKFHP1JV1c//vSuxq0khtAIkffl0KxLQBHoov8LcFsADafhnY
   62.68 +UZFXASOsZOdv1sp5HqLrkJmOk28sw0+6HrVXa4PItghG5jOVG1CgWaCCtC24zQj5
   62.69 +zhXYfmh/aGIdBf1vPe9bZi5tJqJFwNBceGW3kZI=
   62.70 +=Adb/
   62.71 +-----END PGP PUBLIC KEY BLOCK-----
    63.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.2 +++ b/test/test_keys/pub/inquisitor-0xA4728718_renewed_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    63.3 @@ -0,0 +1,68 @@
    63.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    63.5 +
    63.6 +mQGNBEdLUwABDAC2bTz7s8V9CDu/K3PtSXDvNCtx+84tdQEoNnmzQh9bkdnHWIzO
    63.7 +cscoO/YcJIQFJJ7WWdCudLLj+qaHS1t2EomW8ZRYe/HdIcIW/qO0ydGDShiJxEZN
    63.8 +4ZrNPz+BfEAhatbsN46z7DyzZjGHPPdIdLic2QAuDbv/z2/11ABDYa58vZINOp1r
    63.9 +pkmytOJps92K8hpY+PmfWTdNSWaNTCiQoel0MyyV/AgNLv/HUJRlN5QvqCQWqcAN
   63.10 +lHE5JmVZQK9wzlzs8T8pnoJJRPMG3GeiiMWMXjPUI01DdX+Fv69wkFavUOOV/JND
   63.11 +0nKl42xqajbkDL+Hc9veNlR4+hVykdVOlFgEY3x37wiI3gklHGoRZmex4MOL9+oB
   63.12 +LEiOARhtduG1w3bukOphhBfc1W4We12WIblKWfzRr/YhIgiNCD5rCL8kvcaFyKUe
   63.13 +3a9BQWayRewPmY8IdxcUHoKwhNS5a+52Aqgd/1ki+VvWRX3uTVAZA0rIiECGTioQ
   63.14 +MkSHr1F00bZ+1QEAEQEAAbQwTGFkeSBDbGFpcmUgVHJldmVseWFuIDxpbnF1aXNp
   63.15 +dG9yQGRhcnRobWFtYS5vcmc+iQHUBBMBCAA+AhsDBQsJCAcCBhUKCQgLAgQWAgMB
   63.16 +Ah4BAheAFiEEjo0jga4Gar4f7lCYIbqXfKRyhxgFAlvEYBsFCSdFEBsACgkQIbqX
   63.17 +fKRyhxiwhgv+PS9XovTbC9kMqku2s8miYY3n3BidbMbt/gIlUost1MG+ldbbnIbV
   63.18 +HiE6kZlwoWxV/K4nErENEIgNxLLPcb2mPtJcz+PqUWZezQHu5sg5sWfg8kHxhtTs
   63.19 +roP+DeUZfmK7u1hrvE7fcHI5I8OoGW2oyqfpKr9gG9Vft3C8fgTuon2iGdiV0T4i
   63.20 +0ogdVjSOpSVYxG0MGaAc76g4nhuh1C1av2lkmGDy767BIQGDAiKGk/T6lPAtL2th
   63.21 +UqTjAdhbtsH3DGfxOx+QwgzV9g8Ot9NlH7UI1SK5fmmd5vdlSha4uR2iTBldlbcS
   63.22 +xLXPTfmfGlYru2jPnK64h4c1JS36RX3L2HQm7UGoMv0tGW1z0c6N2RBs/BRlv0i8
   63.23 +ym26O2XoqYIxISmclVqi/NOJFYnPtaH3zGONlDDC+ir73qf8Yx9yHlYUG5gOI2od
   63.24 +u1Qfs0LX55p8yVKPVyjMI8s0X5nFAqLSeX7NTtdwOoe58xBh304BCSOaxyUcS+C1
   63.25 +wZ/Ndn18l79+uQGNBEdLUwABDADFucwuaIM6TymiK54S8qQfiO7JR4hd5LfIhpoF
   63.26 +Hj6/RlbkZC69r1ic9/k73dy/FI13jRHWds/36sQw9PKZN4GP3/yYRkHjZ77GeJ7G
   63.27 +lVJ3N18+uNFurnx/mibYAlvmPq76NMy12foZYXCfRXq6ETg44reT8LtLYAXIzqZz
   63.28 +7v6dVXPmI9eOasPR0Ef7ENrZ49Npt9f2vDzn+nnxkYCEYQzCdSnrlcy6rFxFiSDo
   63.29 +uudTjr7ThtLSjnpsZpvHDqjKkQVu21W0rKinA9P+7EMOpqaxVmCqfViirvlzN7B0
   63.30 +5NjWYSqgH8paGS54YIgt9C4EEvUDCXQuP0A32WNrKxCpaHdbV/Bo9OxOz+Txv3ul
   63.31 +/q4zyhKKiZk1MaoxAJPPvsrzxkEZ3E/FfXRG6RlPc5u6pmHbWU40BSxyf/5kXMds
   63.32 +6k0hMaBE4NyFoMreXum0MqTvtsa+TQtCX91G4+0YQ+oR8z2kjz8ieWcZ8lwHj7Cj
   63.33 +7A1iUVXNiWIjEE6gYPbApGVnHEUAEQEAAYkBvAQYAQgAJgIbDBYhBI6NI4GuBmq+
   63.34 +H+5QmCG6l3ykcocYBQJbxGAbBQknRRAbAAoJECG6l3ykcocY6CwMAJr10elv2Dwg
   63.35 +yrBqaNKpM92n1W1pCCzxv331crnoPYDrIkTVowkC32No70s9q7gnY89TqoxP/6eY
   63.36 +5LtxsDo6zs3o5bZm8l1whm+vgeRqxcf2ET+FPfI42L6nF3/U4w4t0azFdUhkB7O9
   63.37 +ozOcpXQtcoLBpMM26zo3l4qb1nHIAebtx2BCgBM7fU+R43Eqq0Ol+A1bHkyiIJYd
   63.38 +aoO0VN1sH4AKn48Mf8Hjb3X87znyXvSv2S9UQM5RbZ5otWLxftqG2ne6OP/FE4xI
   63.39 +wibbu4HiDbaRHHjpzmEidzbG47Nyc8Fl7AFPZ9nXAL/yZovASuyXV7UXjwDyYAUP
   63.40 +ZKkhmNK8a1otIOv2xTSheyh2+BtQ+y5kVvZhS/kBUwlRl8uTs0Tj19ftDgj/K/I/
   63.41 +2oPInQAPKYikopzsEZ+q0NvLH+iAGoIHuBAQCdRQ3+z114DdiS1XSTFXn/I5DsbC
   63.42 +iHBqIk/i2hY5K58oXjF0ZMvwgAJzZwAk/L4NMxp+jDDY1KjPSdVk+LkBjQRHS1NH
   63.43 +AQwAxLUM+31j9uNQMjEEbv/W03/kx0F6JTam9lWkjLfhra81YWdQ1S7u88RRehO7
   63.44 +dklxCPy4EPOreKQnns7XuDIVBiwhRt0mtVWGyviyHuYHJH9+qrsb4KsnDM+1Vyez
   63.45 +MKKVGfMr7cb+9h3iZb28zwvnwTgnytz82XAZRuqsqRsA/mhQ3JG1QBKAeAGdKdNZ
   63.46 +4YhtFU+Njp23xN+lj1cS6HeCGzvuOTKKSfA1Oilidqp4gMdD/kEabDUHQWPUJvIn
   63.47 +P5SJDdASkC86YKuYTSF/IeLKGumr557BqwvhrEEctoXFgHkPJnZyH4PgPg2pu3F3
   63.48 +m9YNHffLOAlPntYWtSsb1p3Ku7Gl8b2/oJFQWQD6j1/5QjwT4+vezrutq7Vm6tm2
   63.49 +Mq5aA23fI8ThJv8mXAtOoroXhBxd8Mtuxq9i+7Jf2O5SETrcCl86HcjQ0BkhW3q7
   63.50 +X+dFz1fzHYB7zMtlsiFyzBR3shvMiCaqeCr63m3Dl+FA1o1SO9Qa00B3CW0y7wVo
   63.51 +kxiVABEBAAGJA3IEGAEIACYCGwIWIQSOjSOBrgZqvh/uUJghupd8pHKHGAUCW8Rg
   63.52 +GwUJJ0UP1AHAwPQgBBkBCAAdFiEE4SdR5geSmXk6WVtt4fnZwIDBC4EFAkdLU0cA
   63.53 +CgkQ4fnZwIDBC4GtygwArFgZ445cl8Nq7Ste/I3E8epNiAsmTNaKmh+LOqOu4/nb
   63.54 +Du95/8WJUc4eHFE1oIyAoWGIE3MzsZU2WsFxeaDCRSjs8uEL4NWBKvSCQB0VDTUh
   63.55 +z8SN/IrOfFLj2fG7OIV84zrcGwGjsw1AHt6SUNGx/PY4uAMH9ITey+/kDfVAFN1h
   63.56 +CkFk1ksWFgOj4lCxkrH5gyxeiujusEZw3VoXiiDJdhxo6b4Mmn5nBlQiLf/vCBEd
   63.57 +1M5TCvs8FPGU0uoEbRF069vaIqPFCYJjyRzhJ7XcI+5C8Qpvgs6OUexGn43YY/Rv
   63.58 +pGvtc8mj1hsEDrGjggKu1pcKQl3qoy7H3o/u3pJaHhli8wY/Zc54csZ7w6JmOjpw
   63.59 +Q6xi91q+Y5kzRf4DzXi41qUTNyXTbtDw21wZbSgGf8LcA4opHr19HPAF9lNjUTwb
   63.60 +2Rg073GP4YEXC52OzuX8NJfvWDVdBaQylc2fxKg4OHXlSgh+ORHYhzwt2mBiVNix
   63.61 +pqk7Eui6UWbJMmfptHLTCRAhupd8pHKHGMl6C/4/yRB2wZ+xUOpSW3UWJnWur2TD
   63.62 +nkwPCPioSEt1k+G5F/CGYkIG6209FYVTpfcsBXKekEUiMuKGq+A2mKKsDJ72ahBP
   63.63 +0gAuEpz//cKBS0T07Manwc+nTFcuPgJfZxBgCor7gmj4geWHjG6KrwOwk33cI5sp
   63.64 +Y9PdB48u/ogsJvWT9ruQxvVPbzJ6BLuRSbNN1C/aXTATbE4yXqwmqfigx46f6KkA
   63.65 +pwC5M/xGvI8xYLlv4hOtxzRcyEvWge3cws3Zc/i2s/Rq52RSGX/PuopHXLztGPuO
   63.66 +mUqzfIepiMCrKSXwALmqJ5F8JTdiXGy9WV3YfVTnqgG2JUHoxpL2QcSaXHjYlgKR
   63.67 +gK75RwzaMSi/GaMxwpquQhg5eTuNn1RW9GtXrtdOwGiB+tiAg+w7/GFtr+kKzNKp
   63.68 +DAkCHKpjh66oouA199s2S+B1bhfcRhUyCJKQxfcP4k1kOjOiqMJNYVnEBNo/6j1T
   63.69 +XPU4sBxUaJ9xG2LeAlTbQbzKx/SKOyLA+parX5g=
   63.70 +=YvVy
   63.71 +-----END PGP PUBLIC KEY BLOCK-----
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/test/test_keys/pub/master_key_test_certify_extended_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    64.3 @@ -0,0 +1,130 @@
    64.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    64.5 +
    64.6 +mQGNBFgN2wQBDADlhIEuyCGBuRDUGBJsNJuhiF1PmttmKTfZH/y684FrdF2tD1P5
    64.7 +wEsU6wGE1oE/1eoBt4GidrUhyu5F/bvWAgrCR0Hh2+FWIFGWvnmpbpBxool58KmR
    64.8 +6jBkZ2enP92RkDU8YYPdryALvuEKB8D+pCpMHkWynU3DRt56//Ebq802kUuAJUA0
    64.9 +wQInSePni68nMSYKyysGolTT+7m4nEOtPwyid2hcVjGycm4bAEf1x5+3pJSEROQ2
   64.10 +yBrcnL9H37bhceXiXPI63LmesveiPk4zLNK68zKkYVDaRTRgdQEviCppvRF2a4Hc
   64.11 +8StZfRr7tWrnGIdJYX37qlynxzUqDVBJ+61D4068v3SYd4E9OIky+1bvwCgF1/YO
   64.12 +JPlfyUHrYRa6q/G1cxNr/EWQj+Vpz6u5DmnQe4UctKmVaItE148QabQReEc+3y01
   64.13 +6ggOng8WXFZde8rQRDNsLbuHS4XJWWo+6YjOdk0xAm87+eeDR5GuIpiFwYhtSd6V
   64.14 +seYSBLwWmED0C8EAEQEAAbQ3TWFzdGVyIEtleSBUZXN0IChCb2d1cykgPG1hc3Rl
   64.15 +cl9rZXlfdGVzdEBkYXJ0aG1hbWEub3JnPokB1AQTAQgAPgIbAQULCQgHAgYVCgkI
   64.16 +CwIEFgIDAQIeAQIXgBYhBNkIfIbwbtM6xqkPj0h1Wcs6BxHnBQJb0EQ/BQkpWm87
   64.17 +AAoJEEh1Wcs6BxHnDyQL/00FAvCaxpZNmW+fwUBS+XsvwMxCVnQO0opHs8wNLyJn
   64.18 +lCaId1J/MuLmoEJGCCU9fKxK3JJ9lC5S8Mk9f8uK6O9zdOQaDs6Kc5qKoTvrizav
   64.19 +8knANeTYwuLmM4COMdXdphkxwfOTt3hwbR5dU7+byboFds1eGCk0dcoe9JHDY4+B
   64.20 +T76mccyM9qrRF2sUr07050VZQo6JfVyw0N/v6Ed6DjlR5qanBCbxJUurKO6DXnvC
   64.21 +Dq1A9PMh8dnw8aS7jCre0gGnfF+sRjGl05FTVgbxGzOL035IbbqdwOz6IDVtCfqG
   64.22 +VSrGE7o/HQh/y5t6TOJKLIro3qQgvagAtaYuZ8W8RFr+sX+RZ7+5qV+T40gcCwwJ
   64.23 +1rIqqcjkpdqIBsl+dY0vaSKPUgn574dcqNJfH/6kK1K9cOrgL0dl7DVmabXc8XXr
   64.24 +U86FcF4Jke/NEIn557Xd9Mj4Avi3kQj3Tvouu878SWYgDLIWITmO9qNjN0f9p8f1
   64.25 +rw7GW6e4I6A8pT0Z8DfC2LkBjQRYDdtIAQwAtT+fkxIa/o31EplJWcmB/I+cXS6/
   64.26 +vAQkFulWBuhZH+l4fSI9X0SS4cwbBbT1E3WlajBopk5uwozTCVQlFGm4/ow/6h2Q
   64.27 +rKITe0xnRyEXADE2oLP9z+kZDcBJdGyfgbxuhb7UiGsqCSITNoIWtZNzbVcFkqwg
   64.28 +LoiMGpi3erzB5YAB+9YNRr2wggrzgVpKvMtJsrGt7gosabt9Q/Z5U9m8f6UYmR7l
   64.29 +wWvg4nAa3nRY+GSyPP7Wyx/2U5PeJJCaX6imvyu6s6XWsokxSxtiUat8ss5HpUV6
   64.30 +2PrXRGBTsY6v1sRKSsfIDa7il/ibOrbAMVUcTIQ/+CISkCmdnMJL6Dcmr6h8YXKp
   64.31 +r5pIyw78tYaMD4B6mLNgWy3D0AxbgMSnULZrK9m5zzd5QKtMNSXF9PKLCYSSjn7n
   64.32 +yDxpN//dnJQxV2PL2igkMwjE6fPnvJ2ohyniTm98QYA0bN+pc5Dhto7kiqVd/u00
   64.33 +/pV8ezvcpKWEit2N0BnHt2tZ1wJGEy9nZO+tABEBAAGJAbwEGAEIACYWIQTZCHyG
   64.34 +8G7TOsapD49IdVnLOgcR5wUCWA3bSAIbDAUJAeEzgAAKCRBIdVnLOgcR5z4SC/9p
   64.35 +i4mQW1esf847AQqVJRsG0JAYALs5lN799ZNKXoM5y951ZtXxjwyO8018rvxLBCS1
   64.36 +BEwsBp8e/VltgoVKgfSUg7JB7QpEZxnTbnxHXV7hQ8ekdURwPF5JkXu96J3O9ztf
   64.37 +/Qllrr0g3tiq3zKub+FgHeoAH517R9Lp853udqqoI0wFhsZ8JBx7unob5vLiL/fD
   64.38 +41zaRSMv67u9MZAOiHaItU1SGn2a9b6+5VectuemMgOFvU6J4feHfVCv/tzMhz/Y
   64.39 +G3jySbql2ml4GnYreuMny+naXZsBtqyb+Fxwmk+aFvnsdS4KzwneGhQDjpVop8Ky
   64.40 +V+73gy9hqY1GIpRcRal7GggjtkF7CDnicc4XwuqEU+zxzLAtkRknF2TKB45p8GO0
   64.41 +Fa+oIwzMhAlg4iyLIpSyQDVn0JNpjrTs/Ab99b86q451s1G29wnorbZy3q5ZO/vT
   64.42 +i9ZCF/xau0n97aoOcvasqf9jo70bqFJcpE8vkwN5P5Ra+wnKU0Y/AWk9eZLCo0W5
   64.43 +AY0EWA3bfgEMALYuy2yawrtsF00mF0iY9UaXeh9ytlW0paPpvdrbDMR0A6gQfszz
   64.44 +Lg1as6YtOkykmE9FG4gyhS5AckDNl2mIbkD4rnG+GJAuiwZoYg65ACMuxfMAVCDy
   64.45 +J/i5ryKCMaLAKo/Gup8N6Au6dfusGvDDflJteP17W7qyLU6LXUNv2GOUuxCCM8fB
   64.46 +AFLXlCjQ+RmlR67wEGSxg92KMzyam2bt12fc6qrZokIfnhxxx0EbDYw+IFkl6Nu9
   64.47 +6N4Sb3B2gSo2aFGQJliJ41yujjeELCLn5UvN9HcJYKa6NlgHChHWZSu8Il8gmM4C
   64.48 +l1uN/xqN/dQREJOSI//grEvy59t/6IdnrTO9AqDJSr6OVyywwxsgmHJ1+Xbd2VLt
   64.49 +qQq6RpIaM8QuuyZMGX8RKEQOP3uxv99G5pbnUbjzpqo25sMaBkw3yoM0z6ck/D+s
   64.50 +J2QG/cOnlCNgKByLn76KNF1jEI4p5O6UK5PP1l47tdGZ8oJl8Y3dkDiNvLdA2Ywe
   64.51 +8YaRCi6hpOBKywARAQABiQNyBBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecF
   64.52 +AlgN234CGwIFCQHhM4ABwAkQSHVZyzoHEefA9CAEGQEIAB0WIQS4sS/iMBI0HSjh
   64.53 +W1+YtRAXx391HQUCWA3bfgAKCRCYtRAXx391HT4vC/4hzZg2vNd/7hG37Uo2rpvB
   64.54 +ZOssVEKUTNm584ik47jkvCWCuPAjyueh5ko0HjJc+vQiuVyt8CIgSuDTUrWSKcaf
   64.55 +CzpzsGovuXewN0xqGlWpC8PVQXEECpXHmxP3E4ihuqpdAwdsEqNcJ+Zpxk5tkT8v
   64.56 +W2XwEIQPEOd8i1M23TTn7pH8SXhR1A0gFq3Kqz2lHM0kN/BbCMz6WHxEq8Nljr/l
   64.57 +UHEgdXY8stemw5uBuf/73WE6BzUPWGPLt3UkcaeUYlRNC0FswzPFkrLRdw5gpbpZ
   64.58 +q3hTeoL9wLaH3pmMIlDOxjRZszSHvK8L9YX0Xp0HPRyX3rsCTUwFkZFwxK70noEc
   64.59 +9tbU+OhkT7ENgepLYvNS/xjN/rrp9KV6ihwaWdEvIx5iId3IE6vRzw0gV+GPu91E
   64.60 +1tWCy96AaijJTj+ewigiHfEZBeK6XLftqWKCFNwnEsHbfrnp5MVcUYwrc/QQxP1k
   64.61 +smCPK5CtzL7BrLwuS0ricm7J20UbcXIJXZgRK3FfQiDDZQwAtqqVR/8uLzIXkQi9
   64.62 +OBBYsOlO4Lr+qapkBMvao6Ef1oU10Ikd8msI/EqhyKX5zCkD3n+o8rUkwl8lLjwf
   64.63 +4HnsphQY/N+MX+bJpBeW2P6ZUls4TGsRSYcJ4sh8XF/7JgJC8RmMFHO7pxePbQzp
   64.64 +lZSZeCf3lyA1EvNKebCc8sIjklJz9tqGdmeAVSh6cHwzNjBO0sn5c8O6vQ2LMI37
   64.65 +703wi2+AnlcgdzbZIkPPccUrvTgEF/lSZTGOexuWbxEpJ0dLjpJGWDFBc039SX+E
   64.66 +dtLpoHDinzGE6uN92pVFdhGFrDf3qFAmzFSqva2LypjNU6/Cwbait3CQ8ElAChah
   64.67 +lv+RMZ75fYkOXZUpG6EumyJ4ogDUrnKoS3v3HQQrjhtTWi6GmiXFBcOP82i6STbR
   64.68 +ZoMu9K/BDDDeph5+2mSYI2eE1WV/BRq0uA/MPupU1WSzfAwNcCW0pxu8EPbnuRjB
   64.69 +OTZl9LT+W6ti1Z6AsY7jqNgUL+Rlzhgq5CJTfRrfEbpW++9JuQGNBFgN25UBDAC3
   64.70 +2TjNKES0bsmchKpG5x3aO3Ye1BXKoVeM7OpqOYwzFAH2kVMRFasHhaTQgcRfgRR0
   64.71 +GZTKvd/B8Uaq8iwl5zhtmEdLafpqirKzRbMTiHcyG0nZ6fWXNOhZ31+pBCXnY/hc
   64.72 +RZHfKVVqoJTfc/6HcNTqJyLuB751Ket1sZa+FMJnI1o8Nq3W9oe8lcfO5AirHj2P
   64.73 +r679hNHMAdxbIKOhDuTB9nsHyuSMmPBBXcdQG4cv960mbWKf3am7RFInHxpWWxwl
   64.74 +1go/CLC+/T0BXsNJvSpdHMCIxWqwcboPm3FhGW1XyYV0MwdY1A7Wu1LGL6gEFQZ0
   64.75 +k0a9W+5/dRYv++01NPNgGGteVeTHM0g3HXnbSDZJ3CRCocnEynZSMFzoYeqwcAcJ
   64.76 +uj1BEZoWnRF9V7cuvrkMIe7w1Cvz6aT+Pg5LosCvg305NDu3HiwILgK3UVwlw7NK
   64.77 +de8aNdQVAYxFy7Cn9KusYPsd4LATcxDuaFMACFq4/xDENf/hfsaUBvPFUr63cbUA
   64.78 +EQEAAYkBvAQYAQgAJhYhBNkIfIbwbtM6xqkPj0h1Wcs6BxHnBQJYDduVAhsgBQkB
   64.79 +4TOAAAoJEEh1Wcs6BxHnbAML+gI8Q7sGEWCpUEQFvaM/sJSsqynVlCpDjAlWrLfq
   64.80 +YTuIjGsu3byK3Zpgzn6zJfLt5DUqSBycQZeIO0cRVCvqTmGjL6Nkhr/lHY4F1dee
   64.81 +Zo13AKbH2b2CTDkcnqQV11q2IXQ5R6SxhjtRna9+gGADfgxAjWIB8143Y7nzEgPr
   64.82 +xsIN10QY8tEo4QbEcBqu6cL/9Fx27VjCOpmVoElO+DjzyNi908P/HFpVgU3BHxHO
   64.83 +nf+I307gI5InABgqxoIA7hEI76vSqb0XTXjAXMILGWpxK6uHqtdAbRBVmgfljDfD
   64.84 +TSaHCypogFYiLpZiBLMyvZUGlvEq0YrLcVtF08yrzUj62mdN1wb8xf7kvLQOBrC3
   64.85 +vrPDZQFMz30oJfNYZavtGaONaHgv2dk7uVH5ReJyhXA34k8AXk9v12Lgt+AVNYuT
   64.86 +6q6biaAo/KR+H0MGRG7b0W2I1P3GcnHbQQGRckOle134RCvL0u2LFtVLBTUtNOeH
   64.87 +ml/K/qJ8LYdOCVYYEv6lOi/+XbkBjQRb0ENIAQwAwIq4xWeBeMI6+pKlvTI6Wc/R
   64.88 +aOkbyXtG2+MkkVpvl/W4AvrIhXSGaMRz6H/LgU9q1SDuxWlqilVcEtIFX7WHuCEt
   64.89 +sztkKTzGeri2WrX2NLgAaj4YXCbJ1dQkSkC2g+lPsUi9fi3BWWhhA6Pf1U7jj6k3
   64.90 +WM7se5pBuW0mvcY1NvNKyQRS0cKkGqq14uJD1BJXsSMNdb0oMB0jQV7JxLP4PQxB
   64.91 +CJFQ19UcNKvgacRhpFtu/1lve3l5UBO0+wjwPr2vVhdBaq5q9FBZGK+6rJz4Hq5W
   64.92 +72T4TudO89xbJsILl7P7aRGEMJd2/VREBaPFrD26YmF5sYRBPuHWGqgEhO95MuLH
   64.93 +d/pUyzDzi3mi6YYhtfr0X14vEkUaJB4ZnkjlhN3LuY7Y5gc4oGCMkFMOHekOLpIH
   64.94 +/pv2foy3DQah9QBGXBAFlHrT9alN2pfj93XmV9t1xlGyAJuUdEmi0h4kSdHAqI7W
   64.95 +mb4Y4uOb7XC9Mla91C5OTdQBJrFBx84NY+jHFTfjABEBAAGJA3IEGAEIACYWIQTZ
   64.96 +CHyG8G7TOsapD49IdVnLOgcR5wUCW9BDSAIbAgUJJZgGAAHACRBIdVnLOgcR58D0
   64.97 +IAQZAQgAHRYhBIBWYcgEYtKBwS+WG5+HRQnyLtpRBQJb0ENIAAoJEJ+HRQnyLtpR
   64.98 +M+AL/0/WLcs3jwFFUCy3yIcPzRv+EsPk2zTUw62g+BGJQhgJH0EINCARhesDaoVl
   64.99 +Tuu9j9Kr3pWlKn0PlzGb/n5JruGvUX1eHqKyG9db0o6oNfz3d5z+gBIIWt8MJnY3
  64.100 +tOSvX/IiTEtdGBMSErIWoYFarK09DM3lhDDZDX+x0ezauY7Xvnkm6wPX8a4THfQN
  64.101 +0lB6PrjlukRGNe2UvKd+CUUG8ssmR8nKpBvAxM9mqPxv97iGydEzJBj/bJvgvUxz
  64.102 +UrOxRg89JNynvcFwQxJTPoGAUCHejUFwZ7wB+F8V7QBQggR7/hs/z8NsPJFhOU21
  64.103 +KS3yqp9FrxIjfa5NVYiolPC8QMuL7ZLkj9B3BYCECDRXWRTpE6srZhNIAnLtSHEI
  64.104 +CwQZmPw03Ne1AmN45S0+Z/uYwjdM6o3w55Oszz7OW/R4sqNzLUcFh6CE5J8D/qzW
  64.105 +BDkH8/JmgseGHVQRhMb89MfsJT37r6xv6yPhV20o0vpwBM1dg9d7b/g/fFI18/Gy
  64.106 +cZc0PLL3DAC2/R7ZQ9GCePXbjreS+5MGHSeLYmbtjmXgikKUJHa5+Y6pLqaLs6x9
  64.107 +PqZO7tkF+mmzXsQwSKx3/aisoLqBCHjYMK1TQtftPwT3g4n18vHT3C3ngGSpUVgH
  64.108 +CZ1+xsBuyDh1nSiFhp68tf7gaU6SbEupYyCPG4D3VuT5YjbEcrG5B72GWR9bZLTg
  64.109 +Z2EQubrgkOGbodsO/OUxKrQLkKGavfFSyDMc/iV0cb3z2F2hVnHHjWEyheYXy7S1
  64.110 +8yz5S0wmgut4I8mPZGUjsIJKf376udiNOstkTfBcIQisfsonFZIE21IQyXv2SuOm
  64.111 +TcfDJ4aSVUZpwJSycH4KyxffkvnqHZ5ZhS97dUBdkihwmrqlQmEfsBW8Sl+oT3As
  64.112 +B6jPCUb/XPN/QXJrlxJXzZQXLWToD0odkoMF9oBedlHT3WKKyNX04WHszmYsZb65
  64.113 +gmOJlG+Djs+N4i1F4KIzVzSVQmQzlFoHqAeERMuaJ/cm5/NGJNNnmpanQj+M6DZM
  64.114 +5ynRSMq7kMi5AY0EW9BDxAEMAOZzyam5RCcWu53/KDKo8xhymwGCiUUxPcRw7GfL
  64.115 +JWHBxdZmXz95VNSBlJXq1Ju2xOWCmaLsIvJJkzYD3+Q33bmpTvjW83SlTIp54CtS
  64.116 +LR5B0bEl/SNDv+g2IZV+/KHwUu973X4VV9rsVU/q/vu6txy6/XmWQ5wWPjvSkNCJ
  64.117 +Uq8Nt8o+rRhzd1eAFEWeP9xoCK+C9jMBMtSWzwY1g9fXpg8ruNcNOjNbeL/aLn42
  64.118 +6mqc3BIvEGymRFiu0FGAGg5QBJSMIaooMlGFqB6WtPb5P+olS15WFK28UpLfx8VG
  64.119 +aGMN9pgI8HmqUtwUNvv8Utquo26pkTzRMaJ/yvH0RNpB0sNCHWyoXVzWLFDpaCJS
  64.120 +O0SlknONkmEFLZmFWYMrup6bCQAkr1okQce8cHdKu6C25PVmV04S284atU/eg0X6
  64.121 +d9zL9jLemOSNac2JgvVmGn6zllrgF33gLnEqZBd5NqdLQwDdgmo20xucvvvPCDib
  64.122 ++VuMSJsQWLZTlQFudJMPqLJobQARAQABiQG8BBgBCAAmFiEE2Qh8hvBu0zrGqQ+P
  64.123 +SHVZyzoHEecFAlvQQ8QCGwwFCSWYBgAACgkQSHVZyzoHEeemogwA3ZqtuMf3WKNx
  64.124 +DzL/QcTxyotYf3U9J1YoNIL/Xr5pJmP89JbVhA00Uj+SlgZY/SsXJ4khP+lgLeky
  64.125 +Q+gdkxpRO/UJYTPW617OSqxRJmlqRGNfhv5Z8P3O0NwaVuASoy3LQG1zr4paKcgJ
  64.126 +tjKlypnUe2R/Eb8ZKCbcSJAN2Zqkwjl0zeuu+4nHB/96vOteqGigGheQCOoFLML3
  64.127 +aDTnrbgANZ96mAaGrXtNkiqEUaKeLlGLZoGaD56YFVC8uE0Oeo6Hu8HEfLJkOyqv
  64.128 +T2oA2BXjMUKW2kRuM3IkzJ5IqGJ1t1yGxnY2KXhR7LC2xVaXooTtpQWG+UDPpzGh
  64.129 +CVMjl2EcRLAelIP0lQf576dQhiT2WvcyIiSpoj9IVbw9NeGF8lwzGXJzniiLIFRG
  64.130 ++rL6+yvlkIPvNPTpP/h8lNfcGa3a1FyKTl48cs8QES9a/EQLnXgzkEGmYFTVkkSO
  64.131 +iejBxvGHMoSzLsmiZlOgdfhUqHC5FRp2mq8Ls1XgH8mE+79wZiQz
  64.132 +=xu9d
  64.133 +-----END PGP PUBLIC KEY BLOCK-----
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/test/test_keys/pub/master_key_test_deleted_valid_enc_key_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    65.3 @@ -0,0 +1,113 @@
    65.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    65.5 +
    65.6 +mQGNBFgN2wQBDADlhIEuyCGBuRDUGBJsNJuhiF1PmttmKTfZH/y684FrdF2tD1P5
    65.7 +wEsU6wGE1oE/1eoBt4GidrUhyu5F/bvWAgrCR0Hh2+FWIFGWvnmpbpBxool58KmR
    65.8 +6jBkZ2enP92RkDU8YYPdryALvuEKB8D+pCpMHkWynU3DRt56//Ebq802kUuAJUA0
    65.9 +wQInSePni68nMSYKyysGolTT+7m4nEOtPwyid2hcVjGycm4bAEf1x5+3pJSEROQ2
   65.10 +yBrcnL9H37bhceXiXPI63LmesveiPk4zLNK68zKkYVDaRTRgdQEviCppvRF2a4Hc
   65.11 +8StZfRr7tWrnGIdJYX37qlynxzUqDVBJ+61D4068v3SYd4E9OIky+1bvwCgF1/YO
   65.12 +JPlfyUHrYRa6q/G1cxNr/EWQj+Vpz6u5DmnQe4UctKmVaItE148QabQReEc+3y01
   65.13 +6ggOng8WXFZde8rQRDNsLbuHS4XJWWo+6YjOdk0xAm87+eeDR5GuIpiFwYhtSd6V
   65.14 +seYSBLwWmED0C8EAEQEAAbQ3TWFzdGVyIEtleSBUZXN0IChCb2d1cykgPG1hc3Rl
   65.15 +cl9rZXlfdGVzdEBkYXJ0aG1hbWEub3JnPokB1AQTAQgAPgIbAQULCQgHAgYVCgkI
   65.16 +CwIEFgIDAQIeAQIXgBYhBNkIfIbwbtM6xqkPj0h1Wcs6BxHnBQJb0EQ/BQkpWm87
   65.17 +AAoJEEh1Wcs6BxHnDyQL/00FAvCaxpZNmW+fwUBS+XsvwMxCVnQO0opHs8wNLyJn
   65.18 +lCaId1J/MuLmoEJGCCU9fKxK3JJ9lC5S8Mk9f8uK6O9zdOQaDs6Kc5qKoTvrizav
   65.19 +8knANeTYwuLmM4COMdXdphkxwfOTt3hwbR5dU7+byboFds1eGCk0dcoe9JHDY4+B
   65.20 +T76mccyM9qrRF2sUr07050VZQo6JfVyw0N/v6Ed6DjlR5qanBCbxJUurKO6DXnvC
   65.21 +Dq1A9PMh8dnw8aS7jCre0gGnfF+sRjGl05FTVgbxGzOL035IbbqdwOz6IDVtCfqG
   65.22 +VSrGE7o/HQh/y5t6TOJKLIro3qQgvagAtaYuZ8W8RFr+sX+RZ7+5qV+T40gcCwwJ
   65.23 +1rIqqcjkpdqIBsl+dY0vaSKPUgn574dcqNJfH/6kK1K9cOrgL0dl7DVmabXc8XXr
   65.24 +U86FcF4Jke/NEIn557Xd9Mj4Avi3kQj3Tvouu878SWYgDLIWITmO9qNjN0f9p8f1
   65.25 +rw7GW6e4I6A8pT0Z8DfC2LkBjQRYDdtIAQwAtT+fkxIa/o31EplJWcmB/I+cXS6/
   65.26 +vAQkFulWBuhZH+l4fSI9X0SS4cwbBbT1E3WlajBopk5uwozTCVQlFGm4/ow/6h2Q
   65.27 +rKITe0xnRyEXADE2oLP9z+kZDcBJdGyfgbxuhb7UiGsqCSITNoIWtZNzbVcFkqwg
   65.28 +LoiMGpi3erzB5YAB+9YNRr2wggrzgVpKvMtJsrGt7gosabt9Q/Z5U9m8f6UYmR7l
   65.29 +wWvg4nAa3nRY+GSyPP7Wyx/2U5PeJJCaX6imvyu6s6XWsokxSxtiUat8ss5HpUV6
   65.30 +2PrXRGBTsY6v1sRKSsfIDa7il/ibOrbAMVUcTIQ/+CISkCmdnMJL6Dcmr6h8YXKp
   65.31 +r5pIyw78tYaMD4B6mLNgWy3D0AxbgMSnULZrK9m5zzd5QKtMNSXF9PKLCYSSjn7n
   65.32 +yDxpN//dnJQxV2PL2igkMwjE6fPnvJ2ohyniTm98QYA0bN+pc5Dhto7kiqVd/u00
   65.33 +/pV8ezvcpKWEit2N0BnHt2tZ1wJGEy9nZO+tABEBAAGJAbwEGAEIACYWIQTZCHyG
   65.34 +8G7TOsapD49IdVnLOgcR5wUCWA3bSAIbDAUJAeEzgAAKCRBIdVnLOgcR5z4SC/9p
   65.35 +i4mQW1esf847AQqVJRsG0JAYALs5lN799ZNKXoM5y951ZtXxjwyO8018rvxLBCS1
   65.36 +BEwsBp8e/VltgoVKgfSUg7JB7QpEZxnTbnxHXV7hQ8ekdURwPF5JkXu96J3O9ztf
   65.37 +/Qllrr0g3tiq3zKub+FgHeoAH517R9Lp853udqqoI0wFhsZ8JBx7unob5vLiL/fD
   65.38 +41zaRSMv67u9MZAOiHaItU1SGn2a9b6+5VectuemMgOFvU6J4feHfVCv/tzMhz/Y
   65.39 +G3jySbql2ml4GnYreuMny+naXZsBtqyb+Fxwmk+aFvnsdS4KzwneGhQDjpVop8Ky
   65.40 +V+73gy9hqY1GIpRcRal7GggjtkF7CDnicc4XwuqEU+zxzLAtkRknF2TKB45p8GO0
   65.41 +Fa+oIwzMhAlg4iyLIpSyQDVn0JNpjrTs/Ab99b86q451s1G29wnorbZy3q5ZO/vT
   65.42 +i9ZCF/xau0n97aoOcvasqf9jo70bqFJcpE8vkwN5P5Ra+wnKU0Y/AWk9eZLCo0W5
   65.43 +AY0EWA3bfgEMALYuy2yawrtsF00mF0iY9UaXeh9ytlW0paPpvdrbDMR0A6gQfszz
   65.44 +Lg1as6YtOkykmE9FG4gyhS5AckDNl2mIbkD4rnG+GJAuiwZoYg65ACMuxfMAVCDy
   65.45 +J/i5ryKCMaLAKo/Gup8N6Au6dfusGvDDflJteP17W7qyLU6LXUNv2GOUuxCCM8fB
   65.46 +AFLXlCjQ+RmlR67wEGSxg92KMzyam2bt12fc6qrZokIfnhxxx0EbDYw+IFkl6Nu9
   65.47 +6N4Sb3B2gSo2aFGQJliJ41yujjeELCLn5UvN9HcJYKa6NlgHChHWZSu8Il8gmM4C
   65.48 +l1uN/xqN/dQREJOSI//grEvy59t/6IdnrTO9AqDJSr6OVyywwxsgmHJ1+Xbd2VLt
   65.49 +qQq6RpIaM8QuuyZMGX8RKEQOP3uxv99G5pbnUbjzpqo25sMaBkw3yoM0z6ck/D+s
   65.50 +J2QG/cOnlCNgKByLn76KNF1jEI4p5O6UK5PP1l47tdGZ8oJl8Y3dkDiNvLdA2Ywe
   65.51 +8YaRCi6hpOBKywARAQABiQNyBBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecF
   65.52 +AlgN234CGwIFCQHhM4ABwAkQSHVZyzoHEefA9CAEGQEIAB0WIQS4sS/iMBI0HSjh
   65.53 +W1+YtRAXx391HQUCWA3bfgAKCRCYtRAXx391HT4vC/4hzZg2vNd/7hG37Uo2rpvB
   65.54 +ZOssVEKUTNm584ik47jkvCWCuPAjyueh5ko0HjJc+vQiuVyt8CIgSuDTUrWSKcaf
   65.55 +CzpzsGovuXewN0xqGlWpC8PVQXEECpXHmxP3E4ihuqpdAwdsEqNcJ+Zpxk5tkT8v
   65.56 +W2XwEIQPEOd8i1M23TTn7pH8SXhR1A0gFq3Kqz2lHM0kN/BbCMz6WHxEq8Nljr/l
   65.57 +UHEgdXY8stemw5uBuf/73WE6BzUPWGPLt3UkcaeUYlRNC0FswzPFkrLRdw5gpbpZ
   65.58 +q3hTeoL9wLaH3pmMIlDOxjRZszSHvK8L9YX0Xp0HPRyX3rsCTUwFkZFwxK70noEc
   65.59 +9tbU+OhkT7ENgepLYvNS/xjN/rrp9KV6ihwaWdEvIx5iId3IE6vRzw0gV+GPu91E
   65.60 +1tWCy96AaijJTj+ewigiHfEZBeK6XLftqWKCFNwnEsHbfrnp5MVcUYwrc/QQxP1k
   65.61 +smCPK5CtzL7BrLwuS0ricm7J20UbcXIJXZgRK3FfQiDDZQwAtqqVR/8uLzIXkQi9
   65.62 +OBBYsOlO4Lr+qapkBMvao6Ef1oU10Ikd8msI/EqhyKX5zCkD3n+o8rUkwl8lLjwf
   65.63 +4HnsphQY/N+MX+bJpBeW2P6ZUls4TGsRSYcJ4sh8XF/7JgJC8RmMFHO7pxePbQzp
   65.64 +lZSZeCf3lyA1EvNKebCc8sIjklJz9tqGdmeAVSh6cHwzNjBO0sn5c8O6vQ2LMI37
   65.65 +703wi2+AnlcgdzbZIkPPccUrvTgEF/lSZTGOexuWbxEpJ0dLjpJGWDFBc039SX+E
   65.66 +dtLpoHDinzGE6uN92pVFdhGFrDf3qFAmzFSqva2LypjNU6/Cwbait3CQ8ElAChah
   65.67 +lv+RMZ75fYkOXZUpG6EumyJ4ogDUrnKoS3v3HQQrjhtTWi6GmiXFBcOP82i6STbR
   65.68 +ZoMu9K/BDDDeph5+2mSYI2eE1WV/BRq0uA/MPupU1WSzfAwNcCW0pxu8EPbnuRjB
   65.69 +OTZl9LT+W6ti1Z6AsY7jqNgUL+Rlzhgq5CJTfRrfEbpW++9JuQGNBFgN25UBDAC3
   65.70 +2TjNKES0bsmchKpG5x3aO3Ye1BXKoVeM7OpqOYwzFAH2kVMRFasHhaTQgcRfgRR0
   65.71 +GZTKvd/B8Uaq8iwl5zhtmEdLafpqirKzRbMTiHcyG0nZ6fWXNOhZ31+pBCXnY/hc
   65.72 +RZHfKVVqoJTfc/6HcNTqJyLuB751Ket1sZa+FMJnI1o8Nq3W9oe8lcfO5AirHj2P
   65.73 +r679hNHMAdxbIKOhDuTB9nsHyuSMmPBBXcdQG4cv960mbWKf3am7RFInHxpWWxwl
   65.74 +1go/CLC+/T0BXsNJvSpdHMCIxWqwcboPm3FhGW1XyYV0MwdY1A7Wu1LGL6gEFQZ0
   65.75 +k0a9W+5/dRYv++01NPNgGGteVeTHM0g3HXnbSDZJ3CRCocnEynZSMFzoYeqwcAcJ
   65.76 +uj1BEZoWnRF9V7cuvrkMIe7w1Cvz6aT+Pg5LosCvg305NDu3HiwILgK3UVwlw7NK
   65.77 +de8aNdQVAYxFy7Cn9KusYPsd4LATcxDuaFMACFq4/xDENf/hfsaUBvPFUr63cbUA
   65.78 +EQEAAYkBvAQYAQgAJhYhBNkIfIbwbtM6xqkPj0h1Wcs6BxHnBQJYDduVAhsgBQkB
   65.79 +4TOAAAoJEEh1Wcs6BxHnbAML+gI8Q7sGEWCpUEQFvaM/sJSsqynVlCpDjAlWrLfq
   65.80 +YTuIjGsu3byK3Zpgzn6zJfLt5DUqSBycQZeIO0cRVCvqTmGjL6Nkhr/lHY4F1dee
   65.81 +Zo13AKbH2b2CTDkcnqQV11q2IXQ5R6SxhjtRna9+gGADfgxAjWIB8143Y7nzEgPr
   65.82 +xsIN10QY8tEo4QbEcBqu6cL/9Fx27VjCOpmVoElO+DjzyNi908P/HFpVgU3BHxHO
   65.83 +nf+I307gI5InABgqxoIA7hEI76vSqb0XTXjAXMILGWpxK6uHqtdAbRBVmgfljDfD
   65.84 +TSaHCypogFYiLpZiBLMyvZUGlvEq0YrLcVtF08yrzUj62mdN1wb8xf7kvLQOBrC3
   65.85 +vrPDZQFMz30oJfNYZavtGaONaHgv2dk7uVH5ReJyhXA34k8AXk9v12Lgt+AVNYuT
   65.86 +6q6biaAo/KR+H0MGRG7b0W2I1P3GcnHbQQGRckOle134RCvL0u2LFtVLBTUtNOeH
   65.87 +ml/K/qJ8LYdOCVYYEv6lOi/+XbkBjQRb0ENIAQwAwIq4xWeBeMI6+pKlvTI6Wc/R
   65.88 +aOkbyXtG2+MkkVpvl/W4AvrIhXSGaMRz6H/LgU9q1SDuxWlqilVcEtIFX7WHuCEt
   65.89 +sztkKTzGeri2WrX2NLgAaj4YXCbJ1dQkSkC2g+lPsUi9fi3BWWhhA6Pf1U7jj6k3
   65.90 +WM7se5pBuW0mvcY1NvNKyQRS0cKkGqq14uJD1BJXsSMNdb0oMB0jQV7JxLP4PQxB
   65.91 +CJFQ19UcNKvgacRhpFtu/1lve3l5UBO0+wjwPr2vVhdBaq5q9FBZGK+6rJz4Hq5W
   65.92 +72T4TudO89xbJsILl7P7aRGEMJd2/VREBaPFrD26YmF5sYRBPuHWGqgEhO95MuLH
   65.93 +d/pUyzDzi3mi6YYhtfr0X14vEkUaJB4ZnkjlhN3LuY7Y5gc4oGCMkFMOHekOLpIH
   65.94 +/pv2foy3DQah9QBGXBAFlHrT9alN2pfj93XmV9t1xlGyAJuUdEmi0h4kSdHAqI7W
   65.95 +mb4Y4uOb7XC9Mla91C5OTdQBJrFBx84NY+jHFTfjABEBAAGJA3IEGAEIACYWIQTZ
   65.96 +CHyG8G7TOsapD49IdVnLOgcR5wUCW9BDSAIbAgUJJZgGAAHACRBIdVnLOgcR58D0
   65.97 +IAQZAQgAHRYhBIBWYcgEYtKBwS+WG5+HRQnyLtpRBQJb0ENIAAoJEJ+HRQnyLtpR
   65.98 +M+AL/0/WLcs3jwFFUCy3yIcPzRv+EsPk2zTUw62g+BGJQhgJH0EINCARhesDaoVl
   65.99 +Tuu9j9Kr3pWlKn0PlzGb/n5JruGvUX1eHqKyG9db0o6oNfz3d5z+gBIIWt8MJnY3
  65.100 +tOSvX/IiTEtdGBMSErIWoYFarK09DM3lhDDZDX+x0ezauY7Xvnkm6wPX8a4THfQN
  65.101 +0lB6PrjlukRGNe2UvKd+CUUG8ssmR8nKpBvAxM9mqPxv97iGydEzJBj/bJvgvUxz
  65.102 +UrOxRg89JNynvcFwQxJTPoGAUCHejUFwZ7wB+F8V7QBQggR7/hs/z8NsPJFhOU21
  65.103 +KS3yqp9FrxIjfa5NVYiolPC8QMuL7ZLkj9B3BYCECDRXWRTpE6srZhNIAnLtSHEI
  65.104 +CwQZmPw03Ne1AmN45S0+Z/uYwjdM6o3w55Oszz7OW/R4sqNzLUcFh6CE5J8D/qzW
  65.105 +BDkH8/JmgseGHVQRhMb89MfsJT37r6xv6yPhV20o0vpwBM1dg9d7b/g/fFI18/Gy
  65.106 +cZc0PLL3DAC2/R7ZQ9GCePXbjreS+5MGHSeLYmbtjmXgikKUJHa5+Y6pLqaLs6x9
  65.107 +PqZO7tkF+mmzXsQwSKx3/aisoLqBCHjYMK1TQtftPwT3g4n18vHT3C3ngGSpUVgH
  65.108 +CZ1+xsBuyDh1nSiFhp68tf7gaU6SbEupYyCPG4D3VuT5YjbEcrG5B72GWR9bZLTg
  65.109 +Z2EQubrgkOGbodsO/OUxKrQLkKGavfFSyDMc/iV0cb3z2F2hVnHHjWEyheYXy7S1
  65.110 +8yz5S0wmgut4I8mPZGUjsIJKf376udiNOstkTfBcIQisfsonFZIE21IQyXv2SuOm
  65.111 +TcfDJ4aSVUZpwJSycH4KyxffkvnqHZ5ZhS97dUBdkihwmrqlQmEfsBW8Sl+oT3As
  65.112 +B6jPCUb/XPN/QXJrlxJXzZQXLWToD0odkoMF9oBedlHT3WKKyNX04WHszmYsZb65
  65.113 +gmOJlG+Djs+N4i1F4KIzVzSVQmQzlFoHqAeERMuaJ/cm5/NGJNNnmpanQj+M6DZM
  65.114 +5ynRSMq7kMg=
  65.115 +=U2WJ
  65.116 +-----END PGP PUBLIC KEY BLOCK-----
    66.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.2 +++ b/test/test_keys/pub/master_key_test_sign_and_encrypt_added.asc	Wed Nov 21 08:35:41 2018 +0100
    66.3 @@ -0,0 +1,130 @@
    66.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    66.5 +
    66.6 +mQGNBFgN2wQBDADlhIEuyCGBuRDUGBJsNJuhiF1PmttmKTfZH/y684FrdF2tD1P5
    66.7 +wEsU6wGE1oE/1eoBt4GidrUhyu5F/bvWAgrCR0Hh2+FWIFGWvnmpbpBxool58KmR
    66.8 +6jBkZ2enP92RkDU8YYPdryALvuEKB8D+pCpMHkWynU3DRt56//Ebq802kUuAJUA0
    66.9 +wQInSePni68nMSYKyysGolTT+7m4nEOtPwyid2hcVjGycm4bAEf1x5+3pJSEROQ2
   66.10 +yBrcnL9H37bhceXiXPI63LmesveiPk4zLNK68zKkYVDaRTRgdQEviCppvRF2a4Hc
   66.11 +8StZfRr7tWrnGIdJYX37qlynxzUqDVBJ+61D4068v3SYd4E9OIky+1bvwCgF1/YO
   66.12 +JPlfyUHrYRa6q/G1cxNr/EWQj+Vpz6u5DmnQe4UctKmVaItE148QabQReEc+3y01
   66.13 +6ggOng8WXFZde8rQRDNsLbuHS4XJWWo+6YjOdk0xAm87+eeDR5GuIpiFwYhtSd6V
   66.14 +seYSBLwWmED0C8EAEQEAAbQ3TWFzdGVyIEtleSBUZXN0IChCb2d1cykgPG1hc3Rl
   66.15 +cl9rZXlfdGVzdEBkYXJ0aG1hbWEub3JnPokB1AQTAQgAPhYhBNkIfIbwbtM6xqkP
   66.16 +j0h1Wcs6BxHnBQJYDdsEAhsBBQkB4TOABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
   66.17 +AAoJEEh1Wcs6BxHnxGgL/0YTR4NCjHh8uziqVuyXYASri59D8uvX79nceCeHe//t
   66.18 +wi4GrcYWX753is0OSoxYiehWK0zJtejBCCp7Rv5qPdEay7H1fOTYXMmRJO95wBfn
   66.19 +U+LyK3NeVOLy/xXY3/hctXxHXo7bJShDL1xaRyxISIqRlXwRBIPq5D++GumOgO6i
   66.20 +UidgRgohhSskYhNrD3s+rrkAOCEd1v9fm8T0ISkiwTw76aFeERhcC4llKtsPLogS
   66.21 +rf6R0XVJmQHQQMLgkME+T9ktbPWnQNGqNOm3lK1zi7yQMsLWViDqNi25Q11yd4e7
   66.22 +DrXs+OYYaJwQ3/cVWAml/P82C0yfZXsgCXRlr1dP9kZrHNt1VAHOLB/XfSsNADsb
   66.23 +c8fU6TzUDq4H+EqSj6eBw8agiPU8sSVpSOQFSyQuQVokWFS7J9pu8MjcJbyliHBH
   66.24 +B9TQLChdKwOHvQNLjaQSrTj+FC5EuIgR+2adiuqCOTIUwQx6DIIoNP1dS4zpGXRQ
   66.25 +Cb19D2722dmF4OVD2FRmbrkBjQRYDdtIAQwAtT+fkxIa/o31EplJWcmB/I+cXS6/
   66.26 +vAQkFulWBuhZH+l4fSI9X0SS4cwbBbT1E3WlajBopk5uwozTCVQlFGm4/ow/6h2Q
   66.27 +rKITe0xnRyEXADE2oLP9z+kZDcBJdGyfgbxuhb7UiGsqCSITNoIWtZNzbVcFkqwg
   66.28 +LoiMGpi3erzB5YAB+9YNRr2wggrzgVpKvMtJsrGt7gosabt9Q/Z5U9m8f6UYmR7l
   66.29 +wWvg4nAa3nRY+GSyPP7Wyx/2U5PeJJCaX6imvyu6s6XWsokxSxtiUat8ss5HpUV6
   66.30 +2PrXRGBTsY6v1sRKSsfIDa7il/ibOrbAMVUcTIQ/+CISkCmdnMJL6Dcmr6h8YXKp
   66.31 +r5pIyw78tYaMD4B6mLNgWy3D0AxbgMSnULZrK9m5zzd5QKtMNSXF9PKLCYSSjn7n
   66.32 +yDxpN//dnJQxV2PL2igkMwjE6fPnvJ2ohyniTm98QYA0bN+pc5Dhto7kiqVd/u00
   66.33 +/pV8ezvcpKWEit2N0BnHt2tZ1wJGEy9nZO+tABEBAAGJAbwEGAEIACYWIQTZCHyG
   66.34 +8G7TOsapD49IdVnLOgcR5wUCWA3bSAIbDAUJAeEzgAAKCRBIdVnLOgcR5z4SC/9p
   66.35 +i4mQW1esf847AQqVJRsG0JAYALs5lN799ZNKXoM5y951ZtXxjwyO8018rvxLBCS1
   66.36 +BEwsBp8e/VltgoVKgfSUg7JB7QpEZxnTbnxHXV7hQ8ekdURwPF5JkXu96J3O9ztf
   66.37 +/Qllrr0g3tiq3zKub+FgHeoAH517R9Lp853udqqoI0wFhsZ8JBx7unob5vLiL/fD
   66.38 +41zaRSMv67u9MZAOiHaItU1SGn2a9b6+5VectuemMgOFvU6J4feHfVCv/tzMhz/Y
   66.39 +G3jySbql2ml4GnYreuMny+naXZsBtqyb+Fxwmk+aFvnsdS4KzwneGhQDjpVop8Ky
   66.40 +V+73gy9hqY1GIpRcRal7GggjtkF7CDnicc4XwuqEU+zxzLAtkRknF2TKB45p8GO0
   66.41 +Fa+oIwzMhAlg4iyLIpSyQDVn0JNpjrTs/Ab99b86q451s1G29wnorbZy3q5ZO/vT
   66.42 +i9ZCF/xau0n97aoOcvasqf9jo70bqFJcpE8vkwN5P5Ra+wnKU0Y/AWk9eZLCo0W5
   66.43 +AY0EWA3bfgEMALYuy2yawrtsF00mF0iY9UaXeh9ytlW0paPpvdrbDMR0A6gQfszz
   66.44 +Lg1as6YtOkykmE9FG4gyhS5AckDNl2mIbkD4rnG+GJAuiwZoYg65ACMuxfMAVCDy
   66.45 +J/i5ryKCMaLAKo/Gup8N6Au6dfusGvDDflJteP17W7qyLU6LXUNv2GOUuxCCM8fB
   66.46 +AFLXlCjQ+RmlR67wEGSxg92KMzyam2bt12fc6qrZokIfnhxxx0EbDYw+IFkl6Nu9
   66.47 +6N4Sb3B2gSo2aFGQJliJ41yujjeELCLn5UvN9HcJYKa6NlgHChHWZSu8Il8gmM4C
   66.48 +l1uN/xqN/dQREJOSI//grEvy59t/6IdnrTO9AqDJSr6OVyywwxsgmHJ1+Xbd2VLt
   66.49 +qQq6RpIaM8QuuyZMGX8RKEQOP3uxv99G5pbnUbjzpqo25sMaBkw3yoM0z6ck/D+s
   66.50 +J2QG/cOnlCNgKByLn76KNF1jEI4p5O6UK5PP1l47tdGZ8oJl8Y3dkDiNvLdA2Ywe
   66.51 +8YaRCi6hpOBKywARAQABiQNyBBgBCAAmFiEE2Qh8hvBu0zrGqQ+PSHVZyzoHEecF
   66.52 +AlgN234CGwIFCQHhM4ABwAkQSHVZyzoHEefA9CAEGQEIAB0WIQS4sS/iMBI0HSjh
   66.53 +W1+YtRAXx391HQUCWA3bfgAKCRCYtRAXx391HT4vC/4hzZg2vNd/7hG37Uo2rpvB
   66.54 +ZOssVEKUTNm584ik47jkvCWCuPAjyueh5ko0HjJc+vQiuVyt8CIgSuDTUrWSKcaf
   66.55 +CzpzsGovuXewN0xqGlWpC8PVQXEECpXHmxP3E4ihuqpdAwdsEqNcJ+Zpxk5tkT8v
   66.56 +W2XwEIQPEOd8i1M23TTn7pH8SXhR1A0gFq3Kqz2lHM0kN/BbCMz6WHxEq8Nljr/l
   66.57 +UHEgdXY8stemw5uBuf/73WE6BzUPWGPLt3UkcaeUYlRNC0FswzPFkrLRdw5gpbpZ
   66.58 +q3hTeoL9wLaH3pmMIlDOxjRZszSHvK8L9YX0Xp0HPRyX3rsCTUwFkZFwxK70noEc
   66.59 +9tbU+OhkT7ENgepLYvNS/xjN/rrp9KV6ihwaWdEvIx5iId3IE6vRzw0gV+GPu91E
   66.60 +1tWCy96AaijJTj+ewigiHfEZBeK6XLftqWKCFNwnEsHbfrnp5MVcUYwrc/QQxP1k
   66.61 +smCPK5CtzL7BrLwuS0ricm7J20UbcXIJXZgRK3FfQiDDZQwAtqqVR/8uLzIXkQi9
   66.62 +OBBYsOlO4Lr+qapkBMvao6Ef1oU10Ikd8msI/EqhyKX5zCkD3n+o8rUkwl8lLjwf
   66.63 +4HnsphQY/N+MX+bJpBeW2P6ZUls4TGsRSYcJ4sh8XF/7JgJC8RmMFHO7pxePbQzp
   66.64 +lZSZeCf3lyA1EvNKebCc8sIjklJz9tqGdmeAVSh6cHwzNjBO0sn5c8O6vQ2LMI37
   66.65 +703wi2+AnlcgdzbZIkPPccUrvTgEF/lSZTGOexuWbxEpJ0dLjpJGWDFBc039SX+E
   66.66 +dtLpoHDinzGE6uN92pVFdhGFrDf3qFAmzFSqva2LypjNU6/Cwbait3CQ8ElAChah
   66.67 +lv+RMZ75fYkOXZUpG6EumyJ4ogDUrnKoS3v3HQQrjhtTWi6GmiXFBcOP82i6STbR
   66.68 +ZoMu9K/BDDDeph5+2mSYI2eE1WV/BRq0uA/MPupU1WSzfAwNcCW0pxu8EPbnuRjB
   66.69 +OTZl9LT+W6ti1Z6AsY7jqNgUL+Rlzhgq5CJTfRrfEbpW++9JuQGNBFgN25UBDAC3
   66.70 +2TjNKES0bsmchKpG5x3aO3Ye1BXKoVeM7OpqOYwzFAH2kVMRFasHhaTQgcRfgRR0
   66.71 +GZTKvd/B8Uaq8iwl5zhtmEdLafpqirKzRbMTiHcyG0nZ6fWXNOhZ31+pBCXnY/hc
   66.72 +RZHfKVVqoJTfc/6HcNTqJyLuB751Ket1sZa+FMJnI1o8Nq3W9oe8lcfO5AirHj2P
   66.73 +r679hNHMAdxbIKOhDuTB9nsHyuSMmPBBXcdQG4cv960mbWKf3am7RFInHxpWWxwl
   66.74 +1go/CLC+/T0BXsNJvSpdHMCIxWqwcboPm3FhGW1XyYV0MwdY1A7Wu1LGL6gEFQZ0
   66.75 +k0a9W+5/dRYv++01NPNgGGteVeTHM0g3HXnbSDZJ3CRCocnEynZSMFzoYeqwcAcJ
   66.76 +uj1BEZoWnRF9V7cuvrkMIe7w1Cvz6aT+Pg5LosCvg305NDu3HiwILgK3UVwlw7NK
   66.77 +de8aNdQVAYxFy7Cn9KusYPsd4LATcxDuaFMACFq4/xDENf/hfsaUBvPFUr63cbUA
   66.78 +EQEAAYkBvAQYAQgAJhYhBNkIfIbwbtM6xqkPj0h1Wcs6BxHnBQJYDduVAhsgBQkB
   66.79 +4TOAAAoJEEh1Wcs6BxHnbAML+gI8Q7sGEWCpUEQFvaM/sJSsqynVlCpDjAlWrLfq
   66.80 +YTuIjGsu3byK3Zpgzn6zJfLt5DUqSBycQZeIO0cRVCvqTmGjL6Nkhr/lHY4F1dee
   66.81 +Zo13AKbH2b2CTDkcnqQV11q2IXQ5R6SxhjtRna9+gGADfgxAjWIB8143Y7nzEgPr
   66.82 +xsIN10QY8tEo4QbEcBqu6cL/9Fx27VjCOpmVoElO+DjzyNi908P/HFpVgU3BHxHO
   66.83 +nf+I307gI5InABgqxoIA7hEI76vSqb0XTXjAXMILGWpxK6uHqtdAbRBVmgfljDfD
   66.84 +TSaHCypogFYiLpZiBLMyvZUGlvEq0YrLcVtF08yrzUj62mdN1wb8xf7kvLQOBrC3
   66.85 +vrPDZQFMz30oJfNYZavtGaONaHgv2dk7uVH5ReJyhXA34k8AXk9v12Lgt+AVNYuT
   66.86 +6q6biaAo/KR+H0MGRG7b0W2I1P3GcnHbQQGRckOle134RCvL0u2LFtVLBTUtNOeH
   66.87 +ml/K/qJ8LYdOCVYYEv6lOi/+XbkBjQRb0ENIAQwAwIq4xWeBeMI6+pKlvTI6Wc/R
   66.88 +aOkbyXtG2+MkkVpvl/W4AvrIhXSGaMRz6H/LgU9q1SDuxWlqilVcEtIFX7WHuCEt
   66.89 +sztkKTzGeri2WrX2NLgAaj4YXCbJ1dQkSkC2g+lPsUi9fi3BWWhhA6Pf1U7jj6k3
   66.90 +WM7se5pBuW0mvcY1NvNKyQRS0cKkGqq14uJD1BJXsSMNdb0oMB0jQV7JxLP4PQxB
   66.91 +CJFQ19UcNKvgacRhpFtu/1lve3l5UBO0+wjwPr2vVhdBaq5q9FBZGK+6rJz4Hq5W
   66.92 +72T4TudO89xbJsILl7P7aRGEMJd2/VREBaPFrD26YmF5sYRBPuHWGqgEhO95MuLH
   66.93 +d/pUyzDzi3mi6YYhtfr0X14vEkUaJB4ZnkjlhN3LuY7Y5gc4oGCMkFMOHekOLpIH
   66.94 +/pv2foy3DQah9QBGXBAFlHrT9alN2pfj93XmV9t1xlGyAJuUdEmi0h4kSdHAqI7W
   66.95 +mb4Y4uOb7XC9Mla91C5OTdQBJrFBx84NY+jHFTfjABEBAAGJA3IEGAEIACYWIQTZ
   66.96 +CHyG8G7TOsapD49IdVnLOgcR5wUCW9BDSAIbAgUJJZgGAAHACRBIdVnLOgcR58D0
   66.97 +IAQZAQgAHRYhBIBWYcgEYtKBwS+WG5+HRQnyLtpRBQJb0ENIAAoJEJ+HRQnyLtpR
   66.98 +M+AL/0/WLcs3jwFFUCy3yIcPzRv+EsPk2zTUw62g+BGJQhgJH0EINCARhesDaoVl
   66.99 +Tuu9j9Kr3pWlKn0PlzGb/n5JruGvUX1eHqKyG9db0o6oNfz3d5z+gBIIWt8MJnY3
  66.100 +tOSvX/IiTEtdGBMSErIWoYFarK09DM3lhDDZDX+x0ezauY7Xvnkm6wPX8a4THfQN
  66.101 +0lB6PrjlukRGNe2UvKd+CUUG8ssmR8nKpBvAxM9mqPxv97iGydEzJBj/bJvgvUxz
  66.102 +UrOxRg89JNynvcFwQxJTPoGAUCHejUFwZ7wB+F8V7QBQggR7/hs/z8NsPJFhOU21
  66.103 +KS3yqp9FrxIjfa5NVYiolPC8QMuL7ZLkj9B3BYCECDRXWRTpE6srZhNIAnLtSHEI
  66.104 +CwQZmPw03Ne1AmN45S0+Z/uYwjdM6o3w55Oszz7OW/R4sqNzLUcFh6CE5J8D/qzW
  66.105 +BDkH8/JmgseGHVQRhMb89MfsJT37r6xv6yPhV20o0vpwBM1dg9d7b/g/fFI18/Gy
  66.106 +cZc0PLL3DAC2/R7ZQ9GCePXbjreS+5MGHSeLYmbtjmXgikKUJHa5+Y6pLqaLs6x9
  66.107 +PqZO7tkF+mmzXsQwSKx3/aisoLqBCHjYMK1TQtftPwT3g4n18vHT3C3ngGSpUVgH
  66.108 +CZ1+xsBuyDh1nSiFhp68tf7gaU6SbEupYyCPG4D3VuT5YjbEcrG5B72GWR9bZLTg
  66.109 +Z2EQubrgkOGbodsO/OUxKrQLkKGavfFSyDMc/iV0cb3z2F2hVnHHjWEyheYXy7S1
  66.110 +8yz5S0wmgut4I8mPZGUjsIJKf376udiNOstkTfBcIQisfsonFZIE21IQyXv2SuOm
  66.111 +TcfDJ4aSVUZpwJSycH4KyxffkvnqHZ5ZhS97dUBdkihwmrqlQmEfsBW8Sl+oT3As
  66.112 +B6jPCUb/XPN/QXJrlxJXzZQXLWToD0odkoMF9oBedlHT3WKKyNX04WHszmYsZb65
  66.113 +gmOJlG+Djs+N4i1F4KIzVzSVQmQzlFoHqAeERMuaJ/cm5/NGJNNnmpanQj+M6DZM
  66.114 +5ynRSMq7kMi5AY0EW9BDxAEMAOZzyam5RCcWu53/KDKo8xhymwGCiUUxPcRw7GfL
  66.115 +JWHBxdZmXz95VNSBlJXq1Ju2xOWCmaLsIvJJkzYD3+Q33bmpTvjW83SlTIp54CtS
  66.116 +LR5B0bEl/SNDv+g2IZV+/KHwUu973X4VV9rsVU/q/vu6txy6/XmWQ5wWPjvSkNCJ
  66.117 +Uq8Nt8o+rRhzd1eAFEWeP9xoCK+C9jMBMtSWzwY1g9fXpg8ruNcNOjNbeL/aLn42
  66.118 +6mqc3BIvEGymRFiu0FGAGg5QBJSMIaooMlGFqB6WtPb5P+olS15WFK28UpLfx8VG
  66.119 +aGMN9pgI8HmqUtwUNvv8Utquo26pkTzRMaJ/yvH0RNpB0sNCHWyoXVzWLFDpaCJS
  66.120 +O0SlknONkmEFLZmFWYMrup6bCQAkr1okQce8cHdKu6C25PVmV04S284atU/eg0X6
  66.121 +d9zL9jLemOSNac2JgvVmGn6zllrgF33gLnEqZBd5NqdLQwDdgmo20xucvvvPCDib
  66.122 ++VuMSJsQWLZTlQFudJMPqLJobQARAQABiQG8BBgBCAAmFiEE2Qh8hvBu0zrGqQ+P
  66.123 +SHVZyzoHEecFAlvQQ8QCGwwFCSWYBgAACgkQSHVZyzoHEeemogwA3ZqtuMf3WKNx
  66.124 +DzL/QcTxyotYf3U9J1YoNIL/Xr5pJmP89JbVhA00Uj+SlgZY/SsXJ4khP+lgLeky
  66.125 +Q+gdkxpRO/UJYTPW617OSqxRJmlqRGNfhv5Z8P3O0NwaVuASoy3LQG1zr4paKcgJ
  66.126 +tjKlypnUe2R/Eb8ZKCbcSJAN2Zqkwjl0zeuu+4nHB/96vOteqGigGheQCOoFLML3
  66.127 +aDTnrbgANZ96mAaGrXtNkiqEUaKeLlGLZoGaD56YFVC8uE0Oeo6Hu8HEfLJkOyqv
  66.128 +T2oA2BXjMUKW2kRuM3IkzJ5IqGJ1t1yGxnY2KXhR7LC2xVaXooTtpQWG+UDPpzGh
  66.129 +CVMjl2EcRLAelIP0lQf576dQhiT2WvcyIiSpoj9IVbw9NeGF8lwzGXJzniiLIFRG
  66.130 ++rL6+yvlkIPvNPTpP/h8lNfcGa3a1FyKTl48cs8QES9a/EQLnXgzkEGmYFTVkkSO
  66.131 +iejBxvGHMoSzLsmiZlOgdfhUqHC5FRp2mq8Ls1XgH8mE+79wZiQz
  66.132 +=W0uE
  66.133 +-----END PGP PUBLIC KEY BLOCK-----
    67.1 --- a/test/test_keys/pub/pep-test-gabrielle-0xE203586C_pub.asc	Fri Nov 09 09:05:32 2018 +0100
    67.2 +++ b/test/test_keys/pub/pep-test-gabrielle-0xE203586C_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    67.3 @@ -7,24 +7,25 @@
    67.4  oG721Q0GTY/ZllqWTSzElXTE4VAMJ/N9swou9Z0gVbTXQE/7ftrgSTY4WcqD9o4+
    67.5  UnbTdPsSivIOe37wavHm/dtUKm9JQNSTTRjnABEBAAG0SXBFcCBUZXN0IEdhYnJp
    67.6  ZWxsZSAoVGVzdCBEbyBOb3QgVXNlKSA8cGVwLXRlc3QtZ2FicmllbGxlQHBlcC1w
    67.7 -cm9qZWN0Lm9yZz6JAT8EEwEIACkFAlgccIsCGwMFCQPCZwAHCwkIBwMCAQYVCAIJ
    67.8 -CgsEFgIDAQIeAQIXgAAKCRCMVBvU4gNYbBUuB/9XdiclzH6Mn5iGG4stQDvZIKSH
    67.9 -1/FVbDBavdDAwoEVRygjB3FYTdGVDC09zewYtqO3a/Vi6h+KeWybkca35Izw+OQt
   67.10 -RC7+Djt6OMoDK13VjniqW01xmFqs/iJLSO6F+PlzcmyYor8o8Ev0GP8z/7d7ut3p
   67.11 -8CFhz7DG65IYhluo3kc3Detl5MJ/NEYLNwhmCamAJ5lTt9iGZ6xAhwSSKdG/OnAa
   67.12 -/HO1Dc0tEffmvdqs/aAP7+Chhq6wxknCyIxm+7nYRh5Voh9k0lLA47tFDmShMQyK
   67.13 -DFYc/kIo5Tl0dlzre2Qtru+kIpafMkWN/3dDa1yayZ85xrsU7g7fWv4sH22ZuQEN
   67.14 -BFgccIsBCADURXlBzvLOQVJlxEyBUamK8UrsLGm9DE5DXBSr5nEf5Jjc/dq0euA6
   67.15 -BMp7R+ck6Rq7jtvw/S8x9dEEXV8dJBLqHDNg/GXK6YULgpaTHXqYhkdmgzKX0T87
   67.16 -rWMzP/EpGXkOmJBYYfPC+h3qEANeENbOWVlHSarZgE5Bb1GG0kYQT3yCY2gzKcTz
   67.17 -Yq2K36jf2eoEgvDgOHRheC92S5b2bxtfi8llxIez2s1pJkvHYA2TQ0Zw1Jsz/JTf
   67.18 -P3wjXCdBERsPRqfXR72iVwQFGK12R/N2t2bTvQ+WlOG1ywBUA+lRhH2L4MRIc0F0
   67.19 -hqRmaE8LYLV0aHzHjtiAeP3l9+lZ+TiDABEBAAGJASUEGAEIAA8FAlgccIsCGwwF
   67.20 -CQPCZwAACgkQjFQb1OIDWGyg7ggApI7HN+uQL6egyeAkpZ2KN4+8+b6HBtlJUU56
   67.21 -F4SALHbxpkXOG3Zqd3UlN7Ewlf995rvVfDAWnBozBm5G7IGAS4PRJ1rS2dkunnJ5
   67.22 -4NsaO4bU9pCHSAssB9SWmKHPgQjWKflz5bu95Is4jhUTKvAK0wdKY+erVa5uSw62
   67.23 -o8iyHn3B3Qw6zAJKWtrucnMFD6LwIVVTzBVsdxIGFdQdxLwq96C+UaMAwdfXqPgw
   67.24 -6qu9xLrm1PDch6lbCYj0F+iWEBgmg+Os+AYjojwWQ3OKFgdXVGypB1HJLxb2WwHa
   67.25 -H+yO9Wm52wTqotjoruEuvcsb4dKRs+h3tIBDff99svXUo5St7Q==
   67.26 -=H+fm
   67.27 +cm9qZWN0Lm9yZz6JAVYEEwEIAEACGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX
   67.28 +gBYhBJBsm4NJlU6CxWI8PIxUG9TiA1hsBQJb6TgcBQkWmMqRAAoJEIxUG9TiA1hs
   67.29 +DC0H/idmpApBV9PuYo07BekmoYrPtRq+Cuj6pq86Yra297kJChlvQKpkMKjhVrL7
   67.30 +lCjdZL1RZxq4CwCBLJe6/Q795tJhMC1VuMYBLaxKJ6qCccL7lj1YrQjkB7sd2/w3
   67.31 +L+JaxcxJ+WiH/QybtQ4XPrKn217QfkxFFe7yHza0xgfDT0WeYGxqq8DXT+UhHS/n
   67.32 +acOEp6Uo1y7AnhSgeROPSo7sP8O0sRO1yTKKR7g35cijWiSF614nhn/kkzGlZsc3
   67.33 +hive/S/fSNmbbpBzjvruWVh5yw/vGPyKtYfXfBx5YFSnDmRrHQM4jA28A7CXIcY/
   67.34 +XJ0Xct1zJL9qi9qqtfbPVsd4HTq5AQ0EWBxwiwEIANRFeUHO8s5BUmXETIFRqYrx
   67.35 +Suwsab0MTkNcFKvmcR/kmNz92rR64DoEyntH5yTpGruO2/D9LzH10QRdXx0kEuoc
   67.36 +M2D8ZcrphQuClpMdepiGR2aDMpfRPzutYzM/8SkZeQ6YkFhh88L6HeoQA14Q1s5Z
   67.37 +WUdJqtmATkFvUYbSRhBPfIJjaDMpxPNirYrfqN/Z6gSC8OA4dGF4L3ZLlvZvG1+L
   67.38 +yWXEh7PazWkmS8dgDZNDRnDUmzP8lN8/fCNcJ0ERGw9Gp9dHvaJXBAUYrXZH83a3
   67.39 +ZtO9D5aU4bXLAFQD6VGEfYvgxEhzQXSGpGZoTwtgtXRofMeO2IB4/eX36Vn5OIMA
   67.40 +EQEAAYkBPAQYAQgAJgIbDBYhBJBsm4NJlU6CxWI8PIxUG9TiA1hsBQJb6TgsBQkW
   67.41 +mMqhAAoJEIxUG9TiA1hsEAYH/1pXWVEWsMeG7alnuRDSw1ge0SaKQzz8edRkUJje
   67.42 +Ij+uk9DaWUyNvD+I1nlzMgdT4q3isaqiRhwpjnGbf9uPJuZDC4LyvzFXf5aywfPJ
   67.43 +76Lb5QDUGrWqG2pc1EpfAcnYuxaoNPsSHbgljLqg0yQu/hDqLkwZ5Fzs8encobT4
   67.44 +aFq7i+VQ3eC0ZMUb+TW4mLAk9Sy/m+MlBSbSPB5ASmG6j5CyDWJZJDciCkWdD3Ze
   67.45 +R4ARn9tIOBJy1+4VGMVhLN6j9z7EB88I4OTXGKFOyhCFeEcvs459vjiSS4znFqFR
   67.46 +0inDvL1AuN+NhM9ivRFfYbKsYJXLQk9g5T6ZGu7pZOR1iX8=
   67.47 +=HSbi
   67.48  -----END PGP PUBLIC KEY BLOCK-----
    68.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    68.2 +++ b/test/test_keys/pub/sercullen-test-0xCEAADED4_pub.asc	Wed Nov 21 08:35:41 2018 +0100
    68.3 @@ -0,0 +1,41 @@
    68.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    68.5 +
    68.6 +mQGNBEdLUAgBDADAha/ZeyFZp8U2OfaaUH+TDBPDdte4D6Z/lakRYDpBLAdjWkoV
    68.7 +6CRjei7NJtYzTtOQIC2FjGd+DYCWQaW28Jj2DMhvUq/qhwUPNzK/mZ7tfA2rXRsY
    68.8 +34qNWn/g5OnVDw4e1JMv4qUAiaDOTEjrR9zO3iFrFppXhur2SF2ypbP61nG0J+wx
    68.9 +KJda6/n9H16Krtl4VXesOABSjX4Kn+eZxRcQdu1GXiBXs1YKyvN00za3g/73x+GR
   68.10 +ZzxAp+W+ns4AanCGpzFhTR72/ZTlwT5hUfx/0xisgRdo/m6ggCLX49kyAqfS6T1F
   68.11 +ZE0S4HdehFmNg/s5IqTCUt/0iceQpE1QrHJT/dHkF//Mgmvmb8gucXBvExrRYK9f
   68.12 +1QWFP0w0RJ9ftl3Zs7izTBE6od46rPr60EcJU0u0i0uJvL4Oq7XBxYNAg794ELIm
   68.13 +5riVmyhV9ZU7bTdeKMLGwByQYZPogchIoG4m2i+qW+9ckt0B4KNNR4s3T3HCBSTj
   68.14 +DO+ToGKJMWxKwLMAEQEAAbQ0U2VyIEN1bGxlbiBSdXRoZXJmb3JkIDxzZXJjdWxs
   68.15 +ZW4tdGVzdEBkYXJ0aG1hbWEub3JnPokB1AQTAQgAPhYhBByWZtiz4o9Ko4R9qJpu
   68.16 +dePOqt7UBQJHS1AIAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
   68.17 +EJpudePOqt7UesEL/2PObNXSDpG6iZDv47kaLmps4A26Ex3MPucjXawK8ISaXdQl
   68.18 +FD+C+JenU4/UWFMaI9oWsw41R94AvJVdanTHOnmIwT0jv4NTINXBfLAah5iWlLU+
   68.19 +yueDuUesJfu+w5sVZmwi7+1ypOgixpQUBXt2HZSeJSeRME5uLSdJuXL4GTpQKmTg
   68.20 +TqbcAeSAFmeI3ppZZTE8AF8wsFuLT5E74u6huB47MzlGC+andsZLL1o9EIX/J14C
   68.21 +kiXLX7k03HlaiG7RYIwBiAWug7a5qpFX+hvADZsXY3EmsAiTXxvjBY5tSk0uAlOk
   68.22 +QnK3OeWkB6k2YJWyHzXkDyXkzrKGS8hXU01+t1p1qYIsdPCaP2B6PBAljqHzv7Sp
   68.23 +SPTKvGaMgCciaQ4ROz19FAObkJcWR8bi0yiFlgQeZ2apJM3JVnm3ylvULLNg9rv4
   68.24 +0KdvVO4E64KKDVWZ15rpknK+dyS9qg1LP3GAfYqF6JTCug9AJKprvKDOz34HQt9j
   68.25 +MnudzNnBYN7yLg16D7kBjQRHS1AIAQwAwMF3uQqPjcoVGRj9Wt4qMCh+l3AGTiCV
   68.26 +K5SbVlOgxvhHonC16riPq+4sIvUkbyYUr8ukUMCoFLCnP1hHMUeb/YLDR9NJRcz/
   68.27 +gVZDgtKYwqgvTh/h9xbp6Fo8CwzPRVrrBgmRk3BRW7XhvR4phBeL+k8naTxKrAd8
   68.28 +dMWmxPQ59NjIxY9JG9qopCsgArrXdKoipV/uFTjfam7nT9xDRZIa61VniOIZSItR
   68.29 +pKOJ4pZbOsaWJxSzgnUDMrmMvsYXT1PRh5+r35LC1rygjM7JysASh+u6tHU5iGcD
   68.30 +1fZ5W+CILEZ2hbNGFoxWsPDCJaKHKmyEtGq1G0eaZDY2CdYTp8tyOj4/it8aMp6Q
   68.31 +6Obip4SUeXkrwwNBM/PRAzpyDSVi8tB9aBDZIQxQCDv8LLy9lXwWUY2rZD//wioT
   68.32 +YOIomiCMiDP5BwrUhua/zi3JYlps1ZkZIF/G0IkPgvhL1e5sOCNjngBNxnzv2ZZe
   68.33 +32YL3hOtzxVDZ+msWMKpOYdw4r8/q4mhABEBAAGJAbwEGAEIACYWIQQclmbYs+KP
   68.34 +SqOEfaiabnXjzqre1AUCR0tQCAIbDAUJA8JnAAAKCRCabnXjzqre1I4QDAC3EZJm
   68.35 +tVm9UHpZLCmz+yYku3+TX3LCqpMSDO5hIjIxnpjuKqVHLve0VSNE+ZZ24VZgd4C0
   68.36 +CXfoodUbECvhlP2tqPdp/3gk5Gebm7IJca1R24iEy7CHyJApnV/2kjyIXEHesGHb
   68.37 +m/so0dlFn0FTjYKOy9a3dutagq2N4Sb2G0+UD35tljkoEX4lXCj/tWQWrFfV6AMm
   68.38 +w2lh96mFlatM5+pc7X9qAEPXChTJ5KGKE3B9aJnfzg3PaLCa8FRQFlSEwuGhIRYJ
   68.39 +2QO0eD6By3/RzLQEKYwcb+nYNHCaYDCpj/uHTmQwOcMcW6AjraFfZSb6dRwikpMV
   68.40 +ebB/eFp6/my7Z4ITgPqy0gvlcQJyxomevfWYkiE/CMOW8sjsSuH8SJInc7trRDq5
   68.41 +So7PTlpe69tj5e2Deq9jUm6hsD4aTpUvb9SaJ8cyCyBhGVZmGiGMrSEAXDW7yumJ
   68.42 +vZNPIbwVAmW4HSsnz6dUiPJC1WxZeiP6wRhhrEXwxILOROYWeF0g8w+RNcE=
   68.43 +=yx3Q
   68.44 +-----END PGP PUBLIC KEY BLOCK-----
    69.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    69.2 +++ b/test/test_mails/ENGINE-463-attempt-numero-dos.eml	Wed Nov 21 08:35:41 2018 +0100
    69.3 @@ -0,0 +1,66 @@
    69.4 +Reply-To: krista@darthmama.org
    69.5 +To: pep.test.alice@pep-project.org
    69.6 +From: Inquisitor Trevelyan <inquisitor@darthmama.org>
    69.7 +Subject: Crossing the streams
    69.8 +Openpgp: preference=signencrypt
    69.9 +Message-ID: <56bbc9d9-7dbe-4ed0-354b-166e30dd52ce@darthmama.org>
   69.10 +Date: Mon, 15 Oct 2018 11:45:05 +0200
   69.11 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   69.12 + Thunderbird/52.9.1
   69.13 +MIME-Version: 1.0
   69.14 +Content-Type: multipart/encrypted;
   69.15 + protocol="application/pgp-encrypted";
   69.16 + boundary="6YUP5IjbJwN1sztUk72bHgdy31Yea4BsR"
   69.17 +
   69.18 +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
   69.19 +--6YUP5IjbJwN1sztUk72bHgdy31Yea4BsR
   69.20 +Content-Type: application/pgp-encrypted
   69.21 +Content-Description: PGP/MIME version identification
   69.22 +
   69.23 +Version: 1
   69.24 +
   69.25 +--6YUP5IjbJwN1sztUk72bHgdy31Yea4BsR
   69.26 +Content-Type: application/octet-stream; name="encrypted.asc"
   69.27 +Content-Description: OpenPGP encrypted message
   69.28 +Content-Disposition: inline; filename="encrypted.asc"
   69.29 +
   69.30 +-----BEGIN PGP MESSAGE-----
   69.31 +
   69.32 +hQEMA1oCBdlzCD9NAQf9GIR1VtNPY7OUXLHIBVoqzVtD2S+sQboGwE4db825+dpe
   69.33 +3ntdzVWDvgbXjd5fWG1D6Yv/OcNiJMDlMhgXi5vFehzE7xXTWkixhG8IYTl0gkMG
   69.34 +jieT5Wle6kaqtzjiIhgiDWWeWPXQNBMh5latfprvF2IXCYkrldspw4zS437dwZjR
   69.35 +HXCD6Utoe+WsEG65+Jw+gDqv01z1PAna1mzPhrvfR51xVyUAJjlNo2TpRklCRwMd
   69.36 +7UOeGGbnyAZ8hOYF5Zn/CZQRZAI65T/km4PmiuznSHSR1VbdvEW8BzlhqldGn4Yi
   69.37 +b1ICoknuA5zGxEzxCrxaYaTwX1t41ROh+KdQlsdNCIUBjAOt7cwQkmL8RAEL/jbO
   69.38 +IDZDXCWammxrVj3E/VqwlFcFsZ9N/nrKHpC5049S5Ui7PZtODdV+HiVLHd1f79KK
   69.39 +Kk0Njmb5SO0E++iex4fHtRWQupL2wCRv+KqCxIwSNWjA/c+7J/ypuKkpqQzAMbQm
   69.40 +xgB09fl24QMAW8OpKJS30YTTNu6+y990NVLF4N60oEfl3VHjrbdrRIQVq8DczNK3
   69.41 +T27pDdfLC9Yrvzt15LOkXCxHiDLGiUk97c1anBbNCZuX0yufkQfOYz/On1HqAk49
   69.42 +pEAh+0QZv0yYHyhcQrXSh3/yxrmLjB6ppS7QBGUgdTy3cB+88SfvO65vw94TSWi7
   69.43 +c7yIFYiNuNgBfpB0VIpen2/rcDDUFxYk2YCQJKgjeJZPHdH2kg9d8n/H7reMx4gj
   69.44 +0WqoGQYFWlrXfsO/Bni4ZQtHHi0TmZRvXh46ZKfwJtskC7ZYSyBnesHXY4N7l04x
   69.45 +XSfmaBiFHVcWZyBbgiGriNx2LcQaEy0UPdVRXEaRWybOV1Z/j+dauiMk0wSn5tLp
   69.46 +ARKTHK44+2MAh9Mrz+oWuTArFhjic6J86FM2hM5HA0phEYMF9gO0BsP2PYvLlNV3
   69.47 +EijcnTTsea/YndwbF7eZJEltdfBjufZi/MBs3ySIYt5OqBCJnf7mTRBdKL0KJ7v5
   69.48 +J08hj3XBrILjCm9Q4pPM0e00WO/IOwCwewyiTFtukYjJ0kGOpbVtgdcaljxnaPzN
   69.49 +28CXvboPNW6I51JJTmPNlP0ZEP31SEX0wXsnl3/KlHjJc52kHXZglLzbMLj8ahlq
   69.50 +4nnQVtuiP+jGlzk4cmJhDswY+AmT1Fp1auENfPdU3g07VF+jC9qLhf2R2kfW8Mxr
   69.51 +ggw26frxjda7bIVgiNND3gAZJ9tiu0wypLms3h4D9YtnN/RJhddaVzeBj4R+ipE4
   69.52 +Xfts/GRm6cwmEFES5sj9InKXwtXGn4vQPuIIvTj/PUS5R3xCdpSCPXOHSrZA4URj
   69.53 +NVn4VZ3xR26uxmm7VGdcbwNYy27RT8b5piY9kEdJbnck2DHAouHeppIlrbXceEcJ
   69.54 +QhhqRefi2vxWcDt2DKmP2soH2lqHEI5BnHSot3no2u/0C+W78X4E7pzeFT6mmmHV
   69.55 +b2UjNpf0N7o7Jry41240D7d07kifpdSU1Hh284fVlyPBtQh5omfEmFtJaGHmzL7K
   69.56 +HOL+drBTLksFd1EY0ogVOUZd+8Z6XrF2ctwoOuxTGvzA2T2152QeKEx3AjygQeT6
   69.57 +9NbO/0CrgpueYZNJlC+Yl9i6vdaw9qizu02AiLN6WYn460+QSZmeHSIYeMF5YVk+
   69.58 +0VxNnrhn5d6cs9dadGrft/6BOCFPH6s02NDHo36LtecRB/Q52aAiXszRPuTzBBOo
   69.59 +z2cMPTF7sOGO+0h5hmMZorBB2+4++lHW9JG3IU8Zy2AEQHJ+7f6UoZpotvyZrKqe
   69.60 +a92HG4HEhXVFJJJRUtsxHQCulKYm5n9ZXlYgBg3t+T8Z7W5DbsQVfz7kVbt8EDkn
   69.61 +RzsuqXxfUZmzqMKQWJF678gOMS5jpJ4sJolovDE/wRmKI0RUnu/UsDcsITADs21o
   69.62 +RtVN5mSbmPGWYa7o0gBiEq7KocHBAs8Q73g5RJurYzMqpUNCqE2mKmAzyxDI3KdB
   69.63 +VgJZlMcieXJAcaWCAuzZD4rtpr6DMYb4CFs91aWtN6Iy05UzmIJeN7xlmsIOCLhH
   69.64 +ZBqMAhFjFKONEilh+Z7Qe0iGllY+xALAVBlO8ertOESCCKgLt432ELu56YUy6hNG
   69.65 +HNZOgGqf38WbIFY=
   69.66 +=GZ9s
   69.67 +-----END PGP MESSAGE-----
   69.68 +
   69.69 +--6YUP5IjbJwN1sztUk72bHgdy31Yea4BsR--
    70.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    70.2 +++ b/test/test_mails/Header_key_import.eml	Wed Nov 21 08:35:41 2018 +0100
    70.3 @@ -0,0 +1,87 @@
    70.4 +Reply-To: krista@pep-project.org
    70.5 +To: pEp Test Bob <pep.test.bob@pep-project.org>
    70.6 +From: pEp Test Alice <pep.test.alice@pep-project.org>
    70.7 +Subject: Header key import
    70.8 +Openpgp: preference=signencrypt
    70.9 +Autocrypt: addr=pep.test.alice@pep-project.org; prefer-encrypt=mutual;
   70.10 + keydata=
   70.11 + xsBNBFV4PbEBCADTmjGDsoti/VPoZ3w2oCjLBNq1jWIGMkbiUgCGUQjVsNrSZ80U7RmA3Pcu
   70.12 + 3hhiVQNBGA32vL6NPhSJPanVd77s6XVZg+Gq7llbGGkuIxSkJvVrWzYckjMsAInlJ8Ll0kHH
   70.13 + bgATOlO5OtQ21bLCfWZPSq74HEVzQAPtCGYFvOgpCktKTjmsGXe9ysiYN8CEWMVNbDqXmvFh
   70.14 + i4UifpITeQBVM7dtlBw5SoeLZpsHIlKF5i5WPkNw7nuMag/+lRpOqvPumhOmqybWHuAR/Dq0
   70.15 + pOOPh6BzZ4OzOBL96aWUe1dcnIZeBEm8oRxYC3nN95YsjtrLK4BQZTYDTzeh8FIccsLdABEB
   70.16 + AAHNRHBFcCBUZXN0IEFsaWNlICh0ZXN0IGtleSBkb24ndCB1c2UpIDxwZXAudGVzdC5hbGlj
   70.17 + ZUBwZXAtcHJvamVjdC5vcmc+wsB4BBMBAgAiBQJVeD2xAhsDBgsJCAcDAgYVCAIJCgsEFgID
   70.18 + AQIeAQIXgAAKCRCpQR0Xb/AOl5JjCADEBoordVBCmphG6EY+u5yjj/xeQN4Kc1Rl06Ii6m18
   70.19 + 4hnF/osxnTicr+A6Hpwf8whXULuSwXvfuOsVOQdIc2e+1zrecTqyNUWuRs3T7uZ25dvROg1X
   70.20 + ZuajMPf3wh5lX2rPRhOt3UNXJjQfc1MSYXpmT+PoqFXBzMqJUo2DYcw6MSZekoWkIzFXG2s2
   70.21 + YNwILwPnLnMesFtzU6mn9qhfoFsQA6aku8AbG+SNehNZvGuuUiBmu+4UYNoc/RJa7vNWECv9
   70.22 + qZQsT820CuoOZS9MFV7nQlgkGoPerlGXil0vkOG1gsuQD8QkuaTQpn1vYvRcC0P27qLfrqlP
   70.23 + v2Ih2hoIV9tJzsBNBFV4PbEBCADQwKB97t2B2nweprfpbH8QgLCzJYaAMrpcaUaJqm+J3C9e
   70.24 + aepRXTXGtst1zaLbooG2b3QHfDzI2CEYMxO5ynmmSBOe06VKw/PagBzK5ur/eOycl0ZPFSXd
   70.25 + lDj30BQPvRdJvLS4OTMdoKoGpsZDY4hOYj67oHo3TFtrLJCvZruPARkI/pXiOX9FqH4wquNN
   70.26 + aYW1qwk/Wq3k/gOMwp0xjvc01MbadaiiVquJk6jjPrd2wP4FYxIADAllzMpwFAJSWvgCfmqV
   70.27 + bukYOnaCp3QRQXQkc78TdqGXbD5uwJzkxxiEsMmiGT+7RDLIKwXheKmmGXSwgi8m+EndUiqM
   70.28 + TvOdjyUBABEBAAHCwF8EGAECAAkFAlV4PbECGwwACgkQqUEdF2/wDpeQVQgArnfQ7uvG0po/
   70.29 + CPepbrdytI2n63U5dm/MFMsvXpZYVYLO/mROc+akZCPwS0yxtSMKK+tYM9leQx58r89c+K1G
   70.30 + eZoko7xziwmZbt5zEITiJp5L6gg7k6CczskPMx07gY8ooscBC3cFJhz1A0o73BKPR7J0iupa
   70.31 + NmI3sTd1/RNQm6573kGGwc4m2bcQttvN5ox8yimn2QnK3D+6A+Mmzi3Rd11tF+tAWJIsfaEg
   70.32 + DJZn9mOdUkV2ckoSk1K5PptpXSsKLOL+e2WuxSMIr8AVeRqkbYYK6UzX6qIgQIrMOuaXqtRa
   70.33 + NxNccnzIS1YtdtYERSnTaBotNp/FF2wfI7BNFP6r0A==
   70.34 +Organization: pEp
   70.35 +Message-ID: <667f579e-a40b-97b8-9945-5340a2397905@pep-project.org>
   70.36 +Date: Tue, 9 Oct 2018 19:25:17 +0200
   70.37 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   70.38 + Thunderbird/52.9.1
   70.39 +MIME-Version: 1.0
   70.40 +Content-Type: multipart/encrypted;
   70.41 + protocol="application/pgp-encrypted";
   70.42 + boundary="iXQBGwY84uThCa5ZQvmN35nTAV4s6BbcY"
   70.43 +
   70.44 +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
   70.45 +--iXQBGwY84uThCa5ZQvmN35nTAV4s6BbcY
   70.46 +Content-Type: application/pgp-encrypted
   70.47 +Content-Description: PGP/MIME version identification
   70.48 +
   70.49 +Version: 1
   70.50 +
   70.51 +--iXQBGwY84uThCa5ZQvmN35nTAV4s6BbcY
   70.52 +Content-Type: application/octet-stream; name="encrypted.asc"
   70.53 +Content-Description: OpenPGP encrypted message
   70.54 +Content-Disposition: inline; filename="encrypted.asc"
   70.55 +
   70.56 +-----BEGIN PGP MESSAGE-----
   70.57 +
   70.58 +hQEMA4rbkTfsG51OAQf+OXDq3ikDsOxoE5bZTooXGXEQDyocK5fhl9YioLZk33J4
   70.59 +p6aVjSqdw0bKSgr+Og48wD91OqbuqBC8EzSUSJPD3zHaXdZsp9CNnH1lNgZe2kV1
   70.60 +Nak/e8RNASZttI4UjcPfgfDa9QnQObWA+4xW/+f5VEHlbfK+Wp4NwwHCRn/XxHPA
   70.61 +5dchhaffx8smMYtAM2DVwkGvzj0GUQRx07Q1oVoGc2OZzesn9PFozk5vJ6HXN/tW
   70.62 +nJKo3URs+RLZd9LwXj//WwZ33p9sLO2fQVgz4cZdKlne0owMF5ZgcByg5yCAtx5W
   70.63 +eM9FSuyTzIdmEcMewJb7Qqt4SgQdQqoX18mEw8qiAIUBDANaAgXZcwg/TQEIAIy+
   70.64 +kbwGBZ2Uluzfd8YICOtar8JEdPJvaVzm4eCx0USeYudMy0ZAcxakm4RcEr0maKNE
   70.65 +cXmfYg+wgPbPNvlShU/o0p4swg3zgqgv/z78ULgk/AJ4ZoZPv3plr5VS0W6LV8Wl
   70.66 +Tshh3r5dZqhvm7luqKSKVGI7OnNego1gQus/OD0mnF+xX9kcpSLmZwNibEnQIK8R
   70.67 +9/f/E/EXJKpB5JWH9NSMzcWbqoSZB+PsEb3K/TGIzbnLoA7NMH5B1W7QXZiy6ROW
   70.68 +h7OrRhCQbQ7wCshl9pTjpfVQuD23e/vQo4g4r9KXkpS19H3WoN6pmgavQjvinC+L
   70.69 +dFoG5v/x8ERJrgTqcKnS6QFpPWlAGnv/kpE2SLRlOZppZOXwaMvBsDmtBI91iXf/
   70.70 +7z4gmdhkdsKcsxhxvMxW6SLP0e55+7VsC99pPwjy44siP4QJhyUwhXCcH/nD8Vgi
   70.71 +0dgt4H6jilBqDTlcdrIIPe0iJgrgv+yRedqQgwPgsf7SOjYz0rT8H0uq35r1Qz7e
   70.72 +xiyqSHz3UJdjGJTZhd3kAimNTAT0mF663VOHXo6WqBR47VCxOb7ov+Qcs+P098Cw
   70.73 +VgRgbm/hgI1xgCXyX6hTjR1nfIscVxMNdB90ICPvkSaimCZIahGS8O7b0LA3pixj
   70.74 +oX9fUNXPLT/uYSb67BLQvGuNfTlP15AOy1Fxw445MgSOdNeaTYNKLA2bw6V413eo
   70.75 +r/Xp9QhYsr4rOImH1DOB67GbDGk8pwXHXarTtqCedFLVS0WFWV0W7wWCZwOrn8p8
   70.76 +48Wua/DiJ83LMpEcmwrCprirV8i5ZXixBp0SOqTBXfWuTubWgBTv3jonTNetSj/h
   70.77 +vGtfUZe6olQgbGPDxCJn9LLk4LsZLRXvM1ig0X4uOwn27F9cfe9aGefAujPMxl4A
   70.78 +WL+2iFtyHMsECxJUK4g8WQKXPh3PjAp/pmZxXsKbJFT1i7UUffDVMOqqQ2QCNeWx
   70.79 +bqpmFL5hNvzc0DzeQpeS50712e+p3U+uTitolPC98mnkcH54C+4jSgbg2yrYFA78
   70.80 +wF/9GMkL/hLhtmCGBXT3WicMxFyDIsXy5tVEzbGxHJQtoGoRkoSCi6La6Pvfc0il
   70.81 +p8c9OuHQwGVTThY2pbnFKbruJga+NyWnzkqtxk+BAFcRVm09SW1u01yTK1F7B6tu
   70.82 +4c4xXIBtBhHG2zg8f4y9Ilnwbddpf4yFlv2nWHEX/nTYYgqswZzOBV6NdWW3WwYz
   70.83 +9JggZCeWYKwq4S7ID6dKxRM/DlXJ8tDRQdUk4/ly2O06QVqwCSozRQEiDzKadk8M
   70.84 +D1ZE1FScZcIBADKpAOGGIqi3pXZ9Ec8yP6gnP4WJ1N8a0NL+1Dd77IuCKLmrrc/2
   70.85 +gqCCXLe6OOuMIUeeq56KahrXOc0ez2q0cfZILx5pp8cPA8Jzu0vvPSZA+IEBIH4n
   70.86 +BQ==
   70.87 +=x4dq
   70.88 +-----END PGP MESSAGE-----
   70.89 +
   70.90 +--iXQBGwY84uThCa5ZQvmN35nTAV4s6BbcY--