merging
authorVolker Birk <vb@pep.foundation>
Thu, 11 Oct 2018 13:04:02 +0200
changeset 3044630d505b8a0b
parent 3043 c4741d6d66f4
parent 3040 cb725251c5ab
child 3045 cb5f4c863d4f
merging
src/message_api.c
     1.1 --- a/.hgtags	Thu Oct 11 13:01:56 2018 +0200
     1.2 +++ b/.hgtags	Thu Oct 11 13:04:02 2018 +0200
     1.3 @@ -5,3 +5,6 @@
     1.4  3efe9ded2561d3f6d406acbcbcee01b823cb4de8 for_Outlook-1.1.10
     1.5  fa00137505b8528c77efe8df40963f5fef452cad 0.9.0 release
     1.6  b70a6082836b89f8718b23dcba0624d6db318033 ENGINE-323 fixed
     1.7 +d958333b87d0cdda1bb02f50173f1207baade54a Release 1.0.441
     1.8 +e4d80dd0a663c5397a6a9178e08aea1e7808d43e Patch release 1.0.442
     1.9 +43ab5608555e12cb110ccda79cbfb9783e40408b Release 1.1.0
     2.1 --- a/build-mac/pEpEngine.xcodeproj/project.pbxproj	Thu Oct 11 13:01:56 2018 +0200
     2.2 +++ b/build-mac/pEpEngine.xcodeproj/project.pbxproj	Thu Oct 11 13:04:02 2018 +0200
     2.3 @@ -14,6 +14,8 @@
     2.4  		43370834203C075A004E6547 /* sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = 43370832203C075A004E6547 /* sqlite3.h */; };
     2.5  		4354FF651D6EDF300033069C /* sync_impl.c in Sources */ = {isa = PBXBuildFile; fileRef = 4354FF641D6EDF300033069C /* sync_impl.c */; };
     2.6  		4354FF691D6EE1A70033069C /* NULL.c in Sources */ = {isa = PBXBuildFile; fileRef = 4354FF681D6EE1A70033069C /* NULL.c */; };
     2.7 +		438C43B52167752C00C7425B /* labeled_int_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 438C43AF2167752C00C7425B /* labeled_int_list.h */; };
     2.8 +		438C43B62167752C00C7425B /* labeled_int_list.c in Sources */ = {isa = PBXBuildFile; fileRef = 438C43B42167752C00C7425B /* labeled_int_list.c */; };
     2.9  		43BA0F461D7964750059172F /* asn1_helper.c in Sources */ = {isa = PBXBuildFile; fileRef = 43BA0F451D7964750059172F /* asn1_helper.c */; };
    2.10  		43E9BC6A1DB51A1E00AD2352 /* GroupUpdate.c in Sources */ = {isa = PBXBuildFile; fileRef = 43E9BC691DB51A1E00AD2352 /* GroupUpdate.c */; };
    2.11  		43E9BC7F1DB6720E00AD2352 /* UpdateRequest.c in Sources */ = {isa = PBXBuildFile; fileRef = 43E9BC7E1DB6720E00AD2352 /* UpdateRequest.c */; };
    2.12 @@ -133,6 +135,8 @@
    2.13  		64A826891B455D0800EECAF0 /* trans_auto.c in Sources */ = {isa = PBXBuildFile; fileRef = 64A826731B455D0800EECAF0 /* trans_auto.c */; };
    2.14  		64A8268A1B455D0800EECAF0 /* transport.c in Sources */ = {isa = PBXBuildFile; fileRef = 64A826751B455D0800EECAF0 /* transport.c */; };
    2.15  		64A8268C1B455D9D00EECAF0 /* pEpEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 64A826611B455D0800EECAF0 /* pEpEngine.h */; };
    2.16 +		C46EBAED216E445F0042A6A3 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = C46EBAE7216E445F0042A6A3 /* base64.c */; };
    2.17 +		C46EBAEE216E445F0042A6A3 /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = C46EBAEC216E445F0042A6A3 /* base64.h */; };
    2.18  /* End PBXBuildFile section */
    2.19  
    2.20  /* Begin PBXContainerItemProxy section */
    2.21 @@ -201,6 +205,8 @@
    2.22  		4346F86A1ECB38E700381CBE /* sync_app.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sync_app.h; path = ../src/sync_app.h; sourceTree = "<group>"; };
    2.23  		4354FF641D6EDF300033069C /* sync_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sync_impl.c; path = ../src/sync_impl.c; sourceTree = "<group>"; };
    2.24  		4354FF681D6EE1A70033069C /* NULL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = NULL.c; path = ../asn.1/NULL.c; sourceTree = "<group>"; };
    2.25 +		438C43AF2167752C00C7425B /* labeled_int_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = labeled_int_list.h; path = ../src/labeled_int_list.h; sourceTree = "<group>"; };
    2.26 +		438C43B42167752C00C7425B /* labeled_int_list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = labeled_int_list.c; path = ../src/labeled_int_list.c; sourceTree = "<group>"; };
    2.27  		43BA0F451D7964750059172F /* asn1_helper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = asn1_helper.c; path = ../src/asn1_helper.c; sourceTree = "<group>"; };
    2.28  		43E9BC691DB51A1E00AD2352 /* GroupUpdate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = GroupUpdate.c; path = ../asn.1/GroupUpdate.c; sourceTree = "<group>"; };
    2.29  		43E9BC7E1DB6720E00AD2352 /* UpdateRequest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = UpdateRequest.c; path = ../asn.1/UpdateRequest.c; sourceTree = "<group>"; };
    2.30 @@ -346,6 +352,8 @@
    2.31  		64A826771B455D0800EECAF0 /* wrappers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wrappers.h; path = ../src/wrappers.h; sourceTree = "<group>"; };
    2.32  		64DA240C1B832EA0000BEE80 /* netpgp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = netpgp.xcodeproj; path = "../../netpgp-et/netpgp-xcode/netpgp.xcodeproj"; sourceTree = "<group>"; };
    2.33  		64DA24121B832EBA000BEE80 /* libetpan.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libetpan.xcodeproj; path = "../../libetpan/build-mac/libetpan.xcodeproj"; sourceTree = "<group>"; };
    2.34 +		C46EBAE7216E445F0042A6A3 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = base64.c; path = ../src/base64.c; sourceTree = "<group>"; };
    2.35 +		C46EBAEC216E445F0042A6A3 /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = base64.h; path = ../src/base64.h; sourceTree = "<group>"; };
    2.36  /* End PBXFileReference section */
    2.37  
    2.38  /* Begin PBXFrameworksBuildPhase section */
    2.39 @@ -514,6 +522,10 @@
    2.40  		64A8264B1B455C5600EECAF0 /* srcref */ = {
    2.41  			isa = PBXGroup;
    2.42  			children = (
    2.43 +				C46EBAE7216E445F0042A6A3 /* base64.c */,
    2.44 +				C46EBAEC216E445F0042A6A3 /* base64.h */,
    2.45 +				438C43B42167752C00C7425B /* labeled_int_list.c */,
    2.46 +				438C43AF2167752C00C7425B /* labeled_int_list.h */,
    2.47  				4337082D203C075A004E6547 /* sqlite3.c */,
    2.48  				43370832203C075A004E6547 /* sqlite3.h */,
    2.49  				430BCC472015EE800077E998 /* pEp_string.c */,
    2.50 @@ -593,6 +605,7 @@
    2.51  				646C40F21D510CD800C63EFF /* asn_SET_OF.h in Headers */,
    2.52  				646C41311D510CD800C63EFF /* PrintableString.h in Headers */,
    2.53  				646C40F51D510CD800C63EFF /* Beacon.h in Headers */,
    2.54 +				438C43B52167752C00C7425B /* labeled_int_list.h in Headers */,
    2.55  				646C40F71D510CD800C63EFF /* ber_decoder.h in Headers */,
    2.56  				646C41351D510CD800C63EFF /* UTF8String.h in Headers */,
    2.57  				646C40EC1D510CD800C63EFF /* asn_codecs_prim.h in Headers */,
    2.58 @@ -631,6 +644,7 @@
    2.59  				646C41231D510CD800C63EFF /* NativeEnumerated.h in Headers */,
    2.60  				646C41071D510CD800C63EFF /* constr_SET_OF.h in Headers */,
    2.61  				646C414B1D510D2C00C63EFF /* sync.h in Headers */,
    2.62 +				C46EBAEE216E445F0042A6A3 /* base64.h in Headers */,
    2.63  				646C411B1D510CD800C63EFF /* Identity.h in Headers */,
    2.64  				646C412B1D510CD800C63EFF /* per_encoder.h in Headers */,
    2.65  				646C40F91D510CD800C63EFF /* ber_tlv_length.h in Headers */,
    2.66 @@ -793,7 +807,7 @@
    2.67  			);
    2.68  			runOnlyForDeploymentPostprocessing = 0;
    2.69  			shellPath = /bin/sh;
    2.70 -			shellScript = "mkdir -p \"$BUILT_PRODUCTS_DIR/include\"\n\ncp \"$SRCROOT/../src/\"{\\\npEpEngine.h,\\\ncryptotech.h,\\\nkeymanagement.h,\\\nmessage_api.h,\\\ndynamic_api.h,\\\nstringlist.h,\\\ntimestamp.h,\\\nidentity_list.h,\\\nbloblist.h,\\\nstringpair.h,\\\nmessage.h,\\\nmime.h,\\\nsync_fsm.h,\\\nsync.h,\\\nsync_app.h} \"$BUILT_PRODUCTS_DIR/include\"\n\nbash -l -c \"make -C ../asn.1 generate\"\nbash -l -c \"make -C ../asn.1\"\nbash -l -c \"LC_ALL=en_US.UTF-8 YML_PATH=$HOME/yml2 make -C ../sync\"\n";
    2.71 +			shellScript = "bash -l -c \"make -C ../asn.1 generate\"\nbash -l -c \"make -C ../asn.1\"\nbash -l -c \"LC_ALL=en_US.UTF-8 YML_PATH=$HOME/yml2 make -C ../sync\"\n";
    2.72  		};
    2.73  /* End PBXShellScriptBuildPhase section */
    2.74  
    2.75 @@ -818,6 +832,7 @@
    2.76  				646C41301D510CD800C63EFF /* PrintableString.c in Sources */,
    2.77  				64A8267B1B455D0800EECAF0 /* etpan_mime.c in Sources */,
    2.78  				64A8267A1B455D0800EECAF0 /* email.c in Sources */,
    2.79 +				438C43B62167752C00C7425B /* labeled_int_list.c in Sources */,
    2.80  				646C41261D510CD800C63EFF /* OCTET_STRING.c in Sources */,
    2.81  				646C41141D510CD800C63EFF /* Hash.c in Sources */,
    2.82  				646C410E1D510CD800C63EFF /* DeviceGroup-Protocol.c in Sources */,
    2.83 @@ -862,6 +877,7 @@
    2.84  				646C412A1D510CD800C63EFF /* per_encoder.c in Sources */,
    2.85  				646C412E1D510CD800C63EFF /* per_support.c in Sources */,
    2.86  				64A826781B455D0800EECAF0 /* bloblist.c in Sources */,
    2.87 +				C46EBAED216E445F0042A6A3 /* base64.c in Sources */,
    2.88  				430BCC492015EE800077E998 /* pEp_string.c in Sources */,
    2.89  				646C41041D510CD800C63EFF /* constr_SEQUENCE.c in Sources */,
    2.90  				43370833203C075A004E6547 /* sqlite3.c in Sources */,
    2.91 @@ -1044,6 +1060,7 @@
    2.92  		64796A541B455AA5004B1C24 /* Debug */ = {
    2.93  			isa = XCBuildConfiguration;
    2.94  			buildSettings = {
    2.95 +				HEADER_SEARCH_PATHS = "$(inherited)";
    2.96  				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
    2.97  				LIBRARY_SEARCH_PATHS = (
    2.98  					"$(inherited)",
    2.99 @@ -1054,12 +1071,14 @@
   2.100  				OTHER_LDFLAGS = "-ObjC";
   2.101  				PRODUCT_NAME = "$(TARGET_NAME)";
   2.102  				SKIP_INSTALL = YES;
   2.103 +				USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src $(PROJECT_DIR) $(PROJECT_DIR)/../../netpgp-et/include/ $(PROJECT_DIR)/../../netpgp-et/src/ $(PROJECT_DIR)/../../OpenSSL-for-iPhone/include $(PROJECT_DIR)/../asn.1/ $(inherited)";
   2.104  			};
   2.105  			name = Debug;
   2.106  		};
   2.107  		64796A551B455AA5004B1C24 /* Release */ = {
   2.108  			isa = XCBuildConfiguration;
   2.109  			buildSettings = {
   2.110 +				HEADER_SEARCH_PATHS = "$(inherited)";
   2.111  				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
   2.112  				LIBRARY_SEARCH_PATHS = (
   2.113  					"$(inherited)",
   2.114 @@ -1069,6 +1088,7 @@
   2.115  				OTHER_LDFLAGS = "-ObjC";
   2.116  				PRODUCT_NAME = "$(TARGET_NAME)";
   2.117  				SKIP_INSTALL = YES;
   2.118 +				USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src $(PROJECT_DIR) $(PROJECT_DIR)/../../netpgp-et/include/ $(PROJECT_DIR)/../../netpgp-et/src/ $(PROJECT_DIR)/../../OpenSSL-for-iPhone/include $(PROJECT_DIR)/../asn.1/ $(inherited)";
   2.119  			};
   2.120  			name = Release;
   2.121  		};
     3.1 --- a/build-windows/pEpEngine.vcxproj	Thu Oct 11 13:01:56 2018 +0200
     3.2 +++ b/build-windows/pEpEngine.vcxproj	Thu Oct 11 13:04:02 2018 +0200
     3.3 @@ -43,12 +43,12 @@
     3.4    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     3.5      <LinkIncremental>true</LinkIncremental>
     3.6      <RunCodeAnalysis>false</RunCodeAnalysis>
     3.7 -	<IncludePath>$(ProjectDir)\..\..\libetpan\build-windows\include;C:\Program Files %28x86%29\GnuPG\include;$(IncludePath);$(ProjectDir)\asn.1;%ASN1C%\share\asn1c</IncludePath>
     3.8 +    <IncludePath>$(ProjectDir)\..\..\libetpan\build-windows\include;C:\Program Files %28x86%29\GnuPG\include;$(IncludePath);$(ProjectDir)\asn.1;%ASN1C%\share\asn1c</IncludePath>
     3.9      <LibraryPath>$(ProjectDir)\..\..\libetpan\build-windows\Debug;$(LibraryPath)</LibraryPath>
    3.10    </PropertyGroup>
    3.11    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    3.12      <LinkIncremental>false</LinkIncremental>
    3.13 -	<IncludePath>$(ProjectDir)\..\..\libetpan\build-windows\include;C:\Program Files %28x86%29\GnuPG\include;$(IncludePath);$(ProjectDir)\asn.1;%ASN1C%\share\asn1c</IncludePath>
    3.14 +    <IncludePath>$(ProjectDir)\..\..\libetpan\build-windows\include;C:\Program Files %28x86%29\GnuPG\include;$(IncludePath);$(ProjectDir)\asn.1;%ASN1C%\share\asn1c</IncludePath>
    3.15      <LibraryPath>$(ProjectDir)\..\..\libetpan\build-windows\Release;$(LibraryPath)</LibraryPath>
    3.16    </PropertyGroup>
    3.17    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    3.18 @@ -107,6 +107,7 @@
    3.19    </ItemDefinitionGroup>
    3.20    <ItemGroup>
    3.21      <ClCompile Include="..\src\asn1_helper.c" />
    3.22 +    <ClCompile Include="..\src\base64.c" />
    3.23      <ClCompile Include="..\src\baseprotocol.c" />
    3.24      <ClCompile Include="..\src\blacklist.c" />
    3.25      <ClCompile Include="..\src\bloblist.c" />
    3.26 @@ -115,6 +116,7 @@
    3.27      <ClCompile Include="..\src\etpan_mime.c" />
    3.28      <ClCompile Include="..\src\identity_list.c" />
    3.29      <ClCompile Include="..\src\keymanagement.c" />
    3.30 +    <ClCompile Include="..\src\labeled_int_list.c" />
    3.31      <ClCompile Include="..\src\map_asn1.c" />
    3.32      <ClCompile Include="..\src\message.c" />
    3.33      <ClCompile Include="..\src\message_api.c" />
    3.34 @@ -140,6 +142,7 @@
    3.35    </ItemGroup>
    3.36    <ItemGroup>
    3.37      <ClInclude Include="..\src\asn1_helper.h" />
    3.38 +    <ClInclude Include="..\src\base64.h" />
    3.39      <ClInclude Include="..\src\baseprotocol.h" />
    3.40      <ClInclude Include="..\src\blacklist.h" />
    3.41      <ClInclude Include="..\src\bloblist.h" />
    3.42 @@ -149,6 +152,7 @@
    3.43      <ClInclude Include="..\src\etpan_mime.h" />
    3.44      <ClInclude Include="..\src\identity_list.h" />
    3.45      <ClInclude Include="..\src\keymanagement.h" />
    3.46 +    <ClInclude Include="..\src\labeled_int_list.h" />
    3.47      <ClInclude Include="..\src\map_asn1.h" />
    3.48      <ClInclude Include="..\src\message.h" />
    3.49      <ClInclude Include="..\src\message_api.h" />
     4.1 --- a/build-windows/pEpEngine.vcxproj.filters	Thu Oct 11 13:01:56 2018 +0200
     4.2 +++ b/build-windows/pEpEngine.vcxproj.filters	Thu Oct 11 13:04:02 2018 +0200
     4.3 @@ -108,6 +108,12 @@
     4.4      <ClCompile Include="..\src\pEp_string.c">
     4.5        <Filter>Quelldateien</Filter>
     4.6      </ClCompile>
     4.7 +    <ClCompile Include="..\src\labeled_int_list.c">
     4.8 +      <Filter>Quelldateien</Filter>
     4.9 +    </ClCompile>
    4.10 +    <ClCompile Include="..\src\base64.c">
    4.11 +      <Filter>Quelldateien</Filter>
    4.12 +    </ClCompile>
    4.13    </ItemGroup>
    4.14    <ItemGroup>
    4.15      <ClInclude Include="..\src\keymanagement.h">
    4.16 @@ -212,6 +218,12 @@
    4.17      <ClInclude Include="..\src\pEp_string.h">
    4.18        <Filter>Headerdateien</Filter>
    4.19      </ClInclude>
    4.20 +    <ClInclude Include="..\src\labeled_int_list.h">
    4.21 +      <Filter>Headerdateien</Filter>
    4.22 +    </ClInclude>
    4.23 +    <ClInclude Include="..\src\base64.h">
    4.24 +      <Filter>Headerdateien</Filter>
    4.25 +    </ClInclude>
    4.26    </ItemGroup>
    4.27    <ItemGroup>
    4.28      <Text Include="..\LICENSE.txt" />
     5.1 --- a/default.conf	Thu Oct 11 13:01:56 2018 +0200
     5.2 +++ b/default.conf	Thu Oct 11 13:04:02 2018 +0200
     5.3 @@ -238,6 +238,16 @@
     5.4  #NETPGP_INC=-I$(PREFIX)/include
     5.5  
     5.6  
     5.7 +######### OpenPGP #########
     5.8 +# CppUnit library search flag
     5.9 +CPPUNIT_LIB=
    5.10 +#CPPUNIT_LIB=-L$(HOME)/local/lib
    5.11 +
    5.12 +# CppUnit include search flag
    5.13 +CPPUNIT_INC=
    5.14 +#CPPUNIT_INC=-I$(HOME)/local/inc
    5.15 +
    5.16 +
    5.17  ######### Engine internals #########
    5.18  # C macros (not environment variables) that can be overridden:
    5.19  # DEFAULT_KEYSERVER - string with default keyserver
     6.1 --- a/src/Makefile	Thu Oct 11 13:01:56 2018 +0200
     6.2 +++ b/src/Makefile	Thu Oct 11 13:04:02 2018 +0200
     6.3 @@ -90,7 +90,7 @@
     6.4  	cp -v pEpEngine.h keymanagement.h message_api.h dynamic_api.h stringlist.h \
     6.5  	      timestamp.h identity_list.h bloblist.h stringpair.h message.h mime.h \
     6.6  	      cryptotech.h sync.h sync_fsm.h sync_app.h blacklist.h pEp_string.h \
     6.7 -	      openpgp_compat.h $(PREFIX)/include/pEp/
     6.8 +	      labeled_int_list.h openpgp_compat.h base64.h $(PREFIX)/include/pEp/
     6.9  
    6.10  .PHONY: uninstall
    6.11  uninstall:
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/base64.c	Thu Oct 11 13:04:02 2018 +0200
     7.3 @@ -0,0 +1,219 @@
     7.4 +// This file is under GNU General Public License 3.0
     7.5 +// see LICENSE.txt
     7.6 +
     7.7 +#include <stdbool.h>
     7.8 +#include <stdlib.h>
     7.9 +#include <assert.h>
    7.10 +#include <string.h>
    7.11 +
    7.12 +#include "platform.h"
    7.13 +#include "base64.h"
    7.14 +
    7.15 +static char translate_char_to_bits(char input) {
    7.16 +    if (input >= 65 && input <= 90)
    7.17 +        return input - 65;
    7.18 +    if (input >= 97 && input <= 122)
    7.19 +        return input - 71; // 97 - 26
    7.20 +    if (input >= 48 && input <= 57)
    7.21 +        return input + 4; // 52 - 48
    7.22 +    if (input == '+')
    7.23 +        return 62;
    7.24 +    if (input == '/')
    7.25 +        return 63;
    7.26 +    if (input == ' ' || input == '\r' || input == '\n')
    7.27 +        return 127;
    7.28 +    return -1;    
    7.29 +}
    7.30 +
    7.31 +static bool _is_whitespace(const char in) {
    7.32 +    switch (in) {
    7.33 +        case ' ':
    7.34 +        case '\r':
    7.35 +        case '\t':
    7.36 +        case '\n':
    7.37 +            return true;
    7.38 +        default:
    7.39 +            return false;
    7.40 +    }        
    7.41 +}
    7.42 +
    7.43 +static size_t subtract_whitespace(const char* input, int length) {
    7.44 +    size_t actual_size = length;
    7.45 +    int i;
    7.46 +    const char* curr = input;
    7.47 +    for (i = 0; i < length; i++, curr++) {
    7.48 +        if (_is_whitespace(*curr))
    7.49 +            actual_size--;
    7.50 +    }
    7.51 +    return actual_size;
    7.52 +}
    7.53 +    
    7.54 +static void trim_end(const char* input, int* length) {
    7.55 +    const char* end = input + *length;
    7.56 +    
    7.57 +    int start_length = *length;
    7.58 +    
    7.59 +    int i;
    7.60 +    
    7.61 +    for (i = 0; i < start_length; i++) {
    7.62 +        if (!_is_whitespace(*(--end)))
    7.63 +            break;
    7.64 +        (*length) = (*length) - 1;        
    7.65 +    }
    7.66 +}    
    7.67 +    
    7.68 +char next_char(const char** input_ptr, const char* end) {
    7.69 +    const char* input = *input_ptr;
    7.70 +    char this_ch = 0;
    7.71 +    
    7.72 +    while (input < end) {
    7.73 +        this_ch = *input++;
    7.74 +        if (!this_ch)
    7.75 +            return 0;
    7.76 +        if (_is_whitespace(this_ch))
    7.77 +            continue;
    7.78 +        break;    
    7.79 +    }
    7.80 +    
    7.81 +    *input_ptr = input;
    7.82 +    return this_ch;
    7.83 +}
    7.84 +
    7.85 +// 4 chars = 3 output bytes
    7.86 +bloblist_t* base64_str_to_binary_blob(const char* input, int length) {
    7.87 +    if (length == 0)
    7.88 +        return NULL;
    7.89 +    
    7.90 +    trim_end(input, &length);
    7.91 +        
    7.92 +    const char* input_curr;
    7.93 +    input_curr = input;
    7.94 +    const char* input_end = input_curr + length;
    7.95 +    length = subtract_whitespace(input, length);
    7.96 +    size_t final_length = (length / 4) * 3;
    7.97 +
    7.98 +    // padded -- FIXME: whitespace in between ==!!!! 
    7.99 +    if (*(input_end - 1) == '=') {
   7.100 +        final_length -= 1;
   7.101 +        
   7.102 +        if (*(input_end - 2) == '=')
   7.103 +            final_length -=1;
   7.104 +    }
   7.105 +    else {
   7.106 +        // not padded
   7.107 +        int leftover = length % 4;
   7.108 +        switch (leftover) {
   7.109 +            case 0:
   7.110 +                break;
   7.111 +            case 2:
   7.112 +                final_length++;
   7.113 +                break;
   7.114 +            case 3:
   7.115 +                final_length+=2;
   7.116 +                break;
   7.117 +            default:
   7.118 +                return NULL;
   7.119 +        }
   7.120 +    }
   7.121 +    void* blobby = calloc(final_length, 1);
   7.122 +    char* blobby_curr = (char*)blobby;
   7.123 +
   7.124 +    // if the last 1 or 2 bytes are padded, we do those after
   7.125 +    size_t number_of_rounds = final_length / 3;
   7.126 +    
   7.127 +    unsigned int cycle;
   7.128 +    
   7.129 +    // full 3-byte rounds
   7.130 +    for (cycle = 0; cycle < number_of_rounds; cycle++) {
   7.131 +        char byte_array[] = {0,0,0};
   7.132 +        char in_val = next_char(&input_curr, input_end);
   7.133 +        if (in_val == 0)
   7.134 +            goto pEp_error; // can ALSO happen when input_curr == input_end,
   7.135 +                            // which simply shouldn't happen, since we're
   7.136 +                            // interating based on expected OUTPUT, not
   7.137 +                            // input.
   7.138 +                            
   7.139 +        char out_val = translate_char_to_bits(in_val);
   7.140 +        if (out_val > 63)
   7.141 +            goto pEp_error;
   7.142 +        
   7.143 +        byte_array[0] |= out_val << 2;
   7.144 +
   7.145 +        in_val = next_char(&input_curr, input_end);
   7.146 +        if (in_val == 0)
   7.147 +            goto pEp_error;         
   7.148 +        out_val = translate_char_to_bits(in_val);
   7.149 +        if (out_val > 63)
   7.150 +            goto pEp_error;
   7.151 +
   7.152 +        byte_array[0] |= out_val >> 4;
   7.153 +        byte_array[1] = out_val << 4;
   7.154 +        
   7.155 +        in_val = next_char(&input_curr, input_end);
   7.156 +        if (in_val == 0)
   7.157 +            goto pEp_error;         
   7.158 +        out_val = translate_char_to_bits(in_val);
   7.159 +        if (out_val > 63)
   7.160 +            goto pEp_error;
   7.161 +    
   7.162 +        byte_array[1] |= out_val >> 2;
   7.163 +        byte_array[2] = out_val << 6;
   7.164 +
   7.165 +        in_val = next_char(&input_curr, input_end);
   7.166 +        if (in_val == 0)
   7.167 +            goto pEp_error;         
   7.168 +        out_val = translate_char_to_bits(in_val);
   7.169 +        if (out_val > 63)
   7.170 +            goto pEp_error;
   7.171 +        
   7.172 +        byte_array[2] |= out_val;
   7.173 +        
   7.174 +        // Now write everything to the blob
   7.175 +        *blobby_curr++ = byte_array[0];
   7.176 +        *blobby_curr++ = byte_array[1];
   7.177 +        *blobby_curr++ = byte_array[2];        
   7.178 +    }
   7.179 +
   7.180 +    int last_bytes = final_length % 3;
   7.181 +
   7.182 +    if (last_bytes != 0) {
   7.183 +        char byte_1 = 0;
   7.184 +        char byte_2 = 0;
   7.185 +
   7.186 +        char in_val = next_char(&input_curr, input_end);
   7.187 +        if (in_val == 0)
   7.188 +            goto pEp_error;         
   7.189 +        char out_val = translate_char_to_bits(in_val);
   7.190 +        if (out_val > 63)
   7.191 +            goto pEp_error;
   7.192 +        byte_1 = out_val << 2;
   7.193 +        in_val = next_char(&input_curr, input_end);
   7.194 +        if (in_val == 0)
   7.195 +            goto pEp_error;         
   7.196 +        out_val = translate_char_to_bits(in_val);
   7.197 +        if (out_val > 63)
   7.198 +            goto pEp_error;
   7.199 +        byte_1 |= out_val >> 4;
   7.200 +        *blobby_curr++ = byte_1;                   
   7.201 +            
   7.202 +        if (last_bytes == 2) {
   7.203 +            byte_2 = out_val << 4;
   7.204 +            in_val = next_char(&input_curr, input_end);
   7.205 +            if (in_val == 0)
   7.206 +                goto pEp_error;         
   7.207 +            
   7.208 +            out_val = translate_char_to_bits(in_val);
   7.209 +            if (out_val > 63)
   7.210 +                goto pEp_error;
   7.211 +        
   7.212 +            byte_2 |= out_val >> 2;
   7.213 +            *blobby_curr++ = byte_2;
   7.214 +        }
   7.215 +    }
   7.216 +    
   7.217 +    return new_bloblist((char*)blobby, final_length, NULL, NULL);
   7.218 +            
   7.219 +pEp_error:
   7.220 +    free(blobby);
   7.221 +    return NULL;
   7.222 +}    
   7.223 \ No newline at end of file
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/src/base64.h	Thu Oct 11 13:04:02 2018 +0200
     8.3 @@ -0,0 +1,17 @@
     8.4 +// This file is under GNU General Public License 3.0
     8.5 +// see LICENSE.txt
     8.6 +
     8.7 +#pragma once
     8.8 +
     8.9 +#include "dynamic_api.h"
    8.10 +#include "bloblist.h"
    8.11 +
    8.12 +#ifdef __cplusplus
    8.13 +extern "C" {
    8.14 +#endif
    8.15 +
    8.16 +bloblist_t* base64_str_to_binary_blob(const char* input, int length);
    8.17 +
    8.18 +#ifdef __cplusplus
    8.19 +}
    8.20 +#endif
     9.1 --- a/src/cryptotech.h	Thu Oct 11 13:01:56 2018 +0200
     9.2 +++ b/src/cryptotech.h	Thu Oct 11 13:04:02 2018 +0200
     9.3 @@ -19,7 +19,8 @@
     9.4  typedef PEP_STATUS (*decrypt_and_verify_t)(
     9.5          PEP_SESSION session, const char *ctext, size_t csize,
     9.6          const char *dsigtext, size_t dsigsize,
     9.7 -        char **ptext, size_t *psize, stringlist_t **keylist
     9.8 +        char **ptext, size_t *psize, stringlist_t **keylist,
     9.9 +        char **filename_ptr 
    9.10      );
    9.11  
    9.12  typedef PEP_STATUS (*verify_text_t)(
    10.1 --- a/src/keymanagement.c	Thu Oct 11 13:01:56 2018 +0200
    10.2 +++ b/src/keymanagement.c	Thu Oct 11 13:04:02 2018 +0200
    10.3 @@ -532,40 +532,53 @@
    10.4  
    10.5              if (id_list) {
    10.6                  identity_list* id_curr = id_list;
    10.7 +                bool input_is_TOFU = strstr(identity->user_id, "TOFU_") == identity->user_id;
    10.8                  while (id_curr) {
    10.9                      pEp_identity* this_id = id_curr->ident;
   10.10                      if (this_id) {
   10.11                          char* this_uid = this_id->user_id;
   10.12 -                        if (this_uid && (strstr(this_uid, "TOFU_") == this_uid)) {
   10.13 -                            // FIXME: should we also be fixing pEp_own_userId in this
   10.14 -                            // function here?
   10.15 -                            
   10.16 -                            // if usernames match, we replace the userid. Or if the temp username
   10.17 -                            // is anonymous.
   10.18 -                            // FIXME: do we need to create an address match function which
   10.19 -                            // matches the whole dot-and-case rigamarole from 
   10.20 -                            if (EMPTYSTR(this_id->username) ||
   10.21 -                                strcasecmp(this_id->username, this_id->address) == 0 ||
   10.22 -                                (identity->username && 
   10.23 -                                 strcasecmp(identity->username, 
   10.24 -                                            this_id->username) == 0)) {
   10.25 +                        bool curr_is_TOFU = strstr(this_uid, "TOFU_") == this_uid;
   10.26 +                        if (this_uid) {
   10.27 +                            if (curr_is_TOFU && !input_is_TOFU) {
   10.28 +                                // FIXME: should we also be fixing pEp_own_userId in this
   10.29 +                                // function here?
   10.30                                  
   10.31 -                                // Ok, we have a temp ID. We have to replace this
   10.32 -                                // with the real ID.
   10.33 -                                status = replace_userid(session, 
   10.34 -                                                        this_uid, 
   10.35 -                                                        identity->user_id);
   10.36 -                                if (status != PEP_STATUS_OK) {
   10.37 -                                    free_identity_list(id_list);
   10.38 -                                    free(default_own_id);
   10.39 -                                    return status;
   10.40 +                                // if usernames match, we replace the userid. Or if the temp username
   10.41 +                                // is anonymous.
   10.42 +                                // FIXME: do we need to create an address match function which
   10.43 +                                // matches the whole dot-and-case rigamarole from 
   10.44 +                                if (EMPTYSTR(this_id->username) ||
   10.45 +                                    strcasecmp(this_id->username, this_id->address) == 0 ||
   10.46 +                                    (identity->username && 
   10.47 +                                     strcasecmp(identity->username, 
   10.48 +                                                this_id->username) == 0)) {
   10.49 +                                    
   10.50 +                                    // Ok, we have a temp ID. We have to replace this
   10.51 +                                    // with the real ID.
   10.52 +                                    status = replace_userid(session, 
   10.53 +                                                            this_uid, 
   10.54 +                                                            identity->user_id);
   10.55 +                                    if (status != PEP_STATUS_OK) {
   10.56 +                                        free_identity_list(id_list);
   10.57 +                                        free(default_own_id);
   10.58 +                                        return status;
   10.59 +                                    }
   10.60 +                                        
   10.61 +                                    free(this_uid);
   10.62 +                                    this_uid = NULL;
   10.63 +                                    
   10.64 +                                    // Reflect the change we just made to the DB
   10.65 +                                    this_id->user_id = strdup(identity->user_id);
   10.66 +                                    stored_ident = this_id;
   10.67 +                                    // FIXME: free list.
   10.68 +                                    break;                                
   10.69                                  }
   10.70 -                                    
   10.71 -                                free(this_uid);
   10.72 -                                this_uid = NULL;
   10.73 -                                
   10.74 -                                // Reflect the change we just made to the DB
   10.75 -                                this_id->user_id = strdup(identity->user_id);
   10.76 +                            }
   10.77 +                            else if (input_is_TOFU && !curr_is_TOFU) {
   10.78 +                                // Replace ruthlessly - this is NOT supposed to happen.
   10.79 +                                // BAD APP BEHAVIOUR.
   10.80 +                                free(identity->user_id);
   10.81 +                                identity->user_id = strdup(this_id->user_id);
   10.82                                  stored_ident = this_id;
   10.83                                  // FIXME: free list.
   10.84                                  break;                                
   10.85 @@ -1158,7 +1171,12 @@
   10.86  
   10.87      if (ident->me)
   10.88      {
   10.89 -        revoke_key(session, ident->fpr, NULL);
   10.90 +        // See if key is revoked already
   10.91 +        bool revoked = false;
   10.92 +        status = key_revoked(session, ident->fpr, &revoked);
   10.93 +        if (!revoked)
   10.94 +            revoke_key(session, ident->fpr, NULL);
   10.95 +            
   10.96          myself(session, ident);
   10.97      }
   10.98      else
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/src/labeled_int_list.c	Thu Oct 11 13:04:02 2018 +0200
    11.3 @@ -0,0 +1,121 @@
    11.4 +// This file is under GNU General Public License 3.0
    11.5 +// see LICENSE.txt
    11.6 +
    11.7 +#include <stdbool.h>
    11.8 +#include <stdlib.h>
    11.9 +#include <assert.h>
   11.10 +#include <string.h>
   11.11 +
   11.12 +#include "platform.h"
   11.13 +#include "labeled_int_list.h"
   11.14 +
   11.15 +DYNAMIC_API labeled_int_list_t *new_labeled_int_list(int value, const char* label)
   11.16 +{
   11.17 +    assert(label);
   11.18 +    if (!label)
   11.19 +        return NULL;
   11.20 +        
   11.21 +    labeled_int_list_t * labeled_int_list = calloc(1, sizeof(labeled_int_list_t));
   11.22 +    assert(labeled_int_list);
   11.23 +    if (labeled_int_list == NULL)
   11.24 +        return NULL;
   11.25 +
   11.26 +    labeled_int_list->value = value;
   11.27 +    labeled_int_list->label = strdup(label);
   11.28 +    if (!labeled_int_list->label) {
   11.29 +        free(labeled_int_list);
   11.30 +        labeled_int_list = NULL;
   11.31 +    }
   11.32 +    return labeled_int_list;
   11.33 +}
   11.34 +
   11.35 +DYNAMIC_API void free_labeled_int_list(labeled_int_list_t *labeled_int_list)
   11.36 +{
   11.37 +    labeled_int_list_t *curr = labeled_int_list;
   11.38 +
   11.39 +    while (curr) {
   11.40 +        labeled_int_list_t *next = curr->next;
   11.41 +        free(curr->label);
   11.42 +        free(curr);
   11.43 +        curr = next;
   11.44 +    }
   11.45 +}
   11.46 +
   11.47 +DYNAMIC_API labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src)
   11.48 +{
   11.49 +    assert(src);
   11.50 +    if (src == NULL)
   11.51 +        return NULL;
   11.52 +    
   11.53 +    labeled_int_list_t *labeled_int_list = NULL;
   11.54 +
   11.55 +    labeled_int_list = new_labeled_int_list(src->value, src->label);
   11.56 +    if (labeled_int_list == NULL)
   11.57 +        goto enomem;
   11.58 +
   11.59 +    labeled_int_list_t* src_curr = src->next;
   11.60 +    labeled_int_list_t** dst_curr_ptr = &labeled_int_list->next;
   11.61 +
   11.62 +    // list
   11.63 +    while (src_curr) {
   11.64 +        *dst_curr_ptr = new_labeled_int_list(src_curr->value, src_curr->label);
   11.65 +        if (*dst_curr_ptr == NULL)
   11.66 +            goto enomem;
   11.67 +
   11.68 +        src_curr = src_curr->next;
   11.69 +        dst_curr_ptr = &((*dst_curr_ptr)->next);
   11.70 +    }
   11.71 +
   11.72 +    return labeled_int_list;
   11.73 +
   11.74 +enomem:
   11.75 +    free_labeled_int_list(labeled_int_list);
   11.76 +    return NULL;
   11.77 +}
   11.78 +
   11.79 +DYNAMIC_API labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label)
   11.80 +{
   11.81 +    if (!label)
   11.82 +        return NULL;
   11.83 +        
   11.84 +    if (!labeled_int_list)
   11.85 +        return new_labeled_int_list(value, label);
   11.86 +
   11.87 +    if (!labeled_int_list->label) { // empty list
   11.88 +        assert(!labeled_int_list->next);
   11.89 +        if (labeled_int_list->next)
   11.90 +            return NULL; // invalid list
   11.91 +
   11.92 +        labeled_int_list->value = value;
   11.93 +        labeled_int_list->label = strdup(label);
   11.94 +        if (!labeled_int_list->label) {
   11.95 +            free(labeled_int_list);
   11.96 +            labeled_int_list = NULL;
   11.97 +        }
   11.98 +
   11.99 +        return labeled_int_list;
  11.100 +    }
  11.101 +
  11.102 +    labeled_int_list_t* list_curr = labeled_int_list;
  11.103 +
  11.104 +    while (list_curr->next)
  11.105 +        list_curr = list_curr->next;
  11.106 +
  11.107 +    list_curr->next = new_labeled_int_list(value, label);
  11.108 +
  11.109 +    assert(list_curr->next);
  11.110 +    if (!list_curr->next)
  11.111 +        return NULL;
  11.112 +
  11.113 +    return list_curr->next;
  11.114 +}
  11.115 +
  11.116 +DYNAMIC_API int labeled_int_list_length(const labeled_int_list_t *labeled_int_list)
  11.117 +{
  11.118 +    int len = 0;
  11.119 +
  11.120 +    for (const labeled_int_list_t *_li = labeled_int_list; _li && _li->label; _li = _li->next)
  11.121 +        len++;
  11.122 +
  11.123 +    return len;
  11.124 +}
  11.125 \ No newline at end of file
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/src/labeled_int_list.h	Thu Oct 11 13:04:02 2018 +0200
    12.3 @@ -0,0 +1,31 @@
    12.4 +// This file is under GNU General Public License 3.0
    12.5 +// see LICENSE.txt
    12.6 +
    12.7 +#pragma once
    12.8 +
    12.9 +#include "dynamic_api.h"
   12.10 +#include "stringpair.h"
   12.11 +
   12.12 +#ifdef __cplusplus
   12.13 +extern "C" {
   12.14 +#endif
   12.15 +
   12.16 +typedef struct _labeled_int_list_t {
   12.17 +    int value;
   12.18 +    char* label;                                // UTF-8 string, null-terminated
   12.19 +    struct _labeled_int_list_t *next;           // this is a single linked list
   12.20 +} labeled_int_list_t;
   12.21 +
   12.22 +DYNAMIC_API labeled_int_list_t *new_labeled_int_list(int value, const char* label);
   12.23 +
   12.24 +DYNAMIC_API void free_labeled_int_list(labeled_int_list_t *labeled_int_list);
   12.25 +
   12.26 +DYNAMIC_API labeled_int_list_t *labeled_int_list_dup(const labeled_int_list_t *src);
   12.27 +
   12.28 +DYNAMIC_API labeled_int_list_t *labeled_int_list_add(labeled_int_list_t *labeled_int_list, int value, const char* label);
   12.29 +
   12.30 +DYNAMIC_API int labeled_int_list_length(const labeled_int_list_t *labeled_int_list);
   12.31 +
   12.32 +#ifdef __cplusplus
   12.33 +}
   12.34 +#endif
    13.1 --- a/src/message_api.c	Thu Oct 11 13:01:56 2018 +0200
    13.2 +++ b/src/message_api.c	Thu Oct 11 13:04:02 2018 +0200
    13.3 @@ -7,6 +7,7 @@
    13.4  #include "platform.h"
    13.5  #include "mime.h"
    13.6  #include "blacklist.h"
    13.7 +#include "base64.h"
    13.8  
    13.9  #include <assert.h>
   13.10  #include <string.h>
   13.11 @@ -1170,6 +1171,7 @@
   13.12          return false;
   13.13  
   13.14      const char* bare_filename_ptr = _get_resource_ptr_noown(blob->filename);
   13.15 +    bare_filename_ptr += strlen(bare_filename_ptr) - 15;
   13.16      if (strncmp(bare_filename_ptr, "PGPexch.htm.", 12) == 0) {
   13.17          if (strcmp(bare_filename_ptr + 11, ".pgp") == 0 ||
   13.18              strcmp(bare_filename_ptr + 11, ".asc") == 0)
   13.19 @@ -1329,6 +1331,45 @@
   13.20      }
   13.21  }
   13.22  
   13.23 +static PEP_comm_type _get_comm_type_preview(
   13.24 +    PEP_SESSION session,
   13.25 +    PEP_comm_type max_comm_type,
   13.26 +    pEp_identity *ident
   13.27 +    )
   13.28 +{
   13.29 +    assert(session);
   13.30 +    assert(ident);
   13.31 +
   13.32 +    PEP_STATUS status = PEP_STATUS_OK;
   13.33 +
   13.34 +    if (max_comm_type == PEP_ct_compromised)
   13.35 +        return PEP_ct_compromised;
   13.36 +
   13.37 +    if (max_comm_type == PEP_ct_mistrusted)
   13.38 +        return PEP_ct_mistrusted;
   13.39 +
   13.40 +    PEP_comm_type comm_type = PEP_ct_unknown;
   13.41 +    if (ident && !EMPTYSTR(ident->address) && !EMPTYSTR(ident->user_id)) {
   13.42 +        pEp_identity *ident2;
   13.43 +        status = get_identity(session, ident->address, ident->user_id, &ident2);
   13.44 +        comm_type = ident2 ? ident2->comm_type : PEP_ct_unknown;
   13.45 +        free_identity(ident2);
   13.46 +
   13.47 +        if (status == PEP_STATUS_OK) {
   13.48 +            if (comm_type == PEP_ct_compromised)
   13.49 +                comm_type = PEP_ct_compromised;
   13.50 +            else if (comm_type == PEP_ct_mistrusted)
   13.51 +                comm_type = PEP_ct_mistrusted;
   13.52 +            else
   13.53 +                comm_type = _MIN(max_comm_type, comm_type);
   13.54 +        }
   13.55 +        else {
   13.56 +            comm_type = PEP_ct_unknown;
   13.57 +        }
   13.58 +    }
   13.59 +    return comm_type;
   13.60 +}
   13.61 +
   13.62  static void free_bl_entry(bloblist_t *bl)
   13.63  {
   13.64      if (bl) {
   13.65 @@ -1416,7 +1457,8 @@
   13.66                                                          blob_value, blob_size,
   13.67                                                          NULL, 0,
   13.68                                                          &bl_ptext, &bl_psize, 
   13.69 -                                                        &bl_keylist);
   13.70 +                                                        &bl_keylist,
   13.71 +                                                        NULL);
   13.72                  free_stringlist(bl_keylist); // we don't care about key encryption as long as we decrypt
   13.73                  if (_status == PEP_DECRYPTED || _status == PEP_DECRYPTED_AND_VERIFIED) {
   13.74                      free_blobval = true;
   13.75 @@ -2661,7 +2703,8 @@
   13.76          free_stringlist(*keylist);
   13.77          *decrypt_status = decrypt_and_verify(session, ctext, csize,
   13.78                                               NULL, 0,
   13.79 -                                             &ptext, &psize, keylist);
   13.80 +                                             &ptext, &psize, keylist,
   13.81 +                                             NULL);
   13.82          
   13.83      }
   13.84  
   13.85 @@ -2711,9 +2754,12 @@
   13.86              free(ptext);
   13.87              ptext = NULL;
   13.88  
   13.89 +            char* pgp_filename = NULL;
   13.90              status = decrypt_and_verify(session, attctext, attcsize,
   13.91                                          NULL, 0,
   13.92 -                                        &ptext, &psize, &_keylist);
   13.93 +                                        &ptext, &psize, &_keylist,
   13.94 +                                        &pgp_filename);
   13.95 +                                        
   13.96              free_stringlist(_keylist);
   13.97  
   13.98              if (ptext) {
   13.99 @@ -2722,18 +2768,26 @@
  13.100                      ptext = NULL;
  13.101                  }
  13.102                  else {
  13.103 -                    static const char * const mime_type = "application/octet-stream";
  13.104 -                    char * const filename =
  13.105 -                        without_double_ending(_s->filename);
  13.106 -                    if (filename == NULL)
  13.107 -                        return PEP_OUT_OF_MEMORY;
  13.108 -
  13.109 -                    _m = bloblist_add(_m, ptext, psize, mime_type,
  13.110 -                        filename);
  13.111 -                    free(filename);
  13.112 -                    if (_m == NULL)
  13.113 -                        return PEP_OUT_OF_MEMORY;
  13.114 -
  13.115 +                    static const char * const mime_type = "application/octet-stream";                    
  13.116 +                    if (pgp_filename) {
  13.117 +                        _m = bloblist_add(_m, ptext, psize, mime_type,
  13.118 +                             pgp_filename);
  13.119 +                        free(pgp_filename);                        
  13.120 +                        if (_m == NULL)
  13.121 +                            return PEP_OUT_OF_MEMORY;
  13.122 +                    }
  13.123 +                    else {
  13.124 +                        char * const filename =
  13.125 +                            without_double_ending(_s->filename);
  13.126 +                        if (filename == NULL)
  13.127 +                            return PEP_OUT_OF_MEMORY;
  13.128 +
  13.129 +                        _m = bloblist_add(_m, ptext, psize, mime_type,
  13.130 +                            filename);
  13.131 +                        free(filename);
  13.132 +                        if (_m == NULL)
  13.133 +                            return PEP_OUT_OF_MEMORY;
  13.134 +                    }
  13.135                      ptext = NULL;
  13.136  
  13.137                      if (msg->attachments == NULL)
  13.138 @@ -2762,6 +2816,7 @@
  13.139                  return PEP_OUT_OF_MEMORY;
  13.140          }
  13.141      }
  13.142 +
  13.143      return status;
  13.144  }
  13.145  
  13.146 @@ -3022,6 +3077,28 @@
  13.147      return NULL;
  13.148  }
  13.149  
  13.150 +static bool import_header_keys(PEP_SESSION session, message* src) {
  13.151 +    stringpair_list_t* header_keys = stringpair_list_find(src->opt_fields, "Autocrypt"); 
  13.152 +    if (!header_keys || !header_keys->value)
  13.153 +        return false;
  13.154 +    const char* value = header_keys->value->value;
  13.155 +    if (!value)
  13.156 +        return false;
  13.157 +    const char* start_key = strstr(value, "keydata=");
  13.158 +    if (!start_key)
  13.159 +        return false;
  13.160 +    start_key += 8; // length of "keydata="
  13.161 +    int length = strlen(start_key);
  13.162 +    bloblist_t* the_key = base64_str_to_binary_blob(start_key, length);
  13.163 +    if (!the_key)
  13.164 +        return false;
  13.165 +    PEP_STATUS status = import_key(session, the_key->value, the_key->size, NULL);
  13.166 +    free_bloblist(the_key);
  13.167 +    if (status == PEP_STATUS_OK)
  13.168 +        return true;
  13.169 +    return false;
  13.170 +}
  13.171 +
  13.172  DYNAMIC_API PEP_STATUS _decrypt_message(
  13.173          PEP_SESSION session,
  13.174          message *src,
  13.175 @@ -3107,15 +3184,18 @@
  13.176      /*** Begin Import any attached public keys and update identities accordingly ***/
  13.177      // Private key in unencrypted mail are ignored -> NULL
  13.178      bool imported_keys = import_attached_keys(session, src, NULL);
  13.179 -
  13.180 +    import_header_keys(session, src);
  13.181 +    
  13.182      // FIXME: is this really necessary here?
  13.183 -    if (!is_me(session, src->from))
  13.184 -        status = update_identity(session, src->from);
  13.185 -    else
  13.186 -        status = myself(session, src->from);
  13.187 +    if (src->from) {
  13.188 +        if (!is_me(session, src->from))
  13.189 +            status = update_identity(session, src->from);
  13.190 +        else
  13.191 +            status = myself(session, src->from);
  13.192          
  13.193 -    if (status != PEP_STATUS_OK)
  13.194 -        return status;
  13.195 +        if (status != PEP_STATUS_OK)
  13.196 +            return status;
  13.197 +    }
  13.198      
  13.199      /*** End Import any attached public keys and update identities accordingly ***/
  13.200      
  13.201 @@ -3154,7 +3234,8 @@
  13.202      /** Ok, we should be ready to decrypt. Try decrypt and verify first! **/
  13.203      status = cryptotech[crypto].decrypt_and_verify(session, ctext,
  13.204                                                     csize, dsig_text, dsig_size,
  13.205 -                                                   &ptext, &psize, &_keylist);
  13.206 +                                                   &ptext, &psize, &_keylist,
  13.207 +                                                   NULL);
  13.208  
  13.209      if (status > PEP_CANNOT_DECRYPT_UNKNOWN)
  13.210          goto pep_error;
  13.211 @@ -3198,13 +3279,14 @@
  13.212  
  13.213                  /* if decrypted, but not verified... */
  13.214                  if (decrypt_status == PEP_DECRYPTED) {
  13.215 -                                                                                     
  13.216 -                    status = verify_decrypted(session,
  13.217 -                                              src, msg,
  13.218 -                                              ptext, psize,
  13.219 -                                              &_keylist,
  13.220 -                                              &decrypt_status,
  13.221 -                                              crypto);
  13.222 +                    
  13.223 +                    if (src->from)                                                                 
  13.224 +                        status = verify_decrypted(session,
  13.225 +                                                  src, msg,
  13.226 +                                                  ptext, psize,
  13.227 +                                                  &_keylist,
  13.228 +                                                  &decrypt_status,
  13.229 +                                                  crypto);
  13.230                  }
  13.231                  break;
  13.232  
  13.233 @@ -3350,7 +3432,7 @@
  13.234          
  13.235          // Ok, so if it was signed and it's all verified, we can update
  13.236          // eligible signer comm_types to PEP_ct_pEp_*
  13.237 -        if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED && is_pep_msg)
  13.238 +        if (decrypt_status == PEP_DECRYPTED_AND_VERIFIED && is_pep_msg && calculated_src->from)
  13.239              status = update_sender_to_pep_trust(session, calculated_src->from, _keylist);
  13.240  
  13.241          /* Ok, now we have a keylist used for decryption/verification.
  13.242 @@ -3570,6 +3652,23 @@
  13.243      }
  13.244  }
  13.245  
  13.246 +static void _max_comm_type_from_identity_list_preview(
  13.247 +        identity_list *identities,
  13.248 +        PEP_SESSION session,
  13.249 +        PEP_comm_type *max_comm_type
  13.250 +    )
  13.251 +{
  13.252 +    identity_list * il;
  13.253 +    for (il = identities; il != NULL; il = il->next)
  13.254 +    {
  13.255 +        if (il->ident)
  13.256 +        {   
  13.257 +            *max_comm_type = _get_comm_type_preview(session, *max_comm_type,
  13.258 +                il->ident);
  13.259 +        }
  13.260 +    }
  13.261 +}
  13.262 +
  13.263  DYNAMIC_API PEP_STATUS outgoing_message_rating(
  13.264          PEP_SESSION session,
  13.265          message *msg,
  13.266 @@ -3613,6 +3712,42 @@
  13.267      return PEP_STATUS_OK;
  13.268  }
  13.269  
  13.270 +DYNAMIC_API PEP_STATUS outgoing_message_rating_preview(
  13.271 +        PEP_SESSION session,
  13.272 +        message *msg,
  13.273 +        PEP_rating *rating
  13.274 +    )
  13.275 +{
  13.276 +    PEP_comm_type max_comm_type = PEP_ct_pEp;
  13.277 +
  13.278 +    assert(session);
  13.279 +    assert(msg);
  13.280 +    assert(msg->dir == PEP_dir_outgoing);
  13.281 +    assert(rating);
  13.282 +
  13.283 +    if (!(session && msg && rating))
  13.284 +        return PEP_ILLEGAL_VALUE;
  13.285 +
  13.286 +    if (msg->dir != PEP_dir_outgoing)
  13.287 +        return PEP_ILLEGAL_VALUE;
  13.288 +
  13.289 +    *rating = PEP_rating_undefined;
  13.290 +
  13.291 +    _max_comm_type_from_identity_list_preview(msg->to, session,
  13.292 +            &max_comm_type);
  13.293 +
  13.294 +    _max_comm_type_from_identity_list_preview(msg->cc, session,
  13.295 +            &max_comm_type);
  13.296 +
  13.297 +    _max_comm_type_from_identity_list_preview(msg->bcc, session,
  13.298 +            &max_comm_type);
  13.299 +
  13.300 +    *rating = _MAX(_rating(max_comm_type, PEP_rating_undefined),
  13.301 +            PEP_rating_unencrypted);
  13.302 +
  13.303 +    return PEP_STATUS_OK;
  13.304 +}
  13.305 +
  13.306  DYNAMIC_API PEP_STATUS identity_rating(
  13.307          PEP_SESSION session,
  13.308          pEp_identity *ident,
    14.1 --- a/src/message_api.h	Thu Oct 11 13:01:56 2018 +0200
    14.2 +++ b/src/message_api.h	Thu Oct 11 13:04:02 2018 +0200
    14.3 @@ -41,7 +41,7 @@
    14.4      
    14.5      // This is mainly used by pEp clients to send private keys to 
    14.6      // their own PGP-only device
    14.7 -    PEP_encrypt_flag_force_version_1 = 0x16
    14.8 +    PEP_encrypt_flag_force_version_1 = 0x10
    14.9      
   14.10  } PEP_encrypt_flags; 
   14.11  
   14.12 @@ -435,6 +435,26 @@
   14.13      );
   14.14  
   14.15  
   14.16 +// outgoing_message_rating_preview() - get rating preview
   14.17 +//
   14.18 +//  parameters:
   14.19 +//      session (in)        session handle
   14.20 +//      msg (in)            message to get the rating for
   14.21 +//      rating (out)        rating preview for the message
   14.22 +//
   14.23 +//  return value:
   14.24 +//      error status or PEP_STATUS_OK on success
   14.25 +//
   14.26 +//  caveat:
   14.27 +//      msg->from must point to a valid pEp_identity
   14.28 +//      msg->dir must be PEP_dir_outgoing
   14.29 +//      the ownership of msg remains with the caller
   14.30 +DYNAMIC_API PEP_STATUS outgoing_message_rating_preview(
   14.31 +        PEP_SESSION session,
   14.32 +        message *msg,
   14.33 +        PEP_rating *rating
   14.34 +    );
   14.35 +
   14.36  // identity_rating() - get rating for a single identity
   14.37  //
   14.38  //  parameters:
    15.1 --- a/src/mime.c	Thu Oct 11 13:01:56 2018 +0200
    15.2 +++ b/src/mime.c	Thu Oct 11 13:04:02 2018 +0200
    15.3 @@ -446,8 +446,6 @@
    15.4      char *subject = msg->shortmsg ? msg->shortmsg : altstr;
    15.5  
    15.6      assert(msg);
    15.7 -    assert(msg->from);
    15.8 -    assert(msg->from->address);
    15.9      assert(result);
   15.10  
   15.11      *result = NULL;
   15.12 @@ -485,7 +483,7 @@
   15.13          dt = NULL;
   15.14      }
   15.15  
   15.16 -    /* if (msg->from) */ {
   15.17 +     if (msg->from) {
   15.18          struct mailimf_mailbox_list *from = identity_to_mbl(msg->from);
   15.19          if (from == NULL)
   15.20              goto enomem;
    16.1 --- a/src/pEpEngine.c	Thu Oct 11 13:01:56 2018 +0200
    16.2 +++ b/src/pEpEngine.c	Thu Oct 11 13:04:02 2018 +0200
    16.3 @@ -123,6 +123,15 @@
    16.4      "          end) = 1 "
    16.5      "   order by is_own desc, "
    16.6      "   timestamp desc; ";
    16.7 +    
    16.8 +static const char* sql_get_identities_by_userid =
    16.9 +    "select address, identity.main_key_id, username, lang,"
   16.10 +    "   identity.flags, is_own"
   16.11 +    "   from identity"
   16.12 +    "   join person on id = identity.user_id"
   16.13 +    "   where identity.user_id = ?1 "
   16.14 +    "   order by is_own desc, "
   16.15 +    "   timestamp desc; ";
   16.16  
   16.17  static const char *sql_replace_identities_fpr =  
   16.18      "update identity"
   16.19 @@ -151,7 +160,11 @@
   16.20      "       device_group = "
   16.21      "           (select device_group from person where id = ?1)"
   16.22      "   where id = ?1 ;";
   16.23 -    
   16.24 +
   16.25 +// Will cascade.
   16.26 +static const char *sql_delete_person = 
   16.27 +     "delete from person where id = ?1 ;";
   16.28 +
   16.29  static const char *sql_set_as_pep_user =
   16.30      "update person set is_pep_user = 1 "
   16.31      "   where id = ?1 ; ";
   16.32 @@ -305,6 +318,9 @@
   16.33      "select comm_type from trust where user_id = ?1 "
   16.34      "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
   16.35  
   16.36 +static const char *sql_get_trust_by_userid = 
   16.37 +    "select pgp_keypair_fpr, comm_type from trust where user_id = ?1 ";
   16.38 +
   16.39  static const char *sql_least_trust = 
   16.40      "select min(comm_type) from trust where"
   16.41      " pgp_keypair_fpr = upper(replace(?1,' ',''))"
   16.42 @@ -1069,6 +1085,11 @@
   16.43              (int)strlen(sql_get_identities_by_address), 
   16.44              &_session->get_identities_by_address, NULL);
   16.45      assert(int_result == SQLITE_OK);
   16.46 +    
   16.47 +    int_result = sqlite3_prepare_v2(_session->db, sql_get_identities_by_userid,
   16.48 +            (int)strlen(sql_get_identities_by_userid), 
   16.49 +            &_session->get_identities_by_userid, NULL);
   16.50 +    assert(int_result == SQLITE_OK);
   16.51  
   16.52      int_result = sqlite3_prepare_v2(_session->db, sql_get_user_default_key,
   16.53              (int)strlen(sql_get_user_default_key), &_session->get_user_default_key, NULL);
   16.54 @@ -1120,6 +1141,10 @@
   16.55              (int)strlen(sql_update_person), &_session->update_person, NULL);
   16.56      assert(int_result == SQLITE_OK);
   16.57  
   16.58 +    int_result = sqlite3_prepare_v2(_session->db, sql_delete_person,
   16.59 +            (int)strlen(sql_delete_person), &_session->delete_person, NULL);
   16.60 +    assert(int_result == SQLITE_OK);
   16.61 +
   16.62      int_result = sqlite3_prepare_v2(_session->db, sql_exists_person,
   16.63              (int)strlen(sql_exists_person), &_session->exists_person, NULL);
   16.64      assert(int_result == SQLITE_OK);
   16.65 @@ -1191,6 +1216,10 @@
   16.66              (int)strlen(sql_get_trust), &_session->get_trust, NULL);
   16.67      assert(int_result == SQLITE_OK);
   16.68  
   16.69 +    int_result = sqlite3_prepare_v2(_session->db, sql_get_trust_by_userid,
   16.70 +            (int)strlen(sql_get_trust_by_userid), &_session->get_trust_by_userid, NULL);
   16.71 +    assert(int_result == SQLITE_OK);
   16.72 +
   16.73      int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
   16.74              (int)strlen(sql_least_trust), &_session->least_trust, NULL);
   16.75      assert(int_result == SQLITE_OK);
   16.76 @@ -1378,6 +1407,8 @@
   16.77                  sqlite3_finalize(session->get_identity_without_trust_check);
   16.78              if (session->get_identities_by_address)
   16.79                  sqlite3_finalize(session->get_identities_by_address);            
   16.80 +            if (session->get_identities_by_userid)
   16.81 +                sqlite3_finalize(session->get_identities_by_userid);                            
   16.82              if (session->get_user_default_key)
   16.83                  sqlite3_finalize(session->get_user_default_key);    
   16.84              if (session->get_default_own_userid)
   16.85 @@ -1392,6 +1423,8 @@
   16.86                  sqlite3_finalize(session->remove_fpr_as_default);            
   16.87              if (session->set_person)
   16.88                  sqlite3_finalize(session->set_person);
   16.89 +            if (session->delete_person)
   16.90 +                sqlite3_finalize(session->delete_person);                
   16.91              if (session->set_as_pep_user)
   16.92                  sqlite3_finalize(session->set_as_pep_user);
   16.93              if (session->is_pep_user)
   16.94 @@ -1426,6 +1459,8 @@
   16.95                  sqlite3_finalize(session->update_trust_for_fpr);
   16.96              if (session->get_trust)
   16.97                  sqlite3_finalize(session->get_trust);
   16.98 +            if (session->get_trust_by_userid)
   16.99 +                sqlite3_finalize(session->get_trust_by_userid);                
  16.100              if (session->least_trust)
  16.101                  sqlite3_finalize(session->least_trust);
  16.102              if (session->mark_compromised)
  16.103 @@ -2117,6 +2152,76 @@
  16.104      return PEP_STATUS_OK;
  16.105  }
  16.106  
  16.107 +PEP_STATUS get_identities_by_userid(
  16.108 +        PEP_SESSION session,
  16.109 +        const char *user_id,
  16.110 +        identity_list** id_list
  16.111 +    )
  16.112 +{
  16.113 +    pEp_identity* ident;
  16.114 +
  16.115 +    assert(session);
  16.116 +    assert(user_id);
  16.117 +    assert(user_id[0]);
  16.118 +    assert(id_list);
  16.119 +
  16.120 +    if (!(session && user_id && user_id[0] && id_list))
  16.121 +        return PEP_ILLEGAL_VALUE;
  16.122 +
  16.123 +    *id_list = NULL;
  16.124 +    identity_list* ident_list = NULL;
  16.125 +
  16.126 +    sqlite3_reset(session->get_identities_by_userid);
  16.127 +    sqlite3_bind_text(session->get_identities_by_userid, 1, user_id, -1, SQLITE_STATIC);
  16.128 +    int result;
  16.129 +
  16.130 +    while ((result = sqlite3_step(session->get_identities_by_userid)) == SQLITE_ROW) {
  16.131 +        ident = new_identity(
  16.132 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 0),
  16.133 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 1),
  16.134 +                user_id,
  16.135 +                (const char *) sqlite3_column_text(session->get_identities_by_userid, 2)
  16.136 +                );
  16.137 +        assert(ident);
  16.138 +        if (ident == NULL) {
  16.139 +            sqlite3_reset(session->get_identities_by_userid);
  16.140 +            return PEP_OUT_OF_MEMORY;
  16.141 +        }
  16.142 +
  16.143 +        ident->comm_type = PEP_ct_unknown;
  16.144 +        
  16.145 +        const char* const _lang = (const char *)
  16.146 +            sqlite3_column_text(session->get_identities_by_userid, 3);
  16.147 +        if (_lang && _lang[0]) {
  16.148 +            assert(_lang[0] >= 'a' && _lang[0] <= 'z');
  16.149 +            assert(_lang[1] >= 'a' && _lang[1] <= 'z');
  16.150 +            assert(_lang[2] == 0);
  16.151 +            ident->lang[0] = _lang[0];
  16.152 +            ident->lang[1] = _lang[1];
  16.153 +            ident->lang[2] = 0;
  16.154 +        }
  16.155 +        ident->flags = (unsigned int)
  16.156 +            sqlite3_column_int(session->get_identities_by_userid, 4);
  16.157 +        ident->me = (unsigned int)
  16.158 +            sqlite3_column_int(session->get_identities_by_userid, 5);
  16.159 +    
  16.160 +        if (ident_list)
  16.161 +            identity_list_add(ident_list, ident);
  16.162 +        else
  16.163 +            ident_list = new_identity_list(ident);
  16.164 +    }
  16.165 +
  16.166 +    sqlite3_reset(session->get_identities_by_userid);
  16.167 +    
  16.168 +    *id_list = ident_list;
  16.169 +    
  16.170 +    if (!ident_list)
  16.171 +        return PEP_CANNOT_FIND_IDENTITY;
  16.172 +    
  16.173 +    return PEP_STATUS_OK;
  16.174 +}
  16.175 +
  16.176 +
  16.177  PEP_STATUS exists_identity_entry(PEP_SESSION session, pEp_identity* identity,
  16.178                                   bool* exists) {
  16.179      assert(session);
  16.180 @@ -2548,6 +2653,27 @@
  16.181      return status;
  16.182  }
  16.183  
  16.184 +PEP_STATUS delete_person(PEP_SESSION session, const char* user_id) {
  16.185 +    assert(session);
  16.186 +    assert(!EMPTYSTR(user_id));        
  16.187 +    if (!session || EMPTYSTR(user_id))
  16.188 +        return PEP_ILLEGAL_VALUE;
  16.189 +        
  16.190 +    PEP_STATUS status = PEP_STATUS_OK;
  16.191 +    
  16.192 +    sqlite3_reset(session->delete_person);
  16.193 +    sqlite3_bind_text(session->delete_person, 1, user_id, -1,
  16.194 +                      SQLITE_STATIC);
  16.195 +                      
  16.196 +    int result = sqlite3_step(session->delete_person);
  16.197 +    
  16.198 +    if (result != SQLITE_DONE)
  16.199 +        status = PEP_UNKNOWN_ERROR;
  16.200 +        
  16.201 +    sqlite3_reset(session->delete_person);
  16.202 +    return status;
  16.203 +}
  16.204 +
  16.205  DYNAMIC_API PEP_STATUS is_pep_user(PEP_SESSION session, pEp_identity *identity, bool* is_pep)
  16.206  {
  16.207      assert(session);
  16.208 @@ -2815,9 +2941,327 @@
  16.209      return PEP_STATUS_OK;
  16.210  }
  16.211  
  16.212 +PEP_STATUS get_trust_by_userid(PEP_SESSION session, const char* user_id,
  16.213 +                                           labeled_int_list_t** trust_list)
  16.214 +{
  16.215 +    int result;
  16.216 +
  16.217 +    if (!(session && user_id && user_id[0]))
  16.218 +        return PEP_ILLEGAL_VALUE;
  16.219 +
  16.220 +    *trust_list = NULL;
  16.221 +    labeled_int_list_t* t_list = NULL;
  16.222 +
  16.223 +    sqlite3_reset(session->get_trust_by_userid);
  16.224 +    sqlite3_bind_text(session->get_trust_by_userid, 1, user_id, -1, SQLITE_STATIC);
  16.225 +
  16.226 +    while ((result = sqlite3_step(session->get_trust_by_userid)) == SQLITE_ROW) {
  16.227 +        if (!t_list)
  16.228 +            t_list = new_labeled_int_list(sqlite3_column_int(session->get_trust_by_userid, 1),
  16.229 +                                         (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
  16.230 +        else
  16.231 +            labeled_int_list_add(t_list, sqlite3_column_int(session->get_trust_by_userid, 1),
  16.232 +                                (const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
  16.233 +    }
  16.234 +
  16.235 +    sqlite3_reset(session->get_trust_by_userid);
  16.236 +
  16.237 +    *trust_list = t_list;
  16.238 +        
  16.239 +    return PEP_STATUS_OK;
  16.240 +}
  16.241 +
  16.242 +PEP_comm_type reconcile_trust(PEP_comm_type t_old, PEP_comm_type t_new) {
  16.243 +    switch (t_new) {
  16.244 +        case PEP_ct_mistrusted:
  16.245 +        case PEP_ct_key_revoked:
  16.246 +        case PEP_ct_compromised:
  16.247 +        case PEP_ct_key_b0rken:
  16.248 +            return t_new;
  16.249 +        default:
  16.250 +            break;
  16.251 +    }
  16.252 +    switch (t_old) {
  16.253 +        case PEP_ct_mistrusted:
  16.254 +        case PEP_ct_key_revoked:
  16.255 +        case PEP_ct_compromised:
  16.256 +        case PEP_ct_key_b0rken:
  16.257 +            return t_old;
  16.258 +        default:
  16.259 +            break;
  16.260 +    }
  16.261 +    if (t_old < PEP_ct_strong_but_unconfirmed && t_new >= PEP_ct_strong_but_unconfirmed)
  16.262 +        return t_new;
  16.263 +    
  16.264 +    bool confirmed = (t_old & PEP_ct_confirmed) || (t_new & PEP_ct_confirmed);
  16.265 +    PEP_comm_type result = _MAX(t_old, t_new);
  16.266 +    if (confirmed)
  16.267 +        result |= PEP_ct_confirmed;
  16.268 +    return result;
  16.269 +}
  16.270 +
  16.271 +PEP_STATUS reconcile_pEp_status(PEP_SESSION session, const char* old_uid, 
  16.272 +                                const char* new_uid) {
  16.273 +    PEP_STATUS status = PEP_STATUS_OK;
  16.274 +    // We'll make this easy - if the old one has a pEp status, we set no matter
  16.275 +    // what.
  16.276 +    pEp_identity* ident = new_identity(NULL, NULL, old_uid, NULL);
  16.277 +    bool is_pEp_peep = false;
  16.278 +    status = is_pep_user(session, ident, &is_pEp_peep);
  16.279 +    if (is_pEp_peep) {
  16.280 +        free(ident->user_id);
  16.281 +        ident->user_id = strdup(new_uid);
  16.282 +        if (!ident->user_id) {
  16.283 +            status = PEP_OUT_OF_MEMORY;
  16.284 +            goto pEp_free;
  16.285 +        }
  16.286 +        status = set_as_pep_user(session, ident);
  16.287 +    }
  16.288 +pEp_free:
  16.289 +    free_identity(ident);
  16.290 +    return status;
  16.291 +}
  16.292 +
  16.293 +const char* reconcile_usernames(const char* old_name, const char* new_name, 
  16.294 +                                const char* address) {
  16.295 +    if (EMPTYSTR(old_name)) {
  16.296 +        if (EMPTYSTR(new_name))
  16.297 +            return address;
  16.298 +        else
  16.299 +            return new_name;
  16.300 +    }
  16.301 +    if (EMPTYSTR(new_name))
  16.302 +        return old_name;        
  16.303 +    if (strcmp(new_name, address) == 0)
  16.304 +        return old_name;
  16.305 +    return new_name;        
  16.306 +}
  16.307 +
  16.308 +PEP_STATUS reconcile_default_keys(PEP_SESSION session, pEp_identity* old_ident,
  16.309 +                                  pEp_identity* new_ident) {
  16.310 +    PEP_STATUS status = PEP_STATUS_OK;
  16.311 +                                      
  16.312 +    const char* old_fpr = old_ident->fpr;
  16.313 +    const char* new_fpr = new_ident->fpr;
  16.314 +    if (!old_fpr)
  16.315 +        return status;
  16.316 +
  16.317 +    PEP_comm_type old_ct = old_ident->comm_type;    
  16.318 +    PEP_comm_type new_ct = new_ident->comm_type;
  16.319 +    
  16.320 +    if (!new_fpr) {
  16.321 +        new_ident->fpr = strdup(old_fpr);
  16.322 +        if (!new_ident->fpr)
  16.323 +            status = PEP_OUT_OF_MEMORY;
  16.324 +        else    
  16.325 +            new_ident->comm_type = old_ct;
  16.326 +        return status;
  16.327 +    }        
  16.328 +    
  16.329 +    if (strcmp(old_fpr, new_fpr) == 0) {
  16.330 +        new_ident->comm_type = reconcile_trust(old_ct, new_ct);
  16.331 +        return status;
  16.332 +    }
  16.333 +    
  16.334 +    bool old_confirmed = old_ct & PEP_ct_confirmed;
  16.335 +    bool new_confirmed = new_ct & PEP_ct_confirmed;
  16.336 +    
  16.337 +    if (new_confirmed)
  16.338 +        return status;
  16.339 +    else if (old_confirmed) {
  16.340 +        free(new_ident->fpr);
  16.341 +        new_ident->fpr = strdup(old_fpr);
  16.342 +        if (!new_ident->fpr)
  16.343 +            status = PEP_OUT_OF_MEMORY;
  16.344 +        else    
  16.345 +            new_ident->comm_type = old_ct;
  16.346 +        return status;
  16.347 +    }
  16.348 +    
  16.349 +    if (old_ct > new_ct) {
  16.350 +        free(new_ident->fpr);
  16.351 +        new_ident->fpr = strdup(old_fpr);
  16.352 +        if (!new_ident->fpr)
  16.353 +            status = PEP_OUT_OF_MEMORY;
  16.354 +        else    
  16.355 +            new_ident->comm_type = old_ct;
  16.356 +    }
  16.357 +    return status;
  16.358 +}
  16.359 +
  16.360 +void reconcile_language(pEp_identity* old_ident,
  16.361 +                        pEp_identity* new_ident) {
  16.362 +    if (new_ident->lang[0] == 0) {
  16.363 +        if (old_ident->lang[0] != 0) {
  16.364 +            new_ident->lang[0] = old_ident->lang[0];
  16.365 +            new_ident->lang[1] = old_ident->lang[1];
  16.366 +            new_ident->lang[2] = old_ident->lang[2];
  16.367 +        }
  16.368 +    }
  16.369 +}
  16.370 +
  16.371 +// ONLY CALL THIS IF BOTH IDs ARE IN THE PERSON DB, FOOL! </Mr_T>
  16.372 +PEP_STATUS merge_records(PEP_SESSION session, const char* old_uid,
  16.373 +                         const char* new_uid) {
  16.374 +    PEP_STATUS status = PEP_STATUS_OK;
  16.375 +    
  16.376 +    pEp_identity* new_ident = NULL;
  16.377 +    identity_list* old_identities = NULL;
  16.378 +    labeled_int_list_t* trust_list = NULL;
  16.379 +    stringlist_t* touched_keys = new_stringlist(NULL);
  16.380 +    char* main_user_fpr = NULL;
  16.381 +
  16.382 +    status = reconcile_pEp_status(session, old_uid, new_uid);
  16.383 +    if (status != PEP_STATUS_OK)
  16.384 +        goto pEp_free;
  16.385 +                        
  16.386 +    bool new_is_pep = false;
  16.387 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
  16.388 +    status = is_pep_user(session, new_ident, &new_is_pep);
  16.389 +    if (status != PEP_STATUS_OK)
  16.390 +        goto pEp_free;
  16.391 +    free(new_ident);
  16.392 +    new_ident = NULL;
  16.393 +        
  16.394 +    status = get_identities_by_userid(session, old_uid, &old_identities);
  16.395 +    if (status == PEP_STATUS_OK && old_identities) {
  16.396 +        identity_list* curr_old = old_identities;
  16.397 +        for (; curr_old && curr_old->ident; curr_old = curr_old->next) {
  16.398 +            pEp_identity* old_ident = curr_old->ident;
  16.399 +            const char* address = old_ident->address;
  16.400 +            status = get_identity(session, address, new_uid, &new_ident);
  16.401 +            if (status == PEP_CANNOT_FIND_IDENTITY) {
  16.402 +                // No new identity matching the old one, so we just set one w. new user_id
  16.403 +                free(old_ident->user_id);
  16.404 +                old_ident->user_id = strdup(new_uid);
  16.405 +                if (!old_ident->user_id) {
  16.406 +                    status = PEP_OUT_OF_MEMORY;
  16.407 +                    goto pEp_free;
  16.408 +                }
  16.409 +                if (new_is_pep) {
  16.410 +                    PEP_comm_type confirmed_bit = old_ident->comm_type & PEP_ct_confirmed;
  16.411 +                    if ((old_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
  16.412 +                        old_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
  16.413 +                }
  16.414 +                
  16.415 +                status = set_identity(session, old_ident);
  16.416 +                if (status != PEP_STATUS_OK)
  16.417 +                    goto pEp_free;
  16.418 +            }
  16.419 +            else if (status != PEP_STATUS_OK)
  16.420 +                goto pEp_free;
  16.421 +            else {
  16.422 +                // Ok, so we have two idents which might be in conflict. Have to merge them.
  16.423 +                const char* username = reconcile_usernames(old_ident->username,
  16.424 +                                                           new_ident->username,
  16.425 +                                                           address);
  16.426 +                                                           
  16.427 +                if (!new_ident->username || strcmp(username, new_ident->username) != 0) {
  16.428 +                    free(new_ident->username);
  16.429 +                    new_ident->username = strdup(username);
  16.430 +                    if (!new_ident->username) {
  16.431 +                        status = PEP_OUT_OF_MEMORY;
  16.432 +                        goto pEp_free;
  16.433 +                    }
  16.434 +                }
  16.435 +        
  16.436 +                // Reconcile default keys if they differ, trust if they don't
  16.437 +                status = reconcile_default_keys(session, old_ident, new_ident);
  16.438 +                if (status != PEP_STATUS_OK)
  16.439 +                    goto pEp_free;
  16.440 +                    
  16.441 +                // reconcile languages
  16.442 +                reconcile_language(old_ident, new_ident);
  16.443 +
  16.444 +                // reconcile flags - FIXME - is this right?
  16.445 +                new_ident->flags |= old_ident->flags;
  16.446 +                
  16.447 +                // NOTE: In principle, this is only called from update_identity,
  16.448 +                // which would never have me flags set. So I am ignoring them here.
  16.449 +                // if this function is ever USED for that, though, you'll have
  16.450 +                // to go through making sure that the user ids are appropriately
  16.451 +                // aliased, etc. So be careful.
  16.452 +                
  16.453 +                // Set the reconciled record
  16.454 +                    
  16.455 +                status = set_identity(session, new_ident);
  16.456 +                if (status != PEP_STATUS_OK)
  16.457 +                    goto pEp_free;
  16.458 +
  16.459 +                if (new_ident->fpr)
  16.460 +                    stringlist_add(touched_keys, new_ident->fpr);
  16.461 +                        
  16.462 +                free_identity(new_ident);
  16.463 +                new_ident = NULL;    
  16.464 +            }
  16.465 +        }
  16.466 +    }
  16.467 +    // otherwise, no need to reconcile identity records. But maybe trust...    
  16.468 +    new_ident = new_identity(NULL, NULL, new_uid, NULL);
  16.469 +    if (!new_ident) {
  16.470 +        status = PEP_OUT_OF_MEMORY;
  16.471 +        goto pEp_free;
  16.472 +    }
  16.473 +    status = get_trust_by_userid(session, old_uid, &trust_list);
  16.474 +
  16.475 +    labeled_int_list_t* trust_curr = trust_list;
  16.476 +    for (; trust_curr && trust_curr->label; trust_curr = trust_curr->next) {
  16.477 +        const char* curr_fpr = trust_curr->label;
  16.478 +        new_ident->fpr = strdup(curr_fpr); 
  16.479 +        status = get_trust(session, new_ident);
  16.480 +        switch (status) {
  16.481 +            case PEP_STATUS_OK:
  16.482 +                new_ident->comm_type = reconcile_trust(trust_curr->value,
  16.483 +                                                       new_ident->comm_type);
  16.484 +                break;
  16.485 +            case PEP_CANNOT_FIND_IDENTITY:
  16.486 +                new_ident->comm_type = trust_curr->value;
  16.487 +                break;
  16.488 +            default:
  16.489 +                goto pEp_free;
  16.490 +        }
  16.491 +        new_ident->comm_type = reconcile_trust(trust_curr->value,
  16.492 +                                               new_ident->comm_type);
  16.493 +        if (new_is_pep) {
  16.494 +            PEP_comm_type confirmed_bit = new_ident->comm_type & PEP_ct_confirmed;
  16.495 +            if ((new_ident->comm_type | PEP_ct_confirmed) == PEP_ct_OpenPGP)
  16.496 +                new_ident->comm_type = PEP_ct_pEp_unconfirmed | confirmed_bit;
  16.497 +        }
  16.498 +
  16.499 +        status = set_trust(session, new_ident);
  16.500 +        if (status != PEP_STATUS_OK) {
  16.501 +            goto pEp_free;
  16.502 +        }                  
  16.503 +                              
  16.504 +        free(new_ident->fpr);
  16.505 +        new_ident->fpr = NULL;
  16.506 +        new_ident->comm_type = 0;
  16.507 +    }
  16.508 +
  16.509 +    // reconcile the default keys if the new id doesn't have one?
  16.510 +    status = get_main_user_fpr(session, new_uid, &main_user_fpr);
  16.511 +    if (status == PEP_KEY_NOT_FOUND || (status == PEP_STATUS_OK && !main_user_fpr)) {
  16.512 +        status = get_main_user_fpr(session, old_uid, &main_user_fpr);
  16.513 +        if (status == PEP_STATUS_OK && main_user_fpr)
  16.514 +            status = replace_main_user_fpr(session, new_uid, main_user_fpr);
  16.515 +        if (status != PEP_STATUS_OK)
  16.516 +            goto pEp_free;
  16.517 +    }
  16.518 +    
  16.519 +    // delete the old user
  16.520 +    status = delete_person(session, old_uid);
  16.521 +    
  16.522 +pEp_free:
  16.523 +    free_identity(new_ident);
  16.524 +    free_identity_list(old_identities);
  16.525 +    free_labeled_int_list(trust_list);
  16.526 +    free_stringlist(touched_keys);
  16.527 +    free(main_user_fpr);
  16.528 +    return status;
  16.529 +}
  16.530  
  16.531  PEP_STATUS replace_userid(PEP_SESSION session, const char* old_uid,
  16.532 -                              const char* new_uid) {
  16.533 +                          const char* new_uid) {
  16.534      assert(session);
  16.535      assert(old_uid);
  16.536      assert(new_uid);
  16.537 @@ -2825,6 +3269,15 @@
  16.538      if (!session || !old_uid || !new_uid)
  16.539          return PEP_ILLEGAL_VALUE;
  16.540  
  16.541 +    pEp_identity* temp_ident = new_identity(NULL, NULL, new_uid, NULL);
  16.542 +    bool new_exists = false;
  16.543 +    PEP_STATUS status = exists_person(session, temp_ident, &new_exists);
  16.544 +    free_identity(temp_ident);
  16.545 +    if (status != PEP_STATUS_OK) // DB error
  16.546 +        return status;
  16.547 +        
  16.548 +    if (new_exists)
  16.549 +        return merge_records(session, old_uid, new_uid);
  16.550  
  16.551      int result;
  16.552  
  16.553 @@ -2834,6 +3287,12 @@
  16.554      sqlite3_bind_text(session->replace_userid, 2, old_uid, -1,
  16.555              SQLITE_STATIC);
  16.556      result = sqlite3_step(session->replace_userid);
  16.557 +#ifndef NDEBUG
  16.558 +    if (result) {
  16.559 +        const char *errmsg = sqlite3_errmsg(session->db);
  16.560 +        log_event(session, "SQLite3 error", "replace_userid", errmsg, NULL);
  16.561 +    }
  16.562 +#endif // !NDEBUG
  16.563      sqlite3_reset(session->replace_userid);
  16.564      if (result != SQLITE_DONE)
  16.565          return PEP_CANNOT_SET_PERSON; // May need clearer retval
  16.566 @@ -2986,8 +3445,8 @@
  16.567          return PEP_ILLEGAL_VALUE;
  16.568  
  16.569      identity->comm_type = PEP_ct_unknown;
  16.570 -
  16.571      sqlite3_reset(session->get_trust);
  16.572 +
  16.573      sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
  16.574              SQLITE_STATIC);
  16.575      sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
  16.576 @@ -3009,6 +3468,7 @@
  16.577      return status;
  16.578  }
  16.579  
  16.580 +
  16.581  DYNAMIC_API PEP_STATUS least_trust(
  16.582          PEP_SESSION session,
  16.583          const char *fpr,
  16.584 @@ -3049,7 +3509,8 @@
  16.585  DYNAMIC_API PEP_STATUS decrypt_and_verify(
  16.586      PEP_SESSION session, const char *ctext, size_t csize,
  16.587      const char *dsigtext, size_t dsigsize,
  16.588 -    char **ptext, size_t *psize, stringlist_t **keylist
  16.589 +    char **ptext, size_t *psize, stringlist_t **keylist,
  16.590 +    char** filename_ptr
  16.591      )
  16.592  {
  16.593      assert(session);
  16.594 @@ -3063,7 +3524,8 @@
  16.595          return PEP_ILLEGAL_VALUE;
  16.596  
  16.597      return session->cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify(
  16.598 -            session, ctext, csize, dsigtext, dsigsize, ptext, psize, keylist);
  16.599 +            session, ctext, csize, dsigtext, dsigsize, ptext, psize, keylist,
  16.600 +            filename_ptr);
  16.601  }
  16.602  
  16.603  DYNAMIC_API PEP_STATUS encrypt_and_sign(
    17.1 --- a/src/pEpEngine.h	Thu Oct 11 13:01:56 2018 +0200
    17.2 +++ b/src/pEpEngine.h	Thu Oct 11 13:04:02 2018 +0200
    17.3 @@ -13,7 +13,8 @@
    17.4  
    17.5  #include "dynamic_api.h"
    17.6  #include "stringlist.h"
    17.7 -#include "stringpair.h"    
    17.8 +#include "stringpair.h"
    17.9 +#include "labeled_int_list.h"    
   17.10  #include "timestamp.h"
   17.11  
   17.12  #define PEP_VERSION "2.0" // protocol version
   17.13 @@ -231,16 +232,20 @@
   17.14  // decrypt_and_verify() - decrypt and/or verify a message
   17.15  //
   17.16  //    parameters:
   17.17 -//        session (in)    session handle
   17.18 -//        ctext (in)      cipher text to decrypt and/or verify
   17.19 -//        csize (in)      size of cipher text
   17.20 -//        dsigtext (in)   if extant, *detached* signature text for this
   17.21 -//                        message (or NULL if not)
   17.22 -//        dsize (in)      size of *detached* signature text for this
   17.23 -//                        message (0, if no detached sig exists)
   17.24 -//        ptext (out)     pointer to internal buffer with plain text
   17.25 -//        psize (out)     size of plain text
   17.26 -//        keylist (out)   list of key ids which where used to encrypt
   17.27 +//        session (in)          session handle
   17.28 +//        ctext (in)            cipher text to decrypt and/or verify
   17.29 +//        csize (in)            size of cipher text
   17.30 +//        dsigtext (in)         if extant, *detached* signature text for this
   17.31 +//                              message (or NULL if not)
   17.32 +//        dsize (in)            size of *detached* signature text for this
   17.33 +//                              message (0, if no detached sig exists)
   17.34 +//        ptext (out)           pointer to internal buffer with plain text
   17.35 +//        psize (out)           size of plain text
   17.36 +//        keylist (out)         list of key ids which where used to encrypt
   17.37 +//        filename_ptr (out)    mails produced by certain PGP implementations 
   17.38 +//                              may return a decrypted filename here for attachments. 
   17.39 +//                              Externally, this can generally be NULL, and is an optional
   17.40 +//                              parameter.
   17.41  //
   17.42  //    return value:
   17.43  //        PEP_UNENCRYPTED               message was unencrypted and not signed
   17.44 @@ -262,7 +267,8 @@
   17.45  DYNAMIC_API PEP_STATUS decrypt_and_verify(
   17.46          PEP_SESSION session, const char *ctext, size_t csize,
   17.47          const char *dsigtext, size_t dsigsize,
   17.48 -        char **ptext, size_t *psize, stringlist_t **keylist
   17.49 +        char **ptext, size_t *psize, stringlist_t **keylist,
   17.50 +        char ** filename_ptr
   17.51      );
   17.52  
   17.53  
   17.54 @@ -1275,6 +1281,10 @@
   17.55  
   17.56  PEP_STATUS set_pgp_keypair(PEP_SESSION session, const char* fpr);
   17.57  
   17.58 +// exposed for testing
   17.59 +PEP_STATUS set_person(PEP_SESSION session, pEp_identity* identity,
   17.60 +                      bool guard_transaction);
   17.61 +
   17.62  #ifdef __cplusplus
   17.63  }
   17.64  #endif
    18.1 --- a/src/pEp_internal.h	Thu Oct 11 13:01:56 2018 +0200
    18.2 +++ b/src/pEp_internal.h	Thu Oct 11 13:04:02 2018 +0200
    18.3 @@ -1,7 +1,7 @@
    18.4  // This file is under GNU General Public License 3.0
    18.5  // see LICENSE.txt
    18.6  
    18.7 -#define PEP_ENGINE_VERSION "0.9.0"
    18.8 +#define PEP_ENGINE_VERSION "1.1.0"
    18.9  
   18.10  // maximum attachment size to import as key 1MB, maximum of 20 attachments
   18.11  
   18.12 @@ -131,6 +131,7 @@
   18.13      sqlite3_stmt *get_identity;
   18.14      sqlite3_stmt *get_identity_without_trust_check;
   18.15      sqlite3_stmt *get_identities_by_address;
   18.16 +    sqlite3_stmt *get_identities_by_userid;
   18.17      sqlite3_stmt *replace_identities_fpr;
   18.18      sqlite3_stmt *replace_main_user_fpr;
   18.19      sqlite3_stmt *get_main_user_fpr;
   18.20 @@ -138,6 +139,7 @@
   18.21      sqlite3_stmt *remove_fpr_as_default;
   18.22      sqlite3_stmt *set_person;
   18.23      sqlite3_stmt *update_person;
   18.24 +    sqlite3_stmt *delete_person;
   18.25      sqlite3_stmt *exists_person;    
   18.26      sqlite3_stmt *set_as_pep_user;
   18.27      sqlite3_stmt *is_pep_user;
   18.28 @@ -155,6 +157,7 @@
   18.29      sqlite3_stmt *exists_trust_entry;
   18.30      sqlite3_stmt *update_trust_for_fpr;
   18.31      sqlite3_stmt *get_trust;
   18.32 +    sqlite3_stmt *get_trust_by_userid;
   18.33      sqlite3_stmt *least_trust;
   18.34      sqlite3_stmt *mark_compromised;
   18.35      sqlite3_stmt *reset_trust;
    19.1 --- a/src/pgp_gpg.c	Thu Oct 11 13:01:56 2018 +0200
    19.2 +++ b/src/pgp_gpg.c	Thu Oct 11 13:04:02 2018 +0200
    19.3 @@ -577,7 +577,8 @@
    19.4  PEP_STATUS pgp_decrypt_and_verify(
    19.5      PEP_SESSION session, const char *ctext, size_t csize,
    19.6      const char *dsigtext, size_t dsigsize,
    19.7 -    char **ptext, size_t *psize, stringlist_t **keylist
    19.8 +    char **ptext, size_t *psize, stringlist_t **keylist,
    19.9 +    char** filename_ptr
   19.10      )
   19.11  {
   19.12      PEP_STATUS result;
   19.13 @@ -693,6 +694,15 @@
   19.14                          *keylist = NULL;
   19.15                          result = PEP_OUT_OF_MEMORY;
   19.16                      }
   19.17 +                    // Get filename, if desired
   19.18 +                    if (filename_ptr) {
   19.19 +                        const char* fname = gpgme_decrypt_result->file_name;
   19.20 +                        if (fname) {
   19.21 +                            *filename_ptr = strdup(fname);
   19.22 +                            if (!(*filename_ptr))
   19.23 +                                result = PEP_OUT_OF_MEMORY;
   19.24 +                        }
   19.25 +                    }
   19.26                  } /* Ok, so now we have any recipients it was encrypted for
   19.27                       in recipient_keylist */
   19.28              
   19.29 @@ -811,7 +821,7 @@
   19.30                          }
   19.31                          case GPG_ERR_CERT_REVOKED:
   19.32                          case GPG_ERR_BAD_SIGNATURE:
   19.33 -			    result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   19.34 +                            result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
   19.35                              //result = PEP_DECRYPT_BAD_SIGNATURE;
   19.36                              break;
   19.37                          case GPG_ERR_SIG_EXPIRED:
    20.1 --- a/src/pgp_gpg.h	Thu Oct 11 13:01:56 2018 +0200
    20.2 +++ b/src/pgp_gpg.h	Thu Oct 11 13:04:02 2018 +0200
    20.3 @@ -11,7 +11,8 @@
    20.4  PEP_STATUS pgp_decrypt_and_verify(
    20.5          PEP_SESSION session, const char *ctext, size_t csize,
    20.6          const char *dsigtext, size_t dsigsize,
    20.7 -        char **ptext, size_t *psize, stringlist_t **keylist
    20.8 +        char **ptext, size_t *psize, stringlist_t **keylist,
    20.9 +        char** filename_ptr
   20.10      );
   20.11  
   20.12  PEP_STATUS pgp_encrypt_and_sign(
    21.1 --- a/src/pgp_netpgp.c	Thu Oct 11 13:01:56 2018 +0200
    21.2 +++ b/src/pgp_netpgp.c	Thu Oct 11 13:04:02 2018 +0200
    21.3 @@ -373,7 +373,8 @@
    21.4  PEP_STATUS pgp_decrypt_and_verify(
    21.5      PEP_SESSION session, const char *ctext, size_t csize,
    21.6      const char *dsigtext, size_t dsigsize,
    21.7 -    char **ptext, size_t *psize, stringlist_t **keylist
    21.8 +    char **ptext, size_t *psize, stringlist_t **keylist,
    21.9 +    char** filename_ptr // will be ignored
   21.10      )
   21.11  {
   21.12      char *_ptext = NULL;
    22.1 --- a/src/pgp_netpgp.h	Thu Oct 11 13:01:56 2018 +0200
    22.2 +++ b/src/pgp_netpgp.h	Thu Oct 11 13:04:02 2018 +0200
    22.3 @@ -10,7 +10,8 @@
    22.4  PEP_STATUS pgp_decrypt_and_verify(
    22.5          PEP_SESSION session, const char *ctext, size_t csize,
    22.6          const char *dsigtext, size_t dsigsize,
    22.7 -        char **ptext, size_t *psize, stringlist_t **keylist
    22.8 +        char **ptext, size_t *psize, stringlist_t **keylist,
    22.9 +        char** filename_ptr // will be ignored
   22.10      );
   22.11  
   22.12  PEP_STATUS pgp_encrypt_and_sign(
    23.1 --- a/src/stringlist.c	Thu Oct 11 13:01:56 2018 +0200
    23.2 +++ b/src/stringlist.c	Thu Oct 11 13:04:02 2018 +0200
    23.3 @@ -113,6 +113,17 @@
    23.4      return list_curr->next;
    23.5  }
    23.6  
    23.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value) {
    23.8 +    if (!head || !value || !head->value)
    23.9 +        return NULL;
   23.10 +    stringlist_t* retval = head;
   23.11 +    for (; retval ; retval = retval->next) {
   23.12 +        if (strcmp(retval->value, value) == 0)
   23.13 +            break;
   23.14 +    }
   23.15 +    return retval;
   23.16 +}
   23.17 +
   23.18  DYNAMIC_API stringlist_t *stringlist_add_unique(
   23.19          stringlist_t *stringlist,
   23.20          const char *value
    24.1 --- a/src/stringlist.h	Thu Oct 11 13:01:56 2018 +0200
    24.2 +++ b/src/stringlist.h	Thu Oct 11 13:04:02 2018 +0200
    24.3 @@ -133,6 +133,7 @@
    24.4  
    24.5  DYNAMIC_API void free_stringlist(stringlist_t *stringlist);
    24.6  
    24.7 +stringlist_t* stringlist_search(stringlist_t* head, const char* value);
    24.8  
    24.9  #ifdef __cplusplus
   24.10  }
    25.1 --- a/test/Makefile	Thu Oct 11 13:01:56 2018 +0200
    25.2 +++ b/test/Makefile	Thu Oct 11 13:04:02 2018 +0200
    25.3 @@ -18,14 +18,14 @@
    25.4  DEPS := $(OBJS:.o=.d)
    25.5  
    25.6  INC_DIRS := ./include /usr/local/include 
    25.7 -INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(GPGME_INC)
    25.8 +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(GPGME_INC) $(CPPUNIT_INC)
    25.9  
   25.10  LDFLAGS += -L/usr/local/lib
   25.11  
   25.12  CFLAGS += -Wno-deprecated
   25.13  CXXFLAGS += -Wno-deprecated
   25.14  
   25.15 -LDFLAGS+= $(ETPAN_LIB) -L../asn.1 -L../src
   25.16 +LDFLAGS+= $(ETPAN_LIB) $(CPPUNIT_LIB) -L../asn.1 -L../src
   25.17  LDLIBS+= -letpan -lpEpEngine -lstdc++ -lasn1
   25.18  
   25.19  ifeq ($(BUILD_FOR),Linux)
   25.20 @@ -93,7 +93,12 @@
   25.21  ifndef PY_ENV
   25.22  	@echo "WARNING: Can't find python3 - this is fine unless you're adding test suites. If so, please install python3."
   25.23  else
   25.24 +ifndef EXCLUDE
   25.25  	$(PY_ENV) gensuitemaker.py
   25.26 +else
   25.27 +	# Comma-separated list, no spaces
   25.28 +	$(PY_ENV) gensuitemaker.py --exclude=$(EXCLUDE)
   25.29 +endif
   25.30  endif
   25.31  		
   25.32  .PHONY: test_home_
    26.1 --- a/test/convenience_scripts/keygen_for_test.py	Thu Oct 11 13:01:56 2018 +0200
    26.2 +++ b/test/convenience_scripts/keygen_for_test.py	Thu Oct 11 13:04:02 2018 +0200
    26.3 @@ -1,5 +1,5 @@
    26.4  import argparse
    26.5 -import gnupg
    26.6 +from pretty_bad_protocol import gnupg
    26.7  import os
    26.8  import subprocess
    26.9  
   26.10 @@ -19,10 +19,11 @@
   26.11  homedir = os.path.join(os.path.expanduser('~'),"gnupg")
   26.12  print("GNUPGHOME=" + homedir + "\n")
   26.13  
   26.14 +
   26.15  try:
   26.16 -    gpg = gnupg.GPG(gnupghome=homedir) 
   26.17 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', gnupghome=homedir) 
   26.18  except TypeError:
   26.19 -    gpg = gnupg.GPG(homedir=homedir)
   26.20 +    gpg = gnupg.GPG(binary='/usr/bin/gpg', homedir=homedir)
   26.21  
   26.22  name = args.real_name_prefix
   26.23  email = args.email_address_prefix
   26.24 @@ -61,7 +62,7 @@
   26.25              email = e_split[0] + "_" + i_str + "@" + e_split[1]
   26.26  
   26.27      print("Generating key data for " + name + " " + email + "\n")
   26.28 -    input_data = gpg.gen_key_input(key_type="RSA", key_length=2048, subkey_type="RSA", subkey_length=2048, expire_date=0, name_real=name, name_email=email, password="")
   26.29 +    input_data = gpg.gen_key_input(key_type="RSA", key_length=2048, expire_date=0, name_real=name, name_email=email)
   26.30      if not input_data:
   26.31          raise Exception('Input data not created in iteration ' + str(i))
   26.32      
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/test/convenience_scripts/quickadd_testcalls.py	Thu Oct 11 13:04:02 2018 +0200
    27.3 @@ -0,0 +1,53 @@
    27.4 +# very fragile, for Krista's convenience only. DANGER, USE AT OWN RISK.
    27.5 +import sys
    27.6 +import os
    27.7 +
    27.8 +calls_added_file = sys.argv[1]
    27.9 +class_name = sys.argv[2]
   27.10 +
   27.11 +f = open(calls_added_file, "r")
   27.12 +calls = f.readlines()
   27.13 +f.close()
   27.14 +
   27.15 +class_file_path = "src/engine_tests/" + class_name + ".cc"
   27.16 +class_file = open(class_file_path, "r")
   27.17 +class_file_lines = class_file.readlines();
   27.18 +class_file.close();
   27.19 +
   27.20 +accumulator = ""
   27.21 +call_part_1 = "    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string(\""
   27.22 +call_part_3 = "                                                                      static_cast<Func>("
   27.23 +
   27.24 +counter = 0
   27.25 +index = 0
   27.26 +for l in class_file_lines:
   27.27 +    if "add_test_to_suite" in l:
   27.28 +        index = counter;
   27.29 +    counter += 1;    
   27.30 +
   27.31 +if counter == 0:
   27.32 +    for l in class_file_lines:
   27.33 +        if (l.startswith(class_name)):
   27.34 +            index = counter + 2;
   27.35 +            break;
   27.36 +        counter += 1;
   27.37 +    if (counter == 0):
   27.38 +        os.exit(-1)
   27.39 +else:
   27.40 +    index += 2
   27.41 +            
   27.42 +for c in calls:
   27.43 +    if not c:
   27.44 +        continue
   27.45 +    c = c.rstrip()
   27.46 +    call_part_2 = class_name + "::" + c + "\"),\n"
   27.47 +    call_part_4 = "&" + class_name + "::" + c + ")));\n"
   27.48 +
   27.49 +    accumulator += call_part_1 + call_part_2 + call_part_3 + call_part_4
   27.50 +    
   27.51 +class_file_lines.insert(index, accumulator);    
   27.52 +
   27.53 +class_file = open(class_file_path, "w")
   27.54 +class_file.writelines(class_file_lines)
   27.55 +class_file.close()
   27.56 +
    28.1 --- a/test/gensuitemaker.py	Thu Oct 11 13:01:56 2018 +0200
    28.2 +++ b/test/gensuitemaker.py	Thu Oct 11 13:04:02 2018 +0200
    28.3 @@ -1,6 +1,6 @@
    28.4  # This file is under GNU General Public License 3.0
    28.5  # see LICENSE.txt
    28.6 -
    28.7 +import argparse
    28.8  from os import listdir, getcwd
    28.9  from os.path import isfile, join
   28.10  from re import sub
   28.11 @@ -14,11 +14,23 @@
   28.12  
   28.13  indent = "    "
   28.14  
   28.15 +parser = argparse.ArgumentParser()
   28.16 +parser.add_argument("--exclude", "-x", help="Comma-separated list of tests to exclude from test suite build")
   28.17 +
   28.18 +args = parser.parse_args()
   28.19 +
   28.20 +exclude_arg = args.exclude
   28.21 +exclude_list = []
   28.22 +if exclude_arg:
   28.23 +    exclude_list = exclude_arg.split(",")
   28.24 +    for x in exclude_list:
   28.25 +        x.replace(" ","")
   28.26  for f in ls:
   28.27      if isfile(join(srcpath, f)):
   28.28          if (f.endswith(".cc")):
   28.29              suite = sub('\.cc$', '', f)
   28.30 -            suites.append(suite)
   28.31 +            if not suite in exclude_list:
   28.32 +                suites.append(suite)
   28.33  
   28.34  license = (''
   28.35  '// This file is under GNU General Public License 3.0\n'
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/test/include/Engine463Tests.h	Thu Oct 11 13:04:02 2018 +0200
    29.3 @@ -0,0 +1,20 @@
    29.4 +// This file is under GNU General Public License 3.0
    29.5 +// see LICENSE.txt
    29.6 +
    29.7 +#ifndef ENGINE463_H
    29.8 +#define ENGINE463_H
    29.9 +
   29.10 +#include <string>
   29.11 +#include "EngineTestIndividualSuite.h"
   29.12 +
   29.13 +using namespace std;
   29.14 +
   29.15 +class Engine463Tests : public EngineTestIndividualSuite {
   29.16 +    public:
   29.17 +        Engine463Tests(string test_suite, string test_home_dir);
   29.18 +    private:
   29.19 +        void check_engine_463_no_own_key();
   29.20 +        void check_engine_463_own_key();
   29.21 +};
   29.22 +
   29.23 +#endif
    30.1 --- a/test/include/EngineTestSuite.h	Thu Oct 11 13:01:56 2018 +0200
    30.2 +++ b/test/include/EngineTestSuite.h	Thu Oct 11 13:04:02 2018 +0200
    30.3 @@ -4,6 +4,8 @@
    30.4  #include <cpptest.h>
    30.5  #include <string>
    30.6  #include <map>
    30.7 +#include <vector>
    30.8 +#include <utility>
    30.9  #include "pEpEngine.h"
   30.10  
   30.11  using namespace std;
   30.12 @@ -14,7 +16,9 @@
   30.13          virtual ~EngineTestSuite();
   30.14          
   30.15          void add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()> test_func);
   30.16 -        
   30.17 +        void output_test_header(const char* test_name);
   30.18 +        void output_test_footer(const char* test_name);
   30.19 +
   30.20      protected:
   30.21          PEP_SESSION session;
   30.22          string test_home;
   30.23 @@ -34,12 +38,24 @@
   30.24          unsigned int number_of_tests;
   30.25          unsigned int on_test_number;
   30.26          
   30.27 +        string temp_test_home;
   30.28 +        
   30.29          virtual void setup();
   30.30          virtual void tear_down();
   30.31          
   30.32          void set_full_env();
   30.33 +        void set_full_env(const char* gpg_conf_copy_path, const char* gpg_agent_conf_file_copy_path, const char* db_conf_file_copy_path);
   30.34          void restore_full_env();
   30.35          void initialise_test_home();
   30.36          void set_my_name();    
   30.37 +	
   30.38 +        void copy_conf_file_to_test_dir(const char* dest_path, const char* conf_orig_path, const char* conf_dest_name);
   30.39 +        
   30.40 +        std::vector<std::pair<std::string, std::string>> gpgdir_fileadd_queue;
   30.41 +        std::vector<std::pair<std::string, std::string>> homedir_fileadd_queue;
   30.42 +        void add_file_to_gpg_dir_queue(std::string copy_from, std::string dst_fname);    
   30.43 +        void add_file_to_home_dir_queue(std::string copy_from, std::string dst_fname);
   30.44 +        void process_file_queue(std::string dirname, std::vector<std::pair<std::string, std::string>> file_queue);
   30.45 +
   30.46  };
   30.47  #endif
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/test/include/HeaderKeyImportTests.h	Thu Oct 11 13:04:02 2018 +0200
    31.3 @@ -0,0 +1,61 @@
    31.4 +// This file is under GNU General Public License 3.0
    31.5 +// see LICENSE.txt
    31.6 +
    31.7 +#ifndef HEADER_KEY_IMPORT_H
    31.8 +#define HEADER_KEY_IMPORT_H
    31.9 +
   31.10 +#include <string>
   31.11 +#include "EngineTestIndividualSuite.h"
   31.12 +
   31.13 +using namespace std;
   31.14 +
   31.15 +class HeaderKeyImportTests : public EngineTestIndividualSuite {
   31.16 +    public:
   31.17 +        HeaderKeyImportTests(string test_suite, string test_home_dir);
   31.18 +    private:
   31.19 +        void base_64_minimal_round();
   31.20 +        void base_64_minimal_padded_1();
   31.21 +        void base_64_minimal_padded_2();
   31.22 +        void base_64_minimal_unpadded_1();
   31.23 +        void base_64_minimal_unpadded_2();    
   31.24 +        void base_64_minimal_leading_whitespace_round();
   31.25 +        void base_64_minimal_leading_whitespace_padded_1();
   31.26 +        void base_64_minimal_leading_whitespace_padded_2();
   31.27 +        void base_64_minimal_leading_whitespace_unpadded_1();        
   31.28 +        void base_64_minimal_leading_whitespace_unpadded_2();
   31.29 +        void base_64_minimal_trailing_whitespace_round();
   31.30 +        void base_64_minimal_trailing_whitespace_padded_1();
   31.31 +        void base_64_minimal_trailing_whitespace_padded_2();
   31.32 +        void base_64_minimal_trailing_whitespace_unpadded_1();        
   31.33 +        void base_64_minimal_trailing_whitespace_unpadded_2();
   31.34 +        void base_64_minimal_internal_whitespace_round();
   31.35 +        void base_64_minimal_internal_whitespace_padded_1();
   31.36 +        void base_64_minimal_internal_whitespace_padded_2();
   31.37 +        void base_64_minimal_internal_whitespace_unpadded_1();        
   31.38 +        void base_64_minimal_internal_whitespace_unpadded_2();
   31.39 +        void base_64_round();
   31.40 +        void base_64_padded_1();
   31.41 +        void base_64_padded_2();
   31.42 +        void base_64_unpadded_1();        
   31.43 +        void base_64_unpadded_2();
   31.44 +        void base_64_leading_whitespace_round();
   31.45 +        void base_64_leading_whitespace_padded_1();
   31.46 +        void base_64_leading_whitespace_padded_2();
   31.47 +        void base_64_leading_whitespace_unpadded_1();        
   31.48 +        void base_64_leading_whitespace_unpadded_2();
   31.49 +        void base_64_trailing_whitespace_round();
   31.50 +        void base_64_trailing_whitespace_padded_1();
   31.51 +        void base_64_trailing_whitespace_padded_2();
   31.52 +        void base_64_trailing_whitespace_unpadded_1();        
   31.53 +        void base_64_trailing_whitespace_unpadded_2();
   31.54 +        void base_64_kitchen_sink_round();
   31.55 +        void base_64_kitchen_sink_padded_1();
   31.56 +        void base_64_kitchen_sink_padded_2();
   31.57 +        void base_64_kitchen_sink_unpadded_1();        
   31.58 +        void base_64_kitchen_sink_unpadded_2();
   31.59 +        void check_header_key_import();
   31.60 +        
   31.61 +        bool verify_base_64_test(const char* input, const char* desired_output);
   31.62 +};
   31.63 +
   31.64 +#endif
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/test/include/MessageNullFromTests.h	Thu Oct 11 13:04:02 2018 +0200
    32.3 @@ -0,0 +1,26 @@
    32.4 +// This file is under GNU General Public License 3.0
    32.5 +// see LICENSE.txt
    32.6 +
    32.7 +#ifndef MESSAGE_NULL_FROM_H
    32.8 +#define MESSAGE_NULL_FROM_H
    32.9 +
   32.10 +#include <string>
   32.11 +#include "EngineTestIndividualSuite.h"
   32.12 +
   32.13 +using namespace std;
   32.14 +
   32.15 +class MessageNullFromTests : public EngineTestIndividualSuite {
   32.16 +    public:
   32.17 +        MessageNullFromTests(string test_suite, string test_home_dir);
   32.18 +    protected:
   32.19 +        void setup();
   32.20 +    private:
   32.21 +        void check_message_null_from_no_header_key_unencrypted();
   32.22 +        void check_message_null_from_header_key_unencrypted();
   32.23 +        void check_message_null_from_encrypted_not_signed();
   32.24 +        void check_message_null_from_encrypted_and_signed(); 
   32.25 +        void import_bob_pair_and_set_own();
   32.26 +        void import_alice_pub();
   32.27 +};
   32.28 +
   32.29 +#endif
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/test/include/UserIdCollisionTests.h	Thu Oct 11 13:04:02 2018 +0200
    33.3 @@ -0,0 +1,112 @@
    33.4 +// This file is under GNU General Public License 3.0
    33.5 +// see LICENSE.txt
    33.6 +
    33.7 +#ifndef USER_ID_COLLISION_H
    33.8 +#define USER_ID_COLLISION_H
    33.9 +
   33.10 +#include <string>
   33.11 +#include "EngineTestIndividualSuite.h"
   33.12 +
   33.13 +using namespace std;
   33.14 +
   33.15 +class UserIdCollisionTests : public EngineTestIndividualSuite {
   33.16 +    public:
   33.17 +        UserIdCollisionTests(string test_suite, string test_home_dir);
   33.18 +    
   33.19 +    protected:
   33.20 +        void setup();
   33.21 +        void tear_down();
   33.22 +        
   33.23 +        // own user
   33.24 +        pEp_identity* user_alice;
   33.25 +        // real ID, only minimal info w/ username
   33.26 +        pEp_identity* real_alex;
   33.27 +        // tofu ID, only minimal info w/ username        
   33.28 +        pEp_identity* tofu_alex;
   33.29 +        // real ID, only minimal info w/o username
   33.30 +        pEp_identity* real_alex_0;
   33.31 +        // tofu ID, only minimal info w/o username
   33.32 +        pEp_identity* tofu_alex_0;
   33.33 +        // real ID, only minimal info w/o username
   33.34 +        pEp_identity* real_alex_1;
   33.35 +        // tofu ID, only minimal info w/o username
   33.36 +        pEp_identity* tofu_alex_1;
   33.37 +        // real ID, various kinds of info
   33.38 +        pEp_identity* real_alex_2;
   33.39 +        // tofu ID, various kinds of info
   33.40 +        pEp_identity* tofu_alex_2;
   33.41 +        // real ID, various kinds of info
   33.42 +        pEp_identity* real_alex_3;
   33.43 +        // tofu ID, various kinds of info        
   33.44 +        pEp_identity* tofu_alex_3;
   33.45 +        // tofu ID, various kinds of info        
   33.46 +        pEp_identity* tofu_alex_4;
   33.47 +        // real ID, various kinds of info
   33.48 +        pEp_identity* real_alex_4;
   33.49 +        // tofu ID, various kinds of info        
   33.50 +        pEp_identity* tofu_alex_5;
   33.51 +        // real ID, various kinds of info
   33.52 +        pEp_identity* real_alex_5;
   33.53 +        // tofu ID, various kinds of info        
   33.54 +        pEp_identity* tofu_alex_6a;
   33.55 +        // real ID, various kinds of info
   33.56 +        pEp_identity* real_alex_6a;
   33.57 +        // tofu ID, various kinds of info        
   33.58 +        pEp_identity* tofu_alex_6b;
   33.59 +        // real ID, various kinds of info
   33.60 +        pEp_identity* real_alex_6b;
   33.61 +        // tofu ID, various kinds of info        
   33.62 +        pEp_identity* tofu_alex_6c;
   33.63 +        // real ID, various kinds of info
   33.64 +        pEp_identity* real_alex_6c;
   33.65 +        // tofu ID, various kinds of info        
   33.66 +        pEp_identity* tofu_alex_6d;
   33.67 +        // real ID, various kinds of info
   33.68 +        pEp_identity* real_alex_6d;
   33.69 +        
   33.70 +        const char* const alice_keyfile = "test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc";
   33.71 +        const char* const alice_keyid = "4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
   33.72 +        const char* const alice_email = "pep.test.alice@pep-project.org";
   33.73 +        const char* const alex_keyfile = "test_keys/pub/pep.test.alexander-0x26B54E4E_pub.asc";
   33.74 +        const char* const alex_keyid = "3AD9F60FAEB22675DB873A1362D6981326B54E4E";        
   33.75 +        const char* const alex_email = "pep.test.alexander@peptest.ch";        
   33.76 +        const char* const alex0_keyfile = "test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc";
   33.77 +        const char* const alex0_keyid = "F4598A17D4690EB3B5B0F6A344F04E963B7302DB";
   33.78 +        const char* const alex0_email = "pep.test.alexander0@darthmama.org";                
   33.79 +        const char* const alex1_keyfile = "test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc";
   33.80 +        const char* const alex1_keyid = "59AF4C51492283522F6904531C09730A541260F6";        
   33.81 +        const char* const alex1_email = "pep.test.alexander1@darthmama.org";                                
   33.82 +        const char* const alex2_keyfile = "test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc";
   33.83 +        const char* const alex2_keyid = "46A994F19077C05610870273C4B8AB0BA6512F30";
   33.84 +        const char* const alex2_email = "pep.test.alexander2@darthmama.org";                                
   33.85 +        const char* const alex3_keyfile = "test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc";
   33.86 +        const char* const alex3_keyid = "5F7076BBD92E14EA49F0DF7C2CE49419724B3975";        
   33.87 +        const char* const alex3_email = "pep.test.alexander3@darthmama.org";                
   33.88 +        const char* const alex4_keyfile = "test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc";
   33.89 +        const char* const alex4_keyid = "E95FFF95B8E2FDD4A12C3374395F1485844B9DCF";        
   33.90 +        const char* const alex4_email = "pep.test.alexander4@darthmama.org";                
   33.91 +        const char* const alex5_keyfile = "test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc";
   33.92 +        const char* const alex5_keyid = "58BCC2BF2AE1E3C4FBEAB89AD7838ACA0773CD29";        
   33.93 +        const char* const alex5_email = "pep.test.alexander5@darthmama.org";                
   33.94 +        const char* const alex6a_keyfile = "test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc";
   33.95 +        const char* const alex6a_keyid = "B4CE2F6947B6947C500F0687AEFDE530BDA17020";        
   33.96 +        const char* const alex6_email = "pep.test.alexander6@darthmama.org";                
   33.97 +        const char* const alex6b_keyfile = "test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc";
   33.98 +        const char* const alex6b_keyid = "2E21325D202A44BFD9C607FCF095B202503B14D8";        
   33.99 +        const char* const alex6c_keyfile = "test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc";
  33.100 +        const char* const alex6c_keyid = "3C1E713D8519D7F907E3142D179EAA24A216E95A";        
  33.101 +        const char* const alex6d_keyfile = "test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc";
  33.102 +        const char* const alex6d_keyid = "74D79B4496E289BD8A71B70BA8E2C4530019697D";        
  33.103 +        
  33.104 +    private:
  33.105 +        void simple_tofu_collision();        
  33.106 +        void simple_tofu_collision_different_usernames();
  33.107 +        void tofu_collision_two_tofus();        
  33.108 +        void tofu_collision_two_tofus_diff_usernames();
  33.109 +        void real_followed_by_explicit_tofu();
  33.110 +        void merge_records_normal();
  33.111 +        void merge_records_set();
  33.112 +        void merge_records_set_2();
  33.113 +};
  33.114 +
  33.115 +#endif
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/test/include/pEpTestOutput.h	Thu Oct 11 13:04:02 2018 +0200
    34.3 @@ -0,0 +1,43 @@
    34.4 +
    34.5 +#ifndef PEP_TEST_OUTPUT_H
    34.6 +#define PEP_TEST_OUTPUT_H
    34.7 +
    34.8 +#include <cpptest.h>
    34.9 +#include <vector>
   34.10 +#include <string>
   34.11 +
   34.12 +namespace Test {
   34.13 +    class pEpTestOutput : public Output {
   34.14 +        public:
   34.15 +            pEpTestOutput();
   34.16 +            ~pEpTestOutput() {};
   34.17 +            void finished(int tests, const Time& time);
   34.18 +            void initialize(int tests) {};
   34.19 +            void suite_start(int tests, const std::string& name);
   34.20 +            void suite_end(int tests, const std::string& name,
   34.21 +                           const Time& time);
   34.22 +            void test_start(const std::string& name);
   34.23 +            void test_end(const std::string& name, bool ok,
   34.24 +                          const Time& time);
   34.25 +            void assertment(const Test::Source& s);
   34.26 +            
   34.27 +            void outputCorrectPercentage(int num_tests, int failures, int width);
   34.28 +            
   34.29 +        private:
   34.30 +            static constexpr const char* huge_sepline = "///////////////////////////////////////////////////////////////////////////\n";
   34.31 +            static constexpr const char* alt_sepline = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
   34.32 +            static constexpr const char* big_sepline = "********************************************************\n";
   34.33 +            static constexpr const char* med_sepline = "-----------------------------------\n";
   34.34 +            static constexpr const char* sml_sepline = "++++++++++++++++++++++++++\n";
   34.35 +            static constexpr const char* lil_sepline = "~~~~~~\n";
   34.36 +            int _total_failed;
   34.37 +            int _total_tests;
   34.38 +            int _suite_failed;
   34.39 +            int _suite_total;
   34.40 +            std::string _suite_name;
   34.41 +            std::string _test_name;
   34.42 +            std::vector<Source> _test_errors;
   34.43 +            
   34.44 +    };
   34.45 +}
   34.46 +#endif
   34.47 \ No newline at end of file
    35.1 --- a/test/include/test_util.h	Thu Oct 11 13:01:56 2018 +0200
    35.2 +++ b/test/include/test_util.h	Thu Oct 11 13:04:02 2018 +0200
    35.3 @@ -11,6 +11,8 @@
    35.4  
    35.5  void test_init();
    35.6  
    35.7 +bool file_exists(std::string filename);
    35.8 +
    35.9  // string equality (case and non-case sensitive)
   35.10  bool _streq(const char* str1, const char* str2);
   35.11  bool _strceq(const char* str1, const char* str2);
   35.12 @@ -35,11 +37,14 @@
   35.13  // Grabs a new uuid for your randomish string needs.
   35.14  char* get_new_uuid();
   35.15  
   35.16 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename);
   35.17 +
   35.18  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename);
   35.19  
   35.20  int util_delete_filepath(const char *filepath, 
   35.21                           const struct stat *file_stat, 
   35.22                           int ftw_info, 
   35.23                           struct FTW * ftw_struct);
   35.24 +                         
   35.25          
   35.26  #endif
    36.1 --- a/test/src/EngineTestIndividualSuite.cc	Thu Oct 11 13:01:56 2018 +0200
    36.2 +++ b/test/src/EngineTestIndividualSuite.cc	Thu Oct 11 13:04:02 2018 +0200
    36.3 @@ -27,4 +27,4 @@
    36.4  void EngineTestIndividualSuite::tear_down() {
    36.5      restore_full_env();
    36.6      EngineTestSuite::tear_down();
    36.7 -}
    36.8 +}
    36.9 \ No newline at end of file
    37.1 --- a/test/src/EngineTestSessionSuite.cc	Thu Oct 11 13:01:56 2018 +0200
    37.2 +++ b/test/src/EngineTestSessionSuite.cc	Thu Oct 11 13:04:02 2018 +0200
    37.3 @@ -23,7 +23,6 @@
    37.4  }
    37.5  
    37.6  void EngineTestSessionSuite::tear_down() {
    37.7 -    cout << "Session: tear_down - OTN: " << on_test_number << " NOT: " << number_of_tests << endl; 
    37.8      if (on_test_number == number_of_tests)
    37.9          restore_full_env();
   37.10          
    38.1 --- a/test/src/EngineTestSuite.cc	Thu Oct 11 13:01:56 2018 +0200
    38.2 +++ b/test/src/EngineTestSuite.cc	Thu Oct 11 13:04:02 2018 +0200
    38.3 @@ -5,11 +5,20 @@
    38.4  #include <unistd.h>
    38.5  #include <ftw.h>
    38.6  #include <assert.h>
    38.7 +#include <fstream>
    38.8 +#include <iostream>
    38.9 +#include <sys/types.h>
   38.10 +#include <sys/stat.h>
   38.11 +
   38.12 +#import <string>
   38.13 +#import <vector>
   38.14 +#include <utility>
   38.15  
   38.16  #include "platform_unix.h"
   38.17  
   38.18  #include "test_util.h"
   38.19  #include "EngineTestSuite.h"
   38.20 +
   38.21  using namespace std;
   38.22  
   38.23  // Constructor
   38.24 @@ -30,7 +39,58 @@
   38.25      number_of_tests++;
   38.26  }
   38.27  
   38.28 +void EngineTestSuite::copy_conf_file_to_test_dir(const char* dest_path, const char* conf_orig_path, const char* conf_dest_name) {
   38.29 +    string conf_dest_path = dest_path;
   38.30 +    
   38.31 +    struct stat pathinfo;
   38.32 +
   38.33 +    if(stat(conf_dest_path.c_str(), &pathinfo) != 0) {
   38.34 +        int errchk = mkdir(conf_dest_path.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
   38.35 +        if (errchk != 0)
   38.36 +            throw std::runtime_error("Error accessing conf file directory.");
   38.37 +    }
   38.38 +    
   38.39 +    conf_dest_path += "/";
   38.40 +    conf_dest_path += conf_dest_name;
   38.41 +    
   38.42 +    ifstream src(conf_orig_path);
   38.43 +    ofstream dst(conf_dest_path.c_str(), ios::trunc);
   38.44 +    
   38.45 +    assert(src);
   38.46 +    assert(dst);
   38.47 +    
   38.48 +    dst << src.rdbuf();
   38.49 +     
   38.50 +    src.close();
   38.51 +    dst.close();
   38.52 +}
   38.53 +
   38.54 +void EngineTestSuite::add_file_to_gpg_dir_queue(string copy_from, string dst_fname) {    
   38.55 +    gpgdir_fileadd_queue.push_back(make_pair(copy_from, dst_fname));
   38.56 +}
   38.57 +
   38.58 +void EngineTestSuite::add_file_to_home_dir_queue(string copy_from, string dst_fname) {
   38.59 +    homedir_fileadd_queue.push_back(make_pair(copy_from, dst_fname));
   38.60 +}
   38.61 +
   38.62 +void EngineTestSuite::process_file_queue(string dirname, vector<pair<string, string>> file_queue) {
   38.63 +    if (file_queue.empty())
   38.64 +        return;
   38.65 +        
   38.66 +    vector<pair<string, string>>::iterator it;
   38.67 +    
   38.68 +    for (it = file_queue.begin(); it != file_queue.end(); it++) {
   38.69 +        copy_conf_file_to_test_dir(dirname.c_str(), it->first.c_str(), it->second.c_str());
   38.70 +    }
   38.71 +    
   38.72 +    file_queue.clear();
   38.73 +}
   38.74 +
   38.75  void EngineTestSuite::set_full_env() {
   38.76 +    set_full_env(NULL, NULL, NULL);
   38.77 +}
   38.78 +
   38.79 +void EngineTestSuite::set_full_env(const char* gpg_conf_copy_path, const char* gpg_agent_conf_file_copy_path, const char* db_conf_file_copy_path) {
   38.80      int success = 0;
   38.81      struct stat dirchk;
   38.82      
   38.83 @@ -39,7 +99,7 @@
   38.84      success = system("gpgconf --kill all");
   38.85      if (success != 0)
   38.86          throw std::runtime_error("SETUP: Error when executing 'gpgconf --kill all'.");
   38.87 -    sleep(1); // hopefully enough time for the system to recognise that it is dead. *sigh*    
   38.88 + //   sleep(1); // hopefully enough time for the system to recognise that it is dead. *sigh*    
   38.89  
   38.90      if (stat(test_home.c_str(), &dirchk) == 0) {
   38.91          if (!S_ISDIR(dirchk.st_mode))
   38.92 @@ -48,7 +108,7 @@
   38.93          struct stat buf;
   38.94  
   38.95          if (stat(test_home.c_str(), &buf) == 0) {
   38.96 -            cout << test_home << " exists. We'll recursively delete. We hope we're not horking your whole system..." << endl;
   38.97 +//            cout << test_home << " exists. We'll recursively delete. We hope we're not horking your whole system..." << endl;
   38.98              int success = nftw((test_home + "/.").c_str(), util_delete_filepath, 100, FTW_DEPTH);
   38.99          }
  38.100      }
  38.101 @@ -59,7 +119,7 @@
  38.102              throw std::runtime_error("Error creating a test directory.");
  38.103      }
  38.104  
  38.105 -    string temp_test_home = test_home + "/" + my_name;
  38.106 +    temp_test_home = test_home + "/" + my_name;
  38.107      
  38.108      int errchk = mkdir(temp_test_home.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
  38.109      if (errchk != 0)
  38.110 @@ -82,22 +142,28 @@
  38.111  
  38.112      
  38.113      string home = getenv("HOME");
  38.114 -    cout << "home is " << home << endl;
  38.115      assert(temp_test_home.compare(home) != 0);
  38.116      assert(temp_test_home.compare(home + "/") != 0);
  38.117 +    assert(temp_test_home.compare(home + "/.gnupg") != 0); // This is an EXCLUSION test, so we leave this.
  38.118 +    assert(temp_test_home.compare(home + ".gnupg") != 0);
  38.119      assert(temp_test_home.compare(home + "/gnupg") != 0);
  38.120      assert(temp_test_home.compare(home + "gnupg") != 0);
  38.121      assert(temp_test_home.compare(prev_gpg_home) != 0);
  38.122      assert(temp_test_home.compare(prev_gpg_home + "/gnupg") != 0);
  38.123      assert(temp_test_home.compare(prev_gpg_home + "gnupg") != 0);
  38.124 +    assert(temp_test_home.compare(prev_gpg_home + "/.gnupg") != 0);
  38.125 +    assert(temp_test_home.compare(prev_gpg_home + ".gnupg") != 0);
  38.126  
  38.127      if (temp_test_home.compare(home) == 0 || temp_test_home.compare(home + "/") == 0 ||
  38.128          temp_test_home.compare(home + "/gnupg") == 0 || temp_test_home.compare(home + "gnupg") == 0 ||
  38.129 +        temp_test_home.compare(home + "/.gnupg") == 0 || temp_test_home.compare(home + ".gnupg") == 0 ||
  38.130          temp_test_home.compare(prev_gpg_home) == 0 || temp_test_home.compare(prev_gpg_home + "/gnupg") == 0 ||
  38.131 -        temp_test_home.compare(prev_gpg_home + "gnupg") == 0)
  38.132 +        temp_test_home.compare(prev_gpg_home + "gnupg") == 0 || temp_test_home.compare(prev_gpg_home + "/.gnupg") == 0 ||
  38.133 +        temp_test_home.compare(prev_gpg_home + ".gnupg") == 0)
  38.134          throw std::runtime_error("SETUP: new GNUPGHOME threatens to mess up user GNUPGHOME (and delete all their keys). NO DICE.");
  38.135      
  38.136  //    cout << "Ok - checked if new test home will be safe. We'll try and make the directory, deleting it if it has already exists." << endl;
  38.137 +    cout << "Test home directory is " << temp_test_home << endl;
  38.138      
  38.139      struct stat buf;
  38.140      
  38.141 @@ -105,12 +171,24 @@
  38.142      if (success != 0)
  38.143          throw std::runtime_error("SETUP: Error when setting GNUPGHOME.");
  38.144  
  38.145 -    cout << "New GNUPGHOME is " << getenv("GNUPGHOME") << endl;
  38.146 +    cout << "New GNUPGHOME is " << getenv("GNUPGHOME") << endl << endl;
  38.147      
  38.148      success = setenv("HOME", temp_test_home.c_str(), 1);
  38.149      if (success != 0)
  38.150          throw std::runtime_error("SETUP: Cannot set test_home for init.");
  38.151 -    
  38.152 +
  38.153 +    string tmp_gpg_dir = temp_test_home + "/.gnupg";
  38.154 +
  38.155 +    process_file_queue(tmp_gpg_dir, gpgdir_fileadd_queue);
  38.156 +    process_file_queue(temp_test_home, homedir_fileadd_queue);
  38.157 +
  38.158 +    if (gpg_conf_copy_path)
  38.159 +        copy_conf_file_to_test_dir((temp_test_home + "/gnupg").c_str(), gpg_conf_copy_path, "gpg.conf");
  38.160 +    if (gpg_agent_conf_file_copy_path)        
  38.161 +        copy_conf_file_to_test_dir((temp_test_home + "/gnupg").c_str(), gpg_agent_conf_file_copy_path, "gpg-agent.conf");
  38.162 +    if (db_conf_file_copy_path)
  38.163 +        copy_conf_file_to_test_dir(temp_test_home.c_str(), db_conf_file_copy_path, ".pEp_management.db");
  38.164 +        
  38.165      unix_local_db(true);
  38.166      gpg_conf(true);
  38.167      gpg_agent_conf(true);
  38.168 @@ -140,8 +218,8 @@
  38.169      success = setenv("HOME", real_home.c_str(), 1);
  38.170      if (success != 0)
  38.171          throw std::runtime_error("RESTORE: Cannot reset home directory! Either set environment variable manually back to your home, or quit this session!");
  38.172 -    else
  38.173 -        cout << "RESTORE: HOME is now " << getenv("HOME") << endl;
  38.174 +    // else
  38.175 +    //     cout << "RESTORE: HOME is now " << getenv("HOME") << endl;
  38.176      unix_local_db(true);
  38.177      gpg_conf(true);
  38.178      gpg_agent_conf(true);
  38.179 @@ -157,4 +235,3 @@
  38.180  void EngineTestSuite::set_my_name() {
  38.181      my_name = typeid(*this).name();
  38.182  }
  38.183 -
    39.1 --- a/test/src/SuiteMaker.cc	Thu Oct 11 13:01:56 2018 +0200
    39.2 +++ b/test/src/SuiteMaker.cc	Thu Oct 11 13:04:02 2018 +0200
    39.3 @@ -12,159 +12,175 @@
    39.4  #include "SuiteMaker.h"
    39.5  
    39.6  // Begin where we generate stuff
    39.7 +#include "DecorateTests.h"
    39.8 +#include "UserIdCollisionTests.h"
    39.9 +#include "ReencryptPlusExtraKeysTests.h"
   39.10 +#include "BlacklistTests.h"
   39.11 +#include "AppleMailTests.h"
   39.12 +#include "MessageTwoPointOhTests.h"
   39.13 +#include "IdentityListTests.h"
   39.14 +#include "I18nTests.h"
   39.15 +#include "Engine463Tests.h"
   39.16 +#include "DecryptAttachPrivateKeyUntrustedTests.h"
   39.17 +#include "BCCTests.h"
   39.18 +#include "LeastColorGroupTests.h"
   39.19 +#include "MistrustUndoTests.h"
   39.20 +#include "BlacklistAcceptNewKeyTests.h"
   39.21 +#include "MessageApiTests.h"
   39.22 +#include "StringlistTests.h"
   39.23 +#include "HeaderKeyImportTests.h"
   39.24 +#include "StringpairListTests.h"
   39.25 +#include "TrustManipulationTests.h"
   39.26 +#include "EncryptAttachPrivateKeyTests.h"
   39.27 +#include "BloblistTests.h"
   39.28 +#include "SequenceTests.h"
   39.29 +#include "TrustwordsTests.h"
   39.30 +#include "RevokeRegenAttachTests.h"
   39.31 +#include "EncryptMissingPrivateKeyTests.h"
   39.32 +#include "PepSubjectReceivedTests.h"
   39.33 +#include "KeyeditTests.h"
   39.34 +#include "MapAsn1Tests.h"
   39.35 +#include "PgpBinaryTests.h"
   39.36 +#include "DecryptAttachPrivateKeyTrustedTests.h"
   39.37 +#include "MessageNullFromTests.h"
   39.38  #include "MimeTests.h"
   39.39 -#include "BloblistTests.h"
   39.40 +#include "PgpListKeysTests.h"
   39.41  #include "NewUpdateIdAndMyselfTests.h"
   39.42 -#include "I18nTests.h"
   39.43 -#include "IdentityListTests.h"
   39.44 -#include "PgpBinaryTests.h"
   39.45 -#include "MistrustUndoTests.h"
   39.46 +#include "EncryptForIdentityTests.h"
   39.47 +#include "CrashdumpTests.h"
   39.48 +#include "CaseAndDotAddressTests.h"
   39.49  #include "LeastCommonDenomColorTests.h"
   39.50 -#include "StringlistTests.h"
   39.51 -#include "PgpListKeysTests.h"
   39.52 -#include "MessageApiTests.h"
   39.53 -#include "EncryptMissingPrivateKeyTests.h"
   39.54 -#include "CaseAndDotAddressTests.h"
   39.55 +#include "ExternalRevokeTests.h"
   39.56  #include "UserIDAliasTests.h"
   39.57 -#include "BCCTests.h"
   39.58 -#include "BlacklistAcceptNewKeyTests.h"
   39.59 -#include "DecryptAttachPrivateKeyUntrustedTests.h"
   39.60 -#include "BlacklistTests.h"
   39.61 -#include "RevokeRegenAttachTests.h"
   39.62 -#include "PepSubjectReceivedTests.h"
   39.63 -#include "SequenceTests.h"
   39.64 -#include "EncryptAttachPrivateKeyTests.h"
   39.65 -#include "ExternalRevokeTests.h"
   39.66 -#include "KeyeditTests.h"
   39.67 -#include "LeastColorGroupTests.h"
   39.68 -#include "DecryptAttachPrivateKeyTrustedTests.h"
   39.69 -#include "TrustwordsTests.h"
   39.70 -#include "ReencryptPlusExtraKeysTests.h"
   39.71 -#include "MapAsn1Tests.h"
   39.72 -#include "DecorateTests.h"
   39.73 -#include "MessageTwoPointOhTests.h"
   39.74 -#include "CrashdumpTests.h"
   39.75 -#include "StringpairListTests.h"
   39.76 -#include "EncryptForIdentityTests.h"
   39.77 -#include "TrustManipulationTests.h"
   39.78 -#include "AppleMailTests.h"
   39.79  
   39.80  
   39.81  const char* SuiteMaker::all_suites[] = {
   39.82 +    "DecorateTests",
   39.83 +    "UserIdCollisionTests",
   39.84 +    "ReencryptPlusExtraKeysTests",
   39.85 +    "BlacklistTests",
   39.86 +    "AppleMailTests",
   39.87 +    "MessageTwoPointOhTests",
   39.88 +    "IdentityListTests",
   39.89 +    "I18nTests",
   39.90 +    "Engine463Tests",
   39.91 +    "DecryptAttachPrivateKeyUntrustedTests",
   39.92 +    "BCCTests",
   39.93 +    "LeastColorGroupTests",
   39.94 +    "MistrustUndoTests",
   39.95 +    "BlacklistAcceptNewKeyTests",
   39.96 +    "MessageApiTests",
   39.97 +    "StringlistTests",
   39.98 +    "HeaderKeyImportTests",
   39.99 +    "StringpairListTests",
  39.100 +    "TrustManipulationTests",
  39.101 +    "EncryptAttachPrivateKeyTests",
  39.102 +    "BloblistTests",
  39.103 +    "SequenceTests",
  39.104 +    "TrustwordsTests",
  39.105 +    "RevokeRegenAttachTests",
  39.106 +    "EncryptMissingPrivateKeyTests",
  39.107 +    "PepSubjectReceivedTests",
  39.108 +    "KeyeditTests",
  39.109 +    "MapAsn1Tests",
  39.110 +    "PgpBinaryTests",
  39.111 +    "DecryptAttachPrivateKeyTrustedTests",
  39.112 +    "MessageNullFromTests",
  39.113      "MimeTests",
  39.114 -    "BloblistTests",
  39.115 +    "PgpListKeysTests",
  39.116      "NewUpdateIdAndMyselfTests",
  39.117 -    "I18nTests",
  39.118 -    "IdentityListTests",
  39.119 -    "PgpBinaryTests",
  39.120 -    "MistrustUndoTests",
  39.121 +    "EncryptForIdentityTests",
  39.122 +    "CrashdumpTests",
  39.123 +    "CaseAndDotAddressTests",
  39.124      "LeastCommonDenomColorTests",
  39.125 -    "StringlistTests",
  39.126 -    "PgpListKeysTests",
  39.127 -    "MessageApiTests",
  39.128 -    "EncryptMissingPrivateKeyTests",
  39.129 -    "CaseAndDotAddressTests",
  39.130 +    "ExternalRevokeTests",
  39.131      "UserIDAliasTests",
  39.132 -    "BCCTests",
  39.133 -    "BlacklistAcceptNewKeyTests",
  39.134 -    "DecryptAttachPrivateKeyUntrustedTests",
  39.135 -    "BlacklistTests",
  39.136 -    "RevokeRegenAttachTests",
  39.137 -    "PepSubjectReceivedTests",
  39.138 -    "SequenceTests",
  39.139 -    "EncryptAttachPrivateKeyTests",
  39.140 -    "ExternalRevokeTests",
  39.141 -    "KeyeditTests",
  39.142 -    "LeastColorGroupTests",
  39.143 -    "DecryptAttachPrivateKeyTrustedTests",
  39.144 -    "TrustwordsTests",
  39.145 -    "ReencryptPlusExtraKeysTests",
  39.146 -    "MapAsn1Tests",
  39.147 -    "DecorateTests",
  39.148 -    "MessageTwoPointOhTests",
  39.149 -    "CrashdumpTests",
  39.150 -    "StringpairListTests",
  39.151 -    "EncryptForIdentityTests",
  39.152 -    "TrustManipulationTests",
  39.153 -    "AppleMailTests",
  39.154  };
  39.155  
  39.156  // This file is generated, so magic constants are ok.
  39.157 -int SuiteMaker::num_suites = 36;
  39.158 +int SuiteMaker::num_suites = 40;
  39.159  
  39.160  void SuiteMaker::suitemaker_build(const char* test_class_name, const char* test_home, Test::Suite** test_suite) {
  39.161 -    if (strcmp(test_class_name, "MimeTests") == 0)
  39.162 -        *test_suite = new MimeTests(test_class_name, test_home);
  39.163 +    if (strcmp(test_class_name, "DecorateTests") == 0)
  39.164 +        *test_suite = new DecorateTests(test_class_name, test_home);
  39.165 +    else if (strcmp(test_class_name, "UserIdCollisionTests") == 0)
  39.166 +        *test_suite = new UserIdCollisionTests(test_class_name, test_home);
  39.167 +    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  39.168 +        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  39.169 +    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  39.170 +        *test_suite = new BlacklistTests(test_class_name, test_home);
  39.171 +    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  39.172 +        *test_suite = new AppleMailTests(test_class_name, test_home);
  39.173 +    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  39.174 +        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  39.175 +    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  39.176 +        *test_suite = new IdentityListTests(test_class_name, test_home);
  39.177 +    else if (strcmp(test_class_name, "I18nTests") == 0)
  39.178 +        *test_suite = new I18nTests(test_class_name, test_home);
  39.179 +    else if (strcmp(test_class_name, "Engine463Tests") == 0)
  39.180 +        *test_suite = new Engine463Tests(test_class_name, test_home);
  39.181 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  39.182 +        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  39.183 +    else if (strcmp(test_class_name, "BCCTests") == 0)
  39.184 +        *test_suite = new BCCTests(test_class_name, test_home);
  39.185 +    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  39.186 +        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  39.187 +    else if (strcmp(test_class_name, "MistrustUndoTests") == 0)
  39.188 +        *test_suite = new MistrustUndoTests(test_class_name, test_home);
  39.189 +    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  39.190 +        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  39.191 +    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  39.192 +        *test_suite = new MessageApiTests(test_class_name, test_home);
  39.193 +    else if (strcmp(test_class_name, "StringlistTests") == 0)
  39.194 +        *test_suite = new StringlistTests(test_class_name, test_home);
  39.195 +    else if (strcmp(test_class_name, "HeaderKeyImportTests") == 0)
  39.196 +        *test_suite = new HeaderKeyImportTests(test_class_name, test_home);
  39.197 +    else if (strcmp(test_class_name, "StringpairListTests") == 0)
  39.198 +        *test_suite = new StringpairListTests(test_class_name, test_home);
  39.199 +    else if (strcmp(test_class_name, "TrustManipulationTests") == 0)
  39.200 +        *test_suite = new TrustManipulationTests(test_class_name, test_home);
  39.201 +    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  39.202 +        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  39.203      else if (strcmp(test_class_name, "BloblistTests") == 0)
  39.204          *test_suite = new BloblistTests(test_class_name, test_home);
  39.205 +    else if (strcmp(test_class_name, "SequenceTests") == 0)
  39.206 +        *test_suite = new SequenceTests(test_class_name, test_home);
  39.207 +    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  39.208 +        *test_suite = new TrustwordsTests(test_class_name, test_home);
  39.209 +    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  39.210 +        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  39.211 +    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  39.212 +        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  39.213 +    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  39.214 +        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  39.215 +    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  39.216 +        *test_suite = new KeyeditTests(test_class_name, test_home);
  39.217 +    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  39.218 +        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  39.219 +    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  39.220 +        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  39.221 +    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  39.222 +        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  39.223 +    else if (strcmp(test_class_name, "MessageNullFromTests") == 0)
  39.224 +        *test_suite = new MessageNullFromTests(test_class_name, test_home);
  39.225 +    else if (strcmp(test_class_name, "MimeTests") == 0)
  39.226 +        *test_suite = new MimeTests(test_class_name, test_home);
  39.227 +    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  39.228 +        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  39.229      else if (strcmp(test_class_name, "NewUpdateIdAndMyselfTests") == 0)
  39.230          *test_suite = new NewUpdateIdAndMyselfTests(test_class_name, test_home);
  39.231 -    else if (strcmp(test_class_name, "I18nTests") == 0)
  39.232 -        *test_suite = new I18nTests(test_class_name, test_home);
  39.233 -    else if (strcmp(test_class_name, "IdentityListTests") == 0)
  39.234 -        *test_suite = new IdentityListTests(test_class_name, test_home);
  39.235 -    else if (strcmp(test_class_name, "PgpBinaryTests") == 0)
  39.236 -        *test_suite = new PgpBinaryTests(test_class_name, test_home);
  39.237 -    else if (strcmp(test_class_name, "MistrustUndoTests") == 0)
  39.238 -        *test_suite = new MistrustUndoTests(test_class_name, test_home);
  39.239 +    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  39.240 +        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  39.241 +    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  39.242 +        *test_suite = new CrashdumpTests(test_class_name, test_home);
  39.243 +    else if (strcmp(test_class_name, "CaseAndDotAddressTests") == 0)
  39.244 +        *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
  39.245      else if (strcmp(test_class_name, "LeastCommonDenomColorTests") == 0)
  39.246          *test_suite = new LeastCommonDenomColorTests(test_class_name, test_home);
  39.247 -    else if (strcmp(test_class_name, "StringlistTests") == 0)
  39.248 -        *test_suite = new StringlistTests(test_class_name, test_home);
  39.249 -    else if (strcmp(test_class_name, "PgpListKeysTests") == 0)
  39.250 -        *test_suite = new PgpListKeysTests(test_class_name, test_home);
  39.251 -    else if (strcmp(test_class_name, "MessageApiTests") == 0)
  39.252 -        *test_suite = new MessageApiTests(test_class_name, test_home);
  39.253 -    else if (strcmp(test_class_name, "EncryptMissingPrivateKeyTests") == 0)
  39.254 -        *test_suite = new EncryptMissingPrivateKeyTests(test_class_name, test_home);
  39.255 -    else if (strcmp(test_class_name, "CaseAndDotAddressTests") == 0)
  39.256 -        *test_suite = new CaseAndDotAddressTests(test_class_name, test_home);
  39.257 +    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  39.258 +        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  39.259      else if (strcmp(test_class_name, "UserIDAliasTests") == 0)
  39.260          *test_suite = new UserIDAliasTests(test_class_name, test_home);
  39.261 -    else if (strcmp(test_class_name, "BCCTests") == 0)
  39.262 -        *test_suite = new BCCTests(test_class_name, test_home);
  39.263 -    else if (strcmp(test_class_name, "BlacklistAcceptNewKeyTests") == 0)
  39.264 -        *test_suite = new BlacklistAcceptNewKeyTests(test_class_name, test_home);
  39.265 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyUntrustedTests") == 0)
  39.266 -        *test_suite = new DecryptAttachPrivateKeyUntrustedTests(test_class_name, test_home);
  39.267 -    else if (strcmp(test_class_name, "BlacklistTests") == 0)
  39.268 -        *test_suite = new BlacklistTests(test_class_name, test_home);
  39.269 -    else if (strcmp(test_class_name, "RevokeRegenAttachTests") == 0)
  39.270 -        *test_suite = new RevokeRegenAttachTests(test_class_name, test_home);
  39.271 -    else if (strcmp(test_class_name, "PepSubjectReceivedTests") == 0)
  39.272 -        *test_suite = new PepSubjectReceivedTests(test_class_name, test_home);
  39.273 -    else if (strcmp(test_class_name, "SequenceTests") == 0)
  39.274 -        *test_suite = new SequenceTests(test_class_name, test_home);
  39.275 -    else if (strcmp(test_class_name, "EncryptAttachPrivateKeyTests") == 0)
  39.276 -        *test_suite = new EncryptAttachPrivateKeyTests(test_class_name, test_home);
  39.277 -    else if (strcmp(test_class_name, "ExternalRevokeTests") == 0)
  39.278 -        *test_suite = new ExternalRevokeTests(test_class_name, test_home);
  39.279 -    else if (strcmp(test_class_name, "KeyeditTests") == 0)
  39.280 -        *test_suite = new KeyeditTests(test_class_name, test_home);
  39.281 -    else if (strcmp(test_class_name, "LeastColorGroupTests") == 0)
  39.282 -        *test_suite = new LeastColorGroupTests(test_class_name, test_home);
  39.283 -    else if (strcmp(test_class_name, "DecryptAttachPrivateKeyTrustedTests") == 0)
  39.284 -        *test_suite = new DecryptAttachPrivateKeyTrustedTests(test_class_name, test_home);
  39.285 -    else if (strcmp(test_class_name, "TrustwordsTests") == 0)
  39.286 -        *test_suite = new TrustwordsTests(test_class_name, test_home);
  39.287 -    else if (strcmp(test_class_name, "ReencryptPlusExtraKeysTests") == 0)
  39.288 -        *test_suite = new ReencryptPlusExtraKeysTests(test_class_name, test_home);
  39.289 -    else if (strcmp(test_class_name, "MapAsn1Tests") == 0)
  39.290 -        *test_suite = new MapAsn1Tests(test_class_name, test_home);
  39.291 -    else if (strcmp(test_class_name, "DecorateTests") == 0)
  39.292 -        *test_suite = new DecorateTests(test_class_name, test_home);
  39.293 -    else if (strcmp(test_class_name, "MessageTwoPointOhTests") == 0)
  39.294 -        *test_suite = new MessageTwoPointOhTests(test_class_name, test_home);
  39.295 -    else if (strcmp(test_class_name, "CrashdumpTests") == 0)
  39.296 -        *test_suite = new CrashdumpTests(test_class_name, test_home);
  39.297 -    else if (strcmp(test_class_name, "StringpairListTests") == 0)
  39.298 -        *test_suite = new StringpairListTests(test_class_name, test_home);
  39.299 -    else if (strcmp(test_class_name, "EncryptForIdentityTests") == 0)
  39.300 -        *test_suite = new EncryptForIdentityTests(test_class_name, test_home);
  39.301 -    else if (strcmp(test_class_name, "TrustManipulationTests") == 0)
  39.302 -        *test_suite = new TrustManipulationTests(test_class_name, test_home);
  39.303 -    else if (strcmp(test_class_name, "AppleMailTests") == 0)
  39.304 -        *test_suite = new AppleMailTests(test_class_name, test_home);
  39.305  }
  39.306  
  39.307  void SuiteMaker::suitemaker_buildlist(const char** test_class_names, int num_to_run, const char* test_home, std::vector<Test::Suite*>& test_suites) {
    40.1 --- a/test/src/TestDriver.cc	Thu Oct 11 13:01:56 2018 +0200
    40.2 +++ b/test/src/TestDriver.cc	Thu Oct 11 13:04:02 2018 +0200
    40.3 @@ -1,7 +1,9 @@
    40.4  #include <stdlib.h>
    40.5  #include <cpptest.h>
    40.6  #include <cpptest-suite.h>
    40.7 -#include <cpptest-textoutput.h>
    40.8 +#include <cpptest-output.h>
    40.9 +#include "pEpTestOutput.h"
   40.10 +
   40.11  #include <string>
   40.12  #include <vector>
   40.13  #include <sys/stat.h>
   40.14 @@ -51,7 +53,7 @@
   40.15          test_runner->add(suite); 
   40.16      }
   40.17  
   40.18 -    Test::TextOutput output(Test::TextOutput::Verbose);
   40.19 -    return test_runner->run(output, false) ? 0 : 1;
   40.20 -    
   40.21 +    Test::Output* output = new Test::pEpTestOutput(); // blah
   40.22 +    return test_runner->run(*output, false) ? 0 : 1;
   40.23 +    delete(output);
   40.24  }
    41.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.2 +++ b/test/src/engine_tests/Engine463Tests.cc	Thu Oct 11 13:04:02 2018 +0200
    41.3 @@ -0,0 +1,74 @@
    41.4 +// This file is under GNU General Public License 3.0
    41.5 +// see LICENSE.txt
    41.6 +
    41.7 +#include <stdlib.h>
    41.8 +#include <string>
    41.9 +
   41.10 +#include "pEpEngine.h"
   41.11 +#include "pEp_internal.h"
   41.12 +#include "test_util.h"
   41.13 +
   41.14 +#include "EngineTestIndividualSuite.h"
   41.15 +#include "Engine463Tests.h"
   41.16 +
   41.17 +using namespace std;
   41.18 +
   41.19 +Engine463Tests::Engine463Tests(string suitename, string test_home_dir) :
   41.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   41.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_no_own_key"),
   41.22 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_no_own_key)));
   41.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("Engine463Tests::check_engine_463_own_key"),
   41.24 +                                                                      static_cast<Func>(&Engine463Tests::check_engine_463_own_key)));                                                                  
   41.25 +}
   41.26 +
   41.27 +void Engine463Tests::check_engine_463_no_own_key() {
   41.28 +    const string claudio_keys = slurp("test_keys/priv/notfound-alt-pub_and_private.asc");
   41.29 +    const string fake_schleuder_key = slurp("test_keys/pub/fake-schleuder.asc");
   41.30 +    
   41.31 +    PEP_STATUS status = import_key(session, claudio_keys.c_str(), claudio_keys.length(), NULL);
   41.32 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   41.33 +    status = import_key(session, fake_schleuder_key.c_str(), fake_schleuder_key.length(), NULL);
   41.34 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   41.35 +
   41.36 +    // Ok, bring in message, decrypt, and see what happens.
   41.37 +    const string msg = slurp("test_mails/notfound-alt.msg");
   41.38 +
   41.39 +    char* decrypted_msg = NULL;
   41.40 +    stringlist_t* keylist_used = nullptr;
   41.41 +    char* modified_src = NULL;
   41.42 +    
   41.43 +    PEP_rating rating;
   41.44 +    PEP_decrypt_flags_t flags;
   41.45 +     
   41.46 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   41.47 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   41.48 +    cout << decrypted_msg << endl;        
   41.49 +}
   41.50 +
   41.51 +void Engine463Tests::check_engine_463_own_key() {
   41.52 +    const string claudio_keys = slurp("test_keys/priv/notfound-alt-pub_and_private.asc");
   41.53 +    const string fake_schleuder_key = slurp("test_keys/pub/fake-schleuder.asc");
   41.54 +    
   41.55 +    PEP_STATUS status = import_key(session, claudio_keys.c_str(), claudio_keys.length(), NULL);
   41.56 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   41.57 +    status = import_key(session, fake_schleuder_key.c_str(), fake_schleuder_key.length(), NULL);
   41.58 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   41.59 +
   41.60 +    pEp_identity* own_ident = new_identity("claudio+engine-463@pep.foundation", "A039BC60E43E0DFDDC9DE8663B48C38325210C88", PEP_OWN_USERID, "Not Actually Claudio");
   41.61 +    status = set_own_key(session, own_ident, "A039BC60E43E0DFDDC9DE8663B48C38325210C88");
   41.62 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));    
   41.63 +
   41.64 +    // Ok, bring in message, decrypt, and see what happens.
   41.65 +    const string msg = slurp("test_mails/notfound-alt.msg");
   41.66 +
   41.67 +    char* decrypted_msg = NULL;
   41.68 +    stringlist_t* keylist_used = nullptr;
   41.69 +    char* modified_src = NULL;
   41.70 +    
   41.71 +    PEP_rating rating;
   41.72 +    PEP_decrypt_flags_t flags;
   41.73 +     
   41.74 +    status = MIME_decrypt_message(session, msg.c_str(), msg.size(), &decrypted_msg, &keylist_used, &rating, &flags, &modified_src);
   41.75 +    TEST_ASSERT_MSG((status == PEP_STATUS_OK), tl_status_string(status));
   41.76 +    cout << decrypted_msg << endl;        
   41.77 +}
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/test/src/engine_tests/HeaderKeyImportTests.cc	Thu Oct 11 13:04:02 2018 +0200
    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/LeastColorGroupTests.cc	Thu Oct 11 13:01:56 2018 +0200
    43.2 +++ b/test/src/engine_tests/LeastColorGroupTests.cc	Thu Oct 11 13:04:02 2018 +0200
    43.3 @@ -57,7 +57,6 @@
    43.4      pEp_identity * sender1 = new_identity("pep.color.test.V@kgrothoff.org",
    43.5                                            NULL, "TOFU_pep.color.test.V@kgrothoff.org",
    43.6                                            "Pep Color Test V (sender)");
    43.7 -    
    43.8      status = update_identity(session, sender1);
    43.9      trust_personal_key(session, sender1);
   43.10      status = update_identity(session, sender1);
    44.1 --- a/test/src/engine_tests/LeastCommonDenomColorTests.cc	Thu Oct 11 13:01:56 2018 +0200
    44.2 +++ b/test/src/engine_tests/LeastCommonDenomColorTests.cc	Thu Oct 11 13:04:02 2018 +0200
    44.3 @@ -26,7 +26,7 @@
    44.4  }
    44.5  
    44.6  void LeastCommonDenomColorTests::check_least_common_denom_color() {
    44.7 -        
    44.8 +
    44.9      const char* mailfile = "test_mails/Test_Message_JSON-21_Color_Problems.eml";
   44.10              
   44.11      // import keys
   44.12 @@ -137,5 +137,4 @@
   44.13      dest_msg = nullptr;
   44.14      keylist = nullptr;
   44.15      rating = PEP_rating_unreliable;
   44.16 -    
   44.17  }
    45.1 --- a/test/src/engine_tests/MessageApiTests.cc	Thu Oct 11 13:01:56 2018 +0200
    45.2 +++ b/test/src/engine_tests/MessageApiTests.cc	Thu Oct 11 13:04:02 2018 +0200
    45.3 @@ -26,7 +26,6 @@
    45.4  }
    45.5  
    45.6  void MessageApiTests::check_message_api() {
    45.7 -
    45.8      cout << "Importing Alice's key " << endl;
    45.9      const string alice_pub_key = slurp("test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   45.10      const string alice_priv_key = slurp("test_keys/priv/pep-test-alice-0x6FF00E97_priv.asc");
   45.11 @@ -221,5 +220,5 @@
   45.12      cout << "done.\n";
   45.13  
   45.14      free(enc_msg);
   45.15 -    free(dec_msg);
   45.16 +    free(dec_msg);    
   45.17  }
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/test/src/engine_tests/MessageNullFromTests.cc	Thu Oct 11 13:04:02 2018 +0200
    46.3 @@ -0,0 +1,124 @@
    46.4 +// This file is under GNU General Public License 3.0
    46.5 +// see LICENSE.txt
    46.6 +
    46.7 +#include <stdlib.h>
    46.8 +#include <string>
    46.9 +
   46.10 +#include <assert.h>
   46.11 +
   46.12 +#include "pEpEngine.h"
   46.13 +#include "test_util.h"
   46.14 +
   46.15 +#include "EngineTestIndividualSuite.h"
   46.16 +#include "MessageNullFromTests.h"
   46.17 +
   46.18 +using namespace std;
   46.19 +
   46.20 +MessageNullFromTests::MessageNullFromTests(string suitename, string test_home_dir) :
   46.21 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   46.22 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("MessageNullFromTests::check_message_null_from_no_header_key_unencrypted"),
   46.23 +                                                                      static_cast<Func>(&MessageNullFromTests::check_message_null_from_header_key_unencrypted)));
   46.24 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("MessageNullFromTests::check_message_null_from_no_header_key_unencrypted"),
   46.25 +                                                                          static_cast<Func>(&MessageNullFromTests::check_message_null_from_header_key_unencrypted)));                                                                  
   46.26 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("MessageNullFromTests::check_message_null_from_encrypted_not_signed"),
   46.27 +                                                                          static_cast<Func>(&MessageNullFromTests::check_message_null_from_encrypted_not_signed)));                                                                  
   46.28 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("MessageNullFromTests::check_message_null_from_encrypted_and_signed"),
   46.29 +                                                                          static_cast<Func>(&MessageNullFromTests::check_message_null_from_encrypted_and_signed)));                                                                                                                                            
   46.30 +}
   46.31 +
   46.32 +void MessageNullFromTests::import_alice_pub() {
   46.33 +    const string alice_pub_key = slurp("test_keys/pub/pep-test-alice-0x6FF00E97_pub.asc");
   46.34 +    PEP_STATUS status = import_key(session, alice_pub_key.c_str(), alice_pub_key.length(), NULL);
   46.35 +    assert(status == PEP_STATUS_OK);
   46.36 +}
   46.37 +
   46.38 +void MessageNullFromTests::import_bob_pair_and_set_own() {
   46.39 +    const string bob_pub_key = slurp("test_keys/pub/pep-test-bob-0xC9C2EE39_pub.asc");
   46.40 +    const string bob_priv_key = slurp("test_keys/priv/pep-test-bob-0xC9C2EE39_priv.asc");
   46.41 +    PEP_STATUS status = import_key(session, bob_pub_key.c_str(), bob_pub_key.length(), NULL);
   46.42 +    assert(status == PEP_STATUS_OK);
   46.43 +    status = import_key(session, bob_priv_key.c_str(), bob_priv_key.length(), NULL);
   46.44 +    assert(status == PEP_STATUS_OK);
   46.45 +}
   46.46 +
   46.47 +void MessageNullFromTests::setup() {
   46.48 +    EngineTestIndividualSuite::setup();
   46.49 +    import_bob_pair_and_set_own();
   46.50 +}
   46.51 +
   46.52 +void MessageNullFromTests::check_message_null_from_no_header_key_unencrypted() {
   46.53 +    string null_from_msg = slurp("test_files/432_no_from_2.eml");
   46.54 +    cout << null_from_msg << endl;
   46.55 +    stringlist_t* keylist = NULL;
   46.56 +    PEP_decrypt_flags_t flags;
   46.57 +    PEP_rating rating;
   46.58 +    char* mime_plaintext = NULL;
   46.59 +    char* modified_src = NULL;
   46.60 +    PEP_STATUS status = MIME_decrypt_message(session, null_from_msg.c_str(),
   46.61 +                                             null_from_msg.size(),
   46.62 +                                             &mime_plaintext,
   46.63 +                                             &keylist,
   46.64 +                                             &rating,
   46.65 +                                             &flags,
   46.66 +                                             &modified_src);
   46.67 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));                                         
   46.68 +}
   46.69 +
   46.70 +void MessageNullFromTests::check_message_null_from_header_key_unencrypted() {
   46.71 +    string null_from_msg = slurp("test_files/432_no_from.eml");
   46.72 +    cout << null_from_msg << endl;
   46.73 +    stringlist_t* keylist = NULL;
   46.74 +    PEP_decrypt_flags_t flags;
   46.75 +    PEP_rating rating;
   46.76 +    char* mime_plaintext = NULL;
   46.77 +    char* modified_src = NULL;
   46.78 +    PEP_STATUS status = MIME_decrypt_message(session, null_from_msg.c_str(),
   46.79 +                                             null_from_msg.size(),
   46.80 +                                             &mime_plaintext,
   46.81 +                                             &keylist,
   46.82 +                                             &rating,
   46.83 +                                             &flags,
   46.84 +                                             &modified_src);
   46.85 +    TEST_ASSERT_MSG(status == PEP_UNENCRYPTED, tl_status_string(status));                                         
   46.86 +}
   46.87 +
   46.88 +void MessageNullFromTests::check_message_null_from_encrypted_not_signed() {
   46.89 +    import_alice_pub();
   46.90 +    string null_from_msg = slurp("test_files/432_no_from_encrypted_not_signed.eml");
   46.91 +    cout << null_from_msg << endl;
   46.92 +    stringlist_t* keylist = NULL;
   46.93 +    PEP_decrypt_flags_t flags;
   46.94 +    PEP_rating rating;
   46.95 +    char* mime_plaintext = NULL;
   46.96 +    char* modified_src = NULL;
   46.97 +    PEP_STATUS status = MIME_decrypt_message(session, null_from_msg.c_str(),
   46.98 +                                             null_from_msg.size(),
   46.99 +                                             &mime_plaintext,
  46.100 +                                             &keylist,
  46.101 +                                             &rating,
  46.102 +                                             &flags,
  46.103 +                                             &modified_src);
  46.104 +    TEST_ASSERT_MSG(status == PEP_DECRYPTED, tl_status_string(status));                                         
  46.105 +    TEST_ASSERT(mime_plaintext);
  46.106 +}
  46.107 +
  46.108 +void MessageNullFromTests::check_message_null_from_encrypted_and_signed() {
  46.109 +    import_alice_pub();    
  46.110 +    string null_from_msg = slurp("test_files/432_no_from_encrypted_and_signed.eml");
  46.111 +    cout << null_from_msg << endl;
  46.112 +    stringlist_t* keylist = NULL;
  46.113 +    PEP_decrypt_flags_t flags;
  46.114 +    PEP_rating rating;
  46.115 +    char* mime_plaintext = NULL;
  46.116 +    char* modified_src = NULL;
  46.117 +    PEP_STATUS status = MIME_decrypt_message(session, null_from_msg.c_str(),
  46.118 +                                             null_from_msg.size(),
  46.119 +                                             &mime_plaintext,
  46.120 +                                             &keylist,
  46.121 +                                             &rating,
  46.122 +                                             &flags,
  46.123 +                                             &modified_src);
  46.124 +    TEST_ASSERT_MSG(status == PEP_STATUS_OK, tl_status_string(status));                                         
  46.125 +    TEST_ASSERT(mime_plaintext);
  46.126 +}
  46.127 +
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/test/src/engine_tests/UserIdCollisionTests.cc	Thu Oct 11 13:04:02 2018 +0200
    47.3 @@ -0,0 +1,336 @@
    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 +
   47.11 +#include "pEpEngine.h"
   47.12 +
   47.13 +#include "test_util.h"
   47.14 +#include "EngineTestIndividualSuite.h"
   47.15 +#include "UserIdCollisionTests.h"
   47.16 +
   47.17 +using namespace std;
   47.18 +
   47.19 +UserIdCollisionTests::UserIdCollisionTests(string suitename, string test_home_dir) :
   47.20 +    EngineTestIndividualSuite::EngineTestIndividualSuite(suitename, test_home_dir) {
   47.21 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision"),
   47.22 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision)));                                                                  
   47.23 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::simple_tofu_collision_different_usernames"),
   47.24 +                                                                      static_cast<Func>(&UserIdCollisionTests::simple_tofu_collision_different_usernames)));                                                                                                                                        
   47.25 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus"),
   47.26 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus)));                                                                                                                                                                                                              
   47.27 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames"),
   47.28 +                                                                      static_cast<Func>(&UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames)));
   47.29 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::real_followed_by_explicit_tofu"),
   47.30 +                                                                      static_cast<Func>(&UserIdCollisionTests::real_followed_by_explicit_tofu)));
   47.31 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_normal"),
   47.32 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_normal)));                                                                  
   47.33 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set"),
   47.34 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set)));                                                                  
   47.35 +    add_test_to_suite(std::pair<std::string, void (Test::Suite::*)()>(string("UserIdCollisionTests::merge_records_set_2"),
   47.36 +                                                                      static_cast<Func>(&UserIdCollisionTests::merge_records_set_2)));                                                                                                                                        
   47.37 +}
   47.38 +
   47.39 +void UserIdCollisionTests::setup() {
   47.40 +    EngineTestIndividualSuite::setup();
   47.41 +    user_alice = new_identity(alice_email, alice_keyid, PEP_OWN_USERID, "Alice from Mel's Diner");
   47.42 +    slurp_and_import_key(session, alice_keyfile);    
   47.43 +    
   47.44 +    real_alex = new_identity(alex_email, alex_keyid, "AlexID", "Alexander the Mediocre");
   47.45 +    
   47.46 +    tofu_alex = new_identity(alex_email, alex_keyid, NULL, NULL);
   47.47 +
   47.48 +    real_alex_0 = new_identity(alex_email, alex_keyid, "Alex0", "Alexander the Mediocre");
   47.49 +    
   47.50 +    tofu_alex_0 = new_identity(alex_email, alex_keyid, NULL, NULL);
   47.51 +    
   47.52 +    real_alex_1 = new_identity(alex1_email, alex_keyid, "Alex1", NULL);
   47.53 +    
   47.54 +    tofu_alex_1 = new_identity(alex1_email, alex1_keyid, NULL, NULL);
   47.55 +
   47.56 +    real_alex_2 = new_identity(alex2_email, alex1_keyid, "Alex2", NULL);
   47.57 +
   47.58 +    tofu_alex_2 = new_identity(alex2_email, alex2_keyid, NULL, NULL);
   47.59 +
   47.60 +    real_alex_3 = new_identity(alex3_email, alex2_keyid, "Alex3", NULL);
   47.61 +
   47.62 +    tofu_alex_3 = new_identity(alex3_email, alex3_keyid, NULL, NULL);
   47.63 +
   47.64 +    real_alex_4 = new_identity(alex4_email, alex3_keyid, "Alex4", NULL);
   47.65 +
   47.66 +    tofu_alex_4 = new_identity(alex4_email, alex4_keyid, NULL, NULL);
   47.67 +
   47.68 +    real_alex_5 = new_identity(alex5_email, alex4_keyid, "Alex5", NULL);
   47.69 +
   47.70 +    tofu_alex_5 = new_identity(alex5_email, alex5_keyid, NULL, NULL);
   47.71 +
   47.72 +    real_alex_6a = new_identity(alex6_email, alex5_keyid, "Alex6", NULL);
   47.73 +
   47.74 +    tofu_alex_6a = new_identity(alex6_email, alex6a_keyid, NULL, NULL);
   47.75 +
   47.76 +    real_alex_6b = new_identity(alex6_email, alex6a_keyid, "Alex6", NULL);
   47.77 +
   47.78 +    tofu_alex_6b = new_identity(alex6_email, alex6b_keyid, NULL, NULL);
   47.79 +
   47.80 +    real_alex_6c = new_identity(alex6_email, alex6b_keyid, "Alex6", NULL);
   47.81 +
   47.82 +    tofu_alex_6c = new_identity(alex6_email, alex6c_keyid, NULL, NULL);
   47.83 +
   47.84 +    real_alex_6d = new_identity(alex6_email, alex6c_keyid, "Alex6", NULL);
   47.85 +
   47.86 +    tofu_alex_6d = new_identity(alex6_email, alex6d_keyid, NULL, NULL);
   47.87 +}
   47.88 +
   47.89 +void UserIdCollisionTests::tear_down() {
   47.90 +    free_identity(real_alex);
   47.91 +    free_identity(real_alex_0);
   47.92 +    free_identity(real_alex_1);
   47.93 +    free_identity(real_alex_2);
   47.94 +    free_identity(real_alex_3);
   47.95 +    free_identity(real_alex_4);
   47.96 +    free_identity(real_alex_5);
   47.97 +    free_identity(real_alex_6a);
   47.98 +    free_identity(real_alex_6b);
   47.99 +    free_identity(real_alex_6c);
  47.100 +    free_identity(real_alex_6d);
  47.101 +    free_identity(tofu_alex);
  47.102 +    free_identity(tofu_alex_0);
  47.103 +    free_identity(tofu_alex_1);
  47.104 +    free_identity(tofu_alex_2);
  47.105 +    free_identity(tofu_alex_3);
  47.106 +    free_identity(tofu_alex_4);
  47.107 +    free_identity(tofu_alex_5);
  47.108 +    free_identity(tofu_alex_6a);
  47.109 +    free_identity(tofu_alex_6b);
  47.110 +    free_identity(tofu_alex_6c);
  47.111 +    free_identity(tofu_alex_6d);
  47.112 +    EngineTestIndividualSuite::tear_down();    
  47.113 +}
  47.114 +
  47.115 +void UserIdCollisionTests::simple_tofu_collision() {
  47.116 +    slurp_and_import_key(session,alex_keyfile);
  47.117 +    tofu_alex->username = strdup("Alexander the Mediocre");
  47.118 +    PEP_STATUS status = update_identity(session, tofu_alex);
  47.119 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.120 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  47.121 +    string tofu_id = string("TOFU_") + alex_email;
  47.122 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  47.123 +    status = update_identity(session, real_alex);
  47.124 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.125 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  47.126 +    bool tofu_still_exists = false;
  47.127 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  47.128 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.129 +    TEST_ASSERT(!tofu_still_exists);    
  47.130 +}
  47.131 +
  47.132 +void UserIdCollisionTests::simple_tofu_collision_different_usernames() {
  47.133 +    slurp_and_import_key(session,alex_keyfile);
  47.134 +    tofu_alex->username = strdup("Alexander Hamilton");
  47.135 +    PEP_STATUS status = update_identity(session, tofu_alex);
  47.136 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.137 +    TEST_ASSERT_MSG(strcmp(tofu_alex->fpr, alex_keyid) == 0, tofu_alex->fpr);
  47.138 +    string tofu_id = string("TOFU_") + alex_email;
  47.139 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, tofu_id.c_str()) == 0, tofu_alex->user_id);    
  47.140 +    status = update_identity(session, real_alex);
  47.141 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.142 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  47.143 +    bool tofu_still_exists = false;
  47.144 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  47.145 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.146 +    // SHOULD still exist, because we don't replace when usernames differ
  47.147 +    TEST_ASSERT(tofu_still_exists);    
  47.148 +}
  47.149 +
  47.150 +void UserIdCollisionTests::tofu_collision_two_tofus() {
  47.151 +    slurp_and_import_key(session,alex6a_keyfile);
  47.152 +    
  47.153 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  47.154 +    tofu_alex_6b->username = strdup("Alexander Hamilton");
  47.155 +
  47.156 +    tofu_alex_6a->lang[0] = 'j';
  47.157 +    tofu_alex_6a->lang[1] = 'p';
  47.158 +    
  47.159 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  47.160 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.161 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  47.162 +    string tofu_id = string("TOFU_") + alex6_email;
  47.163 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  47.164 +
  47.165 +    // Ok, NOW we put in an explicit TOFU
  47.166 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  47.167 +    status = update_identity(session, tofu_alex_6b);
  47.168 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.169 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  47.170 +    bool tofu_still_exists = false;
  47.171 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  47.172 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.173 +    // SHOULD still exist, because we don't replace when usernames differ
  47.174 +    TEST_ASSERT(tofu_still_exists);    
  47.175 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  47.176 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  47.177 +}
  47.178 +
  47.179 +void UserIdCollisionTests::tofu_collision_two_tofus_diff_usernames() {
  47.180 +    slurp_and_import_key(session,alex6a_keyfile);
  47.181 +    
  47.182 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  47.183 +    tofu_alex_6b->username = strdup("Alexander the Not-Cool-At-All");
  47.184 +
  47.185 +    tofu_alex_6a->lang[0] = 'j';
  47.186 +    tofu_alex_6a->lang[1] = 'p';
  47.187 +    
  47.188 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  47.189 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.190 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->fpr, alex6a_keyid) == 0, tofu_alex_6a->fpr);
  47.191 +    string tofu_id = string("TOFU_") + alex6_email;
  47.192 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6a->user_id, tofu_id.c_str()) == 0, tofu_alex_6a->user_id);    
  47.193 +
  47.194 +    // Ok, NOW we put in an explicit TOFU
  47.195 +    tofu_alex_6b->user_id = strdup(tofu_id.c_str());
  47.196 +    status = update_identity(session, tofu_alex_6b);
  47.197 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.198 +    TEST_ASSERT_MSG(strcmp(tofu_alex_6b->fpr, alex6a_keyid) == 0, tofu_alex_6b->fpr);
  47.199 +    bool tofu_still_exists = false;
  47.200 +    status = exists_person(session, tofu_alex_6a, &tofu_still_exists);
  47.201 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.202 +    // SHOULD still exist, because we don't replace when usernames differ
  47.203 +    TEST_ASSERT(tofu_still_exists);    
  47.204 +    TEST_ASSERT(tofu_alex_6b->lang[0] == 'j');
  47.205 +    TEST_ASSERT(tofu_alex_6b->lang[1] == 'p');    
  47.206 +    TEST_ASSERT(strcmp(tofu_alex_6b->username,"Alexander the Not-Cool-At-All") == 0);    
  47.207 +}
  47.208 +
  47.209 +void UserIdCollisionTests::real_followed_by_explicit_tofu() {
  47.210 +    slurp_and_import_key(session,alex_keyfile);
  47.211 +    real_alex->username = strdup("Alexander the Mediocre");
  47.212 +    PEP_STATUS status = update_identity(session, real_alex);
  47.213 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.214 +    TEST_ASSERT_MSG(strcmp(real_alex->fpr, alex_keyid) == 0, real_alex->fpr);
  47.215 +    string tofu_id = string("TOFU_") + alex_email;
  47.216 +    tofu_alex->username = strdup(real_alex->username);
  47.217 +    tofu_alex->user_id = strdup(tofu_id.c_str());
  47.218 +    status = update_identity(session, tofu_alex);
  47.219 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.220 +    TEST_ASSERT_MSG(strcmp(tofu_alex->user_id, "AlexID") == 0, tofu_alex->user_id);
  47.221 +    bool tofu_still_exists = false;
  47.222 +    free(tofu_alex->user_id);
  47.223 +    tofu_alex->user_id = strdup(tofu_id.c_str());    
  47.224 +    status = exists_person(session, tofu_alex, &tofu_still_exists);
  47.225 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.226 +    TEST_ASSERT(!tofu_still_exists);    
  47.227 +}
  47.228 +
  47.229 +void UserIdCollisionTests::merge_records_normal() {
  47.230 +    // Tofu 6a has lots of stuff.
  47.231 +    slurp_and_import_key(session,alex6a_keyfile);    
  47.232 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  47.233 +    tofu_alex_6a->lang[0] = 'e';
  47.234 +    tofu_alex_6a->lang[1] = 's';
  47.235 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  47.236 +    slurp_and_import_key(session,alex6c_keyfile);
  47.237 +    free(tofu_alex_6a->fpr);
  47.238 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  47.239 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;    
  47.240 +    status = set_identity(session, tofu_alex_6a);
  47.241 +    slurp_and_import_key(session,alex6d_keyfile);
  47.242 +    free(tofu_alex_6a->fpr);
  47.243 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  47.244 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed; // ???
  47.245 +    status = set_identity(session, tofu_alex_6a);
  47.246 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  47.247 +    status = update_identity(session, real_alex_6a);                        
  47.248 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.249 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  47.250 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed, tl_ct_string(real_alex_6a->comm_type));
  47.251 +    free(real_alex_6a->fpr);
  47.252 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  47.253 +    status = get_trust(session, real_alex_6a);
  47.254 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.255 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_OpenPGP, tl_ct_string(real_alex_6a->comm_type));    
  47.256 +}
  47.257 +
  47.258 +void UserIdCollisionTests::merge_records_set() {
  47.259 +    // Tofu 6a has lots of stuff.
  47.260 +    slurp_and_import_key(session,alex6a_keyfile);    
  47.261 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  47.262 +    tofu_alex_6a->lang[0] = 'e';
  47.263 +    tofu_alex_6a->lang[1] = 's';
  47.264 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  47.265 +    slurp_and_import_key(session,alex6b_keyfile);        
  47.266 +    slurp_and_import_key(session,alex6c_keyfile);
  47.267 +    free(tofu_alex_6a->fpr);
  47.268 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  47.269 +    tofu_alex_6a->comm_type = PEP_ct_pEp_unconfirmed;    
  47.270 +    status = set_identity(session, tofu_alex_6a);
  47.271 +    status = set_as_pep_user(session, tofu_alex_6a);     
  47.272 +    slurp_and_import_key(session,alex6d_keyfile);
  47.273 +    free(tofu_alex_6a->fpr);
  47.274 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  47.275 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  47.276 +    status = set_identity(session, tofu_alex_6a);    
  47.277 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  47.278 +    free(real_alex_6a->fpr);
  47.279 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  47.280 +    status = set_person(session, real_alex_6a, true); // NOT identit
  47.281 +    TEST_ASSERT(status == PEP_STATUS_OK);   
  47.282 +    status = update_identity(session, real_alex_6a);
  47.283 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.284 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  47.285 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  47.286 +    bool pEp_peep = false;
  47.287 +    status = is_pep_user(session, real_alex_6a, &pEp_peep);
  47.288 +    TEST_ASSERT(pEp_peep);
  47.289 +    free(real_alex_6a->fpr);
  47.290 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  47.291 +    status = get_trust(session, real_alex_6a);
  47.292 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  47.293 +    free(real_alex_6a->fpr);
  47.294 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  47.295 +    status = get_trust(session, real_alex_6a);
  47.296 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  47.297 +}
  47.298 +
  47.299 +void UserIdCollisionTests::merge_records_set_2() {
  47.300 +    // Tofu 6a has lots of stuff.
  47.301 +    slurp_and_import_key(session,alex6a_keyfile);    
  47.302 +    tofu_alex_6a->username = strdup("Alexander Hamilton");
  47.303 +    tofu_alex_6a->lang[0] = 'e';
  47.304 +    tofu_alex_6a->lang[1] = 's';
  47.305 +    PEP_STATUS status = update_identity(session, tofu_alex_6a);
  47.306 +    slurp_and_import_key(session,alex6b_keyfile);        
  47.307 +    slurp_and_import_key(session,alex6c_keyfile);
  47.308 +    free(tofu_alex_6a->fpr);
  47.309 +    tofu_alex_6a->fpr = strdup(alex6c_keyid);
  47.310 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP_unconfirmed;    
  47.311 +    status = set_identity(session, tofu_alex_6a);
  47.312 +    slurp_and_import_key(session,alex6d_keyfile);
  47.313 +    free(tofu_alex_6a->fpr);
  47.314 +    tofu_alex_6a->fpr = strdup(alex6d_keyid);
  47.315 +    tofu_alex_6a->comm_type = PEP_ct_OpenPGP;
  47.316 +    status = set_identity(session, tofu_alex_6a);    
  47.317 +    real_alex_6a->username = strdup(tofu_alex_6a->username);
  47.318 +    free(real_alex_6a->fpr);
  47.319 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  47.320 +    status = set_person(session, real_alex_6a, true); // NOT identity   
  47.321 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.322 +    status = set_as_pep_user(session, real_alex_6a);     
  47.323 +    TEST_ASSERT(status == PEP_STATUS_OK);    
  47.324 +    status = update_identity(session, real_alex_6a);
  47.325 +    TEST_ASSERT(status == PEP_STATUS_OK);
  47.326 +    TEST_ASSERT(real_alex_6a->lang[0] = 'e');
  47.327 +    TEST_ASSERT_MSG(real_alex_6a->comm_type == PEP_ct_pEp, tl_ct_string(real_alex_6a->comm_type));    
  47.328 +    bool pEp_peep = false;
  47.329 +    status = is_pep_user(session, real_alex_6a, &pEp_peep);
  47.330 +    TEST_ASSERT(pEp_peep);
  47.331 +    free(real_alex_6a->fpr);
  47.332 +    real_alex_6a->fpr = strdup(alex6c_keyid);
  47.333 +    status = get_trust(session, real_alex_6a);
  47.334 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp_unconfirmed);
  47.335 +    free(real_alex_6a->fpr);
  47.336 +    real_alex_6a->fpr = strdup(alex6d_keyid);
  47.337 +    status = get_trust(session, real_alex_6a);
  47.338 +    TEST_ASSERT(real_alex_6a->comm_type == PEP_ct_pEp);    
  47.339 +}
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/test/src/pEpTestOutput.cc	Thu Oct 11 13:04:02 2018 +0200
    48.3 @@ -0,0 +1,98 @@
    48.4 +#include <cpptest.h>
    48.5 +#include <iostream>
    48.6 +#include <iomanip>
    48.7 +#include <vector>
    48.8 +#include <string>
    48.9 +#include <cstring>
   48.10 +
   48.11 +#include "pEpTestOutput.h"
   48.12 +using namespace std;
   48.13 +
   48.14 +namespace Test {
   48.15 +	pEpTestOutput::pEpTestOutput() : _total_failed(0), _total_tests(0) {}
   48.16 +    
   48.17 +    void pEpTestOutput::outputCorrectPercentage(int num_tests, int failures, int width) {
   48.18 +        cout << setw(width);
   48.19 +        if (num_tests) {
   48.20 +            double percentage = ((num_tests - failures) / (double)num_tests) * 100;
   48.21 +            cout << std::fixed << setprecision(1) << percentage << "\%"; 
   48.22 +        }
   48.23 +        else 
   48.24 +            cout << "N/A";
   48.25 +    }
   48.26 +    	
   48.27 +	void pEpTestOutput::finished(int tests, const Test::Time& time) {
   48.28 +        cout << huge_sepline << endl;
   48.29 +        string header = "FULL TEST RUN RESULTS:";
   48.30 +        cout << alt_sepline << left << setw(header.size()) << header;
   48.31 +        cout << right << setw(56 - header.size()) << "+" << endl;
   48.32 +        cout << right << setw(30) << "Number of tests run: " << setw(7) << tests << setw(19) << "+" << endl;
   48.33 +        cout << right << setw(30) << "Tests failed: " << setw(7) << _total_failed << setw(19) << "+" << endl;
   48.34 +        cout << right << setw(30) << "Pass percentage: ";
   48.35 +        outputCorrectPercentage(_total_tests, _total_failed, 7);
   48.36 +        cout << setw(18) << "+" << endl;
   48.37 +        cout << setw(56) << "+" << endl;
   48.38 +        string finalstr = std::to_string(tests) + " tests run in " + std::to_string(time.seconds()) + "." + std::to_string(time.microseconds()) + " seconds.";
   48.39 +        int remlen = 56 - finalstr.size();
   48.40 +        cout << left << setw(finalstr.size()) << finalstr << right << setw(remlen) << "+" << endl;
   48.41 +        cout << alt_sepline << endl;
   48.42 +	}
   48.43 +	
   48.44 +	void pEpTestOutput::suite_start(int tests, const string& name) {
   48.45 +        _suite_failed = 0;
   48.46 +        _suite_name = name;
   48.47 +        _suite_total = 0;
   48.48 +        if (tests > 0) {
   48.49 +            cout << endl << huge_sepline;
   48.50 +            cout << "BEGIN TEST SUITE: " << name << endl << endl;
   48.51 +        }
   48.52 +	}
   48.53 +	
   48.54 +	void pEpTestOutput::suite_end(int tests, const string& name, const Test::Time& time)
   48.55 +	{
   48.56 +        if (tests > 0) {
   48.57 +            cout << endl << "Suite results:" << endl; 
   48.58 +            cout << right << setw(30) << "Number of tests run: " << setw(7) << tests << endl;
   48.59 +            cout << right << setw(30) << "Tests failed: " << setw(7) << _suite_failed << endl;
   48.60 +            cout << right << setw(30) << "Pass percentage: ";
   48.61 +            outputCorrectPercentage(_suite_total, _suite_failed, 7);
   48.62 +            cout << endl << endl;
   48.63 +            cout << tests << " tests run in " << time << " seconds." << endl;
   48.64 +            cout << endl;
   48.65 +            cout << "END TEST SUITE: " << name << endl;
   48.66 +        }
   48.67 +	}
   48.68 +    
   48.69 +	void pEpTestOutput::test_start(const std::string& name) {
   48.70 +        _test_name = name;
   48.71 +        cout << med_sepline;
   48.72 +        cout << "Begin test " << name << endl;
   48.73 +        cout << lil_sepline;
   48.74 +        _test_errors.clear();
   48.75 +    }
   48.76 +    void pEpTestOutput::test_end(const string& name, bool ok, const Test::Time&) {
   48.77 +	    if (!ok) {
   48.78 +            _suite_failed++;
   48.79 +            _total_failed++;
   48.80 +            cout << endl << endl << alt_sepline;
   48.81 +            cout << "*** Test " << name << " failed!" << endl;
   48.82 +            vector<Source>::iterator it;
   48.83 +            for (it = _test_errors.begin(); it != _test_errors.end(); it++) {
   48.84 +                Source src = *it;
   48.85 +                cout << lil_sepline;
   48.86 +                cout << left << setw(25) << "*** Assert location: " << src.file() << ":" << src.line() << endl;
   48.87 +                cout << left << setw(25) << "*** Message: " << src.message() << endl;                
   48.88 +            }
   48.89 +            cout << alt_sepline << endl;
   48.90 +        }
   48.91 +        _total_tests++;
   48.92 +        _suite_total++;
   48.93 +
   48.94 +        cout << "End test " << name << endl;
   48.95 +        cout << med_sepline;        
   48.96 +	}
   48.97 +	
   48.98 +	void pEpTestOutput::assertment(const Source& s) {
   48.99 +		_test_errors.push_back(s);
  48.100 +	}
  48.101 +}
  48.102 \ No newline at end of file
    49.1 --- a/test/src/util/test_util.cc	Thu Oct 11 13:01:56 2018 +0200
    49.2 +++ b/test/src/util/test_util.cc	Thu Oct 11 13:04:02 2018 +0200
    49.3 @@ -13,6 +13,11 @@
    49.4  #include <unistd.h>
    49.5  #include <ftw.h>
    49.6  
    49.7 +bool file_exists(std::string filename) {
    49.8 +    struct stat buffer;
    49.9 +    return (stat(filename.c_str(), &buffer) == 0);
   49.10 +}
   49.11 +
   49.12  char* str_to_lower(const char* str) {
   49.13      if (!str)
   49.14          return NULL;
   49.15 @@ -331,14 +336,19 @@
   49.16      }
   49.17  }
   49.18  
   49.19 +bool slurp_and_import_key(PEP_SESSION session, const char* key_filename) {
   49.20 +    std::string keyfile = slurp(key_filename);
   49.21 +    if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   49.22 +        return false;
   49.23 +    return true;
   49.24 +}
   49.25 +
   49.26  bool slurp_message_and_import_key(PEP_SESSION session, const char* message_fname, std::string& message, const char* key_filename) {
   49.27 +    bool ok = true;
   49.28      message = slurp(message_fname);
   49.29 -    if (key_filename) {
   49.30 -        std::string keyfile = slurp(key_filename);
   49.31 -        if (import_key(session, keyfile.c_str(), keyfile.size(), NULL) != PEP_STATUS_OK)
   49.32 -            return false;
   49.33 -    }
   49.34 -    return true;
   49.35 +    if (key_filename)
   49.36 +        ok = slurp_and_import_key(session, key_filename);
   49.37 +    return ok;
   49.38  }
   49.39  
   49.40  
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/test/test_files/432_no_from.eml	Thu Oct 11 13:04:02 2018 +0200
    50.3 @@ -0,0 +1,492 @@
    50.4 +Return-Path: <SRS0=Imtu/Y=LL=pep.foundation=krista@srs.smtpin.rzone.de>
    50.5 +X-Original-To: krista@gnunet.org
    50.6 +Delivered-To: krista@gnunet.org
    50.7 +Received: from vmmailrelay1.informatik.tu-muenchen.de (mailrelay1.informatik.tu-muenchen.de [131.159.254.14])
    50.8 +	by sam.net.in.tum.de (Postfix) with ESMTP id 35CD81C00C7
    50.9 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   50.10 +Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid 109)
   50.11 +	id 54A621C038A; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   50.12 +Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost [127.0.0.1])
   50.13 +	by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 309F81C037B
   50.14 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   50.15 +Received: from vmmaildmz1.informatik.tu-muenchen.de (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87])
   50.16 +	by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 25AB31C0376
   50.17 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   50.18 +Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid 109)
   50.19 +	id 241CB1C2DD6; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   50.20 +X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
   50.21 +	vmmaildmz1.informatik.tu-muenchen.de
   50.22 +X-Spam-Level: 
   50.23 +X-Spam-Status: No, score=-1.9 required=7.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE,
   50.24 +	SPF_HELO_PASS,UNPARSEABLE_RELAY autolearn=no autolearn_force=no
   50.25 +	version=3.4.0-tuminfo_1
   50.26 +Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
   50.27 +	by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id 10E381C2DD4
   50.28 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:02 +0200 (CEST)
   50.29 +Received: from mi4-p00-ob.smtp.rzone.de (mi4-p00-ob.smtp.rzone.de [85.215.255.5])
   50.30 +	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
   50.31 +	(No client certificate requested)
   50.32 +	by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id F26571C2DC6
   50.33 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:01 +0200 (CEST)
   50.34 +X-RZG-FWD-BY: krista@darthmama.org
   50.35 +Received: from mailin.rzone.de ([unix socket])
   50.36 +	by mailin.rzone.de (RZmta 43.21) with LMTPA;
   50.37 +	Tue, 28 Aug 2018 14:34:00 +0200 (CEST)
   50.38 +Authentication-Results: strato.com; dmarc=none header.from=pep.foundation
   50.39 +Authentication-Results: strato.com; arc=none
   50.40 +Authentication-Results: strato.com; dkim=none
   50.41 +Authentication-Results: strato.com; dkim-adsp=none header.from="krista@pep.foundation"
   50.42 +Authentication-Results: strato.com; spf=none smtp.mailfrom="krista@pep.foundation"
   50.43 +X-RZG-Expurgate: clean/normal
   50.44 +X-RZG-Expurgate-ID: 149500::1535459640-000020CD-236E2DC3/0/0
   50.45 +X-Strato-MessageType: email
   50.46 +X-RZG-CLASS-ID: mi00
   50.47 +Received-SPF: none
   50.48 +	client-ip=131.159.0.36;
   50.49 +	helo="mail-out2.informatik.tu-muenchen.de";
   50.50 +	envelope-from="krista@pep.foundation";
   50.51 +	receiver=smtpin.rzone.de;
   50.52 +	identity=mailfrom;
   50.53 +Received: from mail-out2.informatik.tu-muenchen.de ([131.159.0.36])
   50.54 +	by smtpin.rzone.de (RZmta 43.21 OK)
   50.55 +	with ESMTPS id f090f3u7SCY02qG
   50.56 +	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA))
   50.57 +	(Client did not present a certificate)
   50.58 +	for <krista@darthmama.org>;
   50.59 +	Tue, 28 Aug 2018 14:34:00 +0200 (CEST)
   50.60 +Received: from [192.168.0.102] (ip5f584961.dynamic.kabel-deutschland.de [95.88.73.97])
   50.61 +	by services.sec.in.tum.de (Postfix) with ESMTPSA id 6A14A1008E943
   50.62 +	for <krista@darthmama.org>; Tue, 28 Aug 2018 14:33:54 +0200 (CEST)
   50.63 +To: krista@darthmama.org
   50.64 +From: 
   50.65 +Subject: Message to edit
   50.66 +Openpgp: preference=signencrypt
   50.67 +Organization: =?UTF-8?B?cOKJoXA=?=
   50.68 +Message-ID: <b651dc6c-513c-b584-7309-49eca57c5fc3@pep.foundation>
   50.69 +Date: Tue, 28 Aug 2018 14:33:53 +0200
   50.70 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   50.71 + Thunderbird/52.9.1
   50.72 +MIME-Version: 1.0
   50.73 +Content-Type: multipart/mixed;
   50.74 + boundary="------------D703284A94612CBD63CC1F3B"
   50.75 +Content-Language: en-US
   50.76 +
   50.77 +This is a multi-part message in MIME format.
   50.78 +--------------D703284A94612CBD63CC1F3B
   50.79 +Content-Type: text/plain; charset=utf-8
   50.80 +Content-Transfer-Encoding: 7bit
   50.81 +
   50.82 +This message will be edited so that the "from" field is missing.
   50.83 +
   50.84 +--------------D703284A94612CBD63CC1F3B
   50.85 +Content-Type: application/pgp-keys;
   50.86 + name="0x34346730473419EB.asc"
   50.87 +Content-Transfer-Encoding: 7bit
   50.88 +Content-Disposition: attachment;
   50.89 + filename="0x34346730473419EB.asc"
   50.90 +
   50.91 +-----BEGIN PGP PUBLIC KEY BLOCK-----
   50.92 +
   50.93 +mQINBFhFRHMBEAC9MOXvvFrVJWpK2SDYfeDsft4ExuI9lLTvi5bzQKyvr3PkctEW
   50.94 +w4Cr3kdNwbqIXO7diMSnbEJvh8OvvrII7hJcStpNSIIYZf9UBAAIIaPJelm26cxI
   50.95 +JN9SsBxAYuPrY3OzHAgNS+/QGnkXjQxI3a6rJ38kVsMavl+q85Pm5m3WUcNko+gE
   50.96 +YkSu5F7Fb4h7wyeF4uyHgPoSEA/qaQcqUoLT+xHyWDTUb+NBZhc4jO6W38FP2Gbh
   50.97 +kNwDwKQrrgbMizEys4qmysdZOYOFWvyBNcQ3/qlkF9BbefPwDTnez0wKy2W4jr62
   50.98 +l3mc8k3MU1+NBEa03uoAaHCHr3MeEbOSwR2MiCshiBzE4HSeadQFIeruPCYHD8Vo
   50.99 +kV5wwbskVPs900ILDuSSsjamKsQROSIK2F94yqB0U6cTEc/cbZY8cNLLZkYsziSd
  50.100 +uI86H++ohEJ+apr2BkIYWnccuziqTzIIFixDHdYe3WBkR+hooL5i327mG4uRjAnT
  50.101 +hcgtCPzxzBC//0ktF1aS63Q8FrpjQ9MFBZEmYNl0Tae/b6nO1aVh9evyeoAx+Bmp
  50.102 +7rl47FWNjQl6zBbBrLoWmz3D79e3IxQs0l7niqDphkOuQy4hAFoLCy21QCxXJ0FY
  50.103 +VRB6F9Fd6Ha8SL4lMBjfYpG0yU5EGJcCo7gMV1D/cdQ8KCHSEd7jUopBVwARAQAB
  50.104 +tCZLcmlzdGEgQmVubmV0dCA8a3Jpc3RhQHBlcC5mb3VuZGF0aW9uPokCQAQTAQgA
  50.105 +KgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAIZAQUCWwwDoAUJBokmLQAKCRA0
  50.106 +NGcwRzQZ61u4D/9mRxSKqrCgblgJrZ4YYBV5FWIcD4yIe8TZ3vzqOyHwtftVWERF
  50.107 +3LbKYwYfaOAZRpL+nonA0UZx3DlSIRvnT5Ne/5NSHHsSrU/6OzBooHFWAn2lqsGO
  50.108 +ADL3a9w/Acdx14E9a5NdyhDyZZVr02ipyxtwKUgKae7i+mdjTvBBLrPfjg1kKroN
  50.109 +P8obk3qNaUeLHlG46WndLosAAEVrU8VHnpUCpxRU5s6JWu0omtPcpmWhaSfowogw
  50.110 +HGzViwoe3NxQLYwBZuZuOp5QmhemqKU2sBNxX0ZaNijGctYLjmO7qTgKK/IF24df
  50.111 +51362TNoQ8gBUQGVKiOM5dkm9YsXMoAL+ClsvNtMwasHvtvnXviTkPvjs8FnjX2P
  50.112 +UGGZhFvrgqvIO4eR1GyuvasOIQjLcTG58sWPuZLvEwcMtyinNVyvzpLPnkOlhaRH
  50.113 +F88plA5xrQT0bKLuqN0ve8jZvLJT/As9MRSm2ftZMTwmaR4HN0JduMsBrE4Boef+
  50.114 +9UQHzfL0Ivq3G/TzkmTIyblaPUvKLKfsZJoq+jjp2viX0EfnEG0rZt/dse9Z0C2N
  50.115 +hQrJfSAV/yN/uXriXinYb9dQ0k4Bd9+zHPE/mhZ9Cwv6EO4fNgy+1GRfy11NeJWK
  50.116 +D4EzDFuUY7gAkJkcv3vfag0WW65rwn2pOoe1NUPqlHxqW0fOYfZYVzbf2YkCHAQT
  50.117 +AQgABgUCWwwGVAAKCRAFca+8pUk1U2y+D/oDA8Q9X7BtRuVQFAvS9QjqxI0ZsN9y
  50.118 +kVhq6CnJ7e8Fk1av41ztWtUy7yo3DiGur71Fd+4tCcGX7ofqGGv4LhUDCUOzSxih
  50.119 +1LNKPsMjRZo1gMZH/TSyVYLVhW/A5LK2Zvpmyc34DN4iFrb8uJ8a/sW2LlAXHEou
  50.120 +LGnJ/qTzHtVxZtrnaKmTQdRovWfrDgdFSbK5ZXM7tfxfeeUVv2TZwZngM4MTdaTa
  50.121 +vcOM/jGjvX1CjbZYePllU8WkxgLPh+Uwrdqzlyc35gzR7agT/MvWbmNFcA3myjis
  50.122 +5CRW5b6B67EM6tqxC2i4jau2P/TRPoHZaGLxkhgfdbsBDxgndUDi/Rgav7FdXmu0
  50.123 +etgJRvKEfthpHFt7/U7BYeChg0mweJkKSRKWNj+P9aR7YKgFLtD8iNLd7lonEtit
  50.124 +Vxj22n8Kw4cZRyB0m9l5V1FkkROEVd++sOUhivVCYWP4SpGjUiqkpcW5UL4Envjx
  50.125 +7CKAgZxGUr4qwAIUsET2y06zEqywTPvxarbZy0ltQrEpBAflOkJ0NuwIoBaKSE0G
  50.126 +rl6YaCZ0JvjkFV79eFcmNA4apjkZ2yBhxqUjw7HZ3L3JU13Bw4y8iYiiWx5HZdBe
  50.127 +BEQcSK9abdyxqX+tH2ZL+n/FSIJ5QTxeQzpnihjHHXARaHDrFdUWU4JoVdPuIwsz
  50.128 +QQpPh74u6lPchYkBMwQTAQgAHRYhBArpqj4yBZXPkylr36FVrEkczPxBBQJbGj2e
  50.129 +AAoJEKFVrEkczPxBn4UH/Rxsl+mZSfqGFS3aRdIFM1JTEFZC53cfUxmbAk//V4j7
  50.130 +o9h27LE22T4n8UqT60fYelSg1Ks1TluR4SoHFsZMiT3hzWTu3LHydsaUW6NoG/ie
  50.131 +O8PuMPge0NVTmF40PRcUSgy8aqA+Q2BeTt4itcLyro/pZz4lbkZ1oJt2WG8b5qKj
  50.132 +VJCILCHuZZnJHDVN1dqv2g17UQbzfor7DWO71/+wdEsnsLXYWp6FbZJsnq0S3ENn
  50.133 +hcy0ylXnZbXmaAd4PctJvsuGkB2km64F1bE98ljSz1QmyNfvB2Tgr2w5nULZl9Xf
  50.134 +z77M+qo27OyaWMT/GEROVM3+a34cobKnjSFcK6aixCa0L0tyaXN0YSBCZW5uZXR0
  50.135 +IChw4omhcCkgPGtyaXN0YUBwZXAtcHJvamVjdC5vcmc+iQJCBBMBCAAsAhsDBwsJ
  50.136 +CAcDAgEGFQgCCQoLBBYCAwECHgECF4ACGQEFAlodK0gFCQO5GlUACgkQNDRnMEc0
  50.137 +GeuE/A/+Jvgu6WhQhPv0yhvpO5NFSYDT/P9Ez/BGAWF+Vf2yHufv3WZS0i/MyU0b
  50.138 +DEKHdvDOWnPGzU4kxGWwftkyGtVKA47Vs1p96m37PzbsSQh1gyedSHy7BLFt/92g
  50.139 +OXY5/Lt+5MEDLJSqmnW5rt4xc0zkg6gKlIYiu8LCYEtG/OAW7WDx0mHWV/bXEKBu
  50.140 +aprxU4A+1sN/VFI5SXILUHW15t+CczpX7yrcIlelB17+sgeBa37ynAcxBABxA83+
  50.141 +at+90s3Pxur4iYaWrAbKnrG62VV3W0uuYQNLfV7DKPgaXM6XbOhipIE+yS1EYnf3
  50.142 +JKzQl06G40atPPmb35Nkvfk/JgPF5byJ+uKO4ntsqa8XKt3GbRY2/mKiO2WVvd0w
  50.143 +RfyuEYW3H/gvv1TZJBEqDtbjmgAEbdnGdkfldV5UAcYLzzM6GC9zrKrPuGrKUkdm
  50.144 +9FRKooKJ5JS6CYfHlZfKipdAyQ9gGyfZT5Tz6f+1/xJkwO+JpWsZV5LUua6XzfJn
  50.145 +vA2lVT5RPRZ7y1D7XKzIs24cfnf1Y4YSIAiwl90DpFLKJjISQTlAJ7Bd/yhyv8/J
  50.146 +csqIgA19Lqpr7jApk9/YNZyj9AjFmJ/ce6L8LYTum+a/ccmI4x+tmdXGtyjTsH5n
  50.147 +mjxBrhiCct+NpR6paLZxKKtJZkLX8V3Cfsq4JajIccUOUcN7w3WJAj8EEwEIACkC
  50.148 +GwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAUCWwwDoAUJBokmLQAKCRA0NGcw
  50.149 +RzQZ69e4D/4xYImZNBUCADolemNsGn4lcGdgbeUtamUx9oycUEGBFAHIzTOkGtf3
  50.150 +P9Lhq+GCgS9Fi171RUwtlLpjriu+GPOltwTPKx4G4l30YrrmouNVzJlBOozp+jB4
  50.151 +OsygcNTxJqPywkGlI9F+O8zuBE15imjavSINV63y9Ypib+LnpPIOs34t4iq/jCdK
  50.152 +pVbMvNzyzgqBHOymyKh1CIq6UCpeWdbokJsBhknwhtWG/ZuY1aH6JwmZXBSfGsqh
  50.153 +241a3n46tIYWRbF4TCpbAJiWM/Yg5Es4tvT1tZMzIg2Z6TCQkZhbv9yv4vPyBICl
  50.154 +OPSH79J24hmbWF6hDdi8DVi0STDmi/bxA8kKROdhgc9ZKz5bHaVlyewYdNNPGH3I
  50.155 +/euATdTUBPs4g7n/i0P43XuyLvtOBG9m2KfkJmODOiwqlf1/RSDYOWn1uepAxOQ6
  50.156 +vfUm7ELwPx3DLE2J7PPa8fxg4Iph69UP9aF7aOXt61t0fn1Olttc5ANjZuTHYyvq
  50.157 +aPeRPoAmJY1RM26BAzhSdLYwZViEbUhPdmGmTBAJ98PnsvXV4UHI4oyDiZOtg5B0
  50.158 +CRc1jcdabl7YvnBauWJBGs0saHxvFOHXdBftC5cx19kO8vFfoUS6wdM6Ots8hZee
  50.159 +MIOIJZ+xwZSdVA1CMq4v5PrEzbfrHh6oSZ4AkJnFpvne6zX/7TAnlIkCQgQTAQgA
  50.160 +LAIbAwUJAeEzgAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJZLp7LAhkBAAoJ
  50.161 +EDQ0ZzBHNBnrGgQQAJRnVH0L6X3aNkmLwZrvtWlrfSNG56g+WNRH9KN3NsQ6l4dC
  50.162 +t0IHq9wXZiydTvM+knRnzhpkKNA4bE+mFpSngiC51huE9kvXa4K0s0/oJqfZGfrY
  50.163 +JeaeEWDOxZQ+c0cxAquRL8gB0L+nbEx0KwyKeXexi29Wrxq53Jc3DBJPeeC1zDkd
  50.164 +z1+K0GcnmSBnH1BxJwXqgXg+8wo3CmQD4yn8GiY3L7pRYG+XHgnNLLsm+n6fAyFV
  50.165 +H1Xsk/BRWEu1kWKI1PHaVL8l+/xd5c7Sa3duL41z0W86VHkD0uDdKwyaH8fcV58J
  50.166 +gUEAS0E6VdMO4GnA20hbcX+IqIK/Qpp7FtT0CdcPktJhMUu6e2BXgtL75Z+pmnk3
  50.167 +LpFVSd6pCUavRQCoXO3EiDgKRypqkr8MVKE5IDdNhxo5EHq+7oHyU2lPRLkAieUf
  50.168 +9ZEun+vFiYEaV+T7hqfX4pcFw6dTDvOfl/4lxzxErvrRf+F5KHIdsMtso2clS4FW
  50.169 +GzcnuG3EQqDQe4RFRyo9smCR7KfyYJmM00c+NSrb/SJ/YOfcqUErKpVsKvlS+wY+
  50.170 +M4UkFqOshspv+v6P9b5sDVWY1dwGHAgq+bwIlrkT1BuYKsNa8Il2J2h5caoc7k+V
  50.171 +221dFV8OQa3TQX92ftuLo8ayxX5XvlKRkI5lV2ExlWNPblMjsO83/5cXGm+oiQIc
  50.172 +BBMBCAAGBQJbDAZaAAoJEAVxr7ylSTVTL6EP/0PoDMuttnJMIK76lE5/JXM/H2+Z
  50.173 +dgPUN0t8YgkaKEjvTTcBsiJlt9cnxsTxGHuTi1fdkLQYO5c8LRIVV57aY5ocntl7
  50.174 +kIEoMiUUhiVlHMSaB9PE9HQYMalrtYqhtJ/c0YfIYt0yw1CFYYaNZjKqI7O1zbM8
  50.175 +yHCfauSYOtUgX8oTs+i0/MFUed1qP4EC5W9nRzLhSkzt8jqIn3O9+jksZLAGUUm5
  50.176 +X/4F9DIesdinnsZgYIBXWVVR/04WkLnBwz/f5EhXIq/lhvpde6fNNx009mXtUwez
  50.177 +NG01j+mqm36szmj0Q8+QGhNxuL9i6EGXpoT5HKYM+f+HqO6TCYIiZIBvL1N9J87p
  50.178 +NA49TldwwHDGxNJjUPGT6t+/UcWZ7oKylr/6GyWT9si4JwlUSNMRX2l/kELit3r4
  50.179 ++QcLyxCHcyS8x4pTmnf0jP6xFjqiCJShOo6FuR/BR3bTSwx4G1H1WRpEdeammKFA
  50.180 +GjMFoskoNY8N81eST6AIR/OSZ8RoBUoSb2XTgzwr20G0xz8UefGcViA2NwNYALPh
  50.181 +FY315+zUqyfRuqu7wFLjy3rwX8LZveXIWcRW8mH2ZWk+HkEsmWs6LFqu3OHqeyO6
  50.182 +afLSylzT4U/SoG5VHA6xTNeKMWPkLkQLdvsqU4CUF/RMdq6YFJqV3NGTaZ99yHxa
  50.183 +D6L1FnATnV+nbJOuiQEzBBMBCAAdFiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsa
  50.184 +PZ4ACgkQoVWsSRzM/EElPwf/VxjzbUg/AMLIRjmLVScLKiHcwFfH+uCcFK3aw0FJ
  50.185 +J8abKS3FrTru3HwYBF7A6NmUX+/rgPBkKFDbQfz6rhLw6i72y9lkPYUd7MYsl3rl
  50.186 +kO/LIylYYdk347MJ8EQCkxSTwWYSK5SYvVecPtdLLiCJD76QOr0SmaFsCq0ad8bI
  50.187 +2iu7leQrGSfV6JITIoeQBhSLWDSfennZ7MJLg4yKskghpSwjLzZ3oidebIwxvmTi
  50.188 +nUomgTtP2pTnfSgO7wdU7ApgfQ5lTQIhfGr3LC/7F2qoeR8nJcbiE/sw0ZDvegJu
  50.189 +MJgu7Z9j26UzqakdZtCPABTJamzx6CwywTEZ24Viaf97i7Q5S3Jpc3RhIEdyb3Ro
  50.190 +b2ZmIChw4omhcCkgPGtyaXN0YS5ncm90aG9mZkBwZXAtcHJvamVjdC5vcmc+iQI/
  50.191 +BBMBCAApBQJYRUWcAhsDBQkB4TOABwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AA
  50.192 +CgkQNDRnMEc0Ges1ZxAAqJwTf/BK530mkJwU1gF/+7JbIE/PD3aed5pTQV4mTvEJ
  50.193 +fn6m+CcXCG4EpvHeetw1qLmmliGQP21VcgSgmI+fjTq/y9o+m24XUT45txsDGb6r
  50.194 +HHESh9IKhrPJtaSK7IyicUTbWo4Guvt0hEC5sFU0aKZkZEc0SS6ouPc2O8df5bwH
  50.195 +sDLNZ1ZIS9Er3VcQbEwelmFYBUowXxlabftQqFAM77Bkmio5ekMP9jK/6Zfqnw9+
  50.196 +wwb2vVW6XQ/W2mtVhNNgR+PJ71OuX1FeeKD4EGVQ8yE6HNSKB5bzDaW2+6beZqkd
  50.197 +7yvZ/c2hiz5DnY459BYEIAjkFDCNQk5/sAo9ApGENQYm6yScM08W81yiBq3BPG/l
  50.198 +Z4lhonIsG9FnL/FqqpUHKdNZSBmW6EdyjIZxg8liS9iha3JKDFanMcSOVGEquCbH
  50.199 +xV1WxVT/DSLHRgWiiqauqxZ3BHAcrnsKJySYEZzQ3i2Vtp1o1rlWSCRvn0Fh7883
  50.200 +e8j0iVyh6W8uLHq8VkgcMw/M2Y3gfdsRckWOrNkpmBeg+usZostPaeIj2AsYu1JH
  50.201 +hvLjNfQpwCwWngopdpJWexs/DClsAj6WcJYVwkl++pKqRfEKbFCPEriqxzZ4xQo5
  50.202 +eaVZcEcOxIt6kcC6XZNLorPAARd063ShcQMvugXGy5OMDO+mCvRBfjtx88jCQ4uJ
  50.203 +AhwEEwEIAAYFAlhFReMACgkQBXGvvKVJNVMKQhAAn5dYlKDWUp7c8BpYg2WQzNPZ
  50.204 +G835CbxkQ1rNWZbsxr6cjYpX3UNjhnFY7hlIWXdKB+qpURAQD1lgj3hpx0p97e+K
  50.205 +qqUroF/Y+hoLJ0j48G475TEKiL2HLSx4Gp1497BzH7yw66NDvAby0ujW8mj9AgfS
  50.206 +oo17qRukZgVkwYnz2zQ/cgXrnATi9TejimjgxucP3j5KQMbyIL5gvXk8bU4GWJ38
  50.207 +Y3HFWFXauUms+XZpP+J1B9Ucw6WylsblPGJ8ra6h9K4bVMAHP//PjK0jQsGt15Tb
  50.208 +sv4IFQ177/lJ2QAO1AlYAuuRginDQy7T9nXfpEXewbHbTWash0j3Yj0+paYLp7x/
  50.209 +5xEbLr2eG+gZ4Et2a1qeJJWjVhP1WNTtySGIAtJVAub1XcTApoq47KTxxLpBGOJM
  50.210 +eOzs728QWe2DAGXCu3Mevnjokzmesvx9nwhAq+bPaguheyt/PMWDkMxI9GgwlsDa
  50.211 +9FuAMZ6Ia3MM6CNkTxcg3PyD8/iRx0dUb5JXvXlwgw4QTUA/2UGf9qLqHTTxTV6F
  50.212 +vGRrrCvKx9jqYYpY1+hlmBEpPFOc4eiwH7yLugh8M2aAzvIHGtrSMHWe8sCEaure
  50.213 +jWWx7znH4KBe6JjaEIVHGVz14FBxvkUGO2ET+VybsTILhVECnxTM1LonEVJkCpTz
  50.214 +lB5XZxhPT/i7uGofUz2JAh8EMAEIAAkFAlkuntQCHQAACgkQNDRnMEc0GetR1A/+
  50.215 +J2phQTJYEqeKgWOzRV206dK1m+pGYWzM1Es8wtJS45hbV8xXrnWlo14JBUVC/mmh
  50.216 +j67/jrmPCnKMMnRfVtEMoB9MULR2s1M4wVzl6TJkemDNtAdgpBLyC+dBQQZyH0v6
  50.217 +TTJVhiUKsWxDR24C2Hkr54Z4KcruQv4QhHd0zUgSjyihTYdOjMpO//VaOmODCCoX
  50.218 +p48BWN2CMDeGCVDs9nvFuMDrQ1omFZCL+qZcAJbqOg5LJ/FEl+bf8noGIZ8BZphF
  50.219 +pVB+yW1sNRo/yFYboW9LiDdqENhc3Wjx/Qy9qZsThNaUuWNqLR+CdTpPZdhm5PnR
  50.220 +yBBuxb+hIfI4P1Vk1vlwcNkyu5z6gyeMOkVwEv69+olKvpwX8UhYsrE/t4NwVQCm
  50.221 +z5g/DYrGbJfz/x8cLl8h/DvO4lPAKkB0VgxDSUd3kIPQEgYgJQ1xarN3DKOyn+pL
  50.222 +/EEuWcYsiI7tA6NLS4vIxgojN5+G9EuCew6WALJKKfEgKXz6ExIgRMaTYbp01YxI
  50.223 +zXn7N3dQ22Orz14/hESncImQyretdKAtb5HuoN8fJKubvw8nJHihp7EqM64hYhUz
  50.224 +KyJa61/hXKhRK8Dyimwj8k2tTJqIG3bcax0XhhOHvurAFxV4YlQOdKeTk5m0tJ/4
  50.225 +kpVY3f9JWRY/Ug1zzPa8CeKNb/78v3Ul58S1fPnMpcy0MEtyaXN0YSBHcm90aG9m
  50.226 +ZiAocOKJoXApIDxrcmlzdGFAcGVwLXByb2plY3Qub3JnPokCPwQTAQgAKQUCWEVE
  50.227 +cwIbAwUJAeEzgAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEDQ0ZzBHNBnr
  50.228 +Q/wP/07yFuVEWLuSDmsqKuCXhwH8NxG5eQoS/0bOGp1PQLe9Pi0PW3ivXBznFh7N
  50.229 +lgVLcFbWJ18hfbXh72+zX7EsZK7z4w11ELViGvVT+9BFpMmtXVbnfEAigEqMs4F9
  50.230 +yDZVnR+d8SKS2XsKEvOyRMjybGNezPB/of4dJr/ZDRaisz1nEoEBwx+oOyzokeDb
  50.231 +AnD/0hffxqjvkMuDIPDFn/u3W2l3As9vABqF88Wwu/anPja3+d9Xv6MsBxXMz77D
  50.232 +nAghUsJ7446VEWVW3u+PZRSqN6F+LFChoMUHqHyXUkOMoYZzqTRckGyAzUQtu8sA
  50.233 +Ep0GjWezp/8Hj3ChqgLfjVurJudJd16ez0Jk1PqKemxgwzNc5McBIp3nWC1PuJwk
  50.234 +UXwBcyypfjjEckUfgtRsPRhUwabnUwK59K9ieHlyk2VJdVkhnAIBvnxoAjz4tE2J
  50.235 +o7R7dzRffbKQD/ob4kkNjCZYFGI+MkFFdAqP7iWgNxljQ9CzDWH1P9SdIAwSfMWu
  50.236 +4LFdSV9MhDt6CveCX8l9hQI79HK7HdhszCTqDON1zRK3KPtmvcl29LCtL0L2CIUX
  50.237 +uxhQ+laV/6lALQBqg/wCmA3DQt9tDmhj7gwtAuo2RPAQB90LBFrGvdN1bX4qGx2q
  50.238 +xIvGXlLSYWfuFA0mxwla90MHAHEGpMNDBqlrI7Z+zs7kKNXxiQIcBBMBCAAGBQJY
  50.239 +RUXzAAoJEAVxr7ylSTVToxYP/0ug4SViM4P8PrhjT8zuwI2yuYkY7PTSyhJi6OLW
  50.240 +/ngkXdpVmDy5TjSX/GE0QYbARa7MHmjzKM73PA72o0de9EFqNxU0rOMRj7Hxh50F
  50.241 +17fw5iwvYepKdku3JeZUB8xZkqQxFOj8Xar05Y3TfdWgCpneEwMqhtOG40DMHUtp
  50.242 +m29t8q/hEHUG5zI8j/wgNnxQFS3Z5vfsQvbGoDiPMb8qEfEzYlO/CEQhPGOQFgVh
  50.243 +ooYUJWNu3ZWoroyvGys2ANeibH8yLhnOPMVWMBMoI35ypmLLaier5n0bF9LQmPV0
  50.244 +ZRifzltfWhITIh+MDjAnQM81QiGSG+a8AaWB9mjH27C6VIoCtjrvBj3WfeHbeDwh
  50.245 +I6jmTXj2QCbiyHhb7Dym1Is11j5pL1m6rK6H6kF446hmaOielUXazASrUxmRsMLO
  50.246 +s7QiP+KC01KATEOtmRNXbu8rSbaePM3Y2Y5Hvg5d2GFloWraRQnSRj+gRcDFJtEe
  50.247 +ZAz7rCrEw5K6FxDBuO0IVY5WhJ9m1oXkepNqfsNRQxxrqYobP7IxlojVnF2guCuy
  50.248 +9xEO9Hv8b+1htoT7ERm7UlGvu8p4OqYp89gAYUVXVWiiesxMItCxWX75lPVLVnKy
  50.249 +k77jHz6N41aPYBwnzt4fQx0iT+/Ss6+zEZA0Swboz2p9dfws+uPIrUwTYZoxVLx5
  50.250 +GdPHiQIfBDABCAAJBQJZLp6fAh0AAAoJEDQ0ZzBHNBnrXnIQAIA2U6ct4eFyhDhG
  50.251 +mVmARMaddXWpaPS5xNFgWCvbZqWfVMUxEe1/BeHiA4Gkd3ew0Hudz9GXkt43LFi8
  50.252 +2uZBUV20lL1cxneacQt8o4XUGP5+oiWmuTjpSJmG16uqoEhHIpKnZIoZPDgaEtZD
  50.253 +P5TT8ioKOoM49OUT9nWmRu8dSGdCRqny4cn3Ygxnkvw645ZLL+BV49d46jLRIg/E
  50.254 +uGsDviM9lnF/rPaHgDqaZ7LyLQ/ZIHt8sJNXYl4JHWhspw9o0rlVosir2Kw23g85
  50.255 +a3wl1945bDod79PuVUHknAGdEAxhLz5TLFlGZAn354QCQdhAAU/LjjWEhz7lfXoL
  50.256 +TEWwZfu28zziPrFKuGjo6+Uhrvn87Gznb9crNpYyao+hUxWRVY+eORqIT4mnt3no
  50.257 +u+sZXFQqbrJPsWFpAU8NUtrz06psLLuAAbH6fU6xp8L7aEwvKYzaDCfz2nqMSTKt
  50.258 +yxFG4omAcfKG4ygilDYq7PdRJn+AI3jt32s3tKZwfS7VlF2yo63lSqq5AVpzUm3c
  50.259 +iYmKdMsuJaugsmOnMUTuMOQipkIt5QJ78DM/LmNy0dta38I24DTT1O4/jF96yqx0
  50.260 +S/2+AjK/2mvEDCpR/C6NPrhk6o0QfzCQLas0XbIwxI3z5GVM2D2kZ3+fW6NHi5V7
  50.261 +OW8EVGlsfArj2fr83jqfo86NrZgMtDFLcmlzdGEgR3JvdGhvZmYgKHDiiaFwKSA8
  50.262 +a3Jpc3RhQHBlcC1zZWN1cml0eS5uZXQ+iQI/BBMBCAApBQJYRUUcAhsDBQkB4TOA
  50.263 +BwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQNDRnMEc0GeuAxBAAhKxzf5kj
  50.264 +W+YA+pRA2r+e0R9sK3T4MvJm3tGlVxTr2yT3xLYyKm0KZ+2XeVpMf8WxJ7yZy0aR
  50.265 +R6z9QPBaXO5QUcbk+BvT4kSQEfMYgHZtzBp7tgsyzGV5HogLG3S9Z12V08tYVcD3
  50.266 +TSE0462gZfxrvYfvb/yP4J/0PFz17XwC7ATrEbeSllx9D3m9xi8BhGfkCgR45V2r
  50.267 +7A/oTNhZSaHtxkHb8a9+nzMNd8mgtOCdhOng+pzn2YRSdP6iBA+qabunCY3op3VB
  50.268 +RXoOPpz8CIMkBK5nB/+45Fi56stnCzblXlD95ec+DahW6AYsqXfQCIF3ff9f2KAR
  50.269 +JB+9tdp/8ppxpy0RxOz2uKSDSDaRVVfsG7qj0SJvqSH2auN7awgGpOXC3x2hfA7L
  50.270 +eCb0lISbWgNPlpguY572LpZwGFKz1xvwMSRARVsPrYaH8TDnTDWZcnQEasyxpsHX
  50.271 +TZrnsEZcE6nOaOWDjQp8jsOrD/4gUrIAdgXd2blZGxnD0vuhBVS5MQwn6XpvWEMV
  50.272 +gMMDpACi8eUZ15cRlGawmkw4zjCrX5tyRCaId5EMvYhBW3Vnw8PnQc/S+4P1XRwO
  50.273 +vFC9ijE6zEGYLGl6NoZdBhhUCJnNtP3hCO5WnMifkz2SfAhPxxslRhtdPhAo0d0v
  50.274 +3An8JzB/E9nnHUCbBeyzRw9TWpfSLImvRrSJAhwEEwEIAAYFAlhFRfMACgkQBXGv
  50.275 +vKVJNVMVvA//YfKpjSmjs9agqWzJVhyP5yES4pAPKP/FRC9Mm2gUHw0eTCwN5pqY
  50.276 +DcRkyhfEq0yOdfKTWrS4g8Z1fCkaQS576oTv8L4msrb43skhQVl1QUWGNAcNQxZD
  50.277 +4p396YnqPDGkkftr4ac4v+SNZFJntNs61Rlp6WwKcF7rKH2qIE4kmirrQisNiuDZ
  50.278 +5Y87bujhgtHRc+PN+5uu9t2gymH8ydf3R7x1lGYbF6AmRvEg1cW8UBZAF41b5TJo
  50.279 +hOoXqmuUZaHmeMBaELiFDbCJ5h012xT2wbjQeok5+DRVRDqPASBRN/Y+xvjMPB+r
  50.280 +U7LHCLRdQa2Jdd6X22QiQafQbY8TIuJ8wZcfSdSCtpKnxEPQcPMQ+NbTrmLZk3fb
  50.281 +nO8qJ7TYZ+YO7dUlT17dO8Et+vHWvF+0WFsFFcw/u/gUzztrkcpNaTRV59GSOsta
  50.282 +KCVs10NXiPmMKBRm2yEAX3lxUnxvLTPfCkwI1aHuz5IiaLPQpSjtTbP6LVtrK7z7
  50.283 +x/N/R8if+XofbZ3DoyMykD8mY71vMz5h3iOk4JjyfBo0W+SLAPhxCCfAV96OVKUx
  50.284 +oRjViYUAevnXBG8KtRNVA6p1SUzAx3XhI6tbm2DWFQIFNpxqVX9fPdBLewx9IXup
  50.285 +sHENq1BiOsdasn+Rn+jjbNAle3NUoHSP3rnJDUkJL07kE/Dv6bbo3amJAh8EMAEI
  50.286 +AAkFAlkunrUCHQAACgkQNDRnMEc0GesyVQ//RwC6CO8a8Qk4OL4DGeOMIVAYS+Pu
  50.287 +nqOSL9U6bk7HggYVgbK1vJS7hbrtuXp2RMBl16Dr1HQXNwflTBB81GkXJF2EIp5K
  50.288 +oG+zfXFElOrjyU7/GJbSlI13RPSWvqlZxdGDiK6gqPx/jVYKjeOwhBf4AZ5NZOc3
  50.289 +3kHEFZeRJmt+0PAQa0mNtAPw+Zrfg4yuS/V6c33Q5GV0J7Hrmow7QTrLZK0QLF2F
  50.290 +6Axv96aF4G3E3qlFWWMtyDWB4asOl40XLyWLdHseV+dj/k37fZOeeC1wJat/rySC
  50.291 +kpC27vT2NS3TLT8M1wy8/Vf4QWlPKjCTxbV36H733pVT/uIr6fEckBrujSh9PTt/
  50.292 +UqzNE+NC2HMrmR6SgTtSxQe/pVfB/iNwjhi7ZGoXQLvv7ZFRtZlrhYjMOZNvCQHf
  50.293 +JV5jx89p9B5eUuVlEBs0LTPeGhMkXemd5awnPoDenmbQUiquqqurfqFJY7xICVrB
  50.294 +V6yIcbyQIhy+XtZwMBMCZgBiJ7kcprIwNIBIZwqmuoh/51qADEpjSQzu+NgS6/DG
  50.295 +Qv9wJva+Kj177EN4WrzgvUynhivn7XhQT5OpqtgA5FPTdqKZFvzODsMvBuyzwyek
  50.296 +F0QWNIhdqvcp3i+fRvXMfDtX5YYX0rrgr1S/5Umw9e7sMDoVAdwtciO25ZvbGNrE
  50.297 ++kgsSGxu/ItTkcS0MEtyaXN0YSBCZW5uZXR0IChw4omhcCkgPGtyaXN0YUBwZXAt
  50.298 +c2VjdXJpdHkubmV0PokCPwQTAQgAKQIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4B
  50.299 +AheABQJaHStIBQkDuRpVAAoJEDQ0ZzBHNBnr6acQAJgaFd2ISl6tK9tPx51zh3vV
  50.300 +YUYv99a82sGU25geOc3TKVfssnpLkMzHcXbEEckVyn2lvs1Q9TaymC2j8BDs5xwD
  50.301 +esqu2uw6b0R01mlYhy1+Cuz4XNo434LUyT1/YIOYzduhrlBmZ5B2Kp6tSBF49H7g
  50.302 +MmCZ1BokjwI7JO9ogyzFdx8zPJ1S8jbV5ADf4QoS4p/GkywpPzCEgOkzMAkZ0B5I
  50.303 +epnmQPNtfPzAHEUnUGZk0Dnvw3BoxH0PeacpKNrByJDMWhyQa71f51ooM9vVm+1D
  50.304 +kjptImQ24/K3k+MCKO9aMeE/2aOkSsT8btvhLga5iXBGHygYfhwRduXJTLcCuMjq
  50.305 +S2E9kogaLm5eQktwXswTivhZgBIgKetFot0hfdTnZpc/AANqajZeE7TzDs2J8TxM
  50.306 +yKL0YpyEhZM7Qa7BIAP94STZfKoRN84CCz5pfxp0e85NN7Aka5wnYdsetNqK5Arn
  50.307 +tYqDuChNKurjRmvj/EJPiQpOTDevQJIUBXYMlPj/l6WW6imSzyhMqu0dhYV/KDvO
  50.308 +mqC50mTSypL7GI4VL1bO5OxAq86xwwrWlnLF0K2yUfS9bAVT49ENL+n45Z2k811x
  50.309 +5gPADqp+thfT+JvQQGQU/KnnOc//AqEA4lryvd+IPNSYKdiPCcMjfr06ZTSFxl+W
  50.310 +Z32r1lgcD0ItVnnpIVtGiQI/BBMBCAApAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwEC
  50.311 +HgECF4AFAlsMA6AFCQaJJi0ACgkQNDRnMEc0Get38g//QbNpYEHXttxg+4FKRnnJ
  50.312 +LPasl+Vgn7S9b4ivDLtcUwYbd2lk4l7KXBPGBPz8G7k+xoPdooMyojIkj3mjyAVZ
  50.313 +BSMZ+rJJVzC/u8YYmuY7GEuMEHxWPLJGLVFwGAjvEewtPCQlS91w5IrIlkLgrVoP
  50.314 +HC9yhtGfcaavKZ2+UHf2ISyZ4eTJpEQ8w2WiOHXS/JN/o32r3aLvsIvbfyEAPh13
  50.315 +U24lYtEL2z5n7HMtuh3mthd6uI9V5+WAq9vRKubhyPj6eF7SQKa/2ry1yspHo/LV
  50.316 +a8pvUEL7uihZxAwg0p2+z7fEYyau5ce2x6lGHI3IimRN+kozLXpFHRZqtmTnfkIm
  50.317 +w2k/e7YfzGBql5AKpn8WSs1P+2LQbXA0qkOlIhgLcfjGUfRUoLyRF4DTm6MEjGZW
  50.318 +N7awVmuIxsmLlVc5i6CUcaxWTE8hT93ssfrL7hVEzb+wH/9ckF6FH+gba+pCvaUq
  50.319 +Ssf0NWW8nNga95qBW1Ii3XYH8SF8XI0qVGC5MDqHbUrzCLHH/V9U4lyFde8Luvog
  50.320 +3cpiPt51IwmLPoo1v/bu7g6696HPRiPaoAKjZsPOejinmsFVmCVcEkylMLx3ycoB
  50.321 +KzxdVKNGlD4gJA20tysfTv25ZOaj6/WXI5rGhTu905w5UoWgB5keZ/npRKhDH7+M
  50.322 +nzMmuOhpIOUAbJY9TGCQaL2JAj8EEwEIACkFAlkunsYCGwMFCQHhM4AHCwkIBwMC
  50.323 +AQYVCAIJCgsEFgIDAQIeAQIXgAAKCRA0NGcwRzQZ62qQD/wKX5cKoICueycy8MMR
  50.324 +0YlSgji8cu017P9EsAVThyTeWAgjd9GQJ2dsWxDrPynU7uKEJ7a0GZXi5xyrGFiM
  50.325 +tKhgwVegbWt6OPknUoAKZGzjGyghoIfRNxQJLJ5Hq085A+Gyh+6jIP1ahhL7OTAA
  50.326 +4fZnC4SqLCdoOdcx9+Vucr3wUHBCayrU5HR8GiHdlj5J0eZij5FuGGHIx+sbXAiE
  50.327 +NBPM5B4eXvKhTvCKUs8h9/upcrPfk0ZRxeoh/BxQUOnTsz3J5QXaJHc0xwg3cfXO
  50.328 +0vE0/+6fpCCpniMliDBOfTsX7PbD8UYbCV693+rjFVkOnipyBY3Zz4aXR8Bojpt0
  50.329 +jSRuzFmVf6cqcCJ4knz/ekPmebNayG/NYkAEkAkmGIh1VbQCngufDrFius+sBzkt
  50.330 +Hrmi0VVZRqF0r5zSMVM8VAowzlmnmO4QR9fJGtJ6DjLBImLPJAH0CiNthDChtAU4
  50.331 +XPegZmbZIY4Ox3K95yrKzmhbgE0RhshSERm1D74WTfcohWZurLQ2/bJw3OFWOUaG
  50.332 +GYylV/f6Gzz7iMx7s22PE1xBlwjD55eTnszQ4HiQYGV+2TaQIfRVm3vB/+NQ4LZB
  50.333 +q5l5idrNnE/MOut4XGbes78Q4pRtXQ1yJ65ciPeiifkBd5eE0hL8trRRoObj1JPo
  50.334 +Cl03ggiT2+mEj3/lTB4mgcJKzYkCHAQTAQgABgUCWwwGWgAKCRAFca+8pUk1U9wM
  50.335 +D/9c4liSGCPFbBqg2bppnxPucZU5vc9fyY2u1D7l9RNlXAok2InABdswoy7iUEn4
  50.336 +8TlxuTU0+0PK/fSNnkCAVfYPYAp/Okmn5B8g9gkBqMgTd8freN9VWTp2lSlxaFf7
  50.337 +0u02rpYx7nMCawTRmWhDOtl3hTEpEvtKuNjdjtW0Mz8zx+FnT9L2+e33+ykOEfYK
  50.338 +mIO01tirfyPdKwWAsUSa7C9WGKR2UwVvTcZVd1HOfCktMh4ELAnHaV3jMERbySsO
  50.339 +XEuCmMJU642yvVAKOFt1bRQcvpl0xVtvBph5kNuSksugY6YRUDSBq/bKyegAcjz7
  50.340 +OtdWNzU8jVUbBELe/w2U4D1C18fSJahkikEnemIBZAdTQqBPKtlvFbmCnEB2pQO7
  50.341 +7SpIJrKQzD2LV13vlqfY8FsqIBJ4kQ+PHDWVLrMx7kGF/Sjl0Y5lN+kXz3UNlJ4x
  50.342 +R1yV56gmI8ZM+tqcCxE3cr8brmP+xxkEC0KgmDO11vYwrGdrSC0PnIRrqpCu85qx
  50.343 +KmkVuE5rgNVfNJ7qygPcoQvgum91OQePIfHNusw1Ms1D+D/k6Hab5cC/oOCB8QEp
  50.344 +s4vH51MN6+z32W5vXGWTCA38AvkeDc7AqrPCfZfln94HoUP1VtDcSRjyw6vXnzRe
  50.345 +/ndTSemOjQaVOCYA22S6wpDs5GzjN+0t2GcQk4bSwRLWwYkBMwQTAQgAHRYhBArp
  50.346 +qj4yBZXPkylr36FVrEkczPxBBQJbGj2eAAoJEKFVrEkczPxBZPkH/i1MI+W8srfk
  50.347 +pO9WMyo3bTwRM2LEEN1LCVfXhXxqUbzbjERy50fpFHpqhBGcUssCZrmwwpDrtisG
  50.348 +eNVX/SqHRj05qJW9sF4psuoh+jO3h5lkvQA0Ub/iIaQ4wKgqs9oVwKrMTwxbgqZa
  50.349 +DH4PbZdpMILISeokXIvJ2+cKSpNHXLDFQZGQaFiuFIrDKRG1mnmZrfpYekEXHp1e
  50.350 +FZXXx2znmYOL9UF47TaEvUl572f7rWkNcXVaY8xSvOqOo8vdsv3Spjkjtjn7+UJw
  50.351 +l1rTLAa7geepzFYv2T2PNFYByBGUe/XCe83TxFgp3EKzrqu5GOvkQhYlmltkxKSt
  50.352 +YZZLGCA6iPu0OEtyaXN0YSBCZW5uZXR0IChw4omhcCkgPGtyaXN0YS5ncm90aG9m
  50.353 +ZkBwZXAtcHJvamVjdC5vcmc+iQI/BBMBCAApAhsDBwsJCAcDAgEGFQgCCQoLBBYC
  50.354 +AwECHgECF4AFAlodK0gFCQO5GlUACgkQNDRnMEc0GetWoRAAmr2v4Fe2vUn/kv7t
  50.355 +dPRvQK5fCvuOpAvaJLOjwePobuJa+ItCxM5rGTkCKoCX6hRGc/wpKdZB0Yd2dv9O
  50.356 +SiAdiyoOQOnAtt0+pFvcJ7w5bOjWURi8sWxj9nYvXyGBiVACUvq6ApU0pEifziE1
  50.357 +GmwfCiftyK2nKq9my8vEnPr4pkVzF8CkJdxmO8Ufu1ETKJC+4LW0R7pwWtvTnsmZ
  50.358 +xHd7A1r93mpygMDV7qzDDz6RRy1bz+HrwUGuNlyCqbsHEjgOE1EiyhblocGFI8yk
  50.359 +YG+vzSdWF48Emz15CBVKRTfnkN/QWsxEJZAhTHvHPb8McDpQ0C94cNuRGL1P6+gV
  50.360 +aRDHq4fWJc8V+kKSjB2HammVyZmk0LYWUaWMBoNlCOVrnloDrOjWyoyeh4zPfbWU
  50.361 +k1H2Tr2VIsYjXTa/ne8LorDGWFKDrbl5Y2VzOMl2FYUF8WXwuC1XEud3YZ6SLPs/
  50.362 +c9/FBhWHg6ZXnFshgJkiIPZty76o0mGBWsImt6SvRcef8fBmEBmjFAt6QyP0djWL
  50.363 +qUGQ2Df7cfFLMt6wjesEcyjQGaAJgXAAlN727F7bOA0lyaCRKx5W4leQhboj3khy
  50.364 +gL9P7HG70iF6kDE5gw64YPe5AhV8nPO/D7wHo+dqrl1TvJGF7Bmbw25cMbHwBwdV
  50.365 +Ep6Xf0M3fBrrf/dzEZ2D+pGkVhSJAj8EEwEIACkCGwMHCwkIBwMCAQYVCAIJCgsE
  50.366 +FgIDAQIeAQIXgAUCWwwDoQUJBokmLQAKCRA0NGcwRzQZ617DD/sGjFOBPWitPl1X
  50.367 +ufY3xkkrAEAnVXSzQsLT4y6HF0SodmPNgn7lOMT67GmDDRRUCKhzG9+vRcjzswTf
  50.368 +wo031/ciXYxG1FrdA75NtvDRNio9yiyRurLJTt6nbZgX4TqV0ug2ucysxGZYVNt1
  50.369 +d9H1v8FwzvJvsE2mDw108mv8dVTjLsLL/BXh3Qsb0kJ9PSamY1WRtabz+BQtv5gj
  50.370 +NRNzOaGFLiw7iWdIPeq7dFjdzyg6I8dLlazolFsidtZQIlnfqNTrBwBVLRwe9IkK
  50.371 +VkmsTW8jBCZ8je4GSop8r6V/Uysq3w17/ecsH5VPwuNVRtQIEEV+ojXCFTXCCwKk
  50.372 +xCUYLsrZQG+3Cr5ZtIBH+xxplx7dbC55DWcC2Rb/+iBR3Z5pyDrzVlD5lTZ1Qxru
  50.373 +2340WVLWcE4EUhHkgKL51+1wUh8SPJph8WiyOTHY4Ncs4ZzHwrwsT82zBhpMIyD6
  50.374 +gpz0697HFV6gtQN5tpAHPfvWDgZdsquu6xnHAPWwDWVKjQqssOlkSOayN3ibTULq
  50.375 +VW+FHXiot6no99vY3C7MwBMG8H+DiiAuwMZvjwu7QF/K9e/GtcVMIjixa3JkMcK1
  50.376 ++KeBoLhC9K7Re3M+usBMVl661js21w0US3AFtwhi8JAD6CV+f1EnGZ89pbPgSDYl
  50.377 +EI1oh+J54bj6Jt1wWXB69Q20BeFpj4kCPwQTAQgAKQUCWS6e8QIbAwUJAeEzgAcL
  50.378 +CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEDQ0ZzBHNBnrVZUP/RAOy8P2I0ad
  50.379 +eV1tGLLd/n9M7f6ntl9vRQOQ9f23xFk3F2iK5JgYX7sCute2lPwqjBewUgxt0PC/
  50.380 +NnTWLhkb5DsJgEfD0RVqWu/KslWRI/kKvcWE7+s4M1Iv65eLyuMWMGmCLcEpRnPE
  50.381 +XOs9qu83W0N1Mw359yc7Z1LUOZdvp2uVXCYSJu52NHV66Lc8tkPcua5VjpD6NrcA
  50.382 +QGuHBtvzu/XpsJZ6AAWskD/gUCCYvFvgIzJ9IFFB3SQXC/ZTKveginNAcKifkJzq
  50.383 +ju8d5nJo8N0D22sYsP7EbaqZbHl4YzwmiELz0uDg5KJSVj2sC4IzWXm1aHnZDV8m
  50.384 +FdflUTSeG1NR7uoey+yf5xRht5AL5AmbOdlL9aWQzje5bqj1oXb9HqAWfOAshsrx
  50.385 +Ygz4PT7u9FGCpZ9alho028yEpZZkWZejLi07M1fQc4kaWMHHfi0aMlYdELsQ43o7
  50.386 +5aspJ9i39aVA1JRXAAB77b/FDNEPX4RbkcX6dyjDdU9GqhE7CQcjJyabxUGwR5DJ
  50.387 +NB/XjFubVe5CCczliqAFY0FHjXEaBoZvsrE6mkc3mGhdyU/016Mpx+lbQgTi8rNa
  50.388 +WmOrnQmdoHhKAuC4KFhrwlalez1fiLdl3tdFXqHuDehB4zLj+cZcdq/5VriKGzI6
  50.389 +5Qrq6HidIvFfJsK67aC1l9dGbfqgvgSUiQIcBBMBCAAGBQJbDAZaAAoJEAVxr7yl
  50.390 +STVTFUYQAMUyyDQO9gMbS549V4qpl7mVzzfqtyWmfYApsKuqrvcYVZZMO1Xl2ICy
  50.391 +LypNsZ4+Z+8HWpPc0gxWpWcdwi5uShS38OEoQN9Oj89EJzZE/guZmqfTK8W4prcp
  50.392 +hoPYOdKWNeF/pHqef9b19TEQfiQqktNsD5YRuvuvUObAWm9JQdDB2C4iJRy12zhG
  50.393 +2Y8NNnq8eZbQa1MgK1EJPvQo4oIOh+e6sJ/G1swFZevsc1DzZX7WWd07g60HVXTo
  50.394 +ous9yHeqrm3xEsay1c9tSvuWWIyEDqTiwp/smjpPMcwt4vAp2cEZDNylB0TeNifq
  50.395 +4PWYAQkSib+B0VEYSPxtjiA76T8kQn8+m6m89fcQWBm9ldgxVO5IY7P6WTTZsnRW
  50.396 +TOXx6tFXVC2c1XktUGxUtqHwOGh4E99Nlysl9f4N7DLEd9wAdwmTcEYpFQp5k73w
  50.397 +briLCmkn88kN1Vu3pVovmRIaImP9nTbIe1jYQcQrIzkdqIYdYENXvlfPHLT2+2z1
  50.398 +z73CxDTsOScwS2m8MJPGrMB9YzzwoCv6kf79j19BzXcjpteddR8z4o2e+J9X+Hlo
  50.399 +plwOKIlwwHM5bYRwq0A96sHyLzP3KkTZbruZbE5wyG2e/hcftQ5pYZ9HfnwuqN8b
  50.400 +Z7bB7p3rvBOy5p0eR1a20RQidw8S3gkSzKuDMsdcZZN2zamHkCmTiQEzBBMBCAAd
  50.401 +FiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsaPZ4ACgkQoVWsSRzM/EFtlAf6AkR6
  50.402 +FJ7GSwq/vaSSuZWkHylgSxCLpzXePFmmvJLSuLr1GNATwlxNpdaoN5wGxvFBRlD3
  50.403 +tAZ8y2JpOx4vFcBKoRkGLpn2E+S9TS00JDXVQVE1wB74sG8REm9UwXv2jeAA/VI9
  50.404 +xlADtSbKB1qM1QMCeysBY0pJNilwe1lgSatLB9DXxpsth1hs/o+Eo9pR/3aW6U6i
  50.405 +jOBl54q7Y3oqcXUrwlc+jWgXl/HJWP5OPllikxdG3jFbT0ChrmQAekICk9WOmXa+
  50.406 +vO131CWUgXhzQtHKa3fuPfledIKopH8vDa402q2I7GsRXqkBV8ETa4lSRvoMHEd3
  50.407 +YyGCRl+r4SngBAiE1rQuS3Jpc3RhIEJlbm5ldHQgPGtyaXN0YS5iZW5uZXR0QHBl
  50.408 +cC5mb3VuZGF0aW9uPokCPQQTAQgAJwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX
  50.409 +gAUCWwwDoQUJBokmLQAKCRA0NGcwRzQZ691lD/9ySDQYaodPF9pyRDEIjJyjtC+9
  50.410 +62a37kQAg5Z2/8HxbpKdlaIKJ0NQxbaP3v75Yr0uvHCokdqTi7QLCntRk7enIi4c
  50.411 +OLAfzSlYplJouFULWT1AHf++e7Ydvl//TsmSyO1m/cwrE+5BkQYwpNwwHK50UQ/P
  50.412 +qU5USrc4vJ98iUg9wDvKqTrHA3ql09qeYC7vvzecZyb4OVPsw3mP+LX19Jz+13A0
  50.413 +4mNd9+7g5ohe9v+4+SkSi0ZTgT2HCHP2gusHdd/QCnr3PacHmmNBYrJOkebYt5Wz
  50.414 +mOKIXYpa0s0sHn3iJfDeEGi3Yfua2ZwDaiDvdzCPERliv+oFk0vYC5t9BrbvgJTD
  50.415 +Anr9JJmyevZ+QXKjyhUqguSZ6lzhwWLKPi1W2eGg4Pzg7I3yZPqOlux1xF4t6t4n
  50.416 +gczdQEqPIqy/7ZqumjhDN4BGlOYJEeQzdgi2tMl4U5WVsp5cZ2RlJHXpQlcKcuD2
  50.417 +W3QKzLXLEZr9o00igtTlWXCh8jzA2Bry7qtwnS7JjELLVmge3/tOYSZvFe9xXNcK
  50.418 +wdPLkA22OA4dm488pwlmTFKdE+DE+Inft2QSsmzK6L184pMFcqGGPqfEEPNlxqPC
  50.419 +L2fuNyca5oKSWR5m5LPidT4wJ+F4ddhq9AIVn5WSHNZRfHJg2QbIEWct7T6/tq2u
  50.420 +vsdUwaMvR3/ibzehi4kCHAQTAQgABgUCWwwGWgAKCRAFca+8pUk1U9n0D/9axwQ7
  50.421 +QSAYUVglXYt92EAE6jgqk/cWf5uX9av9GzzrzIPTB86KLrOL+yUqIY75mzseMncJ
  50.422 +aEf4mfULdcM11M07YOdcoHT56WkIyFHqN6kgxApu5LQHJQmjpjPe38+3tbCMQbDU
  50.423 +lnFdxmVxvhfVp5yz/luvJzXiwFZ6f8lmrBOJcOw8JNIMldo/LZ4oHHowDwgIB90x
  50.424 +e+CLfw0FQRsuEAjmsyCwO10ur0O07wLrh17/RhgTPZGT1Q8886THN0BOtWImRphc
  50.425 +sRp38MjqV+UrWCd6oUDO/tbucctjtohj75D55CU9bqJfByX5mNG6hQwsKPK9hc10
  50.426 +vAStvk1/Z8WQ+a6nHcL13pi1trZOch+XH1R67w9WMbfw9DyVgup+AumkPsRqsqF5
  50.427 +WKtrXOUb4kc13aWFMsIm/nWn3AHR4NL7BZk+YUNsA1tSRygSwgOAVNXQ9W2xH3VI
  50.428 +hiAuP1CnUJr9YsLfteF2tbVJTBSFlpcpZudBtrKVC4odPD52ThITMj58SXZ67THS
  50.429 +YAtOHzzIKeGnDGhb0tXj2Ca3WZVttIRKkH24w926mVh8HcaF0V52ETv6xPRUEH5d
  50.430 +jI+y3Wi6yUQIwo3+LXXuhjAGhV1owhpwo4J85zR04eAKet8XpEX3S0dxHkD8JRB7
  50.431 +hZeVZJfdkorYeK8pmLeBtpyOo/Z6Gc34GjsocIkBMwQTAQgAHRYhBArpqj4yBZXP
  50.432 +kylr36FVrEkczPxBBQJbGj2eAAoJEKFVrEkczPxBuyYH+waLTZgUlfaAd+JeLrsn
  50.433 +uS9kYvG7RtBZNpVLtG7XJ3td+xiCLS7APwXmUmG2si9UxYrj1bNHJd6CNgt9tkWj
  50.434 +n/V1tCsLcTpwUUnEnq1doYxkzFnJACItKBPUEOaHZuH7heFw+vdjBsdne1wlq0EU
  50.435 +ECgfF8BoAMI0ohfoOf6j9VZat1Vh5GrZa525mVwTgw7exvTjlo8K3lIfIXag4ylp
  50.436 +4hxw+tqTAhV7s3+Ju/f/GyIYgJ4gCgvXIosFWSWc8Ar65R4NrF/y9wsETBNmrpYN
  50.437 +LvfpAEqAiiPtTJFuMl8DffsbLLN9VkeKDMh1aZbn58QOVrTy+Y2BFiwn6z/LT7nD
  50.438 +uKK0KUtyaXN0YSBCZW5uZXR0IDxkYXJ0aG1hbWFAcGVwLmZvdW5kYXRpb24+iQI9
  50.439 +BBMBCAAnAhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheABQJbDAOhBQkGiSYtAAoJ
  50.440 +EDQ0ZzBHNBnrbjgP/RDgsbGW0HHfRzqRICYk6sD86aylqXh+PSG+DFd1BV6kupxH
  50.441 +EHZUgma7q5bmYAnCyhePKVjwfbN0KGITX8WDWHdx0be92iVPTFg16kwemGllqewJ
  50.442 +DZD2a71MsmOYop0Hwifdzn+eOtAk9Bs61WYklhbDNxMJ9PUR4iujCnUby2VlX/zF
  50.443 +Lv8Sb2p4kPEikesHMG8doiaxRi5e9rSa5N29y8bBkTVYf177Gc7bWcDZ1F/aBm0W
  50.444 +CklFR3W7Oe9ugkeW8A5yIFOhiXG1bXbjBss6/PbdcOD+/DGtVHRv2jHEQgmID66s
  50.445 +a5vanHrKNw6W6h1OaCpRsD/3eLB8YPkm6dOUAaYZNaCHAbzOwyHRZsLDL43M2lYi
  50.446 +yyyyJFN5bjWvuj4QFa0PKKZUwO30uy96u6IMQlm4m0FX9uCiEy/Vt25NdeTi3FC0
  50.447 +B4iVQd8xMPP5PoMqC0F/6qDc1aySzYnvVgd/a21IpCIc9qqg+ABVKBsvBVM0fIen
  50.448 +HYlDjIUFPGpkgGO2WABmr15PEgFS6dGZy7m1MsfZBOJ46Hsvpvkd8FzLX9/qTYS6
  50.449 +0fbSF/5B9wTYIQgYoe7uWs3AAzzInciv/kNvAxdgwcahoQhPyo8+thOiKt1dLuTL
  50.450 +EhpmV8XcPxETPRu2M8tAcbGTV1QolOWhzbMDA+7m65zv0wQPA+a7lROBqtdciQIc
  50.451 +BBMBCAAGBQJbDAZbAAoJEAVxr7ylSTVTtP4P/0VAO7cH5J435IdkHwZXzwMtW+mt
  50.452 +roIQf36GD7eOjZe02aQvGBAy6VkqE+vUwpHlBImPLmpsRbKqF9BrnaoQFsBW7x0L
  50.453 +DRg1loL8izxABNZdo7pXx25J9u5IS4B69dxEiVakJj8Rw6ZEaWKyILNskNXGoV3g
  50.454 +F0x1uLujOLRFx77sl/BoKQVdnmsk1bgPcLpoPbC/7zASKKak2C+vW3eg9ruQzaWK
  50.455 +ODPflyboT5p9hHpH5kUd/5mYhgpAdyfTOyb3h0WIhKcCRsMHTVwIC9SmnOpoNkie
  50.456 +BDpUkiqHjjUxWjbWY8JhJP5eXHMAtX2ffKy5vWPRlLphg3MV8j3y/p6lUOXRnISm
  50.457 +ELV5zOuqIUP4OalNSSi8HV/6wmWmvRZeNGJveWwagI1d9jLkyCUUF2kHYirXgMK4
  50.458 +MXoK1jNtwEHE/hr+pj1qYPEIl8ggdUHqkKxme3TZov7SH3J/k/uGjkBxYmP4SCq6
  50.459 +D4RKDsgwwcuAt2MlCRMO/6nhWaa5wY1BcD4R4sFGJw5ondM64SoupldfuneVeQ5q
  50.460 +HpjvQSl8TEv9W4Dt4sJ3lnnaBfKXo1DCVsAPDNOASl79/RDdlxn/+tDaboxQoILh
  50.461 +bwjqL/zD9o6SYmjBo8czaRMVKz6FGfjGUl7MBQN6JOmIIiB+f6GRsX1aJ3pBJpys
  50.462 +I4mPZrpvw9PBwXcxiQEzBBMBCAAdFiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsa
  50.463 +PZ4ACgkQoVWsSRzM/EHlmQf9GYMMUtbi2b3vXLXKCYjmvG9aoAigVPOzxGVBeTBR
  50.464 +Rwj/TTcsWdNgKxXKPQ4R3/uI5NYCnt/sAa5rNpUWfgkAW9++ZmhtWCw06dd1hWs8
  50.465 +7ziaF2pytaJVZoYauNhKkz9wVKWlWvQglCPK2x68RytmbNxrDK2/bQKAZ7o/b0KO
  50.466 +rCXF5lhHXtTZV9X6/wKmKlDxtGOYybDr9VvfliyH7Y7HPL02FuaqOHB2IQKkttlK
  50.467 +86UcbQRFgC0DGUAb6x+NpoZfwIhrIoTSfw49P4Doqr6WNUfAFQC1Fa8CXIg4a1Ru
  50.468 +aAPCZDa0yf0lh7FaGpdugLe918QINlSdsjwn2PHJQm+lMbkCDQRYRURzARAAwm6P
  50.469 +rA3k0gpy7jcd4LPKebL3xIN+oOp6E4jQMcbBWtYQigfMa4gOjVNi4eeL/FaTky/N
  50.470 +IEFYleyHWp0bxET+9W9L/BNjDt6R/LWBDLKtQVmqrC0p8rNTqCo1LI0CsCEu/Zzy
  50.471 +bVd24x+w/VUj1Y2dkPEP3R7FpcpSDMzllM+kLYGXa3+R0PAMniAzDamfMTgicv9Z
  50.472 +LIODKjDTBXCzFFTTKwev/nirD18k4vBqTFsssLnV9MMxanSW/yFTQcGm0A6PiiKS
  50.473 +Y4Bsk3T4OAHr/CR33ebeWvmcCTgF0u72zUG76XXwRHHjxEG9n5BwDxVfiq/2niXA
  50.474 +2Zua8nDx6wmYLvzugFBrmS2cA3epuNLDbnhQ5oHR217SZY/pVTKLmEXEanY85ISF
  50.475 +yuKCmZx1H7Rhcnr/SJGcmcTyXoZUQHimhWnXvMOpGUZ7+dIqTaSgBC6D4D3KWFVl
  50.476 +FywjpwU10PVJQZRSHwWsO6z4UCOrEHq1F13EUe7RJnguhaCoPdFfZNM4i6MxRSCo
  50.477 +xV4bv1+WxT1trY3bodnK//p6/7OXPrhIj0dmtdFELHeWKes9w6E26pWLpzk9TaAK
  50.478 +Jp4jSGh5awjgFCsz3GT09HDy5pjesXa7TOMbsc9dbUUX3Z+JiyZC47F+hmwrOOek
  50.479 +4G34/GXz2RxJdV46lr4nfuU8y1P649202BbKxQ0AEQEAAYkCJQQYAQgADwIbDAUC
  50.480 +WwwDoQUJBokmLgAKCRA0NGcwRzQZ611iD/48dFaRj61CvBuYsed+Kk3uo9pCs04W
  50.481 +SWiUarnd9zKlx3ChN+YtYMTDRpQcH7JEP0N3OifA3nOSgLgd7/HrPdt6Aim5k7v4
  50.482 +Fw7AwEuCbP3w92hzot4OetOyya6IHy8xpiqRj2etPzNAbB0kBEvwmNKSOZMPVRZ8
  50.483 +0Pegz00OI5OMGopuYgZcyAd/R5ZhqJf+8EmHsNXwT3g3ifX7QtXOXlfK8cCExxTa
  50.484 +4xreoP7UWIAUHmWz0wFnPFNQlTt42oA9mF3PjGgCmJ7j4XF7cvEyO0GDRZ1ZGWbE
  50.485 +xrk/EdGKrBQBwlCdxc/1Q87B6Kl2igXAi6rvOeUSWD5TAJSoi5M0gZYB7/6Ve+1Q
  50.486 +04sTmRt3ev6mLLb2Fu/glT7LpVUcMbpLrOB+Pm2d0eOZxVeElO7RV5nJQ8LNwtrl
  50.487 +uBlk644rn9mWiVhfdhfmP/eluXvCyps8BUFwZQu/LZB7lAFiIF0cr+7dKiLRpgMi
  50.488 +RLhTCQht6SEO1rreSb1gF7Em+aJzv1hpvbzQp46vUOqeUGZr1iF840W0b7n/s4Bp
  50.489 +xED67TQi25vFfEYYBtEzYqTCgI2v1h5ixtBkovFbXv28RYZPg5bWfAOQIwb3AnYv
  50.490 +FGBN2XdeO0ytL8rT7qKhvcS63E6ap605r5IvpgpJFap2KhWh2mwHYvNTWPnf1uTO
  50.491 +KgBhWHuSC0CEbA==
  50.492 +=oYD/
  50.493 +-----END PGP PUBLIC KEY BLOCK-----
  50.494 +
  50.495 +--------------D703284A94612CBD63CC1F3B--
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/test/test_files/432_no_from_2.eml	Thu Oct 11 13:04:02 2018 +0200
    51.3 @@ -0,0 +1,492 @@
    51.4 +Return-Path: <SRS0=Imtu/Y=LL=pep.foundation=krista@srs.smtpin.rzone.de>
    51.5 +X-Original-To: krista@gnunet.org
    51.6 +Delivered-To: krista@gnunet.org
    51.7 +Received: from vmmailrelay1.informatik.tu-muenchen.de (mailrelay1.informatik.tu-muenchen.de [131.159.254.14])
    51.8 +	by sam.net.in.tum.de (Postfix) with ESMTP id 35CD81C00C7
    51.9 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   51.10 +Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid 109)
   51.11 +	id 54A621C038A; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   51.12 +Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost [127.0.0.1])
   51.13 +	by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 309F81C037B
   51.14 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   51.15 +Received: from vmmaildmz1.informatik.tu-muenchen.de (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87])
   51.16 +	by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 25AB31C0376
   51.17 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   51.18 +Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid 109)
   51.19 +	id 241CB1C2DD6; Tue, 28 Aug 2018 14:34:04 +0200 (CEST)
   51.20 +X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
   51.21 +	vmmaildmz1.informatik.tu-muenchen.de
   51.22 +X-Spam-Level: 
   51.23 +X-Spam-Status: No, score=-1.9 required=7.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE,
   51.24 +	SPF_HELO_PASS,UNPARSEABLE_RELAY autolearn=no autolearn_force=no
   51.25 +	version=3.4.0-tuminfo_1
   51.26 +Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
   51.27 +	by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id 10E381C2DD4
   51.28 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:02 +0200 (CEST)
   51.29 +Received: from mi4-p00-ob.smtp.rzone.de (mi4-p00-ob.smtp.rzone.de [85.215.255.5])
   51.30 +	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
   51.31 +	(No client certificate requested)
   51.32 +	by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id F26571C2DC6
   51.33 +	for <krista@gnunet.org>; Tue, 28 Aug 2018 14:34:01 +0200 (CEST)
   51.34 +X-RZG-FWD-BY: krista@darthmama.org
   51.35 +Received: from mailin.rzone.de ([unix socket])
   51.36 +	by mailin.rzone.de (RZmta 43.21) with LMTPA;
   51.37 +	Tue, 28 Aug 2018 14:34:00 +0200 (CEST)
   51.38 +Authentication-Results: strato.com; dmarc=none header.from=pep.foundation
   51.39 +Authentication-Results: strato.com; arc=none
   51.40 +Authentication-Results: strato.com; dkim=none
   51.41 +Authentication-Results: strato.com; dkim-adsp=none header.from="krista@pep.foundation"
   51.42 +Authentication-Results: strato.com; spf=none smtp.mailfrom="krista@pep.foundation"
   51.43 +X-RZG-Expurgate: clean/normal
   51.44 +X-RZG-Expurgate-ID: 149500::1535459640-000020CD-236E2DC3/0/0
   51.45 +X-Strato-MessageType: email
   51.46 +X-RZG-CLASS-ID: mi00
   51.47 +Received-SPF: none
   51.48 +	client-ip=131.159.0.36;
   51.49 +	helo="mail-out2.informatik.tu-muenchen.de";
   51.50 +	envelope-from="krista@pep.foundation";
   51.51 +	receiver=smtpin.rzone.de;
   51.52 +	identity=mailfrom;
   51.53 +Received: from mail-out2.informatik.tu-muenchen.de ([131.159.0.36])
   51.54 +	by smtpin.rzone.de (RZmta 43.21 OK)
   51.55 +	with ESMTPS id f090f3u7SCY02qG
   51.56 +	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA))
   51.57 +	(Client did not present a certificate)
   51.58 +	for <krista@darthmama.org>;
   51.59 +	Tue, 28 Aug 2018 14:34:00 +0200 (CEST)
   51.60 +Received: from [192.168.0.102] (ip5f584961.dynamic.kabel-deutschland.de [95.88.73.97])
   51.61 +	by services.sec.in.tum.de (Postfix) with ESMTPSA id 6A14A1008E943
   51.62 +	for <krista@darthmama.org>; Tue, 28 Aug 2018 14:33:54 +0200 (CEST)
   51.63 +To: krista@darthmama.org
   51.64 +From: 
   51.65 +Subject: Message to edit
   51.66 +Openpgp: preference=signencrypt
   51.67 +Organization: =?UTF-8?B?cOKJoXA=?=
   51.68 +Message-ID: <b651dc6c-513c-b584-7309-49eca57c5fc3@pep.foundation>
   51.69 +Date: Tue, 28 Aug 2018 14:33:53 +0200
   51.70 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   51.71 + Thunderbird/52.9.1
   51.72 +MIME-Version: 1.0
   51.73 +Content-Type: multipart/mixed;
   51.74 + boundary="------------D703284A94612CBD63CC1F3B"
   51.75 +Content-Language: en-US
   51.76 +
   51.77 +This is a multi-part message in MIME format.
   51.78 +--------------D703284A94612CBD63CC1F3B
   51.79 +Content-Type: text/plain; charset=utf-8
   51.80 +Content-Transfer-Encoding: 7bit
   51.81 +
   51.82 +This message will be edited so that the "from" field is missing.
   51.83 +
   51.84 +--------------D703284A94612CBD63CC1F3B
   51.85 +Content-Type: application/pgp-keys;
   51.86 + name="0x34346730473419EB.asc"
   51.87 +Content-Transfer-Encoding: 7bit
   51.88 +Content-Disposition: attachment;
   51.89 + filename="0x34346730473419EB.asc"
   51.90 +
   51.91 +-----BEGIN PGP PUBLIC KEY BLOCK-----
   51.92 +
   51.93 +mQINBFhFRHMBEAC9MOXvvFrVJWpK2SDYfeDsft4ExuI9lLTvi5bzQKyvr3PkctEW
   51.94 +w4Cr3kdNwbqIXO7diMSnbEJvh8OvvrII7hJcStpNSIIYZf9UBAAIIaPJelm26cxI
   51.95 +JN9SsBxAYuPrY3OzHAgNS+/QGnkXjQxI3a6rJ38kVsMavl+q85Pm5m3WUcNko+gE
   51.96 +YkSu5F7Fb4h7wyeF4uyHgPoSEA/qaQcqUoLT+xHyWDTUb+NBZhc4jO6W38FP2Gbh
   51.97 +kNwDwKQrrgbMizEys4qmysdZOYOFWvyBNcQ3/qlkF9BbefPwDTnez0wKy2W4jr62
   51.98 +l3mc8k3MU1+NBEa03uoAaHCHr3MeEbOSwR2MiCshiBzE4HSeadQFIeruPCYHD8Vo
   51.99 +kV5wwbskVPs900ILDuSSsjamKsQROSIK2F94yqB0U6cTEc/cbZY8cNLLZkYsziSd
  51.100 +uI86H++ohEJ+apr2BkIYWnccuziqTzIIFixDHdYe3WBkR+hooL5i327mG4uRjAnT
  51.101 +hcgtCPzxzBC//0ktF1aS63Q8FrpjQ9MFBZEmYNl0Tae/b6nO1aVh9evyeoAx+Bmp
  51.102 +7rl47FWNjQl6zBbBrLoWmz3D79e3IxQs0l7niqDphkOuQy4hAFoLCy21QCxXJ0FY
  51.103 +VRB6F9Fd6Ha8SL4lMBjfYpG0yU5EGJcCo7gMV1D/cdQ8KCHSEd7jUopBVwARAQAB
  51.104 +tCZLcmlzdGEgQmVubmV0dCA8a3Jpc3RhQHBlcC5mb3VuZGF0aW9uPokCQAQTAQgA
  51.105 +KgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAIZAQUCWwwDoAUJBokmLQAKCRA0
  51.106 +NGcwRzQZ61u4D/9mRxSKqrCgblgJrZ4YYBV5FWIcD4yIe8TZ3vzqOyHwtftVWERF
  51.107 +3LbKYwYfaOAZRpL+nonA0UZx3DlSIRvnT5Ne/5NSHHsSrU/6OzBooHFWAn2lqsGO
  51.108 +ADL3a9w/Acdx14E9a5NdyhDyZZVr02ipyxtwKUgKae7i+mdjTvBBLrPfjg1kKroN
  51.109 +P8obk3qNaUeLHlG46WndLosAAEVrU8VHnpUCpxRU5s6JWu0omtPcpmWhaSfowogw
  51.110 +HGzViwoe3NxQLYwBZuZuOp5QmhemqKU2sBNxX0ZaNijGctYLjmO7qTgKK/IF24df
  51.111 +51362TNoQ8gBUQGVKiOM5dkm9YsXMoAL+ClsvNtMwasHvtvnXviTkPvjs8FnjX2P
  51.112 +UGGZhFvrgqvIO4eR1GyuvasOIQjLcTG58sWPuZLvEwcMtyinNVyvzpLPnkOlhaRH
  51.113 +F88plA5xrQT0bKLuqN0ve8jZvLJT/As9MRSm2ftZMTwmaR4HN0JduMsBrE4Boef+
  51.114 +9UQHzfL0Ivq3G/TzkmTIyblaPUvKLKfsZJoq+jjp2viX0EfnEG0rZt/dse9Z0C2N
  51.115 +hQrJfSAV/yN/uXriXinYb9dQ0k4Bd9+zHPE/mhZ9Cwv6EO4fNgy+1GRfy11NeJWK
  51.116 +D4EzDFuUY7gAkJkcv3vfag0WW65rwn2pOoe1NUPqlHxqW0fOYfZYVzbf2YkCHAQT
  51.117 +AQgABgUCWwwGVAAKCRAFca+8pUk1U2y+D/oDA8Q9X7BtRuVQFAvS9QjqxI0ZsN9y
  51.118 +kVhq6CnJ7e8Fk1av41ztWtUy7yo3DiGur71Fd+4tCcGX7ofqGGv4LhUDCUOzSxih
  51.119 +1LNKPsMjRZo1gMZH/TSyVYLVhW/A5LK2Zvpmyc34DN4iFrb8uJ8a/sW2LlAXHEou
  51.120 +LGnJ/qTzHtVxZtrnaKmTQdRovWfrDgdFSbK5ZXM7tfxfeeUVv2TZwZngM4MTdaTa
  51.121 +vcOM/jGjvX1CjbZYePllU8WkxgLPh+Uwrdqzlyc35gzR7agT/MvWbmNFcA3myjis
  51.122 +5CRW5b6B67EM6tqxC2i4jau2P/TRPoHZaGLxkhgfdbsBDxgndUDi/Rgav7FdXmu0
  51.123 +etgJRvKEfthpHFt7/U7BYeChg0mweJkKSRKWNj+P9aR7YKgFLtD8iNLd7lonEtit
  51.124 +Vxj22n8Kw4cZRyB0m9l5V1FkkROEVd++sOUhivVCYWP4SpGjUiqkpcW5UL4Envjx
  51.125 +7CKAgZxGUr4qwAIUsET2y06zEqywTPvxarbZy0ltQrEpBAflOkJ0NuwIoBaKSE0G
  51.126 +rl6YaCZ0JvjkFV79eFcmNA4apjkZ2yBhxqUjw7HZ3L3JU13Bw4y8iYiiWx5HZdBe
  51.127 +BEQcSK9abdyxqX+tH2ZL+n/FSIJ5QTxeQzpnihjHHXARaHDrFdUWU4JoVdPuIwsz
  51.128 +QQpPh74u6lPchYkBMwQTAQgAHRYhBArpqj4yBZXPkylr36FVrEkczPxBBQJbGj2e
  51.129 +AAoJEKFVrEkczPxBn4UH/Rxsl+mZSfqGFS3aRdIFM1JTEFZC53cfUxmbAk//V4j7
  51.130 +o9h27LE22T4n8UqT60fYelSg1Ks1TluR4SoHFsZMiT3hzWTu3LHydsaUW6NoG/ie
  51.131 +O8PuMPge0NVTmF40PRcUSgy8aqA+Q2BeTt4itcLyro/pZz4lbkZ1oJt2WG8b5qKj
  51.132 +VJCILCHuZZnJHDVN1dqv2g17UQbzfor7DWO71/+wdEsnsLXYWp6FbZJsnq0S3ENn
  51.133 +hcy0ylXnZbXmaAd4PctJvsuGkB2km64F1bE98ljSz1QmyNfvB2Tgr2w5nULZl9Xf
  51.134 +z77M+qo27OyaWMT/GEROVM3+a34cobKnjSFcK6aixCa0L0tyaXN0YSBCZW5uZXR0
  51.135 +IChw4omhcCkgPGtyaXN0YUBwZXAtcHJvamVjdC5vcmc+iQJCBBMBCAAsAhsDBwsJ
  51.136 +CAcDAgEGFQgCCQoLBBYCAwECHgECF4ACGQEFAlodK0gFCQO5GlUACgkQNDRnMEc0
  51.137 +GeuE/A/+Jvgu6WhQhPv0yhvpO5NFSYDT/P9Ez/BGAWF+Vf2yHufv3WZS0i/MyU0b
  51.138 +DEKHdvDOWnPGzU4kxGWwftkyGtVKA47Vs1p96m37PzbsSQh1gyedSHy7BLFt/92g
  51.139 +OXY5/Lt+5MEDLJSqmnW5rt4xc0zkg6gKlIYiu8LCYEtG/OAW7WDx0mHWV/bXEKBu
  51.140 +aprxU4A+1sN/VFI5SXILUHW15t+CczpX7yrcIlelB17+sgeBa37ynAcxBABxA83+
  51.141 +at+90s3Pxur4iYaWrAbKnrG62VV3W0uuYQNLfV7DKPgaXM6XbOhipIE+yS1EYnf3
  51.142 +JKzQl06G40atPPmb35Nkvfk/JgPF5byJ+uKO4ntsqa8XKt3GbRY2/mKiO2WVvd0w
  51.143 +RfyuEYW3H/gvv1TZJBEqDtbjmgAEbdnGdkfldV5UAcYLzzM6GC9zrKrPuGrKUkdm
  51.144 +9FRKooKJ5JS6CYfHlZfKipdAyQ9gGyfZT5Tz6f+1/xJkwO+JpWsZV5LUua6XzfJn
  51.145 +vA2lVT5RPRZ7y1D7XKzIs24cfnf1Y4YSIAiwl90DpFLKJjISQTlAJ7Bd/yhyv8/J
  51.146 +csqIgA19Lqpr7jApk9/YNZyj9AjFmJ/ce6L8LYTum+a/ccmI4x+tmdXGtyjTsH5n
  51.147 +mjxBrhiCct+NpR6paLZxKKtJZkLX8V3Cfsq4JajIccUOUcN7w3WJAj8EEwEIACkC
  51.148 +GwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAUCWwwDoAUJBokmLQAKCRA0NGcw
  51.149 +RzQZ69e4D/4xYImZNBUCADolemNsGn4lcGdgbeUtamUx9oycUEGBFAHIzTOkGtf3
  51.150 +P9Lhq+GCgS9Fi171RUwtlLpjriu+GPOltwTPKx4G4l30YrrmouNVzJlBOozp+jB4
  51.151 +OsygcNTxJqPywkGlI9F+O8zuBE15imjavSINV63y9Ypib+LnpPIOs34t4iq/jCdK
  51.152 +pVbMvNzyzgqBHOymyKh1CIq6UCpeWdbokJsBhknwhtWG/ZuY1aH6JwmZXBSfGsqh
  51.153 +241a3n46tIYWRbF4TCpbAJiWM/Yg5Es4tvT1tZMzIg2Z6TCQkZhbv9yv4vPyBICl
  51.154 +OPSH79J24hmbWF6hDdi8DVi0STDmi/bxA8kKROdhgc9ZKz5bHaVlyewYdNNPGH3I
  51.155 +/euATdTUBPs4g7n/i0P43XuyLvtOBG9m2KfkJmODOiwqlf1/RSDYOWn1uepAxOQ6
  51.156 +vfUm7ELwPx3DLE2J7PPa8fxg4Iph69UP9aF7aOXt61t0fn1Olttc5ANjZuTHYyvq
  51.157 +aPeRPoAmJY1RM26BAzhSdLYwZViEbUhPdmGmTBAJ98PnsvXV4UHI4oyDiZOtg5B0
  51.158 +CRc1jcdabl7YvnBauWJBGs0saHxvFOHXdBftC5cx19kO8vFfoUS6wdM6Ots8hZee
  51.159 +MIOIJZ+xwZSdVA1CMq4v5PrEzbfrHh6oSZ4AkJnFpvne6zX/7TAnlIkCQgQTAQgA
  51.160 +LAIbAwUJAeEzgAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJZLp7LAhkBAAoJ
  51.161 +EDQ0ZzBHNBnrGgQQAJRnVH0L6X3aNkmLwZrvtWlrfSNG56g+WNRH9KN3NsQ6l4dC
  51.162 +t0IHq9wXZiydTvM+knRnzhpkKNA4bE+mFpSngiC51huE9kvXa4K0s0/oJqfZGfrY
  51.163 +JeaeEWDOxZQ+c0cxAquRL8gB0L+nbEx0KwyKeXexi29Wrxq53Jc3DBJPeeC1zDkd
  51.164 +z1+K0GcnmSBnH1BxJwXqgXg+8wo3CmQD4yn8GiY3L7pRYG+XHgnNLLsm+n6fAyFV
  51.165 +H1Xsk/BRWEu1kWKI1PHaVL8l+/xd5c7Sa3duL41z0W86VHkD0uDdKwyaH8fcV58J
  51.166 +gUEAS0E6VdMO4GnA20hbcX+IqIK/Qpp7FtT0CdcPktJhMUu6e2BXgtL75Z+pmnk3
  51.167 +LpFVSd6pCUavRQCoXO3EiDgKRypqkr8MVKE5IDdNhxo5EHq+7oHyU2lPRLkAieUf
  51.168 +9ZEun+vFiYEaV+T7hqfX4pcFw6dTDvOfl/4lxzxErvrRf+F5KHIdsMtso2clS4FW
  51.169 +GzcnuG3EQqDQe4RFRyo9smCR7KfyYJmM00c+NSrb/SJ/YOfcqUErKpVsKvlS+wY+
  51.170 +M4UkFqOshspv+v6P9b5sDVWY1dwGHAgq+bwIlrkT1BuYKsNa8Il2J2h5caoc7k+V
  51.171 +221dFV8OQa3TQX92ftuLo8ayxX5XvlKRkI5lV2ExlWNPblMjsO83/5cXGm+oiQIc
  51.172 +BBMBCAAGBQJbDAZaAAoJEAVxr7ylSTVTL6EP/0PoDMuttnJMIK76lE5/JXM/H2+Z
  51.173 +dgPUN0t8YgkaKEjvTTcBsiJlt9cnxsTxGHuTi1fdkLQYO5c8LRIVV57aY5ocntl7
  51.174 +kIEoMiUUhiVlHMSaB9PE9HQYMalrtYqhtJ/c0YfIYt0yw1CFYYaNZjKqI7O1zbM8
  51.175 +yHCfauSYOtUgX8oTs+i0/MFUed1qP4EC5W9nRzLhSkzt8jqIn3O9+jksZLAGUUm5
  51.176 +X/4F9DIesdinnsZgYIBXWVVR/04WkLnBwz/f5EhXIq/lhvpde6fNNx009mXtUwez
  51.177 +NG01j+mqm36szmj0Q8+QGhNxuL9i6EGXpoT5HKYM+f+HqO6TCYIiZIBvL1N9J87p
  51.178 +NA49TldwwHDGxNJjUPGT6t+/UcWZ7oKylr/6GyWT9si4JwlUSNMRX2l/kELit3r4
  51.179 ++QcLyxCHcyS8x4pTmnf0jP6xFjqiCJShOo6FuR/BR3bTSwx4G1H1WRpEdeammKFA
  51.180 +GjMFoskoNY8N81eST6AIR/OSZ8RoBUoSb2XTgzwr20G0xz8UefGcViA2NwNYALPh
  51.181 +FY315+zUqyfRuqu7wFLjy3rwX8LZveXIWcRW8mH2ZWk+HkEsmWs6LFqu3OHqeyO6
  51.182 +afLSylzT4U/SoG5VHA6xTNeKMWPkLkQLdvsqU4CUF/RMdq6YFJqV3NGTaZ99yHxa
  51.183 +D6L1FnATnV+nbJOuiQEzBBMBCAAdFiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsa
  51.184 +PZ4ACgkQoVWsSRzM/EElPwf/VxjzbUg/AMLIRjmLVScLKiHcwFfH+uCcFK3aw0FJ
  51.185 +J8abKS3FrTru3HwYBF7A6NmUX+/rgPBkKFDbQfz6rhLw6i72y9lkPYUd7MYsl3rl
  51.186 +kO/LIylYYdk347MJ8EQCkxSTwWYSK5SYvVecPtdLLiCJD76QOr0SmaFsCq0ad8bI
  51.187 +2iu7leQrGSfV6JITIoeQBhSLWDSfennZ7MJLg4yKskghpSwjLzZ3oidebIwxvmTi
  51.188 +nUomgTtP2pTnfSgO7wdU7ApgfQ5lTQIhfGr3LC/7F2qoeR8nJcbiE/sw0ZDvegJu
  51.189 +MJgu7Z9j26UzqakdZtCPABTJamzx6CwywTEZ24Viaf97i7Q5S3Jpc3RhIEdyb3Ro
  51.190 +b2ZmIChw4omhcCkgPGtyaXN0YS5ncm90aG9mZkBwZXAtcHJvamVjdC5vcmc+iQI/
  51.191 +BBMBCAApBQJYRUWcAhsDBQkB4TOABwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AA
  51.192 +CgkQNDRnMEc0Ges1ZxAAqJwTf/BK530mkJwU1gF/+7JbIE/PD3aed5pTQV4mTvEJ
  51.193 +fn6m+CcXCG4EpvHeetw1qLmmliGQP21VcgSgmI+fjTq/y9o+m24XUT45txsDGb6r
  51.194 +HHESh9IKhrPJtaSK7IyicUTbWo4Guvt0hEC5sFU0aKZkZEc0SS6ouPc2O8df5bwH
  51.195 +sDLNZ1ZIS9Er3VcQbEwelmFYBUowXxlabftQqFAM77Bkmio5ekMP9jK/6Zfqnw9+
  51.196 +wwb2vVW6XQ/W2mtVhNNgR+PJ71OuX1FeeKD4EGVQ8yE6HNSKB5bzDaW2+6beZqkd
  51.197 +7yvZ/c2hiz5DnY459BYEIAjkFDCNQk5/sAo9ApGENQYm6yScM08W81yiBq3BPG/l
  51.198 +Z4lhonIsG9FnL/FqqpUHKdNZSBmW6EdyjIZxg8liS9iha3JKDFanMcSOVGEquCbH
  51.199 +xV1WxVT/DSLHRgWiiqauqxZ3BHAcrnsKJySYEZzQ3i2Vtp1o1rlWSCRvn0Fh7883
  51.200 +e8j0iVyh6W8uLHq8VkgcMw/M2Y3gfdsRckWOrNkpmBeg+usZostPaeIj2AsYu1JH
  51.201 +hvLjNfQpwCwWngopdpJWexs/DClsAj6WcJYVwkl++pKqRfEKbFCPEriqxzZ4xQo5
  51.202 +eaVZcEcOxIt6kcC6XZNLorPAARd063ShcQMvugXGy5OMDO+mCvRBfjtx88jCQ4uJ
  51.203 +AhwEEwEIAAYFAlhFReMACgkQBXGvvKVJNVMKQhAAn5dYlKDWUp7c8BpYg2WQzNPZ
  51.204 +G835CbxkQ1rNWZbsxr6cjYpX3UNjhnFY7hlIWXdKB+qpURAQD1lgj3hpx0p97e+K
  51.205 +qqUroF/Y+hoLJ0j48G475TEKiL2HLSx4Gp1497BzH7yw66NDvAby0ujW8mj9AgfS
  51.206 +oo17qRukZgVkwYnz2zQ/cgXrnATi9TejimjgxucP3j5KQMbyIL5gvXk8bU4GWJ38
  51.207 +Y3HFWFXauUms+XZpP+J1B9Ucw6WylsblPGJ8ra6h9K4bVMAHP//PjK0jQsGt15Tb
  51.208 +sv4IFQ177/lJ2QAO1AlYAuuRginDQy7T9nXfpEXewbHbTWash0j3Yj0+paYLp7x/
  51.209 +5xEbLr2eG+gZ4Et2a1qeJJWjVhP1WNTtySGIAtJVAub1XcTApoq47KTxxLpBGOJM
  51.210 +eOzs728QWe2DAGXCu3Mevnjokzmesvx9nwhAq+bPaguheyt/PMWDkMxI9GgwlsDa
  51.211 +9FuAMZ6Ia3MM6CNkTxcg3PyD8/iRx0dUb5JXvXlwgw4QTUA/2UGf9qLqHTTxTV6F
  51.212 +vGRrrCvKx9jqYYpY1+hlmBEpPFOc4eiwH7yLugh8M2aAzvIHGtrSMHWe8sCEaure
  51.213 +jWWx7znH4KBe6JjaEIVHGVz14FBxvkUGO2ET+VybsTILhVECnxTM1LonEVJkCpTz
  51.214 +lB5XZxhPT/i7uGofUz2JAh8EMAEIAAkFAlkuntQCHQAACgkQNDRnMEc0GetR1A/+
  51.215 +J2phQTJYEqeKgWOzRV206dK1m+pGYWzM1Es8wtJS45hbV8xXrnWlo14JBUVC/mmh
  51.216 +j67/jrmPCnKMMnRfVtEMoB9MULR2s1M4wVzl6TJkemDNtAdgpBLyC+dBQQZyH0v6
  51.217 +TTJVhiUKsWxDR24C2Hkr54Z4KcruQv4QhHd0zUgSjyihTYdOjMpO//VaOmODCCoX
  51.218 +p48BWN2CMDeGCVDs9nvFuMDrQ1omFZCL+qZcAJbqOg5LJ/FEl+bf8noGIZ8BZphF
  51.219 +pVB+yW1sNRo/yFYboW9LiDdqENhc3Wjx/Qy9qZsThNaUuWNqLR+CdTpPZdhm5PnR
  51.220 +yBBuxb+hIfI4P1Vk1vlwcNkyu5z6gyeMOkVwEv69+olKvpwX8UhYsrE/t4NwVQCm
  51.221 +z5g/DYrGbJfz/x8cLl8h/DvO4lPAKkB0VgxDSUd3kIPQEgYgJQ1xarN3DKOyn+pL
  51.222 +/EEuWcYsiI7tA6NLS4vIxgojN5+G9EuCew6WALJKKfEgKXz6ExIgRMaTYbp01YxI
  51.223 +zXn7N3dQ22Orz14/hESncImQyretdKAtb5HuoN8fJKubvw8nJHihp7EqM64hYhUz
  51.224 +KyJa61/hXKhRK8Dyimwj8k2tTJqIG3bcax0XhhOHvurAFxV4YlQOdKeTk5m0tJ/4
  51.225 +kpVY3f9JWRY/Ug1zzPa8CeKNb/78v3Ul58S1fPnMpcy0MEtyaXN0YSBHcm90aG9m
  51.226 +ZiAocOKJoXApIDxrcmlzdGFAcGVwLXByb2plY3Qub3JnPokCPwQTAQgAKQUCWEVE
  51.227 +cwIbAwUJAeEzgAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEDQ0ZzBHNBnr
  51.228 +Q/wP/07yFuVEWLuSDmsqKuCXhwH8NxG5eQoS/0bOGp1PQLe9Pi0PW3ivXBznFh7N
  51.229 +lgVLcFbWJ18hfbXh72+zX7EsZK7z4w11ELViGvVT+9BFpMmtXVbnfEAigEqMs4F9
  51.230 +yDZVnR+d8SKS2XsKEvOyRMjybGNezPB/of4dJr/ZDRaisz1nEoEBwx+oOyzokeDb
  51.231 +AnD/0hffxqjvkMuDIPDFn/u3W2l3As9vABqF88Wwu/anPja3+d9Xv6MsBxXMz77D
  51.232 +nAghUsJ7446VEWVW3u+PZRSqN6F+LFChoMUHqHyXUkOMoYZzqTRckGyAzUQtu8sA
  51.233 +Ep0GjWezp/8Hj3ChqgLfjVurJudJd16ez0Jk1PqKemxgwzNc5McBIp3nWC1PuJwk
  51.234 +UXwBcyypfjjEckUfgtRsPRhUwabnUwK59K9ieHlyk2VJdVkhnAIBvnxoAjz4tE2J
  51.235 +o7R7dzRffbKQD/ob4kkNjCZYFGI+MkFFdAqP7iWgNxljQ9CzDWH1P9SdIAwSfMWu
  51.236 +4LFdSV9MhDt6CveCX8l9hQI79HK7HdhszCTqDON1zRK3KPtmvcl29LCtL0L2CIUX
  51.237 +uxhQ+laV/6lALQBqg/wCmA3DQt9tDmhj7gwtAuo2RPAQB90LBFrGvdN1bX4qGx2q
  51.238 +xIvGXlLSYWfuFA0mxwla90MHAHEGpMNDBqlrI7Z+zs7kKNXxiQIcBBMBCAAGBQJY
  51.239 +RUXzAAoJEAVxr7ylSTVToxYP/0ug4SViM4P8PrhjT8zuwI2yuYkY7PTSyhJi6OLW
  51.240 +/ngkXdpVmDy5TjSX/GE0QYbARa7MHmjzKM73PA72o0de9EFqNxU0rOMRj7Hxh50F
  51.241 +17fw5iwvYepKdku3JeZUB8xZkqQxFOj8Xar05Y3TfdWgCpneEwMqhtOG40DMHUtp
  51.242 +m29t8q/hEHUG5zI8j/wgNnxQFS3Z5vfsQvbGoDiPMb8qEfEzYlO/CEQhPGOQFgVh
  51.243 +ooYUJWNu3ZWoroyvGys2ANeibH8yLhnOPMVWMBMoI35ypmLLaier5n0bF9LQmPV0
  51.244 +ZRifzltfWhITIh+MDjAnQM81QiGSG+a8AaWB9mjH27C6VIoCtjrvBj3WfeHbeDwh
  51.245 +I6jmTXj2QCbiyHhb7Dym1Is11j5pL1m6rK6H6kF446hmaOielUXazASrUxmRsMLO
  51.246 +s7QiP+KC01KATEOtmRNXbu8rSbaePM3Y2Y5Hvg5d2GFloWraRQnSRj+gRcDFJtEe
  51.247 +ZAz7rCrEw5K6FxDBuO0IVY5WhJ9m1oXkepNqfsNRQxxrqYobP7IxlojVnF2guCuy
  51.248 +9xEO9Hv8b+1htoT7ERm7UlGvu8p4OqYp89gAYUVXVWiiesxMItCxWX75lPVLVnKy
  51.249 +k77jHz6N41aPYBwnzt4fQx0iT+/Ss6+zEZA0Swboz2p9dfws+uPIrUwTYZoxVLx5
  51.250 +GdPHiQIfBDABCAAJBQJZLp6fAh0AAAoJEDQ0ZzBHNBnrXnIQAIA2U6ct4eFyhDhG
  51.251 +mVmARMaddXWpaPS5xNFgWCvbZqWfVMUxEe1/BeHiA4Gkd3ew0Hudz9GXkt43LFi8
  51.252 +2uZBUV20lL1cxneacQt8o4XUGP5+oiWmuTjpSJmG16uqoEhHIpKnZIoZPDgaEtZD
  51.253 +P5TT8ioKOoM49OUT9nWmRu8dSGdCRqny4cn3Ygxnkvw645ZLL+BV49d46jLRIg/E
  51.254 +uGsDviM9lnF/rPaHgDqaZ7LyLQ/ZIHt8sJNXYl4JHWhspw9o0rlVosir2Kw23g85
  51.255 +a3wl1945bDod79PuVUHknAGdEAxhLz5TLFlGZAn354QCQdhAAU/LjjWEhz7lfXoL
  51.256 +TEWwZfu28zziPrFKuGjo6+Uhrvn87Gznb9crNpYyao+hUxWRVY+eORqIT4mnt3no
  51.257 +u+sZXFQqbrJPsWFpAU8NUtrz06psLLuAAbH6fU6xp8L7aEwvKYzaDCfz2nqMSTKt
  51.258 +yxFG4omAcfKG4ygilDYq7PdRJn+AI3jt32s3tKZwfS7VlF2yo63lSqq5AVpzUm3c
  51.259 +iYmKdMsuJaugsmOnMUTuMOQipkIt5QJ78DM/LmNy0dta38I24DTT1O4/jF96yqx0
  51.260 +S/2+AjK/2mvEDCpR/C6NPrhk6o0QfzCQLas0XbIwxI3z5GVM2D2kZ3+fW6NHi5V7
  51.261 +OW8EVGlsfArj2fr83jqfo86NrZgMtDFLcmlzdGEgR3JvdGhvZmYgKHDiiaFwKSA8
  51.262 +a3Jpc3RhQHBlcC1zZWN1cml0eS5uZXQ+iQI/BBMBCAApBQJYRUUcAhsDBQkB4TOA
  51.263 +BwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQNDRnMEc0GeuAxBAAhKxzf5kj
  51.264 +W+YA+pRA2r+e0R9sK3T4MvJm3tGlVxTr2yT3xLYyKm0KZ+2XeVpMf8WxJ7yZy0aR
  51.265 +R6z9QPBaXO5QUcbk+BvT4kSQEfMYgHZtzBp7tgsyzGV5HogLG3S9Z12V08tYVcD3
  51.266 +TSE0462gZfxrvYfvb/yP4J/0PFz17XwC7ATrEbeSllx9D3m9xi8BhGfkCgR45V2r
  51.267 +7A/oTNhZSaHtxkHb8a9+nzMNd8mgtOCdhOng+pzn2YRSdP6iBA+qabunCY3op3VB
  51.268 +RXoOPpz8CIMkBK5nB/+45Fi56stnCzblXlD95ec+DahW6AYsqXfQCIF3ff9f2KAR
  51.269 +JB+9tdp/8ppxpy0RxOz2uKSDSDaRVVfsG7qj0SJvqSH2auN7awgGpOXC3x2hfA7L
  51.270 +eCb0lISbWgNPlpguY572LpZwGFKz1xvwMSRARVsPrYaH8TDnTDWZcnQEasyxpsHX
  51.271 +TZrnsEZcE6nOaOWDjQp8jsOrD/4gUrIAdgXd2blZGxnD0vuhBVS5MQwn6XpvWEMV
  51.272 +gMMDpACi8eUZ15cRlGawmkw4zjCrX5tyRCaId5EMvYhBW3Vnw8PnQc/S+4P1XRwO
  51.273 +vFC9ijE6zEGYLGl6NoZdBhhUCJnNtP3hCO5WnMifkz2SfAhPxxslRhtdPhAo0d0v
  51.274 +3An8JzB/E9nnHUCbBeyzRw9TWpfSLImvRrSJAhwEEwEIAAYFAlhFRfMACgkQBXGv
  51.275 +vKVJNVMVvA//YfKpjSmjs9agqWzJVhyP5yES4pAPKP/FRC9Mm2gUHw0eTCwN5pqY
  51.276 +DcRkyhfEq0yOdfKTWrS4g8Z1fCkaQS576oTv8L4msrb43skhQVl1QUWGNAcNQxZD
  51.277 +4p396YnqPDGkkftr4ac4v+SNZFJntNs61Rlp6WwKcF7rKH2qIE4kmirrQisNiuDZ
  51.278 +5Y87bujhgtHRc+PN+5uu9t2gymH8ydf3R7x1lGYbF6AmRvEg1cW8UBZAF41b5TJo
  51.279 +hOoXqmuUZaHmeMBaELiFDbCJ5h012xT2wbjQeok5+DRVRDqPASBRN/Y+xvjMPB+r
  51.280 +U7LHCLRdQa2Jdd6X22QiQafQbY8TIuJ8wZcfSdSCtpKnxEPQcPMQ+NbTrmLZk3fb
  51.281 +nO8qJ7TYZ+YO7dUlT17dO8Et+vHWvF+0WFsFFcw/u/gUzztrkcpNaTRV59GSOsta
  51.282 +KCVs10NXiPmMKBRm2yEAX3lxUnxvLTPfCkwI1aHuz5IiaLPQpSjtTbP6LVtrK7z7
  51.283 +x/N/R8if+XofbZ3DoyMykD8mY71vMz5h3iOk4JjyfBo0W+SLAPhxCCfAV96OVKUx
  51.284 +oRjViYUAevnXBG8KtRNVA6p1SUzAx3XhI6tbm2DWFQIFNpxqVX9fPdBLewx9IXup
  51.285 +sHENq1BiOsdasn+Rn+jjbNAle3NUoHSP3rnJDUkJL07kE/Dv6bbo3amJAh8EMAEI
  51.286 +AAkFAlkunrUCHQAACgkQNDRnMEc0GesyVQ//RwC6CO8a8Qk4OL4DGeOMIVAYS+Pu
  51.287 +nqOSL9U6bk7HggYVgbK1vJS7hbrtuXp2RMBl16Dr1HQXNwflTBB81GkXJF2EIp5K
  51.288 +oG+zfXFElOrjyU7/GJbSlI13RPSWvqlZxdGDiK6gqPx/jVYKjeOwhBf4AZ5NZOc3
  51.289 +3kHEFZeRJmt+0PAQa0mNtAPw+Zrfg4yuS/V6c33Q5GV0J7Hrmow7QTrLZK0QLF2F
  51.290 +6Axv96aF4G3E3qlFWWMtyDWB4asOl40XLyWLdHseV+dj/k37fZOeeC1wJat/rySC
  51.291 +kpC27vT2NS3TLT8M1wy8/Vf4QWlPKjCTxbV36H733pVT/uIr6fEckBrujSh9PTt/
  51.292 +UqzNE+NC2HMrmR6SgTtSxQe/pVfB/iNwjhi7ZGoXQLvv7ZFRtZlrhYjMOZNvCQHf
  51.293 +JV5jx89p9B5eUuVlEBs0LTPeGhMkXemd5awnPoDenmbQUiquqqurfqFJY7xICVrB
  51.294 +V6yIcbyQIhy+XtZwMBMCZgBiJ7kcprIwNIBIZwqmuoh/51qADEpjSQzu+NgS6/DG
  51.295 +Qv9wJva+Kj177EN4WrzgvUynhivn7XhQT5OpqtgA5FPTdqKZFvzODsMvBuyzwyek
  51.296 +F0QWNIhdqvcp3i+fRvXMfDtX5YYX0rrgr1S/5Umw9e7sMDoVAdwtciO25ZvbGNrE
  51.297 ++kgsSGxu/ItTkcS0MEtyaXN0YSBCZW5uZXR0IChw4omhcCkgPGtyaXN0YUBwZXAt
  51.298 +c2VjdXJpdHkubmV0PokCPwQTAQgAKQIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4B
  51.299 +AheABQJaHStIBQkDuRpVAAoJEDQ0ZzBHNBnr6acQAJgaFd2ISl6tK9tPx51zh3vV
  51.300 +YUYv99a82sGU25geOc3TKVfssnpLkMzHcXbEEckVyn2lvs1Q9TaymC2j8BDs5xwD
  51.301 +esqu2uw6b0R01mlYhy1+Cuz4XNo434LUyT1/YIOYzduhrlBmZ5B2Kp6tSBF49H7g
  51.302 +MmCZ1BokjwI7JO9ogyzFdx8zPJ1S8jbV5ADf4QoS4p/GkywpPzCEgOkzMAkZ0B5I
  51.303 +epnmQPNtfPzAHEUnUGZk0Dnvw3BoxH0PeacpKNrByJDMWhyQa71f51ooM9vVm+1D
  51.304 +kjptImQ24/K3k+MCKO9aMeE/2aOkSsT8btvhLga5iXBGHygYfhwRduXJTLcCuMjq
  51.305 +S2E9kogaLm5eQktwXswTivhZgBIgKetFot0hfdTnZpc/AANqajZeE7TzDs2J8TxM
  51.306 +yKL0YpyEhZM7Qa7BIAP94STZfKoRN84CCz5pfxp0e85NN7Aka5wnYdsetNqK5Arn
  51.307 +tYqDuChNKurjRmvj/EJPiQpOTDevQJIUBXYMlPj/l6WW6imSzyhMqu0dhYV/KDvO
  51.308 +mqC50mTSypL7GI4VL1bO5OxAq86xwwrWlnLF0K2yUfS9bAVT49ENL+n45Z2k811x
  51.309 +5gPADqp+thfT+JvQQGQU/KnnOc//AqEA4lryvd+IPNSYKdiPCcMjfr06ZTSFxl+W
  51.310 +Z32r1lgcD0ItVnnpIVtGiQI/BBMBCAApAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwEC
  51.311 +HgECF4AFAlsMA6AFCQaJJi0ACgkQNDRnMEc0Get38g//QbNpYEHXttxg+4FKRnnJ
  51.312 +LPasl+Vgn7S9b4ivDLtcUwYbd2lk4l7KXBPGBPz8G7k+xoPdooMyojIkj3mjyAVZ
  51.313 +BSMZ+rJJVzC/u8YYmuY7GEuMEHxWPLJGLVFwGAjvEewtPCQlS91w5IrIlkLgrVoP
  51.314 +HC9yhtGfcaavKZ2+UHf2ISyZ4eTJpEQ8w2WiOHXS/JN/o32r3aLvsIvbfyEAPh13
  51.315 +U24lYtEL2z5n7HMtuh3mthd6uI9V5+WAq9vRKubhyPj6eF7SQKa/2ry1yspHo/LV
  51.316 +a8pvUEL7uihZxAwg0p2+z7fEYyau5ce2x6lGHI3IimRN+kozLXpFHRZqtmTnfkIm
  51.317 +w2k/e7YfzGBql5AKpn8WSs1P+2LQbXA0qkOlIhgLcfjGUfRUoLyRF4DTm6MEjGZW
  51.318 +N7awVmuIxsmLlVc5i6CUcaxWTE8hT93ssfrL7hVEzb+wH/9ckF6FH+gba+pCvaUq
  51.319 +Ssf0NWW8nNga95qBW1Ii3XYH8SF8XI0qVGC5MDqHbUrzCLHH/V9U4lyFde8Luvog
  51.320 +3cpiPt51IwmLPoo1v/bu7g6696HPRiPaoAKjZsPOejinmsFVmCVcEkylMLx3ycoB
  51.321 +KzxdVKNGlD4gJA20tysfTv25ZOaj6/WXI5rGhTu905w5UoWgB5keZ/npRKhDH7+M
  51.322 +nzMmuOhpIOUAbJY9TGCQaL2JAj8EEwEIACkFAlkunsYCGwMFCQHhM4AHCwkIBwMC
  51.323 +AQYVCAIJCgsEFgIDAQIeAQIXgAAKCRA0NGcwRzQZ62qQD/wKX5cKoICueycy8MMR
  51.324 +0YlSgji8cu017P9EsAVThyTeWAgjd9GQJ2dsWxDrPynU7uKEJ7a0GZXi5xyrGFiM
  51.325 +tKhgwVegbWt6OPknUoAKZGzjGyghoIfRNxQJLJ5Hq085A+Gyh+6jIP1ahhL7OTAA
  51.326 +4fZnC4SqLCdoOdcx9+Vucr3wUHBCayrU5HR8GiHdlj5J0eZij5FuGGHIx+sbXAiE
  51.327 +NBPM5B4eXvKhTvCKUs8h9/upcrPfk0ZRxeoh/BxQUOnTsz3J5QXaJHc0xwg3cfXO
  51.328 +0vE0/+6fpCCpniMliDBOfTsX7PbD8UYbCV693+rjFVkOnipyBY3Zz4aXR8Bojpt0
  51.329 +jSRuzFmVf6cqcCJ4knz/ekPmebNayG/NYkAEkAkmGIh1VbQCngufDrFius+sBzkt
  51.330 +Hrmi0VVZRqF0r5zSMVM8VAowzlmnmO4QR9fJGtJ6DjLBImLPJAH0CiNthDChtAU4
  51.331 +XPegZmbZIY4Ox3K95yrKzmhbgE0RhshSERm1D74WTfcohWZurLQ2/bJw3OFWOUaG
  51.332 +GYylV/f6Gzz7iMx7s22PE1xBlwjD55eTnszQ4HiQYGV+2TaQIfRVm3vB/+NQ4LZB
  51.333 +q5l5idrNnE/MOut4XGbes78Q4pRtXQ1yJ65ciPeiifkBd5eE0hL8trRRoObj1JPo
  51.334 +Cl03ggiT2+mEj3/lTB4mgcJKzYkCHAQTAQgABgUCWwwGWgAKCRAFca+8pUk1U9wM
  51.335 +D/9c4liSGCPFbBqg2bppnxPucZU5vc9fyY2u1D7l9RNlXAok2InABdswoy7iUEn4
  51.336 +8TlxuTU0+0PK/fSNnkCAVfYPYAp/Okmn5B8g9gkBqMgTd8freN9VWTp2lSlxaFf7
  51.337 +0u02rpYx7nMCawTRmWhDOtl3hTEpEvtKuNjdjtW0Mz8zx+FnT9L2+e33+ykOEfYK
  51.338 +mIO01tirfyPdKwWAsUSa7C9WGKR2UwVvTcZVd1HOfCktMh4ELAnHaV3jMERbySsO
  51.339 +XEuCmMJU642yvVAKOFt1bRQcvpl0xVtvBph5kNuSksugY6YRUDSBq/bKyegAcjz7
  51.340 +OtdWNzU8jVUbBELe/w2U4D1C18fSJahkikEnemIBZAdTQqBPKtlvFbmCnEB2pQO7
  51.341 +7SpIJrKQzD2LV13vlqfY8FsqIBJ4kQ+PHDWVLrMx7kGF/Sjl0Y5lN+kXz3UNlJ4x
  51.342 +R1yV56gmI8ZM+tqcCxE3cr8brmP+xxkEC0KgmDO11vYwrGdrSC0PnIRrqpCu85qx
  51.343 +KmkVuE5rgNVfNJ7qygPcoQvgum91OQePIfHNusw1Ms1D+D/k6Hab5cC/oOCB8QEp
  51.344 +s4vH51MN6+z32W5vXGWTCA38AvkeDc7AqrPCfZfln94HoUP1VtDcSRjyw6vXnzRe
  51.345 +/ndTSemOjQaVOCYA22S6wpDs5GzjN+0t2GcQk4bSwRLWwYkBMwQTAQgAHRYhBArp
  51.346 +qj4yBZXPkylr36FVrEkczPxBBQJbGj2eAAoJEKFVrEkczPxBZPkH/i1MI+W8srfk
  51.347 +pO9WMyo3bTwRM2LEEN1LCVfXhXxqUbzbjERy50fpFHpqhBGcUssCZrmwwpDrtisG
  51.348 +eNVX/SqHRj05qJW9sF4psuoh+jO3h5lkvQA0Ub/iIaQ4wKgqs9oVwKrMTwxbgqZa
  51.349 +DH4PbZdpMILISeokXIvJ2+cKSpNHXLDFQZGQaFiuFIrDKRG1mnmZrfpYekEXHp1e
  51.350 +FZXXx2znmYOL9UF47TaEvUl572f7rWkNcXVaY8xSvOqOo8vdsv3Spjkjtjn7+UJw
  51.351 +l1rTLAa7geepzFYv2T2PNFYByBGUe/XCe83TxFgp3EKzrqu5GOvkQhYlmltkxKSt
  51.352 +YZZLGCA6iPu0OEtyaXN0YSBCZW5uZXR0IChw4omhcCkgPGtyaXN0YS5ncm90aG9m
  51.353 +ZkBwZXAtcHJvamVjdC5vcmc+iQI/BBMBCAApAhsDBwsJCAcDAgEGFQgCCQoLBBYC
  51.354 +AwECHgECF4AFAlodK0gFCQO5GlUACgkQNDRnMEc0GetWoRAAmr2v4Fe2vUn/kv7t
  51.355 +dPRvQK5fCvuOpAvaJLOjwePobuJa+ItCxM5rGTkCKoCX6hRGc/wpKdZB0Yd2dv9O
  51.356 +SiAdiyoOQOnAtt0+pFvcJ7w5bOjWURi8sWxj9nYvXyGBiVACUvq6ApU0pEifziE1
  51.357 +GmwfCiftyK2nKq9my8vEnPr4pkVzF8CkJdxmO8Ufu1ETKJC+4LW0R7pwWtvTnsmZ
  51.358 +xHd7A1r93mpygMDV7qzDDz6RRy1bz+HrwUGuNlyCqbsHEjgOE1EiyhblocGFI8yk
  51.359 +YG+vzSdWF48Emz15CBVKRTfnkN/QWsxEJZAhTHvHPb8McDpQ0C94cNuRGL1P6+gV
  51.360 +aRDHq4fWJc8V+kKSjB2HammVyZmk0LYWUaWMBoNlCOVrnloDrOjWyoyeh4zPfbWU
  51.361 +k1H2Tr2VIsYjXTa/ne8LorDGWFKDrbl5Y2VzOMl2FYUF8WXwuC1XEud3YZ6SLPs/
  51.362 +c9/FBhWHg6ZXnFshgJkiIPZty76o0mGBWsImt6SvRcef8fBmEBmjFAt6QyP0djWL
  51.363 +qUGQ2Df7cfFLMt6wjesEcyjQGaAJgXAAlN727F7bOA0lyaCRKx5W4leQhboj3khy
  51.364 +gL9P7HG70iF6kDE5gw64YPe5AhV8nPO/D7wHo+dqrl1TvJGF7Bmbw25cMbHwBwdV
  51.365 +Ep6Xf0M3fBrrf/dzEZ2D+pGkVhSJAj8EEwEIACkCGwMHCwkIBwMCAQYVCAIJCgsE
  51.366 +FgIDAQIeAQIXgAUCWwwDoQUJBokmLQAKCRA0NGcwRzQZ617DD/sGjFOBPWitPl1X
  51.367 +ufY3xkkrAEAnVXSzQsLT4y6HF0SodmPNgn7lOMT67GmDDRRUCKhzG9+vRcjzswTf
  51.368 +wo031/ciXYxG1FrdA75NtvDRNio9yiyRurLJTt6nbZgX4TqV0ug2ucysxGZYVNt1
  51.369 +d9H1v8FwzvJvsE2mDw108mv8dVTjLsLL/BXh3Qsb0kJ9PSamY1WRtabz+BQtv5gj
  51.370 +NRNzOaGFLiw7iWdIPeq7dFjdzyg6I8dLlazolFsidtZQIlnfqNTrBwBVLRwe9IkK
  51.371 +VkmsTW8jBCZ8je4GSop8r6V/Uysq3w17/ecsH5VPwuNVRtQIEEV+ojXCFTXCCwKk
  51.372 +xCUYLsrZQG+3Cr5ZtIBH+xxplx7dbC55DWcC2Rb/+iBR3Z5pyDrzVlD5lTZ1Qxru
  51.373 +2340WVLWcE4EUhHkgKL51+1wUh8SPJph8WiyOTHY4Ncs4ZzHwrwsT82zBhpMIyD6
  51.374 +gpz0697HFV6gtQN5tpAHPfvWDgZdsquu6xnHAPWwDWVKjQqssOlkSOayN3ibTULq
  51.375 +VW+FHXiot6no99vY3C7MwBMG8H+DiiAuwMZvjwu7QF/K9e/GtcVMIjixa3JkMcK1
  51.376 ++KeBoLhC9K7Re3M+usBMVl661js21w0US3AFtwhi8JAD6CV+f1EnGZ89pbPgSDYl
  51.377 +EI1oh+J54bj6Jt1wWXB69Q20BeFpj4kCPwQTAQgAKQUCWS6e8QIbAwUJAeEzgAcL
  51.378 +CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEDQ0ZzBHNBnrVZUP/RAOy8P2I0ad
  51.379 +eV1tGLLd/n9M7f6ntl9vRQOQ9f23xFk3F2iK5JgYX7sCute2lPwqjBewUgxt0PC/
  51.380 +NnTWLhkb5DsJgEfD0RVqWu/KslWRI/kKvcWE7+s4M1Iv65eLyuMWMGmCLcEpRnPE
  51.381 +XOs9qu83W0N1Mw359yc7Z1LUOZdvp2uVXCYSJu52NHV66Lc8tkPcua5VjpD6NrcA
  51.382 +QGuHBtvzu/XpsJZ6AAWskD/gUCCYvFvgIzJ9IFFB3SQXC/ZTKveginNAcKifkJzq
  51.383 +ju8d5nJo8N0D22sYsP7EbaqZbHl4YzwmiELz0uDg5KJSVj2sC4IzWXm1aHnZDV8m
  51.384 +FdflUTSeG1NR7uoey+yf5xRht5AL5AmbOdlL9aWQzje5bqj1oXb9HqAWfOAshsrx
  51.385 +Ygz4PT7u9FGCpZ9alho028yEpZZkWZejLi07M1fQc4kaWMHHfi0aMlYdELsQ43o7
  51.386 +5aspJ9i39aVA1JRXAAB77b/FDNEPX4RbkcX6dyjDdU9GqhE7CQcjJyabxUGwR5DJ
  51.387 +NB/XjFubVe5CCczliqAFY0FHjXEaBoZvsrE6mkc3mGhdyU/016Mpx+lbQgTi8rNa
  51.388 +WmOrnQmdoHhKAuC4KFhrwlalez1fiLdl3tdFXqHuDehB4zLj+cZcdq/5VriKGzI6
  51.389 +5Qrq6HidIvFfJsK67aC1l9dGbfqgvgSUiQIcBBMBCAAGBQJbDAZaAAoJEAVxr7yl
  51.390 +STVTFUYQAMUyyDQO9gMbS549V4qpl7mVzzfqtyWmfYApsKuqrvcYVZZMO1Xl2ICy
  51.391 +LypNsZ4+Z+8HWpPc0gxWpWcdwi5uShS38OEoQN9Oj89EJzZE/guZmqfTK8W4prcp
  51.392 +hoPYOdKWNeF/pHqef9b19TEQfiQqktNsD5YRuvuvUObAWm9JQdDB2C4iJRy12zhG
  51.393 +2Y8NNnq8eZbQa1MgK1EJPvQo4oIOh+e6sJ/G1swFZevsc1DzZX7WWd07g60HVXTo
  51.394 +ous9yHeqrm3xEsay1c9tSvuWWIyEDqTiwp/smjpPMcwt4vAp2cEZDNylB0TeNifq
  51.395 +4PWYAQkSib+B0VEYSPxtjiA76T8kQn8+m6m89fcQWBm9ldgxVO5IY7P6WTTZsnRW
  51.396 +TOXx6tFXVC2c1XktUGxUtqHwOGh4E99Nlysl9f4N7DLEd9wAdwmTcEYpFQp5k73w
  51.397 +briLCmkn88kN1Vu3pVovmRIaImP9nTbIe1jYQcQrIzkdqIYdYENXvlfPHLT2+2z1
  51.398 +z73CxDTsOScwS2m8MJPGrMB9YzzwoCv6kf79j19BzXcjpteddR8z4o2e+J9X+Hlo
  51.399 +plwOKIlwwHM5bYRwq0A96sHyLzP3KkTZbruZbE5wyG2e/hcftQ5pYZ9HfnwuqN8b
  51.400 +Z7bB7p3rvBOy5p0eR1a20RQidw8S3gkSzKuDMsdcZZN2zamHkCmTiQEzBBMBCAAd
  51.401 +FiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsaPZ4ACgkQoVWsSRzM/EFtlAf6AkR6
  51.402 +FJ7GSwq/vaSSuZWkHylgSxCLpzXePFmmvJLSuLr1GNATwlxNpdaoN5wGxvFBRlD3
  51.403 +tAZ8y2JpOx4vFcBKoRkGLpn2E+S9TS00JDXVQVE1wB74sG8REm9UwXv2jeAA/VI9
  51.404 +xlADtSbKB1qM1QMCeysBY0pJNilwe1lgSatLB9DXxpsth1hs/o+Eo9pR/3aW6U6i
  51.405 +jOBl54q7Y3oqcXUrwlc+jWgXl/HJWP5OPllikxdG3jFbT0ChrmQAekICk9WOmXa+
  51.406 +vO131CWUgXhzQtHKa3fuPfledIKopH8vDa402q2I7GsRXqkBV8ETa4lSRvoMHEd3
  51.407 +YyGCRl+r4SngBAiE1rQuS3Jpc3RhIEJlbm5ldHQgPGtyaXN0YS5iZW5uZXR0QHBl
  51.408 +cC5mb3VuZGF0aW9uPokCPQQTAQgAJwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX
  51.409 +gAUCWwwDoQUJBokmLQAKCRA0NGcwRzQZ691lD/9ySDQYaodPF9pyRDEIjJyjtC+9
  51.410 +62a37kQAg5Z2/8HxbpKdlaIKJ0NQxbaP3v75Yr0uvHCokdqTi7QLCntRk7enIi4c
  51.411 +OLAfzSlYplJouFULWT1AHf++e7Ydvl//TsmSyO1m/cwrE+5BkQYwpNwwHK50UQ/P
  51.412 +qU5USrc4vJ98iUg9wDvKqTrHA3ql09qeYC7vvzecZyb4OVPsw3mP+LX19Jz+13A0
  51.413 +4mNd9+7g5ohe9v+4+SkSi0ZTgT2HCHP2gusHdd/QCnr3PacHmmNBYrJOkebYt5Wz
  51.414 +mOKIXYpa0s0sHn3iJfDeEGi3Yfua2ZwDaiDvdzCPERliv+oFk0vYC5t9BrbvgJTD
  51.415 +Anr9JJmyevZ+QXKjyhUqguSZ6lzhwWLKPi1W2eGg4Pzg7I3yZPqOlux1xF4t6t4n
  51.416 +gczdQEqPIqy/7ZqumjhDN4BGlOYJEeQzdgi2tMl4U5WVsp5cZ2RlJHXpQlcKcuD2
  51.417 +W3QKzLXLEZr9o00igtTlWXCh8jzA2Bry7qtwnS7JjELLVmge3/tOYSZvFe9xXNcK
  51.418 +wdPLkA22OA4dm488pwlmTFKdE+DE+Inft2QSsmzK6L184pMFcqGGPqfEEPNlxqPC
  51.419 +L2fuNyca5oKSWR5m5LPidT4wJ+F4ddhq9AIVn5WSHNZRfHJg2QbIEWct7T6/tq2u
  51.420 +vsdUwaMvR3/ibzehi4kCHAQTAQgABgUCWwwGWgAKCRAFca+8pUk1U9n0D/9axwQ7
  51.421 +QSAYUVglXYt92EAE6jgqk/cWf5uX9av9GzzrzIPTB86KLrOL+yUqIY75mzseMncJ
  51.422 +aEf4mfULdcM11M07YOdcoHT56WkIyFHqN6kgxApu5LQHJQmjpjPe38+3tbCMQbDU
  51.423 +lnFdxmVxvhfVp5yz/luvJzXiwFZ6f8lmrBOJcOw8JNIMldo/LZ4oHHowDwgIB90x
  51.424 +e+CLfw0FQRsuEAjmsyCwO10ur0O07wLrh17/RhgTPZGT1Q8886THN0BOtWImRphc
  51.425 +sRp38MjqV+UrWCd6oUDO/tbucctjtohj75D55CU9bqJfByX5mNG6hQwsKPK9hc10
  51.426 +vAStvk1/Z8WQ+a6nHcL13pi1trZOch+XH1R67w9WMbfw9DyVgup+AumkPsRqsqF5
  51.427 +WKtrXOUb4kc13aWFMsIm/nWn3AHR4NL7BZk+YUNsA1tSRygSwgOAVNXQ9W2xH3VI
  51.428 +hiAuP1CnUJr9YsLfteF2tbVJTBSFlpcpZudBtrKVC4odPD52ThITMj58SXZ67THS
  51.429 +YAtOHzzIKeGnDGhb0tXj2Ca3WZVttIRKkH24w926mVh8HcaF0V52ETv6xPRUEH5d
  51.430 +jI+y3Wi6yUQIwo3+LXXuhjAGhV1owhpwo4J85zR04eAKet8XpEX3S0dxHkD8JRB7
  51.431 +hZeVZJfdkorYeK8pmLeBtpyOo/Z6Gc34GjsocIkBMwQTAQgAHRYhBArpqj4yBZXP
  51.432 +kylr36FVrEkczPxBBQJbGj2eAAoJEKFVrEkczPxBuyYH+waLTZgUlfaAd+JeLrsn
  51.433 +uS9kYvG7RtBZNpVLtG7XJ3td+xiCLS7APwXmUmG2si9UxYrj1bNHJd6CNgt9tkWj
  51.434 +n/V1tCsLcTpwUUnEnq1doYxkzFnJACItKBPUEOaHZuH7heFw+vdjBsdne1wlq0EU
  51.435 +ECgfF8BoAMI0ohfoOf6j9VZat1Vh5GrZa525mVwTgw7exvTjlo8K3lIfIXag4ylp
  51.436 +4hxw+tqTAhV7s3+Ju/f/GyIYgJ4gCgvXIosFWSWc8Ar65R4NrF/y9wsETBNmrpYN
  51.437 +LvfpAEqAiiPtTJFuMl8DffsbLLN9VkeKDMh1aZbn58QOVrTy+Y2BFiwn6z/LT7nD
  51.438 +uKK0KUtyaXN0YSBCZW5uZXR0IDxkYXJ0aG1hbWFAcGVwLmZvdW5kYXRpb24+iQI9
  51.439 +BBMBCAAnAhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheABQJbDAOhBQkGiSYtAAoJ
  51.440 +EDQ0ZzBHNBnrbjgP/RDgsbGW0HHfRzqRICYk6sD86aylqXh+PSG+DFd1BV6kupxH
  51.441 +EHZUgma7q5bmYAnCyhePKVjwfbN0KGITX8WDWHdx0be92iVPTFg16kwemGllqewJ
  51.442 +DZD2a71MsmOYop0Hwifdzn+eOtAk9Bs61WYklhbDNxMJ9PUR4iujCnUby2VlX/zF
  51.443 +Lv8Sb2p4kPEikesHMG8doiaxRi5e9rSa5N29y8bBkTVYf177Gc7bWcDZ1F/aBm0W
  51.444 +CklFR3W7Oe9ugkeW8A5yIFOhiXG1bXbjBss6/PbdcOD+/DGtVHRv2jHEQgmID66s
  51.445 +a5vanHrKNw6W6h1OaCpRsD/3eLB8YPkm6dOUAaYZNaCHAbzOwyHRZsLDL43M2lYi
  51.446 +yyyyJFN5bjWvuj4QFa0PKKZUwO30uy96u6IMQlm4m0FX9uCiEy/Vt25NdeTi3FC0
  51.447 +B4iVQd8xMPP5PoMqC0F/6qDc1aySzYnvVgd/a21IpCIc9qqg+ABVKBsvBVM0fIen
  51.448 +HYlDjIUFPGpkgGO2WABmr15PEgFS6dGZy7m1MsfZBOJ46Hsvpvkd8FzLX9/qTYS6
  51.449 +0fbSF/5B9wTYIQgYoe7uWs3AAzzInciv/kNvAxdgwcahoQhPyo8+thOiKt1dLuTL
  51.450 +EhpmV8XcPxETPRu2M8tAcbGTV1QolOWhzbMDA+7m65zv0wQPA+a7lROBqtdciQIc
  51.451 +BBMBCAAGBQJbDAZbAAoJEAVxr7ylSTVTtP4P/0VAO7cH5J435IdkHwZXzwMtW+mt
  51.452 +roIQf36GD7eOjZe02aQvGBAy6VkqE+vUwpHlBImPLmpsRbKqF9BrnaoQFsBW7x0L
  51.453 +DRg1loL8izxABNZdo7pXx25J9u5IS4B69dxEiVakJj8Rw6ZEaWKyILNskNXGoV3g
  51.454 +F0x1uLujOLRFx77sl/BoKQVdnmsk1bgPcLpoPbC/7zASKKak2C+vW3eg9ruQzaWK
  51.455 +ODPflyboT5p9hHpH5kUd/5mYhgpAdyfTOyb3h0WIhKcCRsMHTVwIC9SmnOpoNkie
  51.456 +BDpUkiqHjjUxWjbWY8JhJP5eXHMAtX2ffKy5vWPRlLphg3MV8j3y/p6lUOXRnISm
  51.457 +ELV5zOuqIUP4OalNSSi8HV/6wmWmvRZeNGJveWwagI1d9jLkyCUUF2kHYirXgMK4
  51.458 +MXoK1jNtwEHE/hr+pj1qYPEIl8ggdUHqkKxme3TZov7SH3J/k/uGjkBxYmP4SCq6
  51.459 +D4RKDsgwwcuAt2MlCRMO/6nhWaa5wY1BcD4R4sFGJw5ondM64SoupldfuneVeQ5q
  51.460 +HpjvQSl8TEv9W4Dt4sJ3lnnaBfKXo1DCVsAPDNOASl79/RDdlxn/+tDaboxQoILh
  51.461 +bwjqL/zD9o6SYmjBo8czaRMVKz6FGfjGUl7MBQN6JOmIIiB+f6GRsX1aJ3pBJpys
  51.462 +I4mPZrpvw9PBwXcxiQEzBBMBCAAdFiEECumqPjIFlc+TKWvfoVWsSRzM/EEFAlsa
  51.463 +PZ4ACgkQoVWsSRzM/EHlmQf9GYMMUtbi2b3vXLXKCYjmvG9aoAigVPOzxGVBeTBR
  51.464 +Rwj/TTcsWdNgKxXKPQ4R3/uI5NYCnt/sAa5rNpUWfgkAW9++ZmhtWCw06dd1hWs8
  51.465 +7ziaF2pytaJVZoYauNhKkz9wVKWlWvQglCPK2x68RytmbNxrDK2/bQKAZ7o/b0KO
  51.466 +rCXF5lhHXtTZV9X6/wKmKlDxtGOYybDr9VvfliyH7Y7HPL02FuaqOHB2IQKkttlK
  51.467 +86UcbQRFgC0DGUAb6x+NpoZfwIhrIoTSfw49P4Doqr6WNUfAFQC1Fa8CXIg4a1Ru
  51.468 +aAPCZDa0yf0lh7FaGpdugLe918QINlSdsjwn2PHJQm+lMbkCDQRYRURzARAAwm6P
  51.469 +rA3k0gpy7jcd4LPKebL3xIN+oOp6E4jQMcbBWtYQigfMa4gOjVNi4eeL/FaTky/N
  51.470 +IEFYleyHWp0bxET+9W9L/BNjDt6R/LWBDLKtQVmqrC0p8rNTqCo1LI0CsCEu/Zzy
  51.471 +bVd24x+w/VUj1Y2dkPEP3R7FpcpSDMzllM+kLYGXa3+R0PAMniAzDamfMTgicv9Z
  51.472 +LIODKjDTBXCzFFTTKwev/nirD18k4vBqTFsssLnV9MMxanSW/yFTQcGm0A6PiiKS
  51.473 +Y4Bsk3T4OAHr/CR33ebeWvmcCTgF0u72zUG76XXwRHHjxEG9n5BwDxVfiq/2niXA
  51.474 +2Zua8nDx6wmYLvzugFBrmS2cA3epuNLDbnhQ5oHR217SZY/pVTKLmEXEanY85ISF
  51.475 +yuKCmZx1H7Rhcnr/SJGcmcTyXoZUQHimhWnXvMOpGUZ7+dIqTaSgBC6D4D3KWFVl
  51.476 +FywjpwU10PVJQZRSHwWsO6z4UCOrEHq1F13EUe7RJnguhaCoPdFfZNM4i6MxRSCo
  51.477 +xV4bv1+WxT1trY3bodnK//p6/7OXPrhIj0dmtdFELHeWKes9w6E26pWLpzk9TaAK
  51.478 +Jp4jSGh5awjgFCsz3GT09HDy5pjesXa7TOMbsc9dbUUX3Z+JiyZC47F+hmwrOOek
  51.479 +4G34/GXz2RxJdV46lr4nfuU8y1P649202BbKxQ0AEQEAAYkCJQQYAQgADwIbDAUC
  51.480 +WwwDoQUJBokmLgAKCRA0NGcwRzQZ611iD/48dFaRj61CvBuYsed+Kk3uo9pCs04W
  51.481 +SWiUarnd9zKlx3ChN+YtYMTDRpQcH7JEP0N3OifA3nOSgLgd7/HrPdt6Aim5k7v4
  51.482 +Fw7AwEuCbP3w92hzot4OetOyya6IHy8xpiqRj2etPzNAbB0kBEvwmNKSOZMPVRZ8
  51.483 +0Pegz00OI5OMGopuYgZcyAd/R5ZhqJf+8EmHsNXwT3g3ifX7QtXOXlfK8cCExxTa
  51.484 +4xreoP7UWIAUHmWz0wFnPFNQlTt42oA9mF3PjGgCmJ7j4XF7cvEyO0GDRZ1ZGWbE
  51.485 +xrk/EdGKrBQBwlCdxc/1Q87B6Kl2igXAi6rvOeUSWD5TAJSoi5M0gZYB7/6Ve+1Q
  51.486 +04sTmRt3ev6mLLb2Fu/glT7LpVUcMbpLrOB+Pm2d0eOZxVeElO7RV5nJQ8LNwtrl
  51.487 +uBlk644rn9mWiVhfdhfmP/eluXvCyps8BUFwZQu/LZB7lAFiIF0cr+7dKiLRpgMi
  51.488 +RLhTCQht6SEO1rreSb1gF7Em+aJzv1hpvbzQp46vUOqeUGZr1iF840W0b7n/s4Bp
  51.489 +xED67TQi25vFfEYYBtEzYqTCgI2v1h5ixtBkovFbXv28RYZPg5bWfAOQIwb3AnYv
  51.490 +FGBN2XdeO0ytL8rT7qKhvcS63E6ap605r5IvpgpJFap2KhWh2mwHYvNTWPnf1uTO
  51.491 +KgBhWHuSC0CEbA==
  51.492 +=oYD/
  51.493 +-----END PGP PUBLIC KEY BLOCK-----
  51.494 +
  51.495 +--------------D703284A94612CBD63CC1F3B--
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/test/test_files/432_no_from_encrypted_and_signed.eml	Thu Oct 11 13:04:02 2018 +0200
    52.3 @@ -0,0 +1,92 @@
    52.4 +Subject: Fake removed header
    52.5 +Reply-To: krista@pep-project.org
    52.6 +To: pEp Test Bob <pep.test.bob@pep-project.org>
    52.7 +Openpgp: preference=signencrypt
    52.8 +Organization: pEp
    52.9 +Message-ID: <738942f0-8558-dab9-5f60-33267708110e@pep-project.org>
   52.10 +Date: Tue, 28 Aug 2018 17:00:59 +0200
   52.11 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   52.12 + Thunderbird/52.9.1
   52.13 +MIME-Version: 1.0
   52.14 +Content-Type: multipart/encrypted;
   52.15 + protocol="application/pgp-encrypted";
   52.16 + boundary="9URwsx7u29XUW6rbMgCxFfvSekUGqtOLi"
   52.17 +
   52.18 +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
   52.19 +--9URwsx7u29XUW6rbMgCxFfvSekUGqtOLi
   52.20 +Content-Type: application/pgp-encrypted
   52.21 +Content-Description: PGP/MIME version identification
   52.22 +
   52.23 +Version: 1
   52.24 +
   52.25 +--9URwsx7u29XUW6rbMgCxFfvSekUGqtOLi
   52.26 +Content-Type: application/octet-stream; name="encrypted.asc"
   52.27 +Content-Description: OpenPGP encrypted message
   52.28 +Content-Disposition: inline; filename="encrypted.asc"
   52.29 +
   52.30 +-----BEGIN PGP MESSAGE-----
   52.31 +
   52.32 +hQEMA4rbkTfsG51OAQf9FNb7XSpEj9pZ2+FBeIvjRP052dw7D/r4du1cnYVIT1lO
   52.33 +vFQ8KDH6TgWBNATXo3zUetPSu8ijysjf3BkjB8oXM6WVGW0x0YG7VjrBUSllNTG4
   52.34 +7lq7zHMBxvPMsoVq9l6AruJotFdCpscNPiKwFW8ippx6I6dfC6nkNsSX7VMLrfQ7
   52.35 +ijgwN6jaOTlhfohFDRVxdGce38/4bdpB6ywZCeTdzFQF8G4sPDwcqwEE9CdTgSLj
   52.36 +zyi4OOVwbbFV4zWDHM4X5Gw8OHoedsmbUwDrDtImxjhjBjhbXSUG/1uVivcguZAB
   52.37 +0oAk1YPlAOpJXVFXEv9UMv+NsaYsRerukeO1LIPFDIUBDANaAgXZcwg/TQEH/jRn
   52.38 +KnJa0rp1H1r8BJVZwk20P+kDZhUF4PQ/3bt5d8+DILS284AQ+FkulQu+Qf4MymYh
   52.39 +puPPZwsgRSvbgPuMNwTsvDsoQOWd3qa31ujL7ocbTJXqwt6/CZEuW6j9vIfbFmpG
   52.40 +g30u0e1MZHuU7kcBMptcnpUEE4PoKTTSOK8kcGY6UZwWwJzfMUTi2eR2CawJHJl1
   52.41 +VUCfPp5QU0Lh990cXCEM5RRSddx5juSwIjkozpuP0joaEgwCjh8PLVXvH3r3MKiG
   52.42 +Mp5SAJzfGvvcA+n1A1GSXs7RWw8YwgtblqwJtyCGg749SfKAEVbKQnZiBGgXasfN
   52.43 +fuzEo/kJupFBUwseZp3S6wHXYvz1Fo2eK2pcw9ZnN7+gVawXj27pe+gSTheSt+Pj
   52.44 +iVap9q2mBiZ63ywwvDhs6ON7lDmu6mnmN0ANt9fUW1bwF7vmRBDqzgQuaTKKzgag
   52.45 +gASTYKQqY1s1DQNlXsRx1hPDkvxZyjbbGg6BK0qsGGdT4UWVbe05+N63xK4/RLlK
   52.46 +HNU9wRGy++qwNlv5rL4GNlOGV2ypVLGRWdS2ER211qzEUxm1iIuF0Zcdn4Sozx3M
   52.47 +rItVn0Moyx5ddANOANQlHtJCBAPsabP67+PV8UbIn/GEONdWsyrAgVAUpvqsmEGf
   52.48 +2FluwpxnNyy3qR7LzHzejNuXcCOwAylvbPXqJ/1wtAXjaHYJVcJekeDGKLIgj80K
   52.49 +CiuCM9V2cf95luQr+3u+x0+lAAChFlRoWG8Uk+QlgmYEu0YKSZ0+r435aoo/N1kC
   52.50 +7dMb0ZrWqaHiBA85PGa6j2dCz5YwXWPRmmKIx+RlfCbGlczAspQIdnrwCVD9FWT9
   52.51 +7rh+Kkjoc1bpyzwvnzjPPDBje6ntjLc+0TGP6rMvKQlUIoFX9FKYuvZk1Jm0QDFR
   52.52 +U3MpxHsYZefJFIhzgPreQno+sBK4MRPqQkrybzHk6StdfXrl1tDERZXRqayDmPQJ
   52.53 +xYqD8s3SE3KVyQtJpJdFQyRSHL4JEBpHwb0wokk9Hk5MHH2cwCIigBhYr/blRbBe
   52.54 +uh0y9GTfLioCmiSn5LpyRpIw5941g/2gFwfkhHdJh8SYTI+FS3m0lfP5UCCH7N3Z
   52.55 +QEgSqpT0wdSwiMFoaD4Lu9SFlAVIEl8DgLVxDdsfRwoKnt1gn+e4fSCZJLPIQd4b
   52.56 +BVjc7DLmnKLGr405S6VOMGxiigsxP/WNQfEUsLNE7SQwxCRMdA38wwz9ZqKMGZGs
   52.57 +jzES6rC0qbxkbu/ZjgUg4SL2OsIQqXfxZ6IPcRtA2zfC/hVp862ZeWx8KZ5bS/Ge
   52.58 +cTuTb5oajq09zcIqsTijvyVLrPQ1QhK0zNq921Q7NoCHhckX1iMEN/eFTuDo8yRU
   52.59 +h0cQVtHFxTXf4Ho0/0L55wVnME8VkxUF6BKk9dgGBTUgj2Yf8XA9XraYAq4OSoS3
   52.60 +inNSDShHWbP0fm5xW5kgGGJhwDU82OS2Uni5UkeAN7UyZ98wL6toUiPfoioVq2/6
   52.61 +N6zIYQmH1cBYdtgpMEUEILWhjLTfdYGpbPe08sHOC7wMA564S2DhzQZT4M51JHQ1
   52.62 +rIJwBoW0MqRd5YG1Chnafgbft7ZDFk8BVAAvCGOkNffOGO1yl8OPX2CE4ANw2veI
   52.63 +4kmnlyGY/WEMhzA51t4kCqXIeLP9wU967lBW+dAyl7+FhI8KnltOKNdZr4/72dlc
   52.64 +hPr6Vro0luImdO/KsqjFrnBbG21+HkVnwmJ2dUZ+msoGwWecoMzACv/S/HuoIg/0
   52.65 +QTn0wbzHXYavIt7CSTdUOQMTBsjaWZcfWYBmeuGni4iy3E3Mki/hby2LGvwdYVf1
   52.66 +NW0yyzpaiAzc+ZrGr1Dgrtx9Tgrc/SecWjyZEGztLPJxB8hn3EoVK0tVGW6CgeoG
   52.67 +BWBqBIZyFSaAc9kh6oIs6EJr7+cAMjFp4ljgNoOMRizbPyfYjw/JkE9ookogxS+6
   52.68 +61qeh5qCzW5gGNmkJXKf6oYhST2KvM310sjXvmVKPFsfk9OYnrtHUyTOVENba335
   52.69 +c7wthNkWvnkh0khSOXFyRY/eGvdx7tBWGRXzdwom8HB6Z0QeZlb15inJZAiD8ciQ
   52.70 +JPz5irO3UCA9TQCQU95Tw4hsgewC95xW5yCmi8oFE6EDA2ht6/bxCwaHfdnHMlDu
   52.71 +ALdX8PEC+dKeU5mwYZjk+hU/aoLs6o+ZizoLq3NqWELyVhc9E0t3IgT6SwumFuKJ
   52.72 +/BOhhYfruSb98bCTwSmALBke8KrgafAoqGmb9l1kcYY8y6cbCrn0wwF4B0C74kL8
   52.73 +wrlfAouvRXXN9ZBsXz5ZjD0B1cf+p1sER34+eX6n+6codEaPvHHqGSe3HNAYf1bE
   52.74 +K4nqQ9784cMw3z/fzBQ21i4M2dMdhnpcRIShxJNc9PcC2Hveg676dhgbXkPPp0Rn
   52.75 +QZfghkX8VvIHrD+eaMdmZYUTYv/B4W6RJf1j9Gtf0+ksdMBT3ovtSVryclMKXkYv
   52.76 +lOYLOC+AFd8OqMg+XctaRp8g+FKo8w647mpXbhTE6Lx5g9hP8T+uoznWHQGDRZ1S
   52.77 +buE2d9kM2gcyT83WOCtnhH7wtJNDdP5gup5kMcBJnEL3MDiPLj0RQjUbAztsbGfV
   52.78 +hDxI/aQ+AF/GxGmIObCdASr7uB24zNhX2+a7fbEZ7jjUWf12MFyPpmyLy+sz0tSe
   52.79 +nmNB1MexlPis9bKqlxTuw7hxQULklNsKFvfeo2nhmLirbaaSQHXg6IfWGVZQ7I3b
   52.80 ++3QGtaw8YaJHuw+2r+DHpyBsKOOCnVkTf69t4URpRSsu3Q5ClH4HD+tlyhKGtKGc
   52.81 +KoP6AiWmI/EscnXke3FOwhEMEaO+Cy/iDb6Plvd/MjQg4bQDVADfK6e9Jk4NvbQq
   52.82 +uAtW5qq5ng+osr1yClxpdfKyhAVc5xUF5//v04u2N/K/aY6J0IjUmReaWKZsyisq
   52.83 +B9peITPxqJtLQFshoTs+BmgQqsGhxMGH8qXNYPWDFYh2KT5v2LvTfwPP9JFw7/YV
   52.84 +/Lhv9RqccyXXWP2hozcMUdNztM0SmLTXjr4V8s90ipokk/q2MmiwSADYMpjPvgzw
   52.85 +MOEAHlIjlS4IzoNPT3fDQaHVBpiPZxCEgP/cej4cOW+HTv7zILSk9WKWlX2cYlMA
   52.86 +wElpxXLIsOPlraq+2vpYJUBqikgoctXWNwdSXNLBhAeGoOMIR0INdPejDVpR9ALf
   52.87 +GwwhtFirHIsVCRKiWAXZabCQuZK2R7NEofd+SSWij4m0Ma/zWd0DKDsHMP+QWPqL
   52.88 +dLs7uhHqtyOQS7/9f6sdIh7GtFsm99HWkfEptnX8RAesVovSv89SScU5NsFztHSd
   52.89 +dk09U4eM792Pxd8eBylg6A0ClNevPCwkXdLkPSp0WrQ7dqf4KsWpa7tQCWDVWfWY
   52.90 +sqA3ztNY4pZ+aUMMxgnmNLmPSV03wqgwWWz3qZenkyPrwU6G6X4FIoBN5vHZuekH
   52.91 +96e4DjtXsuDTophREz3iv100G3FlPaoTr/ra
   52.92 +=52Ta
   52.93 +-----END PGP MESSAGE-----
   52.94 +
   52.95 +--9URwsx7u29XUW6rbMgCxFfvSekUGqtOLi--
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/test/test_files/432_no_from_encrypted_not_signed.eml	Thu Oct 11 13:04:02 2018 +0200
    53.3 @@ -0,0 +1,83 @@
    53.4 +Reply-To: krista@pep-project.org
    53.5 +To: pEp Test Bob <pep.test.bob@pep-project.org>
    53.6 +Subject: Fake removed header
    53.7 +Openpgp: preference=signencrypt
    53.8 +Organization: pEp
    53.9 +Message-ID: <5827095a-5284-7511-5a93-09863043378a@pep-project.org>
   53.10 +Date: Tue, 28 Aug 2018 17:00:18 +0200
   53.11 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
   53.12 + Thunderbird/52.9.1
   53.13 +MIME-Version: 1.0
   53.14 +Content-Type: multipart/encrypted;
   53.15 + protocol="application/pgp-encrypted";
   53.16 + boundary="NSkgAD9jvONNSWxuU6NbZsLr3E5X4TCOO"
   53.17 +
   53.18 +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)
   53.19 +--NSkgAD9jvONNSWxuU6NbZsLr3E5X4TCOO
   53.20 +Content-Type: application/pgp-encrypted
   53.21 +Content-Description: PGP/MIME version identification
   53.22 +
   53.23 +Version: 1
   53.24 +
   53.25 +--NSkgAD9jvONNSWxuU6NbZsLr3E5X4TCOO
   53.26 +Content-Type: application/octet-stream; name="encrypted.asc"
   53.27 +Content-Description: OpenPGP encrypted message
   53.28 +Content-Disposition: inline; filename="encrypted.asc"
   53.29 +
   53.30 +-----BEGIN PGP MESSAGE-----
   53.31 +
   53.32 +hQEMA4rbkTfsG51OAQf/YsSAXKEEOOIdyYtTTE37kvW7/YD1WffK8yBZSo2gJdkD
   53.33 +ypcQWx8hDfK+h+K4AQMQsOaSHelijGyPnhy6sGsbhCbubee0xxjuu44PMK5XVuWs
   53.34 +NrDjTRDGDdm521Hw4jSZFQaqvgnK+p1HEuVG0aErVdaJKOPAIQdIK1jPaV5UAtmV
   53.35 +5PSw9n7Cuf/YFYBspNh7dg4s9b7eQcLYmCxvlY9DNrfqsFEs0hjzVLw3jK6m2HP9
   53.36 +v5kKznmF/IeLDLFon8puAn9rnCc5fSui9khIqrZ8c7llJh4bxOdsnwWeHMktamP2
   53.37 +KR/hsp62atwnMLpBtkVT7rVbmFeaM8YXLYao459KOYUBDANaAgXZcwg/TQEH/1bd
   53.38 +yKgvu7WT0W2nkxQQ6pe/w+TBgiE98MGTZe1zJnkDat/rO2Zn1Ee0anNOPM/B/itv
   53.39 +OPVy1UXo/+2J8TxsaYtqytiYR+fb5hg0BNRHIjQ0tWoqr89uPX574iBajH4Vg04r
   53.40 +IOTim3cm+wh0+8QMUGfscsjl58l87xS7sTICGsMJgn3jh3D/nht1n6paY+vHQFwP
   53.41 +0Jbtoj5KNknD/JleLkrIEZqbxpi7lgDYcIc/94HtbephkT9ATlJxFOKOV2dC/i5W
   53.42 +aCXEMZkYur3gy1IXn/5DjW42k/ZAsIO1NjTIMdsGwuX1n+Jsa++lPej7NKMp1wMx
   53.43 +2BDjGU3hztz3VfQNVaPS6gHIwy5zGLI4MvE61IrBD6zC1x5M6oy8UAjPP7vyae5d
   53.44 +O31ayAcKQq7WlIUc0PM3OB0qiFFxAozYc8b67o0XMy0zBzCm6c6Koxo00I8UA6V5
   53.45 +HSPhLQ2icjgN7R5XoOZ/Wh2ZiaGOZvDiquRZqqL2EMuu1JFPQJVTDbUgCsLbDNIz
   53.46 +kC3baypXYAcE5ipGe9AS/1kNtVcj5xHQBgIl3Brc7CHOFPV1SaXKTeJATsXVwP07
   53.47 +r6dR/Uikl493VX7RWypAFx7ebFBwavpH1z0FBNBNrjgN5zo54op1U7dyRw/KUv95
   53.48 +lxM/6UNVK0lnQ0kKboVDlP98JxpBIieT7TYFgADWBK/2Fk21ZUATjWzvjBkpNyBq
   53.49 +KiLZzwFhikz8dPQKw2rcAZXMfrOt5Ubcy3uqn9t5FzqLuNr8rsna028a3V8gyEpy
   53.50 +YMcw/3eOJaiGFjEh65zuYPIisf4M1PWC9Fqas7Z/kBiqSh4M0z8XWGHantGn7hea
   53.51 +zUXKFa3lTTbZSk5xkQhxgt4p+OX7g3XJLhL0nAl89geoQxei1gAu1W67eampcoMI
   53.52 +Z2cErd7W60XWxtkC6a5hn8p+r8EKbP0Gqn8rHb9R/xqzhi7GgfDU+t4rTIB04Em0
   53.53 +u8WvPUi9OlRjbT6Coj3QaTWBL+Fi+stKgPQlaEE0NpH/27YW6XwESwA8AL6Gae0s
   53.54 +ZgrtNOnypwjhKP0/vRMapLDwXOvBUbZoVue9ZXaVgo2wdlEmSPVjZgl1Lxs/F+eh
   53.55 +7g8ayDrpSCzw9lTtFi15UCerD+3R4eiVvopL8hv7WEJSSKrmLU+nyq0bI6hUClow
   53.56 +TtDY7MfkOLJ0+bm7n7jCNG7mb9jNn9E+vsMpUmCgNmHCmBpRGPQQlxuvcdZQRlqw
   53.57 +/ULY7Hxvy5KZXHJULD6simunWuNGoIfDoAz8gzGpLM66rxkvN1hsR5esuNctNTOX
   53.58 +F/v7ifFAcNcXVQDNAtTAAZj6ta1TOWovePWERynTnCLjD3BDz8xgQMkA9ajGqVSw
   53.59 +kRSuvq+nDpef2tK3qApvAdUVkOODW074waXo6dXBfLjYlwPkDn1SihbO+K2BI2I9
   53.60 +map08Kc4fvXGDbUBDfS5QmHlOPZjjE1R/5JSp9LHN5++hSVJ5lBbYsbvRJ2Q5LoS
   53.61 +Iw2VPVp62iStwpkz1s1Ah+X5ls+t25LAmciIc1LSAiQFZeLPbLG5V8+jONdXtQCv
   53.62 +vIdOBrNUuRKo6vKLV4AuOIK6aztDxq54g5Hi+I3x8CMIGPJnJQbCQqV5eXrORoPW
   53.63 +BWNQ9d/qX7egMUXqGlyIbxY7DA5H6z2TkclQxUGSEnkTnuLZzTPqEhEXYrx4CcDC
   53.64 +caAVwzUNlAXTcOrnO/dvcfzF1IxiBsN7/TxF326REmnp48ah9o11gQ04eOoOyVsf
   53.65 +aG68+yldxR+M24oRqLL20yhsrEe0THBeJsjaUhgK+Yz4jZBVl8W8zP72/TQxo22R
   53.66 +pAvIfKoqjKnqIwSD6QP2WUn0OkfvDTqEUZCHUNH7qvh/cIi/cZWHgCVoUHA4FX0G
   53.67 +iIn4r9MgA02512u4OE85P5S4FcYPh79dvkX7gRvTIAjtuN95e3ozQqgUntwwx+dc
   53.68 +da+xdSCIGuuoGmSwEad1OQGSm70eK4Hek+8CMXS0KfpARdw1PzYbl0vWx9JDace1
   53.69 +uSU67kXCBClBcB9XumkK5MC/X5bwPy4RHQvujvvQtnv4pwokjRCiO7Z+ibFEDaiq
   53.70 +jh5lz6u3jgfxKVJRuGRHPoj3YKngv4IUtMjRPsg+VEIcPmoLHQzsX0cd59ksPzVT
   53.71 +9hQRfvVB+AG++iYpYuCNsXUShtyCO/2RQoJaho3hW4tW2yXeaSwx5AteRVcz7cLV
   53.72 +1ytq2eiyAEyk0LKH8MVDe9MSTAsallyWDikE/vvgSnPi17MpLkmXfhs4iykNUQk7
   53.73 +qSEdwxcySlWyCg7Vd06GQB1Jp/0NbKdI7DQ5SnQeL14ZjcT6FtDtOgcDl9PIw0zc
   53.74 +QsFhvE0azlD0Bx1C0Kk27RYfDgnKYYQMNCd4y4MF/mb+06SfJVhApVydL8FzlT/T
   53.75 +SQIhD2tQCNdQX8qaOm1fQaXAonyL6na0eSY9uSNG2PI2+rIaVQoIoewA8MPiRe9K
   53.76 +roDDXBL64MfCMmJPytrAVYgcRtj1r2pnF/j8a2D5ocIAKtv+1ZVD514J1ZLJhYsu
   53.77 +BymbDwCJ3ZdLZpe7xhzZPNq9xR/QfD4gDn2dFmU5QDOZir5W5ZfPNotX9NkwL9SE
   53.78 +shrnHKPK0shMXrqtWOFjAAZRYFyt+8yop+fiM4zWzIt6AFWO521HILw3d7yolltg
   53.79 +1n09/U0u8I43msxSUCn8YH16WECrxRSWYp4zlaC3SL6MY5KNwRUZQ2ewH5YMD07B
   53.80 +I6Cv5VR2MyEJCbbDuuV1rN+Yl/wGhIQ43qO3IaUY/ex4l9WQoS4QVycfS62ryuuF
   53.81 +x01DwQOOAlq5BtzkVdCnAnVokNJAzq66wmtmBkv5oCrujsYHR2hcgEMApVYqh+LX
   53.82 +OZeRaNbLTiNbildSJBv4nI9+FVkZBAxSc3VMxnKPgnTRWW1wuw==
   53.83 +=TGci
   53.84 +-----END PGP MESSAGE-----
   53.85 +
   53.86 +--NSkgAD9jvONNSWxuU6NbZsLr3E5X4TCOO--
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/test/test_keys/priv/notfound-alt-pub_and_private.asc	Thu Oct 11 13:04:02 2018 +0200
    54.3 @@ -0,0 +1,89 @@
    54.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    54.5 +
    54.6 +lQOYBFuzOgEBCADJ+VeIS1gXMoom03AGEy0k/kRY/R8nF0ol/zCzdl6WeDsXLg+c
    54.7 +dEBCnpV/TILCt7071RaFOCWCoDo140/IlarhReCqDj5tFDlUFWhBH88XEa/S4iDw
    54.8 +bAt3B/bblYw1nwjpbJacFf8h3G9oqgqkXoDMKHvEMY7N2FKkGxpuTwy9PV4xGy0j
    54.9 +ZourltdnJpkCb6o/cDnfD/BazWqV93SutAWgtE+dsG8XuiE9+Sm5Hq6PEgUXjYQm
   54.10 +tiu0q+vNCquN8jXZAXX42f5jFFtnfbamCDNCcKPBIjMaU0C1HJX5jWUnt1EUeIlZ
   54.11 +w1HAFOnod4ekX09fxc8OUPXjMlaLIg64ea1hABEBAAEAB/0bgSvhKOeCYzTKlEUf
   54.12 +YqmlbcXne3LsWyDTG1Upv08ivRVI8xIXq4IbwGZZ61SsSSLJPNvAARUknIbI01+I
   54.13 +UI9wdZhieCWaq6Qh9fdYVQlZ2iQAOyCitQf7qfc9UHiDTdjEFvBMqbcwiIkYbv2b
   54.14 +hC4Uf1fZcClDEXgxlmpLRtMUiwJxWB3I29SBvqwExTv3B3h7vRbBuuwmDqX6wbf+
   54.15 +VQDBA33dojZT0MbWmE10wVnEklHg5t1HrtvshltHbiIO5KFSOTPqhlE08NOxQucp
   54.16 +f59olj3650dAZLVJoGR/9Vi7AZvHcZwL4l17sT/dLKtNb+enpBOwLp77ZMQnW/dS
   54.17 +2CoFBADPeuAt5hda9NSgffLsFgOdBKB4Ye3zuC9vWYKRFk4NS5zOkM2cx8AXygd9
   54.18 +si6TxtHweSKksr1wUgOt4N2JHXM8HrcggiSPDpNOy5nAMMjXMyK/yoCGIwnlDPk7
   54.19 +LXl7NEEHWaPqe3/iqkY/88xbY249FegsulAv/bSX1pNhE6b8DQQA+TTXVkSvYTPY
   54.20 +fMmZT7wvI+fj8Ugw13QtCTcdmlAMrGXAFcZT3+LuMW2Zy9YYGNV8T9EaUKWglQYD
   54.21 +ZiMJmiq3UdJBYV5KrgFIal4+x4MHf+i74rYifDDK4kUJMrrBw4wH+0qI6KFIfksa
   54.22 +aQfzYQeaYLPu/jQgPCd1OW8+2hTK3aUEAOPp+8f9Ylvu4HGqLhLMl3I9doOZUOIc
   54.23 +/jLhq0W0AYiu3Kd8eQJvLhSPI1/XvbrUD6qFGWlP1T5VknRa1nRLt+ffwZuFe74k
   54.24 +IVzPWT1qxtfqgmOhJwQpTfLltRqHvY5uQiQ0NwnD2u3vxMzpaqU5YNP9bYjCfvIx
   54.25 +fVo4RYhR3p54PW60LkVOR0lORS00NjMgPGNsYXVkaW8rZW5naW5lLTQ2M0BwZXAu
   54.26 +Zm91bmRhdGlvbj6JAVMEEwEKAD4WIQSgObxg5D4N/dyd6GY7SMODJSEMiAUCW7M6
   54.27 +AQIbAwUJA8JnAAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRA7SMODJSEMiLWD
   54.28 +B/dymMl7+CD+e8usiFv7lc93q1nCpyF55Xi37B6VsWbV0apASSv5Sb16PSFAwym2
   54.29 +TaiVDY6XGM2MAVo54QsfAyPwUYyDnExAiV/h7htufnPJ+fCzIQU4VJacnOM5p7AE
   54.30 +1ki0ntuIgG+RhMUm8QUfdw21mXeBG67Ghc9q/L85Wi9fmJ/4StuMHOP97mt9Q5xs
   54.31 +5Jw+8fdIokBDt04c85v8zIZPUjf8VhvGjNmlVfhF5cxwURx+KBjjm/tBVkGvQcQ2
   54.32 +6MZ5SkGwRpoyd6ySUWn2Kh7BQjgo1TEYNkuQ4RZqyVSGmAsZT79G8DCYXAi+CXsZ
   54.33 +GUwV+wlkvxfg5yJzFoKUK9udA5gEW7M6AQEIALD1ORZlN+PC5nL/GuWw6RoGbhy8
   54.34 +eGHYrQUVDsbrdQO4HEGZlWDyoJ/rVxD/jfeyw7mBymSUlYZgtJ7or2holybsQs7+
   54.35 +fcuBnervRk8SN/RR995oZb5QFTobTLry1OkJ09/DQ9X6jNXSlGTCzpgglqcoQNWT
   54.36 +s2TJgOXObUG+wBIqj1aiArc1y8lFVKutSKmeDVoLJMQwkSKzD7KLu42TMia04dP+
   54.37 +29XaiWtqxDqglt+49w061v48Nnow+WdCw2GYaEra28/Fp1QOqYRCxpGdzTD23CSK
   54.38 +AhThScJ6svovGyjlqKFekoPUMKAa0inAU9AstIbok+tlXdtVzqulGwTrjl0AEQEA
   54.39 +AQAH/jYhdWqX4N5fvt3bko9DrDKlV+abcpm/zcF5vRD1ctCF78LTZ+IFpkP1Gied
   54.40 +fQCR4xRqkw5sc0btayMXG50tLVufNxqZt8JaboOw2QmUEaC/uDqFJeZvGecx9alU
   54.41 +YfO9aV4QHb6li5JW/cTK4KahhWQxyI9sxJoml7L0j/BmGNwVPYOwTcqY7Tyu9skM
   54.42 +ucy5qGVKwBYAr8onG3QGjtF9DVeHZfxjTxXP6O4CMKXEreNqn6x7E8LhCnoWFBJh
   54.43 +xTSGFBOa7X6CQoAeivT1gRKy5KCswiEF+IZ3hM/rfcjVJHWBarONd467CNs3wOWW
   54.44 +qXr3xGrVyGofJ/eDLkGo3AEJDTMEAM2p2gANfNb1Y7Swgn6m8ySlJzaghuFezyjj
   54.45 +kMD42He/+Xwo+/I7TQ+UGfAR9omn1yk807A+XYSmcOAsKc+UZrXfv5av24g1TKAk
   54.46 +IkqJHuf5RJaIqbz7ChyBOtQPvO0d2pim5ug3WupOdLsIL4SpBewKaTh792pB9YQL
   54.47 +4whsLcv3BADcRMfwv5Z3s98g/I8T4JEWUg0dLfboThJ6RV/PZlUb94l69TFp4uSU
   54.48 +x50oT7+Ar9PR7LDhX1cQO1FvP3Q1rtMAjbzhuE+aHoImI5/rRgogFbsCRVQNSrjn
   54.49 +F7s+ChIvvvnSGnQMzSv0BYVffHC2NKo/lnZJmohaCqqyawFOVABbSwP9HNlKNtz2
   54.50 +yLk+7DxweukmfuW03DwbnrfbaH3AjMnxTkujgocC91r0+/wLm7KFy5Lon8XEw0uN
   54.51 +pFmVBa5MxDpTOni8ISJZKyRNa+fxmGka3MOAT+7R4hX8dwsE4oKMCwhYbjn76KIZ
   54.52 +dp3SibJMrXif/7pcOnLRwu3Cxr45ZNnBsgpJqYkBPAQYAQoAJhYhBKA5vGDkPg39
   54.53 +3J3oZjtIw4MlIQyIBQJbszoBAhsMBQkDwmcAAAoJEDtIw4MlIQyIClQH+gLknqQN
   54.54 +MbN/JL3Z+QUeHPBqAQzMhhiTR3gxIxPTLub6DBLmpIiQdPHlIJmy3fR6y8yvX/rt
   54.55 +9OJRV1cyPQOLYO9DzgIkizWbwgd51MbQcf9ecuwNrCUDx+86EK5cltjTG/+tSsza
   54.56 +hKAszDQeOJrSVGRL9j96+11AWCN2LFjzqc5Qs6+4aV7mON1hnzTUaTZtAEG5Froa
   54.57 +Ua3DgJo0b+WnFbmBMnhWjnHz2hZSuGqcT3qQnrqGLqTK+ePNQP+wGJ3ZQXMTheEa
   54.58 +AAMxbDtM1HAOkyBNwp2IriAzUUGGwmpRBT7H87iIRdml1KdKtH6qoFvcm6JJrLrm
   54.59 +aDJQe+sFsMLZLxM=
   54.60 +=KOJN
   54.61 +-----END PGP PRIVATE KEY BLOCK-----
   54.62 +-----BEGIN PGP PUBLIC KEY BLOCK-----
   54.63 +
   54.64 +mQENBFuzOgEBCADJ+VeIS1gXMoom03AGEy0k/kRY/R8nF0ol/zCzdl6WeDsXLg+c
   54.65 +dEBCnpV/TILCt7071RaFOCWCoDo140/IlarhReCqDj5tFDlUFWhBH88XEa/S4iDw
   54.66 +bAt3B/bblYw1nwjpbJacFf8h3G9oqgqkXoDMKHvEMY7N2FKkGxpuTwy9PV4xGy0j
   54.67 +ZourltdnJpkCb6o/cDnfD/BazWqV93SutAWgtE+dsG8XuiE9+Sm5Hq6PEgUXjYQm
   54.68 +tiu0q+vNCquN8jXZAXX42f5jFFtnfbamCDNCcKPBIjMaU0C1HJX5jWUnt1EUeIlZ
   54.69 +w1HAFOnod4ekX09fxc8OUPXjMlaLIg64ea1hABEBAAG0LkVOR0lORS00NjMgPGNs
   54.70 +YXVkaW8rZW5naW5lLTQ2M0BwZXAuZm91bmRhdGlvbj6JAVMEEwEKAD4WIQSgObxg
   54.71 +5D4N/dyd6GY7SMODJSEMiAUCW7M6AQIbAwUJA8JnAAULCQgHAwUVCgkICwUWAgMB
   54.72 +AAIeAQIXgAAKCRA7SMODJSEMiLWDB/dymMl7+CD+e8usiFv7lc93q1nCpyF55Xi3
   54.73 +7B6VsWbV0apASSv5Sb16PSFAwym2TaiVDY6XGM2MAVo54QsfAyPwUYyDnExAiV/h
   54.74 +7htufnPJ+fCzIQU4VJacnOM5p7AE1ki0ntuIgG+RhMUm8QUfdw21mXeBG67Ghc9q
   54.75 +/L85Wi9fmJ/4StuMHOP97mt9Q5xs5Jw+8fdIokBDt04c85v8zIZPUjf8VhvGjNml
   54.76 +VfhF5cxwURx+KBjjm/tBVkGvQcQ26MZ5SkGwRpoyd6ySUWn2Kh7BQjgo1TEYNkuQ
   54.77 +4RZqyVSGmAsZT79G8DCYXAi+CXsZGUwV+wlkvxfg5yJzFoKUK9u5AQ0EW7M6AQEI
   54.78 +ALD1ORZlN+PC5nL/GuWw6RoGbhy8eGHYrQUVDsbrdQO4HEGZlWDyoJ/rVxD/jfey
   54.79 +w7mBymSUlYZgtJ7or2holybsQs7+fcuBnervRk8SN/RR995oZb5QFTobTLry1OkJ
   54.80 +09/DQ9X6jNXSlGTCzpgglqcoQNWTs2TJgOXObUG+wBIqj1aiArc1y8lFVKutSKme
   54.81 +DVoLJMQwkSKzD7KLu42TMia04dP+29XaiWtqxDqglt+49w061v48Nnow+WdCw2GY
   54.82 +aEra28/Fp1QOqYRCxpGdzTD23CSKAhThScJ6svovGyjlqKFekoPUMKAa0inAU9As
   54.83 +tIbok+tlXdtVzqulGwTrjl0AEQEAAYkBPAQYAQoAJhYhBKA5vGDkPg393J3oZjtI
   54.84 +w4MlIQyIBQJbszoBAhsMBQkDwmcAAAoJEDtIw4MlIQyIClQH+gLknqQNMbN/JL3Z
   54.85 ++QUeHPBqAQzMhhiTR3gxIxPTLub6DBLmpIiQdPHlIJmy3fR6y8yvX/rt9OJRV1cy
   54.86 +PQOLYO9DzgIkizWbwgd51MbQcf9ecuwNrCUDx+86EK5cltjTG/+tSszahKAszDQe
   54.87 +OJrSVGRL9j96+11AWCN2LFjzqc5Qs6+4aV7mON1hnzTUaTZtAEG5FroaUa3DgJo0
   54.88 +b+WnFbmBMnhWjnHz2hZSuGqcT3qQnrqGLqTK+ePNQP+wGJ3ZQXMTheEaAAMxbDtM
   54.89 +1HAOkyBNwp2IriAzUUGGwmpRBT7H87iIRdml1KdKtH6qoFvcm6JJrLrmaDJQe+sF
   54.90 +sMLZLxM=
   54.91 +=6D5O
   54.92 +-----END PGP PUBLIC KEY BLOCK-----
    55.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.2 +++ b/test/test_keys/priv/pep-test-bob-0xC9C2EE39_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    55.3 @@ -0,0 +1,57 @@
    55.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    55.5 +
    55.6 +lQOYBFV4Pl8BCACuukQLwsHftH5jkVsSL7COFhamNsEE8lZ8MG1f1Rx5ztPuZTna
    55.7 +YXyWODgpj2Bxz0TcP+Q17GbLKse7TWD1k9i1RzLWz8ZSCLYq2TtjLWPleVuGGWeq
    55.8 +Y3tTWHC/nFbivolNPA0mL2038TGdBolPaZiPZ4P8wuQVYNfDqi4utcezGDNS8OHh
    55.9 +EPhfyKKoSM79HLoUPc6xsfimxPMrylI/i8bFvfDYz5vmydefvAxNhqjLH3Gmhj1p
   55.10 +nInsraEiyh7Y2zAxCfr6hD9nky7WixBinKFFhQpcUu1o+Ie6UGwLVbTyRMOcRsob
   55.11 +yahqA/m2HfDRj1Y+n8HHqsQkB2BtmMYXla3jABEBAAEAB/wKqiU2GVr1zJ5iqGZ7
   55.12 +hS9zDk3imXjAuwpK7GlfAVk9snSRpycK7IrxeX8s3J30qsOxGv5sYvOUcGK35kCs
   55.13 +eV78RyfthmM8WMcs28ATgE7WtkhyUAGmTwnuq9+Ldz9MYEUHUrEaXnTkBocFmd0I
   55.14 +Qx5qZLvHHtDtRx4HfAJZz0/5kj8KyKYB5cYsvRoLYdCWuxeIbJu5FYtHHBywNFnZ
   55.15 +Qt8STaQqZPD0gPh3ahzY8KYJFZbSFpGfaH0AX5dkFpUJdyad4R2c9ZOmnaK3W0Ba
   55.16 +cdQSdi66iiT0UG7f6ECR9HfI+nVfshOVLZA90p+LqLW51S7iBeFAoZyYfKuNrE9b
   55.17 +pV3VBADNf9Ec2CJ3jo2LrTrkN1HkcjmwdosFQWaDaXtRmV/GidWAyTS+JzaxnS1A
   55.18 +Y9klOqJktVNegrrkk+Xo6jHxkneGucDSsxpIVIcqTa2LGrt1E1eHNYwuEPIyHvl3
   55.19 +gPmfLCuetu+qp97+EOJBklSJi4ljPcAo7i+WI4Nsni6Q6eF7XQQA2aqRpIBmDdFY
   55.20 +9x3uAMDO3mSqIiEJWPiFZHs/qKGezJUgl4hrsjuiUWiD1gcPSS0zJRcZZ7GLYb9r
   55.21 +1uJOnzOtTLexEnAa0VJ9Svci+jtRX6HVETAnYqn9AQ/0sYvmTmWKge7q7BJHGnyv
   55.22 +YbyXmCwGyV8/cvSS8Mmh8iMYWg6mej8D/jN0ymPP9jGeuFav6Va/T8j+Fdl0zTVT
   55.23 +MkFPizlxJEev6PA9QKvAWo4iqRA3SIdqjrZpPcpwhalV5cK4KfHlh8/GagjU9kFS
   55.24 +JvUarmLZqoDqKT6cHb2OzcNBeCsuKGthraT1G+8NpXIgNr6a+5upo83pbL4RarPn
   55.25 +3u2JgSX0RPKDP8y0QXBFcCBUZXN0IEJvYiAodGVzdCBrZXksIGRvbid0IHVzZSkg
   55.26 +PHBlcC50ZXN0LmJvYkBwZXAtcHJvamVjdC5vcmc+iQE4BBMBAgAiBQJVeD5fAhsD
   55.27 +BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBZv/SIycLuOaR5CACj3E6ykNqj
   55.28 +GS5PzghYfLJso6j954QzLwOozTzU/3/HWH4lC3Jmfr0pGI51KZ6Xevrp3N9SxRqr
   55.29 +uJCFRtwNeH3ujIgDh/UHCUEsP/+d74SOenIBYGUKE1OJmh8/LQdkNSc6JNdzJjDW
   55.30 +dKeh6cAMFvWju/Nqtl/l0FGspQU9dmCMtzkKgmwoKZW56aEVZ2lTxqNEo1aQ+lLr
   55.31 +NueBq0/Q5kAVEzUG7Ufm19wXjWenEMeeElX3UAGudLJuckx7uD8W/yBwqrRAbaCS
   55.32 +eZf6RVBLz96ekjWrVfMnmjkPuQPPt5cs98RxQTpxk7b6xLaWXymhA6cYU+FAW4Dp
   55.33 +bjfJjMWIFDcKnQOYBFV4Pl8BCADKQ2SV6gjR5N69xVdiCaefjwobrXR1niuBHBNT
   55.34 +XMJwPk2xv+e7fY28RK1BzODYCzBhpltvRoCcJi9S7Rqyz81nbxnw/1TaKtn6dDDh
   55.35 +ZPVHjN3vasDueM6xTEfEihNc0Owf4wz9SBjuredUVkdTxU7FxSgVP10dOxhdtkjW
   55.36 +jGW1DF6WlYA8BAIEdbpoheJHz3NFkhPQ8Dlzo7Ioe2t7vrTztcBX11o2e+FPOq1S
   55.37 +mhEr78wbROAyCVAXK+8qDh4zDq8iAMZK/KnZrm6pP00+iBRcb+JQgn3Gn+hU0lgE
   55.38 +3YB9kBJLeWaHxEPNnnNNvW/BMl53ctf8Ip+pzpA1K/S23KU7ABEBAAEAB/0UO5/y
   55.39 +aSoUXl8zv5ZpWGA8E1x7qU3MPZQfgwtMhwEXplEyVelHSvIkjQAsjridPqf1KhAy
   55.40 +dkHY8kRAo4xMqoHjIMIzu+76hgKDzcoH+gfumOD97qwPDub/kGBg1j5v8KGg4knD
   55.41 +L8pNXKMWlNeSFzDf6BmFipmfb3EVYBiIMceIz97c4BGvs29TC2wIKmJBRbWu9eS7
   55.42 +vqkBj8rEGi+pEnzTFvcZTMkoU6Uj/HifpvQ7BcOzUQ/1tiGQMEPv8oPMWmKudqBw
   55.43 +53e7RoYCZmTzuzI5fNvNcNT1EcUQmAfkgT6zvQuY63DAdECVx2f0p7MlgGA9ncQb
   55.44 +IVVdBtJXfwsAFmthBADXmavPPgiC8nU1q8e2pB0pmS3/uflPdmh+xKs0MxylDgSO
   55.45 +H9Ar7g9duxsrjxxHzlkTb0Am2XeWww3fBO762VH9VCAPH3FRoHGNCnY6Ix0MyikW
   55.46 +g4Gs66QXHMTNweOa9zk+cZS6N0H6dDis6x+9M1FCeJzy3gXaq+vfV5LfGeXMYQQA
   55.47 +8CnyHE7rjoqGNPnTWetuYgo6yhYJudbhO0uDewR5MdP1gwpTUmYl5RD41LSwTSGp
   55.48 +VSbjtct5dQg2ZhjUWxXcx1OC+aMafmDPi6S32mwbgfNtfTCIygM8CPDjdWbFu1ba
   55.49 +KbPA9Lc/SHgpg0vbdiZ4PWOqsqnig834r+3VfLX/dxsEANAWGGJRNTHmIwoC4HsV
   55.50 ++KiyApbBRw2TCHxJjlzFY2OFpe8RuGKE7HpKiSYjarGxP0RlESrbie0nbJ8FooIH
   55.51 +gY2ipO3khgK4MK1Xua405mNVzge9oNJPgWEtLabubimVnTwjU6O7m79Xl+R9BYb1
   55.52 +GVZm7f/WMDL7BsNVvhMVjdgiOOOJAR8EGAECAAkFAlV4Pl8CGwwACgkQWb/0iMnC
   55.53 +7jlqbwf/dP4sXDRiR5uVMh5WhOn1S8MnHZhLWAQ6fI9/KxggCPhgY6zAgszPMutz
   55.54 +BsQlV4P6QX30d99IMJrzGYYxjN7Z6fF7us9u103+GTzGQH7/47JG0eSTSaKQvqEa
   55.55 +N1+6M/OBZKcwNW6xHa+lhIS5nJGV3Oey/RFQwucBujQbtyjDN3aGshwqzhJXFBlF
   55.56 +3RqFzLxuAJmeOVedaKvdPjRhgFuxhkicUhVp27qXQCpDpkUkj9hb75yCE6pAzopO
   55.57 +6s65yHsnFyehwgyMrfpTPlPM86B1LH4IEwSaOrEJSdHnnFD8nnSIjRyfra3dsI/R
   55.58 +VNmYX8EkMGICzoR4lWcYFShJQM6QQg==
   55.59 +=rBox
   55.60 +-----END PGP PRIVATE KEY BLOCK-----
    56.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.2 +++ b/test/test_keys/priv/pep.test.alexander0-0x3B7302DB_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    56.3 @@ -0,0 +1,82 @@
    56.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    56.5 +
    56.6 +lQVYBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    56.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    56.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    56.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   56.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   56.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   56.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   56.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   56.14 +WuW5oqY0+BRGOL0AEQEAAQAL/R6Xe6O4dbKUkpjneEdW+HDDtxzmbtlo/0dxcVHd
   56.15 +oQ+Ont4Hm8SUnGF/Zh0zbmpGiU9Oxe6MZrefmK9YbgdpZFfYPoWMKJT71npD/0ZM
   56.16 +d075rZlvGdTUgA9yRv//vIJnOvHzBH9/SrL4qT8GlpzpwLog7xLEqHq0UI4XAS1R
   56.17 +q592Fx35IQgxJNmQOJK31+VbxtpJ6FN9fqjGBaRRa5PuqicBEDKwa63JDg4LzKOz
   56.18 +rv1ARn0DyYiagVD8gydX0FlTdqn/RHmDRpSvV7oD2PdbbzTaOyI79FGvGze0OUiC
   56.19 +rTkkyzalW0LrnzXnE41iXhZdCiWZg7XMra741zmiDBRoMEOm2laIjgK9w7nLNRBh
   56.20 +uC37CYlu5doB7xQEr0FtbFTn4B8rPxHjmRUavqTXYkllsoaESGvlL7twKHmMUSbl
   56.21 +8MpUb7MaOZmCmZc8x4ufJlwFtEiwncSKVCGqqPlHNCwaNwEzzE1bzYjg8lWp5/+A
   56.22 +7LSs9TIZ1oV8HORVokc6oh6puwYAwTxs4frgbKJe3o0zz+xdqHfv2gSRnMjoKWi5
   56.23 +6hib/kEbC4T1T27UyJdNahAb7GODRKW8RZlkvXzu1l5i82pfR4a/4AA0yH3JKcq+
   56.24 +iTCYBDpEmJ4MTmdiOiYGIKupX5nqeDM13TZ90Al1HeyEzvS/uQAnmS5jj8N+GuTy
   56.25 +7gRRnddWb078B+1FFu3nADKr6OHkWgFBo/0GxcGcrmDgfpFLHPBM7OdNqS0Y4+O+
   56.26 +yQkPmSxeX8DjHtMnngiv5r7qcmCbBgDu6RkDWcqncdOisIjcpweeyQ0yPg28zall
   56.27 +xh6VwzCbHK6t0yV6J23+imvcbcv/fsg687u/CDSZx1z5XT80ZOyw8+6szG0azuGu
   56.28 +Io4C4jxrtFTdLN2UkTubsYvMED8YrsZSlxyBG3ycK3mO5RSdUDkQjduLvHJhahfW
   56.29 +Wcpsmdz80v1zXNcWlOwtQiJDdJvgG+4N3PJfmMrXwLhi40Jeo3SU/o2I/xREVsvu
   56.30 +wzVeQLcGPG1aUSwC70YVAO9phge6xYcF/1tqi80q6M28HuN20iiIYLZuM9YUz1Go
   56.31 +VQVhmY5vjWnbrKC9WjWAVlGia7LSZBlBi+JfCUKYMn8TnCnveOIf4ToBPJ/Ah1ty
   56.32 +GOh/ruBlBQJOBGMpj9RF76rWdOBbjbxsC6GQtpK6jQ3z6X85pxKKdp/AJsTU6XG7
   56.33 +Bf5TLo38QVhxN73MbDUlNo484Fux6U25IArUFZ4R9IInq6YJLIJ4dBWnAADwNC2L
   56.34 +cLagmoAWoXaLi5zku0EtQt493DWUhV3x8OKGtDRBbGV4IEFsdGVybmF0ZSAwIDxw
   56.35 +ZXAudGVzdC5hbGV4YW5kZXIwQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEE9FmK
   56.36 +F9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   56.37 +F4AACgkQRPBOljtzAttDxAv/bjfjnSS1/qJfRoug2i0t1Mx23AgZZZ1z1z5siG7n
   56.38 +zcRl7C2HGBauCovCbVN2Q4XHDFwm8a+LRfYCuIuWUZIMNOm+TFHDUtzbPABISzzd
   56.39 +6M0bisxLYruZdrsKh/ZB3PWYPl7Q+smttsfQe6EFaIVi4iFpr8qLMiVkE3CnsENj
   56.40 +V+JskEa8AWTDgW9YHYAP/DQ9KYcdIFGf6InPn3UUjOi6Ncyq1V7aiDELTt9WEycY
   56.41 +QgVYrFeRHNe7LSKtckn+MUgAjWi2XbsdUi/mum6GgfK6PFmq5b4C2+pwryNiapqo
   56.42 +Tpw8mFkS9u0U1nHcgxB0x5xltstkerK5EJtFROEDmN2hTeZxVar0QoTHQV5su2Ah
   56.43 +02Fxf4hFMxEMx9dDv3W/wXSGJl/CbZ1piiQTKGxjKzxqluRpbABFwnqtE+yO7l83
   56.44 +uKNwX42cc782SwPfmafaFYGeXiA4l03TvMvP1YDIFdN93CiTCYXtL+rlKeEjVfhT
   56.45 +0cpvn76ZE/T6R/FnapbSKBmInQVYBFu2SaMBDADjDIr65ms2y1ZoexVjdn5+lgaH
   56.46 +CAYitjm0c/6yDdXJ++B+EicxucC3u/luA5/BItn0t02oZkr5zrgvFva89cUKCqzg
   56.47 +6jKzEIaKKT58oE2VYKsvynvtMPdnYqOgkFmuH6Cv4pRjpO8ygOEqThQ8KNMCzzHb
   56.48 +xSiXO4VO3lNI0TfXAmN+JAyhCC/1WnzEqEvFFRr5LEjVmhq0we+ciQR29kg57aa1
   56.49 +Shku8ucusbSra2BlnygmRlyMBGg3AsxG00q+AcgNsqHB9z2sByG1UsWTdmY6qLJ7
   56.50 +PFr3PTdGXqJGE8CZ+Ev/pzwdWZ/bXHmpRT+vr3FPpu9rUjJadFTzCkgQRuLnzC5y
   56.51 +YjU9d6MA/fIJZV3UJnzmRaFguX5HDxrCc9JIWc1W2wi0BvVC6XIxJxdPlXRvk4FB
   56.52 +6xVfpUcEXkvxfOS2mYSV9ZxsTsGDdAdLfLnqhtfE7Uiv1lmSN77eNzxRyKUjywdY
   56.53 +9mvyJyy0KYwYhabz7HQLDSzMApnU6nOfqt7j7Z0AEQEAAQAL/iZVEUe/zB0RolJ8
   56.54 +aUWEFWIYwRxeCe8lVcO2C6uS82Oo/yM5vF1ET5mVhkyBFyEb2bFbmyRRtNnNAUKN
   56.55 +/XU0hyIlYD+OuqWJpjVANlkDFWYhTnWAmYCXkkVlnVt303Q2ycG4HrZd+7ZKlPk3
   56.56 ++mmXuNxSD8hbVnmF5oFEvsnd7LADqrl6q5kqUTJ6pvLquPQalpW32MobPOQElAgZ
   56.57 +B+RvuwzwpwMXcf3/q3EyNl70f29YugYQPgKzocab1dIlTQqcMRFSQPw4Y3Dyzzv1
   56.58 +3nGWE27Q89WBXW2n7uKO0mpzEjL19LxVqMmL7LMR3RUiVJ5c8r1fDbu+PbvVTSn1
   56.59 +9XRcLzr0A7nJXGOdym4bb9ZxoqGmqilPwaoxBBiFPOftoCFqkMr9iZGdbj1eGXzw
   56.60 +9jYdKkWAEk4oDn/otoPWWSgxMfMJGJgrLrTuO/q+dDmdNRWfBTJmkPTU1NS9nqeQ
   56.61 +lchugRpMYmIKD0m5NeXSQBBGIAeCWQqu6CHQkbMbVw8YRpRyzwYA6ktbzaOqgX+8
   56.62 +lxRyNbn7PW4h10KlB0X0mqwao2xj9R21/+YjTAFGJ6hj5pTiDZzl3PcDbepHySRy
   56.63 +ZRZkcllD2Dy0YGv3xs3HRRmssSoafO5xooUVBlep8dhFmm0gDkpgdsqGxkrZOhdB
   56.64 +vqJjCf8TqjAcxTBz362HtHD6/COFyUr2OZW14muQvngpjZvUVD/Q9Re3DQBTebMS
   56.65 +iHzBY/C9ExvjfBlq+JsWWjyE8V2bNJaAZDqh/4av6H2YVW4Ko/EHBgD4FVlyrk2Y
   56.66 +xWvVTS6OXqGkMzQ1fcpGPE/h1VQdSsORhO2Q6ys65y5smhBYszejN1eCbNhW8mpO
   56.67 +PKWGQbxYj2HKaOFM/nwA5z1oz0CL5a1k9JqTfvSKWke0eSsVY3Z/XN8ryNDkVGC7
   56.68 +qaUXhX+22J8/tLlKdJRtoHD9+oz/hXGR8voC7pEIctPUEhz5RdzDop5uSzxX+yHE
   56.69 +GpSjZN1yQAi3VEDmylkHI+jut4ayCEKXOAvCftwV8IYy4GwhJme+VzsGAO9aUeuV
   56.70 +fH2cWhSJH+ibgYwHJWtUa84ocnD+h0Z3wR4QJ+pFgL4otRNUCM1vj9LO+l6J+GAQ
   56.71 +iFKlWwwXiwRvNuNnRZ1tDmqk1mjZyvBobhMybS+cdh8rTDFpMGFqqrT98BT8Hw6O
   56.72 +gEgkUrrBHelsSZJ1Nc4wMqyjpHNdkGLntHV97xSe8X9+xX6DEnj349hnCluRsh5/
   56.73 +BhChQksZCMg+cJnlwCGDYziaFZRYN3eqIB0hjkRsUKxj43pfcM9XG72MKdImiQG2
   56.74 +BBgBCAAgFiEE9FmKF9RpDrO1sPajRPBOljtzAtsFAlu2SaMCGwwACgkQRPBOljtz
   56.75 +Atu2nAv+Mfphzz5D9Hrq/MgUo2d5DIFg/BzRmlTu5ASEFJx9eeiPUtRMyJ5fd38E
   56.76 +zFlDysoYIc1QIj+Gw34zltTh9CxD0zsVN7gTWrlgZ5+t8vKWDigJYQecZscKnZbi
   56.77 +QzDIh/ODf3pZVLKMDvz6FDeHMV7YjHFaMmWzRLNTvob3/gzg58Tdb++SCo/eD75W
   56.78 +fDYevMtPQxmIVjcJtlcIk9J3XYl/dkhdOFk/rnDrIxptpsO+oLzB1zwf0GvRT43s
   56.79 ++mDm1lwAytqwScp8DS2oW9y3hOSYBx6buzjU47R0D5heE4Ch+hZf0bHuuisCWXmC
   56.80 +oazEUmn5cG0Ze9I2PJnCsRbcBriBrgdbcpKWTInWdHJiLeXhnyfzV00APgCgSeWm
   56.81 +ObVuREvVAqFnBdKf+VRy/tpfnsc5HUOIf3Z9NNrSA2wspKi9AnMDc/7YoiqOoXgg
   56.82 +hMBuLPQqL4CKRerNjEVbykI3OaeRU97oSK/SEPYApK5lHwYrJt6Ov5iwn1t/XADE
   56.83 +N5P4s0bz
   56.84 +=gdrs
   56.85 +-----END PGP PRIVATE KEY BLOCK-----
    57.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    57.2 +++ b/test/test_keys/priv/pep.test.alexander1-0x541260F6_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    57.3 @@ -0,0 +1,82 @@
    57.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    57.5 +
    57.6 +lQVYBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    57.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    57.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    57.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   57.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   57.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   57.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   57.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   57.14 +MtOUJwMpAelnOeMAEQEAAQAL+QEepQLmRpOv4WGZ0kvevMeSebI5++7suisAyoag
   57.15 +Qc1nKbrKwPPtt4kgjtvaK+7eZv7EOLnZGJE6MOA3x0oOy7kJYenAjI+ODEOn8BtK
   57.16 +zKcImE+0ORhK8h10dDyX3TOCtApmtXZ2s5upoWTTw5Oy8ghUMF4yxESb4oTgW3sq
   57.17 +Iozk/3bhKB4NksbipHvklCtgY/vxNhBusjkd+XJ4jXAGAWeRwmDIvtx8KSqypUlH
   57.18 +LfsPdI3CUEzZCx+n9bJZyaZvAAprH5VwPzQw5fGirKE/yiWivTTGBgawivXgNgIv
   57.19 +B1Ncvi94y8uU3GmhkPXKRYpooQXIs7XXypnhI9g07t8RODjRtzmRLNO63EaXxayC
   57.20 +3Y3+LkE6Ewz2yQxZ0RqD2HyoHIsWd5tnU18CgBIWygw8kH3MfjMlAhMjLpP4hgYP
   57.21 +td1p+9MbFGnDK+CL3Gf8R5B+HwH1dIrNG3PoHGWaK1RURGDzwgKXSztiOREeHH/T
   57.22 +GbsrjDsu3YcdQqOqG/4nCJwiAQYA0b6qJzZB1tEX1UeHnc5q/JgJwGr0Z1QjKsTl
   57.23 +ptGIhjiBE/0mB4Cak+u/Qz2jw1RcqWfZkyYWY329r4bWBuPEQ1mEh3wrn0CIGmln
   57.24 +nQkOfMAuNfg8hJPNo/x+Dt4o+XnWKzxnz5sHMEEY1d7q1qUyVfZQjQVgfsWleyt9
   57.25 +QU53CW1uxvrnY1tNlAO7K94+aHWCdYb+PPzHyk/0HNuSgcMgxLt5a7cOwM8LMg2V
   57.26 +aJ5XQS/BlM06anXgMloJO2muIQhjBgDrlcdzXTgSvLid5Ten8Jgl7qwn10RRXq7g
   57.27 +Ewg6/Fl4kIjkBjnUPu/oT4b9xd5nPAJaVXev59AoTaddg3mCD0khRhw47nxzwa9k
   57.28 +LOzBkxAFTqMopoq/uOchQSbyVPQ6gwq56CazsANF6O1BWx2a+51OhH20i4EQ9GcN
   57.29 +Ec9jMSgVqqhwKLIwPq1DmX50VTcavpwD4yV2GBaQCiqg20BRcxEZP1rMEiyJwSxU
   57.30 +rpDGhKJOHlWE2yZG5GqeJN3Wf7jWAIEF/02P9NIEDkQ24LbPJX1I73X7padnfNNq
   57.31 +WQv/zOKGdCAhKGY/M1ChdR8ZNTV4KMb3m19vxyPhx1kkx5cn5dPOxq/7z2nHY5Vb
   57.32 +XhzZFXdigtuXnEsTiXBsgeyUhKCwailCjrXi9mrT+zsHXAkBDOpnFWfDrlK6sLgM
   57.33 +TmHkCtpmiHzaSddsFYM689SI66pJByGJqu189A0YTeh3s0TCmCNoB+v1KFyIGQ4U
   57.34 +8krUdnS3kJu96UvjouikL1pZ2OppPrR0NtSrtDRBbGV4IEFsdGVybmF0ZSAxIDxw
   57.35 +ZXAudGVzdC5hbGV4YW5kZXIxQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWa9M
   57.36 +UUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   57.37 +F4AACgkQHAlzClQSYPZz8Qv+PqWjOm3/GKj5c/qUter1v3LKR0mk4VbpnDy0Hryy
   57.38 +e+WIxCFVC6Lc1nP561vUqY7h4ZFjGSdFAp9gVl06yB9aSL4xNtN7KJdtLRO0CvLF
   57.39 +AQkHVKhTn8Wfe/4TbtYHtbgbnxt2dCdQujsDDJUlDjGrMGhCLbVmfxPVyeSrvUBD
   57.40 +h9fjimo+gso2lbK1/sHinoiXenwoJmWBM2jkuWQBxxXae88MQB/SkFJnpfO8paGD
   57.41 +XkiziUhwhTxNSEksem7NCwANgHG/wVFDhOp9A+o/Q8mdbCKrD0PXL8MV0pCfGicN
   57.42 ++aagcTDGuqBfTZdCZXfjcE0x9oL+pcTNsIe1N3cGDudbD/w1J1iMTYUMznHsFH2z
   57.43 +lPaqfJcNq/4o5YpEjIRoPRzn4TIhp8eCwI77MVJ2qCmDiFMouoZvB6ocYXmwhTT9
   57.44 +/OXsmm1zM8IQXTjnwUL2PN4j3zA5FRyEQejTqTLe/audnYVHEsR8MeRIDoISdmcN
   57.45 +RAQrKDm0oIW7NAWSlpW0R/ZSnQVYBFu2SgMBDAC04ZaOl5gpPbW6uh+ET2oHSkOS
   57.46 +wB6HGwczm5bIn32LZ9fQOQK692a8lpg0Ru1FOhERsrSVOlkk3YFilzX9P6Nvg2Qk
   57.47 +LFBe4IFLym2RsBac8vqF+27p5yjyM7s+W6EfOl74LqCocQ85RRrvMbRp+GCDCy7S
   57.48 +WKQpEeQoZhUfvDADkMc+HxoSja9g5uFV3dTpf9w7QMGW8mF42Oq6Nb4YqiqMQCSG
   57.49 +Y0t73WC4pgvV7gQJOA3sGVdDIa4FAKFycCl8jk7wdyasfSxns2cq2jO4HgCQFife
   57.50 +t+g9x7U4esnbkyFUc+yMMKQJ5mG00V7Lf07GyaQuOOtJOjbou8iMsAqrGjq2uQ3u
   57.51 +Eu2eVMYMj4J3XQttUb3fObwP9G7Bi/kSZFjy39SxfI432jcVT5xmzIY6Iyy+LgKh
   57.52 +agMeUDgANs7A3prTfRbQxq48DjM24EYHWKzt8GdOk8THJAt93/G4l5oefmeuelI3
   57.53 +D8lBFZo/rum1mIKaY2ULnAJfyKw9I3vsT3GtXg0AEQEAAQAL/1gsthOJs6u7ANln
   57.54 +PNDnU5T9L0ac7+TFmLOgL5daJD2uX+aJvBp/Wu4o7UZiouyBu2totZ4fRPBzKEzy
   57.55 +0GdFO/syzkDR91Xg1DapldMUx1k4G0bwBCfyvyOeczMZQMhz0HLka/3gq16sIM6k
   57.56 +aMHVydpnu6nfexroNVQ6Oybuumsqiu3uBGwx9GHk+si8bDttUGL0FMrsGfbqqzYd
   57.57 +1663WSloZUW7psLZbnpku1VMg1wpHqRO0BqSEv4uSgV6xsaIqgF+7Sa9CUSbo9bb
   57.58 +pILyiuVyyn1p0USSOmg+YR78NEHO9eb1tKw5+wublRGlVTL1Gkr3QfEqIIR/lvlQ
   57.59 +4c5D0ZImC1ESF8h03aA1ZPO4+m2hIIBB+yQhTgUN+ou3nvQI8PnoVzOQnB0Pd9J8
   57.60 +iviNKzipbRi32mql7leF83i3nh81GLNwfINNots84YeCcclASWdNXKun5BPlvtN8
   57.61 +bNLwXt3ckLlNQ+M6RAMrNOuzRgfksVPUnw65oYYDISv9b1kvgwYAzJnJq39OaNE1
   57.62 +vDoqWTfZB91cAA2E/FvXmvNDKDYT929oUfjaafqT2fbNSA7qtWGq/DcpdLH0NwI/
   57.63 +4MAMmL0/bgIYYZQ47K/74LvVexREJ95MEvZUmZR0rFuqweQiRPREI6kciTcJNd5r
   57.64 +KeiQ1p6JxZA4afad0LVG8xnFYqEWKnBwiRHfjmz0SeH1pRVeaPR5/N9TOEvQDC6d
   57.65 +T8fCcBMfZmuzv1gS20WdqdcyGZhrGg8OCY//Qt+j1skdVj3w/3gfBgDiUluqE1iq
   57.66 +8U1j1/YeTwL/Cg9oLkRB8TZu7DJIgW0KS9LlqY6j9WCt18lTwfEiEzhqHVCqSEtL
   57.67 +m7y5zSZ8H6yfjV8Ib1yhCQePL4qJOV0pDEQl3tYBwpDARwOtriz2Ud5QlkJB0wxd
   57.68 +TtlTc9rfWy2sDLCV3K/4OfReePm4mpWMqT06Ow1Ne6F9DEAvpu+Q7VZ9seVHmnDi
   57.69 +rvjZb0UDh3ZOn9pETix/4MOnBmvPTIkN403+NonwedMKBCurclOpFFMF/14eWyGu
   57.70 +pp5MQGXN6h2a2OpL3fhLnGZuHALD1lT7Pt0uyfzd3JRaMMGgsga93PlYwSxhqLtZ
   57.71 +6beTIbGNxvMHY5zoy0o43bkFHBzzPajVkkIs2DqWYOrdQXq9rbbyQeshZtS8HXUo
   57.72 +Yb6tGOMlrtdRD2X10dtZpnkas1zMlnLLjEd6BfphizVZAgqRxnVOTPoYojvcqChu
   57.73 +leP7a/z0yKvHV1Mw7efN/4RRr0ePm8YhMNj9zAKsR9alGiF25eUhQ5cXyutKiQG2
   57.74 +BBgBCAAgFiEEWa9MUUkig1IvaQRTHAlzClQSYPYFAlu2SgMCGwwACgkQHAlzClQS
   57.75 +YPY+BQv/W71XfM728hWfvjztPRssjJdj3aRyCpAA8IUZWViINu65a6yL+6JZYu+L
   57.76 +pQY2+AiUkJAin9U2S0ege0H241IXMPj77qCJlLvtvK+G+vZlz8kyCTUNjW6Oo1nb
   57.77 +tqbc5H8sCRv1uSTPVnn3AnkjLL6xDW9zfjM/fTqEjnLCUEpqt4TNNDRcWng1TuvF
   57.78 +mN/ZPG265gnki2RTuuX7iDwG49TkJLBuHDj2Io0glNGj+4WHTwLvsv+Tz2/UZgdf
   57.79 +JCCYAzj9SaCHqjwd2STZfH1ayylHVSaBDYf6gkgRafR5AoZjT64R47QDJj188G4a
   57.80 +DOke7cbusp+ywrctZzHko2r90ix6BLr6g64tKTAvH6Km3s2+yt9RMEAyXDc350rM
   57.81 +32H+oi1lCwQetKrTAXFZnTtqswg3Kk1b4fJJ62tBrnIVhF1FDkREQc4ncc+Ql8uk
   57.82 +3YyxBuyNh53vTHrlMKX3leA79JoBvtJ+ReCAZZnIbf3CGTpe2nyT+R3MRSjrlkEa
   57.83 +QdZkrcqd
   57.84 +=IsNS
   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/priv/pep.test.alexander2-0xA6512F30_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    58.3 @@ -0,0 +1,82 @@
    58.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    58.5 +
    58.6 +lQVYBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    58.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    58.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    58.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   58.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   58.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   58.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   58.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   58.14 +Ln0EZR49Fm5yAWEAEQEAAQAL/RM4d+1OX8AyTYdCAU7mdHAdHRIVgRVCpw5pCpDC
   58.15 +IgTkL83LrUPQC00MREztcoqg0Z0YLbtrYMnwYaEEE/QfcTNvczjg1V5+FGOfrGJa
   58.16 +Qqp0vVfY64lfyoFDMbgU7Cb0D3hRjENNH0UwWQNKicDLLt4hEjAKJ1njH1s8PkrC
   58.17 +RPW4wDYexxwafdsp/Y7fB0OYSvVqieOJ5ag9r/+MU2xoaKZ/H8ey3p+zDBfAA2RP
   58.18 +8h2ucn6ERyUtQLO5uH9QaJ5+rnh0yRwEhl1A2JaHvk8EcS/6e25qpEA2GWHXro1U
   58.19 +4u8OCIyGj4mvqLTCpFRzZrBdoyhC9oM9tDnyERQ36XIJffLVEIp5/Bb02JqDAw1t
   58.20 +ktxgdAAsH8HjriKGZEyqTkd7GQdVAGwe4jJLxXlW4ueJ2rbC93E9B7/soDXkx9Ua
   58.21 +jnGjQpotWl2f5aBNQVClJFIxm2dOCaE78au8kJltWqzn8t+MLYzgvf5ictRsQ1qR
   58.22 +yY1Z1Fsidp9kJk4S9Pv5n3uJ4QYAx3vCYewjry4wgnDBjOeIiUKWI/39Ni2OSHtX
   58.23 +MOfrRsxMibVMlL9CfNzO8wNqrGCfvaEeFyG2m0KaEU2iBeG6QlYFJBFKL+wGTp+k
   58.24 +rpAZO6aCHpBdy8ljA36arh+KNQJQYDQAfVfeOxlh0d2w0untmla1c3xXCpaxp53c
   58.25 +w76s5bFyo4JPvnbnfX0Gk3JkuSDJGw910J1xh3S+4xQEG+USoj9UphqUX42WAI/a
   58.26 +y/k3Xau4uPpFYGyU1G+rMEytHllJBgD/riq+ITq6TXq1MP7QTbK8MXMZV88FlD0s
   58.27 +OeXUwU0CNcYVau0gU9o2H15jZt9pg6pFlVlBTizvlqWOTsKP5Z01F4Oc3s6mqya/
   58.28 +QXiw/Kj7xkew0IS4+66qXmdEcjQkGreAeLYlQAioAFwOvT9CZO10IQvOTpg8nTuv
   58.29 +KdGgzL/C+3fidZLP/cmeK8WLxpp6+EDkhcdntTBThvSgOrGzOalX2Y/WNEcIUE2U
   58.30 +duT7DWjtz8Vb4vz3eLFLLYvfjluMP1kGAPhm4wo58TOIxSzOPpQyDPLp1xJPKACa
   58.31 +oAjzTVRKN35ZMeMlIpHj0ytLQjAC+66OJSb+gNxsA8ACSZlCZZzQ7QV+fdoYhBmB
   58.32 +SD38NbRfUwDA9Ba3M0wsY2UVwivab5SF0JlktcybfHfj3kYaU8g99QQlmwWxcnMN
   58.33 +GmRGJYYVlzG+lf7X2dz9Ufqfawao2br4yXaevwzTR0x8qaGTjUdXopO6QDooKaOR
   58.34 +wDp+O996uBDyGF84vzD6bZfYAOY5HbBZJNGQtDRBbGV4IEFsdGVybmF0ZSAyIDxw
   58.35 +ZXAudGVzdC5hbGV4YW5kZXIyQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEERqmU
   58.36 +8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   58.37 +F4AACgkQxLirC6ZRLzBpqAwAkVAGd2KEKpTxxslZ3nRKIMokqSrxhEw1INmK08ql
   58.38 +FHj3b7eb7zJFVNQpq7s5Wsl89SkEV98dl9pmy2M41RAaU+M/jOYk3mqxqSu1yiA8
   58.39 +qkKyWcF3l3+b7iq+D3hfKHW+tmHMyoitbme7otEH+C+hqpY/Ne+qD+wZAyekvscL
   58.40 +65MBPXVvm7xseuBFR9h8/Cbq5YFoW2b7bisMVHoJuIPek+siVy7CxHBzX4m5O+Z9
   58.41 +N+4vOo4adIxMGiZsbyP8Sn+6tKca8Ca2NEfgII/Q3WsDctNMy9M76q0Ek32be3F/
   58.42 +3eIf4sUWVtc4LrukFrlDPQnsO+t/bfktR0/OHdLcxwjMbn0z5xpB8sJIqr5xqvSz
   58.43 +fwFDhfA87nBxt7V1s/QKQeeuI9vOHpSHgwv6ASJCb8QiilPhev18ONBg0KzmTt4x
   58.44 +ieOKG5KNgY7wcnvUf7Sbqvmqxc7tq0K3gAFqoZS9i6ttx04lSqzdkUoQOVlI9hXR
   58.45 +7+IpgM9yhPd+6YytB/yEBUKrnQVYBFu2Sh0BDADAqureldCVAODg9A2elgQrWDdo
   58.46 +Kliyg4++Z9sOMGv56B9vbd0jzWPV7kJokIwSM2BIaNStjBdRYWRjenUqjwFgjz/+
   58.47 +nxWV593PHYO3grLKEvI+aVVgHZXYoaR9P8RnK6jPxSgpjRlPFgf0gUsuVOav9eO2
   58.48 +EFFL227ktUMCLQf/wKDT2is6qOjlogOIQuoOGN2tnWLmFs9CVkiX8Bg3d9VwWcrn
   58.49 +vprPJu7pf42wCme3R60B82rgX7b1W+nbnfBCPKlQfEMqrm3rCKNLCffo25Wyu0G9
   58.50 +U0sfg61SkFi8JLzmi4NM2KcjgHw7AkUrXAE8Jbi/yChLbmVVCqE3W5WguCNadvn/
   58.51 +GQoPoOBmWQplkLC1SulKYjVYzwsnAKdAh1VI3ClDYwr/mD1O39TGv6Tdx1LbI1rn
   58.52 +5cI6KzOemMd3dzq3dNR8tUg38DKYxbb6zMD24Eg50+9nuAF7ASSL0XwjJUg2kPlJ
   58.53 +K2m8lIUyniLEJuFwHhDskYqSct1NwjpoXOCZY0MAEQEAAQAL+gILP+vOqZYv03VI
   58.54 +XykPr0AVSD2jsc/cfNkote9lySVjV7DYkH3MJmHzzsFv5MMJtKPu1AgbmBAtsfRH
   58.55 +eVXYBonJ7QkPOHjiWpwMLqDNF+9JnCr0vXwqEdCYTYOckgPxcLQjkfo+3pabTycJ
   58.56 +VSTGKv2H7h8X5KFXKioBfiB+JyOSQ0hymIMazKrAnM8z7HPibPstDNrzvMX2pdoP
   58.57 +rbR1+bss4PwbzrtMdM8PtZPoq+fSJyL4YkPNnvV9eZ2AUHlhC6V5zm9pteQ0yUPZ
   58.58 +A03wvDLlS5DlABRjrlwBELrhqQjJJCM6q1+zdiDQYaV+8lgGej+6ZPvzXo9KwCHw
   58.59 +lFbwdbvrEfX6wz3Ye6koplAxTEFH3+v+haDmdHbvi2lte7wDKD9KXX3lrFht8ceD
   58.60 +guJkXHcyHOJ80UKJdB8PRc0HwjaVkXXwygeD7vZuGt5tKlBl5ZAH/z2eldpQXLAq
   58.61 +iZBTre75eTAWpanPvw/LTjpBUXXekkdMT1qPu13HfSPo15+sQQYA0eDvjoBBKsQc
   58.62 +iQ3NtSK1ec0BRHQZDO2IjhLjedV7WvoI4yoXq106WFIv+QPyKdO8khQo1RTUS1NI
   58.63 +1R412AJ46cbkGyNqKTSr2i2VwRrgLfqEwQXZuqalT4W4+bWcx5wprp11hxJ1SPXj
   58.64 +qK+4WevMga7gYBMgQjgFAj7p4evvTwk174wn8dMX0oB0v3gUMcDFh1AVbffUkteI
   58.65 +7dzphiGZcS9jZJoDSJDFN+SqL4r+O4NQLi9GR4OWVMe7ghAa7s37BgDrAb+a7Tec
   58.66 +GPH8jOx0rQPCxbAlh7i78PAiXPL10vgYDM0xAgtZzP72Dl2MBduE5hE9nOEkZUwy
   58.67 +2tm9ISavNqUsXmNKkrakMSx4QQiK9xhnBxJu/IRqTiJly8gBwejwgJkp4AZmgF+a
   58.68 +6u2+c/UIeNRMxwlkcrgGqTdeK3RbJci3wtPBFNhEBvj02Cw3ZADa3X45OR09X8NL
   58.69 +qcjOvCG7imfOmagxG11yg4Kd7+42151aqxAwM9nKpN8LkKGmnrajpVkGAJb6o54g
   58.70 +X855XTP7Yg+3EqcAoUU2+Jm6s0xGWZzXQ8YUT/QpwMnQe6rcyzfc3MmODqaofZnu
   58.71 +8GKVpNsxGg3PqdBd9FRqoxZb/9FAfugAX1DA+f198JJWxg629WOWa4s4DRDJgek9
   58.72 +V0p3PCgzXTNHM2D+eBeO2sGmP28zGfcCzlMCnBBRSIB4AjAS78GHtNw9rV0J+oYx
   58.73 +AUoSXRFvLJWfAuyIa20oeJTwxCHL3lf9XOJ40QXoAT+mun5rgY0J+gt3leSyiQG2
   58.74 +BBgBCAAgFiEERqmU8ZB3wFYQhwJzxLirC6ZRLzAFAlu2Sh0CGwwACgkQxLirC6ZR
   58.75 +LzCpvQv/VH/mnI27WZAS8d14QHwv4HRvWxd88RXyeB1pmJIErOjADsz1ZG2pHrv4
   58.76 +Op9CgPoWxnzdhy+DFwKCYptJUXpU9F4kVDDWpxWoNy9nNIznHFaxLyXt2c7JFGLo
   58.77 +5T+Va5UXaIYr9g6kPYBwFY6wTKvLTWgrPL+lacilLdB0xS1FVd5To7o2ZJCgC/tG
   58.78 +Og4nPH2BieewjPgAdPcpDjFCugy76UlpjbpJ/UYDhgz/g7+kLt6XHPz5sgHXqvO+
   58.79 +juiqdxGFlOQn4xiKJBjSLPaU2QIIYjmHnbJH1+OmnFym2EmRn4fhH0yhBpE0OHuv
   58.80 +0+iWYvfr/pjtlCZF6hdtKiMfv5cmxZWzb3CK33YXdNccw4CW6uqmq2kyn9cDSXw7
   58.81 +OQMIn7nZpc19L72bz+9ZRF2zpWmYogSSN8vSwlsE+jTqEICxlXNoaqQci0FXwLUA
   58.82 +4WnxeLITl+PkzVghRDM1/+C1XkbO4b6ueSLIx3506ZZ4qlht8XFf3KTwkPDr5JzY
   58.83 +04c8TRWq
   58.84 +=R4L1
   58.85 +-----END PGP PRIVATE KEY BLOCK-----
    59.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    59.2 +++ b/test/test_keys/priv/pep.test.alexander3-0x724B3975_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    59.3 @@ -0,0 +1,82 @@
    59.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    59.5 +
    59.6 +lQVYBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    59.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    59.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    59.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   59.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   59.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   59.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   59.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   59.14 +2VVBJm5CGF0GJpcAEQEAAQAL+gNxbUm7mvCghTwd3pChWW90OI4OlTbhYu6vpg32
   59.15 +EMZa2voffPoBssWEmTJp5OPmDO7YiRjBjognVmpcEbzA3r237dnkDqMrVGSQjIJR
   59.16 +5KCflbyQhe6g1pghMpv0LV7SaX1J/Nb3S0HWY3UWIGkeeA5Kt72HTM36a3h1oa9d
   59.17 +0C/rjUFXxyHFgV1TG4n387hNpXOGL0wCKZUr4UvlNGYZiLiNv9Api+qAOoKQCJYN
   59.18 +HXpHZl+0UXGTlbnW8Y6q/M91CCvHFMX1UQC6j0c8clK8eR9s4idRftyOuh0aLxvm
   59.19 +5XdaFfKg1Q/6pfiCSEPZkdd7ssKt2SqPe5e4AgDeSUy2ljHGc3yzcgqmP2k3ZaAQ
   59.20 +EINq8OjDL/hQOv8T0zxy89pRNJBeYczsjwskJzGNtnX8in29Kf746SZvexKP5gaE
   59.21 +6jGAmdTk4ogR3YrJTvHDiy1F4EVEtl5l2ACQ6VynF8Yr4Gmqxg74VWIJrqcD3Xys
   59.22 +xwvi6wZ+4FRorKCekv8ZAD+qKQYA152qE/AAGn+aKv4N9tb4WJK9IdBt+B0ssiNC
   59.23 +e1/YOew2+U/6E5DP8saVH3BNYay0DBwSLfT7/5xdRQyk8hQvGx0pXknUHt82p/K0
   59.24 +SlSNC3UrBmizVBOpEUwcGEz4Bygcslq3PhHbIKZFXXaMxC3LPLiNZIM7Dp8tOI65
   59.25 +WKPl9CMx6/AfYx/8fAwJXkxMo6DSTJ6aQUr0+e5j12k9tsle9n2wN20ukzlGuDS7
   59.26 +TP+SOWHcjr416sIRURxJX6g978PTBgDnzED+ds1SOm0hDkmUl02XNN0R/oQEcuPC
   59.27 +ydTRncxdw5eq33AVD676bCww5aeeMI2sh4jTa0vxenY3MlykyOMUwviBGuRIlk6j
   59.28 +PK9H7ftIXNAhTDmfr5m67YrRxufjsZ5pal5y3QQHg7k7Kq4Zdm77SOXlT4s50aJ5
   59.29 +EhPkA5Nu6BnoMailnC4WjwYJlpkTM7IrqH02CIz3uhtQLVpk2KSKCRlfKSRWHsM7
   59.30 +rdoqrgXTI3JyDVyT9cSPKKl/bongS60GAIoFxnATgz5tTPXecWPGtqQOf9tzP7Wb
   59.31 +hZKnIYweIpAcFqAiFYgsbKRvCDM/NwB8aftKnOuNEyYRPI27VPwGxYcQSVjUzFI8
   59.32 +RlgLZSO3cpRsO0E1NXBrx2wihJZtGgWdjLOUNeM17OCEqRdo/Sb3Z33uUlkYRCCo
   59.33 +Jg4d4+SXvGFBG8TSqg72eS5A8i3astvVvZkweUqMtM6+Tg6mkrDmbn4WomJ04Wim
   59.34 +LYL229FuKHCJcMizP62VoFw9+KDE2tqe+drztDRBbGV4IEFsdGVybmF0ZSAzIDxw
   59.35 +ZXAudGVzdC5hbGV4YW5kZXIzQGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEX3B2
   59.36 +u9kuFOpJ8N98LOSUGXJLOXUFAlu2SjsCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   59.37 +F4AACgkQLOSUGXJLOXVwkAwAk/wmbjPQQIeQEtBrTh5kQw5BCeUaH1zZNghQemdE
   59.38 ++O4KVv/OM2pHybNw9LNihWCHTZsdl8MRcOUMHFzwHETsPuBuO0b/jRb+bNLp8q/M
   59.39 +2lBSUxjiDPzGljmpet9Wi4y4UNHzu55nvu8kS5lSHxObKqISRUffvYtxjy4RyM61
   59.40 +OQT6fvB9gWI1Axh26Qomsf6wVbx9fPkiT+S0+yb6coqxlv8as5elbCksViObkv+d
   59.41 +u6CvK26G50bzjZdhI9uopk+e5/UJgAY4uXLtDsB68jdfrR7jknNEyYa0heMRxQEj
   59.42 +oQMDRJ6xRrfat+q941tXnd5SwQuCKaORi9OscBo8G2vOeuel2szePdmisqWudQX4
   59.43 +8/zcYIGKu4cAERX6fRksFH6IKykifXnpyPT4NqQ+oOUR5bHvxgNVsw3Pmtay8RIZ
   59.44 +KlklXO8H7PdLdL2ChGgL4+4JczwLMkpQzMqouFHfvELSHqTfeVypa9PR8v3TyLH2
   59.45 +o+MADxTLPSYyT6LwsxalQXZ0nQVXBFu2SjsBDADlVNQcjd7ufAjlM6VjG+qRPfYo
   59.46 +UuX44OL1vuHXlk4nzgEgiWXTebk53kH37KGcUZw/j6v7ihvSvVakED43aoT6kyiq
   59.47 +o91fpktLdMRUFFI63fNPFrt9bpFY4mg+cUxpYzImsUNqasSb62IIHxvrnh9JN+a8
   59.48 +RTMHdTsKeXUkS3xdAEjqY4C6JCeQN9TddHMBn9HhqjZd6VZ/XzoAkYdCo06J5lvA
   59.49 +tStteUmqHNJYKsQJwrNXULVxcAzX2okKexvOwA1NkfVlH9ynnuJMYbbW/efPjX6Y
   59.50 +M89H1iJ9kZLUmSg+hc/vj4Wmw3NZpmHSkUY0dFk/tGs3tWmWO1TTgS3pGCTSKtGq
   59.51 +8OlDO2cUKbruvmnor2oD953bew08FXsaFu3otInKDAAoFlQIne6UdzycR92XE+6I
   59.52 +uqcMbcEtzwO1cRXgMDY7mrjJUOQlrEzHKmMWiZ1OqXMjakieQ9fk2mNrw1dNd3/Q
   59.53 +Tr+nI+Jmh9qL5IdZv4zo0yWpvB1qK9ZWEEIsuPUAEQEAAQAL9iM8OrAocW2IS9WW
   59.54 +GdMgdunZ8KLsGb7OJBDzQxUyAtAa1rwpCtFzN60BznZJOot0qTfFhfx1O9ElRiqZ
   59.55 +qaAvaD8Xsn0wBX4CDuTeYUvfKMM4AX96qVPxqQ3/EK/cuIt4sjvqVcauoNv+o7vx
   59.56 +C659R6ai8CX9JoSpfmjIQIyoYciS7UvAqLFGMiNLxhOV0MBvIyWJAXwXCIiJbl/9
   59.57 +UXWWTHrjlIqx9foxUyAlTYGTuzXEtHQLR9V7YdMdwJsw+b91F6EHIysKg/7byBrF
   59.58 +auIht84Bcbd2EXBJC2elmXd9WLerWk8FC39ESQG9nyxwA+qZQ0hpf6rq/O4IaNLH
   59.59 +bLMToo/rRXy8ML7m1giKZjWdRpTplBk6bPH3opvMhl5DuIOiIgeGwCGLjnN1j84J
   59.60 +1PC2QiUn1bDP5oztjCNwGPNvZUOTUF8lARmiljzdEYJ1HIxijBGZEX6+CMxYwDNS
   59.61 +eQ4w6Fu8pTpBKVSjMUU3xOnh5yF7JE4/6GcQKwXNeCW922QBBgDuszLrpY0g878c
   59.62 +V4s2cnDqm7aZjKBJ5+EL9gVobioY322SYGGiEZEHvYiGrgtOzrHe+chgNDGICKM/
   59.63 +kmklbkuSB3Vw6yinJXfQquYM6nMBmZXSISqF8WgPZirkjhtjVFluJQkHB1Icy1zA
   59.64 +QAlgNy/JdK3+6BEV6nxV7ljHzHsAbfRkehEWH6uc6i6sCjthNGQZT0FxCDbGxep7
   59.65 +jsSwPm+E8alpbQOzgBiv802LcOUdWWSswto6dGmR0GU3UQbjxHUGAPXzzjc7SMd8
   59.66 +29Wpe/pCIIdJHD4vF8eP/glPl4fKlKnirEUQotLwC+3xxlQt7tSiUV6Be0WbUxSS
   59.67 +HNGfDZUCyj6zoSz2fpCjgQrOdOG9SBFALRKNnZhnfrbgV8yZmWKHXfGlJL+tPrEk
   59.68 +7WYBKIagvet4VRB1ydcWKDVC7dJP6MO+fu4tZQXPdhuFjH2rTI04ZfwAWk/Rm1cu
   59.69 +bAUGJx9VardPk2EGQNI8lj7B2j92/3AjTFW4ICOJaYYbfnZSumySgQX9HkWEcxzF
   59.70 +AB362I2rvWYxtwDfe8emhz8dF+LrezflysVvNbpmsmCAtz/H8cojNpilLfLjs1w0
   59.71 +1v6nL0Z/hXbZhHXQyy6cD9A4B/vm9H8uSLNeI2ril+BZrgnvUGXkgABlDJvqckm2
   59.72 +4EgNpSxoWpo9+9W8d5inR16YmZbbG7PSKwIQFe+OHdmk2/FLIr7uT4cUoiu2Vwfo
   59.73 +P4ElqmPV8eZ5q+Q/+PYtDP0Qa/KrqPSyS4I9M5nGnp8JuafRIm1N03zk0iCJAbYE
   59.74 +GAEIACAWIQRfcHa72S4U6knw33ws5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5
   59.75 +dQFJDACOMW6qkDazVjjFenLdCxkog+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQ
   59.76 +iy4kl70+pEz0eA6pOHEfmsK2ITClDCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLe
   59.77 +RQN4lB0FmVys+lC9ad73Vl5BzhyoYTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEg
   59.78 +girJTup7niIQfwm8bOuogt36+90JsZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9r
   59.79 +zxHpxKlQDLS/OGtBUz7AZWmZZnhIZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw
   59.80 +0B9PLMSafP/i+Awf2vA0pO94uCGDYG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0Ia
   59.81 +EH4EDChvYdfSNpghcdUu6+zBS4aAB3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9
   59.82 +SNZZYVcV9pTdbU6DtaQWmI3xMMavXNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCV
   59.83 +LqdCUc8=
   59.84 +=pxqa
   59.85 +-----END PGP PRIVATE KEY BLOCK-----
    60.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    60.2 +++ b/test/test_keys/priv/pep.test.alexander4-0x844B9DCF_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    60.3 @@ -0,0 +1,82 @@
    60.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    60.5 +
    60.6 +lQVXBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    60.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    60.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    60.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   60.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   60.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   60.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   60.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   60.14 ++rKeexgmSicMiekAEQEAAQAL+Kj/5AMNjgUt7zNBEXCBQlaSLqreChxZmI3VjrAz
   60.15 +k0nrfhb+Mnue33UaBK16DYNEeC+Od8Hqi50z9n2/Dt2IegKoLiqAjkigZT6AtpY6
   60.16 +GZqgVVxovWMGwQPhFVAV4NncL+9v/vnlCSGHmHEOTmVDneYiKFFCR1qYLGJOUp3x
   60.17 +7DzaNPICeasAV15QpffwjVEGtWVnptHO2yzsUepKg9oVnEni14ArL0ixA1DhAGC3
   60.18 +x6XWi0dmKzsr8VYprWE75mbXnhb9Amm0kS9vUA6VjPu78/6aGxMdjZmdKRhQhATo
   60.19 +oARV7C13CSiKArWzwZPvUvkDgh+nZDNXZ74Ekpe+Odd5rwMul2VqKgkm4HS/4tza
   60.20 +RwXyc6fyMY1cNTn27Dzijdso+tvz1RGTc9hnj1QKCL2vPnfmTUhrEmIwP93e2Q/2
   60.21 +UXvUH361aEg9rV2POG+qvwflU2AV1XK/pKad+OEqffT3SgyCQExjk+oLbpdap33x
   60.22 +EVm+u9SqhK62CHnV686j8VZhBgDLiCoYk7Vps3h5OqtjI1OHz/xuP+bF9piLJMmN
   60.23 +4lY3LSQYuT5wm3ZWHgWn3rYcNloo4K86ezh3rVCGPWDFkBBNgul7J8iASk4WFP+W
   60.24 +Y93xrjgpJr8xavqo+OYFGyQNhZxO7ogWdraKIwmp2QlDB4k2oe85Ocu/+m3YT663
   60.25 +DLMGU8A0ylwey/HiAc3DFele1/KuhAryzjbp5ANzKf/ITKwt2AX7s4WUcYMl9hXi
   60.26 +bct9a0Wmr7Bk/rEJxfgz54nr7WEGANBlmtI3sTxo7nRryqtkHKGr+IM921FkGMT+
   60.27 +qJP2JJMGFkRsT43vhy9hqVfPyx7Itm9UZCVUTAxr1DGc0sIXHQjNulpAst5Aa1Ps
   60.28 +zOmskRaDtsTR6m5va72jLIr5SD8g8oFouBRfKmbaRtcPT7t7S8hdcNw9WF+zreyp
   60.29 +EZayqnWHV8VvoHBTU5K4rGln9EjYIJQPdvbpRky3qvznRKGeJ7GUwdHgZzV93eXJ
   60.30 +e1JP7IGv2C3VGuGJ8u/jbQLeYtEhiQX/XhE72pi14LoYtqeww0HLFG6l6AmUJceS
   60.31 +h6QQDlZRf7VpZ2TaCRhF3AMa2Dp3vD2C91DpeQbSt7RB83BHXnrEhxFCl576HlGr
   60.32 +PQ+KR6iAgO4LbcsmrDyeg9KkKgbvkblG39B1MLkcjKsE24s2Aw9B57rfp1ucKl7I
   60.33 +Ifc+/nLf5uywqVHFXdNgJXplqPinxmGIZzFjPUJueww4JEQTLjKJ5Z03witx8G1t
   60.34 +fjmoQrtorHDr26VBUDM5p9j1xprjsJW74VK0NEFsZXggQWx0ZXJuYXRlIDQgPHBl
   60.35 +cC50ZXN0LmFsZXhhbmRlcjRAZGFydGhtYW1hLm9yZz6JAc4EEwEIADgWIQTpX/+V
   60.36 +uOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX
   60.37 +gAAKCRA5XxSFhEudz1yODACUd3XckWuAXM87H7Jt7tVI4NXGMAb/MvpmWkPTEsBv
   60.38 +ScaUlWR9wXnfVhvIfdLS3omZT5u+rOqAC44lKowO1/+/zvjaO7zpOp8jNZUVOdnl
   60.39 +3wJd6zLNT6cCRW+DJGmnMK2iWcw7ovUTxonpvNvopAllxm+WF1RDiIv6nLBiNBMM
   60.40 +V+tiMIjj8h7vGZ2Zqpzk4VCp1Z2+OE/N/mYELqgyEzgAgfrsxwoBTsFLRoI3+Bgm
   60.41 +x/L4i2RTgE6xB1FGfeiUEG2kQS28fWTHpOtYp4RgozCx68m6WvZ+FdsmkR4UaGDA
   60.42 +kfWA2eB4Nk2QjTjzKvRfQrjSvnIUDHPFGNQgsKbMJNLmGVoeh9bdK4UfiAtRSvln
   60.43 +wzs3u/rIDbAf5YZrfj9nQxu46pOVE5FFti4EZW9IdNyZtY3gn0ki30szhCynMxiR
   60.44 +ooVyrY+wl7wAD0lpqtdAZeJBRhDpdBoMaqpDtbo7Vy1FNInTivcORjxB3dedzv87
   60.45 +8D3GlmrBrlaohTFcRrvFhVadBVgEW7ZKSQEMANQGsISHhvaoq59z9dpNiXwZkXdH
   60.46 +gdlsqR4vfO5Jg8oImMg2ctf/A/TLLsOkLLxoU7t2172x4nwbrvvyT3m1GyescojX
   60.47 +YBjCQHOkVSYjc2vVJ94fbDND+JUXywsdG96nQmn8nOdmBTumyAGLRivtFgDNsmt6
   60.48 +2rrTyZqP39mqZ/fD6QjHaW4bCe7x1aBhuvq2pEdDgg3tdviRmENIpaV9XZNEcB9R
   60.49 +K86RyJAYK5nAcxfoKRA7xT2KVqyjiM6LiiZV4uCjEn41tzWsiTuPQWVH/cpOBjlU
   60.50 +/7hvUZT3iveepvpAx9KREqqW4CW1t+sSFIAn+f32ZK47lVx6ZefA1VKybKtURY7S
   60.51 +YFcsnflaWbGjfnpsniie1XbvVWYrW8WoyobBD5s8ZW/GD9FLyrXK+ANlpx+w7Ntv
   60.52 +49YaMvtV02p12TAp6nOPopR7dqM+JDNzZJ+24s7MGj9+tOjvV6IE5BwOpF+qrRkl
   60.53 +NQCzCdnwzyY2B479O7CbjPQxXIgM4p9ogt+GRQARAQABAAv6ArL74TuXAbqwd/bF
   60.54 +3kSqXrQn2HJNn66aTf98mVulnbdI6YWVCaOBmNv+F40dhebU4PD8LGTZTj0bphVH
   60.55 +osle2xmUYSIyxq0GK2nRuyBQBPwaKcyKqccwbzE8/RCXm1Ga8ohomGL6da/qxUrt
   60.56 +kx9qA5mMi6we9f+h8MGjoZWovgGIKUoWmFCLo2kqyOdtmZPdmOhRdnJQ+vBGAAkO
   60.57 +Th7G3QvxWq/RxF0/6VuxabwjGSzXk22ieaUrLFv1J+ykcoFSUeQ87BEmVYFqreNj
   60.58 +eJqKZkxocu4Qmx+IsDbdtXUtbKDMOeERnXqlHzkftA+tRvSAYmnlPgiwhp93rex8
   60.59 +SV5NwC+aD6Kkqc1vm44NSLetiAp+qL4hyfYJAM6K77u1wzruS4Yn96ZGc/uQ3K05
   60.60 +H/bK2WdDNm6wIv22e8sAHjhVL6wximDRysTj4lIRFak/Ic1IK/Az0xvsl7M2aRsR
   60.61 +gC8LYtzOZG8hNqUfTYE4TiFQAQqal4ALTVWT8zMzSBmRop+pBgDnU4aKobRfP6dG
   60.62 +3YA37QlkJOH/un5PQLm8Lfur2WE6EAi9cFxeo9qdXLYMI5Pc/LNR6/jm2EHgA9JA
   60.63 +vdWw1M76BGviM5N4KrRBOgB+Z8fIT544J2I0elKvUpZJ2WE5vq0PDKZc4yVdKmJ+
   60.64 +nhteLgzRgBYp+ZizH1kSuL56bcrcI8Oc1Jqgdt0Oi0LOS/tKSO5TyytI9+JGrjAv
   60.65 +I+qvEIVMNHYOSbR/Y/62q4ujbHFL8h/9PfAaLGlNyvhJD81x7Z0GAOqkKhYKr+II
   60.66 +sXMMwmX9V17zBM5vShiVo5wRK9kW1bpTjK46aW9i7aOu+KA173pINgjrX6M8UmBC
   60.67 +5oQb5iZKnFLTAlW2evpfBkRSPh2JLt446YBHFC2exxT7Z223/YYbmRGKmY3FNuXC
   60.68 +LigQDdg4knJLr5IZ1g44cMMogCdjkPbtBN49ckOJUl8X3E4QkpSfbKKkVwPDiown
   60.69 +S1Y6yWVTJXRZB4k36x3ZPaAdPIz4izNjC7aC/0764cnmDlDv+lTuyQYAzij4LQQR
   60.70 ++hT2rg5jhCOE5bFoXfJkShwk39LVH6bL3loVcWsmHjrr+dymivIMDrihES8d0cCJ
   60.71 +p+Z6o/0pPmSnOsaMG/yd/tfDBf+pNgONAdFSs+RAobmvog6oGoQxQOIDuSvsU80e
   60.72 +NyCPtIeb6sgYgEqwSFOI399zszlUl8bUktnjQI5CvVBLVaPWj/tmDq9XsA5BnGTe
   60.73 +jPkcZoWGPe7BUVINVBSerHTpu6fp5NJors1NqaxhgAJb1BqZuOPlCRH52+OJAbYE
   60.74 +GAEIACAWIQTpX/+VuOL91KEsM3Q5XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEud
   60.75 +z7Q7C/9k0vPVUQ7mP5B5Mi8yQLECcFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m
   60.76 +2ptPhrreFVPcmIINpluQEWUsS1rqe6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oG
   60.77 +XR0G+ujZnjWuDIhqfkGUxhZCic/ztoboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOK
   60.78 +Ikx4iaf+bd+hwGkdo+Y87jHkCctW9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAww
   60.79 +ZflB98agOQWbzZ7HHq7jI/SXlewGPRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOy
   60.80 +mamqLVerp72RRSkGfPpYcgCQu5qYX9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+
   60.81 +UgWImfUr8E0ZVgjXcEAHOUXjuIiZq01TQAnprcdREzJas5rX8jEttddKeT4WlBY5
   60.82 +mu0oNrBiTOiQK2ZIG8M3Zch5L4I7P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWK
   60.83 +vVrZVl8=
   60.84 +=IhsO
   60.85 +-----END PGP PRIVATE KEY BLOCK-----
    61.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.2 +++ b/test/test_keys/priv/pep.test.alexander5-0x0773CD29_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    61.3 @@ -0,0 +1,82 @@
    61.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    61.5 +
    61.6 +lQVYBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    61.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    61.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    61.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   61.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   61.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   61.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   61.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   61.14 +YncgyLU1Gn3bDIMAEQEAAQAL/jm95VDio51tPzgqXnDPMyOjZyIjv32DOyQjRsQi
   61.15 +wz66D/fS10mh/K++dfAKiu5OtY8iAQE5gADr7V6uwRRFFVxL4eXdvNi6vsK7jUd8
   61.16 +OYLAqrlt3JpAI7HpdqJQzmabYQVm6pHz2NKATR1RTqDe9HFK24Bh3aT6CK4BIwQ9
   61.17 +wTqYdS8kEzPrtneOu9z5AjKtzJZq9OJuFqsRInoESy+R9e7MCj0HB9KxjhuyecLc
   61.18 +ilURaOHxjCwpmO7/Hp+DjxA/Tw97701t9bo6AN8w8QVMVl16PmroX9tR5HCaYPrd
   61.19 +N8pqi9Olmeu4QTQQgscSx6WUR/Je1QHsMsaMOpGi9eluOwP0uOXgGqJf7vMHFoAy
   61.20 +Cf4YF71GQPIi3GjeQDUc3KsyOGuZs6NVAo57J5AGJEBUkJF5Y4JD2J3hUAkMuBZT
   61.21 +MEwY08VoCh/O4w1s2gUY5gwZCkws1WwirWV35wz5KW/XJCu5866bGFPFrcLDfGnr
   61.22 +ph8+KaTQGRrqzC54T7QjyuaQgQYAwjvLPWUKBjx9h/1XFeUusAOaskBZiMAO6hWl
   61.23 +1HmyAjAfBbMiWcFm6UzYewfzXa+2tOfC0znF8Wz9OKBbBGe4L+UqluVKRLe0iDt3
   61.24 +mQHYkUKWXvmuNhlf9ZsOP5YEK9J10Fvprtk47YMxJ3m5qdZW2n7Jf/0W//7OaUyD
   61.25 +upLRxISiLC9CCBPqxTp39vzZlzw82CMA5iUWw5/qZ5f//0EgPXASYiB8uaLP6IvK
   61.26 +1X0tX14UxYMUcunWUy/vO9wmfK+dBgDu3sMC7GRXi3MOt7j/ywD0g9xYviqCR4Gs
   61.27 +V7mAwL3aGTaQJh5M3+G3C7QgOaz3hblL+Bl6B5H/phZZja4I7WW8tD7jx7lxJQ+L
   61.28 +O5pCAKM8lYoQqt2uTVqIMKJf9eDcoz3gsp6zFH9qbF1ucMK2KtzRXDmTXKGucy7b
   61.29 +uBm0Uy1t98M2VBSbAxMDd5KdyrSa459AgZ92eg00n7Z8l46huMGWlvVXyTSsZFxR
   61.30 +gV8F5ke7XawDIsy7tfEeXPbc888Zwp8GAKs2dwvbXEwS8TPUx9Bvsra1BtjrCu6i
   61.31 +LXP6NV0jrwr/OjRLpYGq9ZgMqqznRd8Tqps+IxuXfTSDfaPhAyUZ70QHfRPaZXYF
   61.32 +WnA7Fn6JorMEwCExuAgfgh4+XcNe1UTl9sOeF3fWZ4tdj1P2P8hohZE8zRaCuGtJ
   61.33 +GVEMcF7Y52qc6vAsw53AYA7OiAoROBpg7jRk5LFT353/CknbmlKTXTIS02rWbScj
   61.34 +IH4XPujYpxAo2rJAdRP5jdjAsjzUfhTETdtctDRBbGV4IEFsdGVybmF0ZSA1IDxw
   61.35 +ZXAudGVzdC5hbGV4YW5kZXI1QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEWLzC
   61.36 +vyrh48T76ria14OKygdzzSkFAlu2SocCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   61.37 +F4AACgkQ14OKygdzzSlkqgwAhqu4nwrRZtI61LnG06iVBGa6D66yduTksCUo6APz
   61.38 +bapaM2ahw7j5d144w5QpxlL8/LxJt+0xCSmje6twK0ffElis6PXqATNlTntyDJ8Q
   61.39 +VU4TbBioYfEAzTLShsmkfB+jLrIXEYKRrxwqN68bD/sidFFa7r52DZUse8qYgrHD
   61.40 +g+k68Zr8nrSc5syndcurlh2c2BtwYXBPTNYDPIPWq10Waf7YFDh7ThZSdNh1KcNa
   61.41 +lplDYZX8tgtOYiUggKEph6bqM7FJeGRJ83zkKYHkxPWA0Ek+1ln+Euo82FEXPxy1
   61.42 +4oC3S1GE5gQIbYOcAe58kEy4MaQG2nMlDkQlYSaCVS/UqHekVqbiVaxIVt0sHT/P
   61.43 +NOmXcCfEQtuNysZ4elOBhf9ifyQBx1b91aHv2DytsRgSHKeIksiCq8ArBkXUkPqC
   61.44 +de64Fck6tQY5l3VT40UfCpGw+6N3Li9YVG9Tg6VJunZQl6fZEyFdqkpVAl3U1fvK
   61.45 +My9bQ8qKJosir5rfrPFRLicJnQVYBFu2SocBDADBZ0xM3TBp64QqRuUUT2SNI6h2
   61.46 +ABl7nejdvc0zAjxDbTTh0jW+bDq/x72zuYETY5CauL6KhSZ3ByNQYlVkkDuLRGX0
   61.47 +lsFaI7POZXlgqmssY1RYCEGeMHbyGYf/onNjTAPEdlyZnj8aIw+DQfGrIt2T+B+Y
   61.48 +JAKIEv/4NI9cHVW/yS0ZS9VMBL9EDntMRj9F9+amVnDcpo6RUVd9P5c3jqYZ0kqn
   61.49 +spxZ1tMmo2TkDcZryK+I/sVW+XK9/FmTrj67a+nnenbzAHPKK9xrm0o9KJQWwcSe
   61.50 +Mdm1C7E+lF1Djf+2F0EOBQRqpolR/u4OqCsQPjxBzQ5fK287P4ylqJ/BFAW5lt7R
   61.51 +kO9KN7hmM89jPangducYd2OAsvKCQvJh1kg9RB+C0adQGBZQDPCiRT2jSeY1KeRs
   61.52 +KuOiV8deHx51poAMGhmNv194LOio6Wbqq3rUjel+UECOPqBRK0XCFJbmPCArRqN4
   61.53 +DxBCZWb/Zj58QDs5xgE1kjftVzeS2645SOsdansAEQEAAQAL/1mzS1QrEpVNwpLJ
   61.54 +Jt5wpDZB35Q7H5aR+rs9mLqbws+TCv/hu0OCdw0T2wxMcW1ItHzOSrF8aAa0rNBP
   61.55 +i0OFEdjZ9F+ovCzOekq0DcOjxuljeG8MBUMVP1WyOb163wGi8+xe6TvmhWXd9Qfv
   61.56 +weKZ3SMP5bdunC34gffgiM00Xd0BtYUSAu+rE/rArLcHrbkJ7VQgq1/rcBw+GdHh
   61.57 +eIUwCCHZwv5cfN++H1jAV77eFLVQ8vkbEPPx5iHvtKwmGLpcpeUgZ2FOn+t1qyn/
   61.58 +k+k9ZRHwFmkQ50rjpcw7hibkbiJ0w4qWJA2d8sfMfkizBF7Za2VYrJvoCKh3xKpi
   61.59 +LPevjnCjyXAKIp1UZzFsMYoVYDhlLFDnK2/dUVrGmXdfX/N6/coW0tXKBvAz18jA
   61.60 +K9ahgspzGb1uoNWcGEfOT5FHX+5f0jOlXNwsbmdOKLSBq4r1L9+Yb86LuoBus/+v
   61.61 +733LEVf8B+VvUkFYmE4LxvHMrYejakxEIFgEU8hX/tDXQREEoQYA0v5iAC7iWg6I
   61.62 +6UBetxWPgrt+yTVBAQ5GkH/k4d4CLw20l8/7WZUwItIRdQ0zkY9PPW/xR4NE1W+4
   61.63 +YNci6KLZfkOJr4+Bn16fEMukrPcrRbirVQyZHbabrTEm8eUWkrTPwkQcvmsXpz/1
   61.64 +wUf5mqeEBq8jAEiqKvlRAUKnK3oJY8maD0bxWbGkaAZVQc2lf1vUONQfzxc0dtql
   61.65 +Ll5g5qoiX2jpqcdQgHxAC5+lA3Lvt0YNWcLwonDXiHYF3dXgrWu1BgDqqGDNCWne
   61.66 +s3RTIl/X/ntnV/b9p5jW7xff07NZnTeVGED4kWvPZElV/ZzZ30/gzaGH/BLp3l2q
   61.67 +51WU1q5iw2OL/bZTds+a0g26trzM7FuniHXb2IL5kUzTc+162aa+ceyhjd7RteqH
   61.68 +Sm/GAU2tw8HKTqfQRdKc4+u8HGDshzXkpyPuysLMpBNW+2RgYdvUVJcRMo6UirFi
   61.69 +ggt8EBlh0YkSvEYj7GNYCXq2spSBoax/KBwnJpgk5Lnh8Fxh3dFVO28F/3cTq+e1
   61.70 +V9OljGEbdXkjEr4HZHagm7YrC/l4Vx8V6f0uiujc2P8gGSYX0ZMjqgbu+WzBGfJW
   61.71 +Lmh91Xvm/yJZHMqOwwzE5ioYWm+NjahVFqyq7+v7OK0riKgla/GWvODxpuqExApU
   61.72 +SwMoDTRjGCP2qh4Gbx3bEtw0czU7SywgmRzoHefAFq/WqY56tlIqE7Tl9KhSrPoN
   61.73 +XN2ejyyZ65bbnJIHnE2ikcujq6cM/uRduONVSfYILNQMnICnPEfS+OwPCPJWiQG2
   61.74 +BBgBCAAgFiEEWLzCvyrh48T76ria14OKygdzzSkFAlu2SocCGwwACgkQ14OKygdz
   61.75 +zSn6NQv+JEXdv3I2T0zTOpkaV9XXM0w4uh+3iM7LfGQWklSQhfuIIed+sr+dvi4P
   61.76 +VGr4M+ZmZB5g2ejDEzToPTRu2jmlW3jn75XY3x0f4J4QlMIZYC1hk5Z/4AApUR/o
   61.77 +vwEixe81bXXS0H5jxUdDa4+QbOPT2jcjbFcZMBD8HwSzm/JGwMM8IJHy9k0am1g9
   61.78 +QQR++oYUwUB2n9+uJSI3QW6xnYC1s+O7YROZgyv245P4FL0QmMqr6k2zEY0aELLz
   61.79 +lzJerU6rLT0mtlDNSMwyYYOSTgwkpHZ1jqYzwIjI9MTwjAQ67bVf1En7T0r2uHHe
   61.80 +mINL/Igta/J6rSIl8MV9IKegqzuAwm+0G1HtG+vok2lnGjYLNg9PgF8/bpmOxV93
   61.81 +l93y3YBVKGIod1UTYq+BDC+xSR+QLkxMLlN96YIhxNI/73I+SViwvfW8T+1ndiMs
   61.82 +tQHoWwDLs+/h8Zxc6L+078jII555fUbiKBm5DGoaHW3wuF1ELlfh/5gkFVwILRfj
   61.83 +Q433qaLY
   61.84 +=TSYZ
   61.85 +-----END PGP PRIVATE KEY BLOCK-----
    62.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    62.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x0019697D_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    62.3 @@ -0,0 +1,82 @@
    62.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    62.5 +
    62.6 +lQVYBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    62.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    62.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    62.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   62.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   62.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   62.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   62.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   62.14 +wOxN0vPiTwdHIycAEQEAAQAL/RNzvxT0XdbntBSUXfj4aeadOP4x2pqaR8n6GXHs
   62.15 +FgTDutbTqT13aCHlS3N68UXHXWzxNWnVjlfrKQ6Sziol0sZGrBJafw7Fd8mkYdRU
   62.16 +nxljDimOEnbKeqOjZFSvu1v/i3nMVuPiGmps4Yr1YnD1bplc7DUbNwYcIK3mSFHM
   62.17 +7kx1bOnlPPca+Hu65NT+kjetLlbgLVxC84Px2AFaNytFjDDt1ELAGqyZdvp8US4U
   62.18 +jqtc+Kpg1LEq0facmFQQ+j5LY3s5aZT8VjL4lNkOuaSP+DxQKEQ0nfkySRHSd/9+
   62.19 +9G50y2O7QBMbwv7hyLDPH5Myyb/DTe1X7YfZPF4kvM5FXA0/Hcw1tOEr3fXVyV3d
   62.20 +QrbkDlcfm8kpL1BkRzNtskYlN2fpkR4w9WLMoRQv4BLCskfQxxEXoyYnIog5iYH/
   62.21 +nB/i91jqCZg3E5at4Dr3LCFTegPTP+WXFusy8d9cos/iWOTRfR8dBftRmHkv2wfP
   62.22 +dpKeRwGuiCQm0t7EIOLtjzyu3QYA5aIv6lVlOhHDT8reBJE/7KwjAxyDI3mOMRuC
   62.23 +5gDNVf1ryoTPsobmOySWj4pkJYNhCsVXoruPqMq08Qj3310l990B2wx+D3NEvBMT
   62.24 +odoe4yPo8lTEYW5hc20ogO81TWOhLIRgPpSpWh854LCBssxNEQazW8LKZs9vezsS
   62.25 +Ms51b+zGujBr2yg7zPWT5HeZpKC4db2pABBp9zs+6Zt7xvJlZCoRiKCY4O5phe5+
   62.26 +/1sSxnfHuOz7SbpmwAkJOOYD5NezBgDrl6Iy6+ZiQ8fMQ91MT5puRzry+6pNTGbf
   62.27 +rF6QlH1Qw10Z08/ajR852L4MoAKKBSuJp/rmbk7nOqMHhEnuOQooz8kXYKdyAy5R
   62.28 +2+sHy/UJH2veMfBigEOBmosLjgT8bOBZ2byOYgG1QwKjEoUA9HzJ//UEVt6AlXE/
   62.29 ++EDrCdXojLhQerCQe7ILT9cbzxPVCiAbXLtbxU/ISCmRQFxSXA7zPWfurk/oYrSF
   62.30 +3uXJihVrasukb6T+/aFYnZBPuOoqjL0GAI00hAqN/h+7RIoH/H5gYDwT3XYpd6sR
   62.31 +y8Ag0jDooKXNLTsq3C2lwiJrd2QMZD5fkv6vXct1jHhyqG8uj80qgp7AfvWgbQtQ
   62.32 +3MCUDkXZZ6PzdA/Ugyu0lcdJ65Hz0DuBowN4EeJKyVWikGDZ40Oz+H9u3oryOaO4
   62.33 +1xvRmlQXVM0aGtWZOolPK60TWQvkMDCPUwxrORV07NdTkOqzQg436W0Sj41g3cIQ
   62.34 +kq0O+hjuqmik5lr8SCI9TQAydI36K24euOabtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   62.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEdNeb
   62.36 +RJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   62.37 +F4AACgkQqOLEUwAZaX01cwv/S/iFtnO1aSxHnnQeG6GOw+/yx4XJmJegWJpJZVIf
   62.38 +2I4MXkJ7CL2JmsdoP1iRp7eTut2KRAU/464VbLhdqq0ZrijAFFOnHJhDy9M1bY7E
   62.39 +khbwLU5GDgCl/FEGACltw2fAUbfO8mFp0x1LDHE9K8FdnTVRasmS9Tk8dlympP1q
   62.40 +djU8BpswqWekqhpU4777gUMrSubdaXjZIlgX6XHeGgGT0vD8tT9BGdwW/y/NeMjR
   62.41 +RgnEZNMnwvd4MkewgqbsKPKqKUJfv8BVD3QAuL9j8aK1ve22BjRGQNNkdPy1f20M
   62.42 +DTFdY7bXe9mTILnBDuVv1uvFMMDjIV/IU9bVz3mWg5gqoJ7OCDzV6urvBn8RxQcc
   62.43 +bYAYcEaXLF14ZpX41Eo0eY7khYJLumdSEzAG9l90X6s9MAwX05g/U7PPE7nwO15d
   62.44 +HZXg6iAxHo4JwDMru4k355MDy6mZFf6ia/aAQWHpoGg4me95F1ekoV3wjJuvcamP
   62.45 +rQ50DbAddbVtt7j+JfyaedrNnQVYBFu2SsUBDADNRou3spids1sdWqcMQpxGncDk
   62.46 +fsm9Da18AlPsxyQVEkfBIEau+dQvA69SsFETKQSSLM3yRVHAMKfTBSnTb9DYWkEL
   62.47 +i9drRug6k/UtZog1aza5oeyS8xZPJmOYtgTYeEstzziNSCj9GjAJJUYbqdWnRRH6
   62.48 +4RCJZJyDD9G4iB0fKFpdOGlOco27WBBo+6xOcUocF7R23IiGqLhiLprnWMNYCh2a
   62.49 +stpdgJhkYcOpOcjYpmq+saf4S+iOv2pa7jlfQTgUlcxCNC/Igtt/tN9c4bYuSxFH
   62.50 +kWONOEToO2WzvyY2vxxhGdjzHYE1xLAkK30Gcga36XvWABgZ35JbpTBctD2EiqlE
   62.51 +z2LUlClLQGwLlHij5PkPcReInPeCEvpm20oPYB9g2D2F4Pgto6CRj2OQHkgZI6G4
   62.52 +RoI3bmrhujj6KjiKZHZur35Q/Tf/6PsES2pQF435Zq2gnprxLqm8b4HqY1Fqeqav
   62.53 +Nk6aMsTLd4uHigeLOPUDsN20ngbLtZQgF7XoEbsAEQEAAQAL/Ag6yqqc+vXzAtnZ
   62.54 +R2ky/eDtvZX91iQdC7HHWGYCUUgCaVKahTrunbsbp0hTq5EBFR75apYBpgQ/pfrM
   62.55 +X+jmuGwq8iU1gFMks3Yu48stBt2B9t6O6+dqlTJilDAw2/DffS0+srAAfJsNp29b
   62.56 +AFf5SoipFDwHNVOoOGKx5WDWQd3F6qvPzN/bsP5i7yoPdhohRS0PuIR0jBuHqmXg
   62.57 +timyhnSm172RtO0tAqXoLqEbV/VzCNbQ5kDBilJuwP8Y1L9uCCcpbDmGVoRAj/sO
   62.58 +4qetAnblKkFFcwObKRkWBFJMLEK8qxbUlyIuO5ETNdPnTDonNPQdplupEkIurSwD
   62.59 +qyZMa5LPUnxPGsYzRjsrj5JyFuva5R1zfnv7CYUrYBqZUyfESPo2Ia7HIbW78f7U
   62.60 +CdoxM062zklEMMfoX0TvAOr9ovqYHzGu9hFESRo3xBKtu+3g0a2o3wXqpRaOpK7o
   62.61 +y1RUq8dghHPCTq5BzIAHrc6jCInN1kViAv4ZLLWjV63PH/+YAQYA42A0YENpsg0p
   62.62 +VbEmWsKgg6bg1H/RLhkUI9EEU3Sojmandq3pA4HRcjbDdpcp/yijC9xL9z6KAYdF
   62.63 +kyBzYVhA60MgI5wv8kMe9jkTa9Uaqof4hcSSyWmHEyH/OZxFx3F7Q4aySwU8Onx9
   62.64 +SgLyZyuyEI5Ys5eqMackab5kRI6qh8vlhguvyEXhjPMcG9l61Gya0y/MPWYEre/l
   62.65 +AJ6QTihhvz5CAW9NvSlnq/xH7cNUKngqxUDc71p6qsZuj2zjd2WBBgDnHhoZ0Agz
   62.66 +nNBSb0ohOLW+1RKJXjXYkBbajLT4r0tSLei3OwdwlqwoHR6mgptEMjQif/kt+8XJ
   62.67 +3IngYKFJPKAjvirLTa2+/DQErhuvglLtfok+yRY5im0vGsgKXWmBcdp9ZDStBuQ7
   62.68 +F6+l1U/QrnWG370KdGgovgB3tOLEq3QK3jXB9R5aDYQ/4FLPjHYzt3bqnWzrWrPD
   62.69 +8IF+CdmBD2L4UZ9j9cGr4h8k3VqXlB2VIsXr5ccUQJnw0x/ioMqMLTsF/1ksnvRQ
   62.70 +n4vVQqb1sQ1l8CZ/QGMFkd3LLiDijt3HP95sRxEB3lkpfM04RBTD0tFnisOBOkzY
   62.71 +NXZTfkzlKjHrhzSidfautwo1jM07TAf88vrffHxUU5sdorAvna0x0Xi9Y+AD0Dcc
   62.72 +WycE7i11EcnZ1edkOtZzHthtXKMyMqe/X38bds39vZ9YuzLkRiURfhofOHCUhfTO
   62.73 +g5ybnWRXbywcKXned+kAqCHdLUHq7esQwZOxCCW8z18kkyjB0f6l+ZyRctb/iQG2
   62.74 +BBgBCAAgFiEEdNebRJbiib2KcbcLqOLEUwAZaX0FAlu2SsUCGwwACgkQqOLEUwAZ
   62.75 +aX16RQv8Cep8jDIr2xEB0O+3aa9xDR3miq4Rsz9Pc2oZhjYmTCn+CNLaLyTMbZsj
   62.76 +CZOAO+NFIKKcKy5WW2HgJ2pEDxm1fFV3xLDClT9xT6tDj8CJVpkL/wJiVRcLrBut
   62.77 +auV6qTxt13U1dxFNAemPNl7XJlT1ivl4Ur3bs2gkt/4MkPcuu4xAygWpKCEu0AWQ
   62.78 +m8aDbnpCG3vMLKMUo1VXBkhm16bXKDqOc40g+vLoKW1fYcgozSzFLPDoz3hY4Mwg
   62.79 +X6AlOW4soa4tvrB2mxG4AcQBVHFUrwcm3MtoXSJUiFKz+s0geySqoYG8j2G3lrpN
   62.80 +6YpB+K8qAkoEJmpPLE+J+GYVl4RhiBVJoiVHc2TTRirFTDa+s/kj+xSXwDJ+b9gT
   62.81 +dLd6wINV2djC+YZedO+bj02UQ4z58in/PSl2GYynQeEuSX04iwjeRcI/saFpvVo4
   62.82 +S84RZ8OlVWTDDZKeJMfeCJrUoc3MtMlU0V9/kwxtmEcMd65tZWuMR/AVyHh7G2vm
   62.83 +Q6EcubXn
   62.84 +=2cF7
   62.85 +-----END PGP PRIVATE KEY BLOCK-----
    63.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.2 +++ b/test/test_keys/priv/pep.test.alexander6-0x503B14D8_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    63.3 @@ -0,0 +1,82 @@
    63.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    63.5 +
    63.6 +lQVYBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    63.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    63.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    63.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   63.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   63.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   63.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   63.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   63.14 +ii3YZy2mWMv3nQkAEQEAAQAL/1KR16CAO20srjubKxhKuDnZykptn4obke03C6Br
   63.15 +ZOFANeYW1aPqZ70hXBMZPYJlsmNn2jeXbhblKm60CUkiv7qKhLVlNhe5Pl+EvFxv
   63.16 +aC8pBHBfamTY4MyT87C/gY2MPMIBNedilPiT/9oGg0yIK6j3T7UhayVBjhFpjoWh
   63.17 +47sPj+VLEidfpVUzFXZQ3ufaSmeO3GNf1UsGSz0l2DWFWZCMZnhYFfKJodDmakKT
   63.18 +z4YwYW/wOWteMooCa0UHnF/3t7C7PdIxjImcN9mrkDRUrf27RmOIapJoG1dlJd/p
   63.19 +LdM1/rR/M68/+314GsrdMPhBne+0qzZEjFAwKC55dMF4aN+qtNFKHVcfxy4liVue
   63.20 +936V+4CgI89rlvusKC/KbX8SPQ5i5ci0njKPOLi7nTkJRQ/XqJz1Z2/Xci0/vHSY
   63.21 +WfhFafBrAlQaLuUzGjkCHp6qDAvhBBO7TVNylGY0oqJZ2QQ4u5Hu8iWlApwAmgBL
   63.22 +Jn7pytWN88ko1hAojRupbIkPBQYA65Xbfl7J+Pkv2tcX2qPqdSc7WwRhkDm7FvoQ
   63.23 +lyRLjPdlzofJ49thnQD6VJxjhis8Tx75fQylEW4gJaUlxZzS8QFLq4ZQkRNF7zGK
   63.24 +5LpmrgdPaRuX3C4fhPZoaTbcbCu7LkOj58wQJh+/HmBJx9xiescrXAWwgggCP2DB
   63.25 +mgIjp1RRvlueHBQJfk7Au9mvYQjdLe5me0VlN1X7S/yxO7rjt4csljmp04rwjzQG
   63.26 +zIYsDZKy4vHfLQAOd0e8JrImEXiPBgDtmN6H2jzGE88TEJ+k3uJqgzolRT02edXs
   63.27 +btQjLBaWaf9I+Zp9Ftp84FxePLKxHqVgtKw4ucr96r0nYakrNyG3/5zOd+HiTo7n
   63.28 +qFOFEl0A4seMEyCZfsPZEN9ObnAMUTRghQFj2OawVHA25WvaG9MQvYt+1FdMvTBF
   63.29 +j+zvDQzpyqB3Db9k9/p3xPM7BSgeeiKqsAxvrk1t+0rLAoJaMcN7UkpOdTPa41yt
   63.30 +5aWzKHoL84wgB5zPh7Mm1tZMGh/w7OcF/1g2HYkJgx5tjChGArEr0Vmv1XYM5pp7
   63.31 +0MinHlCNR/52WFPOcbEFrxlEAv1yhNTcwfAewvqNTQJMkXs8hxAKOwlhLCAIj3My
   63.32 +jnreBqjq8Cy6HlM0J2ioMUtRcLZypvQXZYo6XG8+chfIZ+t/nXgrdJnv8YqmP9Rs
   63.33 +T67cIS4AfBC+XKExjEmaBZpmsuZwUe4NadCR1ON6fAbfIn4R0PARjmaLE6oDKLkj
   63.34 +ITTWGmIdimfFOSCNoKYqTXCCcrSIkJZMjsi9tDRBbGV4IEFsdGVybmF0ZSA2IDxw
   63.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEELiEy
   63.36 +XSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   63.37 +F4AACgkQ8JWyAlA7FNjU6Qv/VWgdluLNPHO9yck3IEvoBN6Aa+q0r8UyylLj6hEL
   63.38 +/KUdUVXgS09F1WxbFnc17RiO6fxNQPedVLNMd9I8x6bEG/x/9BOb3y0rzQSpL9sh
   63.39 +uvkbIti/051wtoxDOSsgNzkRI5SYHVdsKdUU1SARAs2H/GE0C9pDxleF6CWbRQ+X
   63.40 +X7POQy6nUd5CHNlMyLk4S7vFlYa30DptgmIosjlJTVh8t2FaHcU9sdffHzazD/90
   63.41 +e1R4dgVMjTPIKM2wwmoau7iRk6VZZ4SIpQkbqyPIIpYcgDIP8AnaFouz43PhJt7U
   63.42 +HcwsfnC4cDToCZiRIooBuJ0FFCaJQJ5U2uaNH2J6Ueb3LCFS5futhS4lD+/6RO0U
   63.43 +4bKBrlrxfOuluZuKKX5WyYn6SPcMQjfXeEyScnucPvyAHFptqnKM/0TU9xi9mxXE
   63.44 +K4kvuPZQj1vXIUR9rm2MjR6OA8qoI+d/8PkfBLnE2hq16d8Uu8DDUERil2rywptz
   63.45 +3q7mxtYiqMbGWZu5hQCBaHiInQVYBFu2SrcBDACt2bUNSzhBoYbWbrLCRfauPdhg
   63.46 +y0HlNPObu1sbcXaX1rR8eN3GGP8oEEDAehf+0CEauHa8BkOqSRamCsHYJTOQkocr
   63.47 +8h0Ole1RvjY987ZnOKcD3keG3HxDcLKkGUHimPI5DXNKqDvXjL3UCPDq9aesROQ6
   63.48 +x2AS6qEbbJCTsiIx+LeN/PgYTlVNjaG9BGoF9U4zR2bjH1TZooDAcLvx/v6KeZpv
   63.49 +kAppxswz71gVsvXNGeTTeiIErF2I2XiaEA/0g0J3RxNsgD3fz1PBZcmt4Egte264
   63.50 +vV+LmxNC6zK++Q/ZZqR4lYjF2OWzrxYJfvWP0R4TEaOPldq1SkR24y79Iz9Lbf1O
   63.51 +X5vrr7gxYn8ZeucAIN3/hAPOO5ngm22mB/XNZKKL0gX8jLSnTteFm87wUggngNK9
   63.52 +rk5CJUQFpEiRA+dogyUKNT+PQDYyURg6s87vkCW3d3tabvi7vko4xrTdGVtbT1/9
   63.53 +sqTnJ7n6Nio6dbdnEV462i31LM8vj0GfWZGsLLUAEQEAAQAL/0I55GgPhvstcqWe
   63.54 +Hte1+j4vDg31cAFGFiT1jsPaCcDWyAOAsY8Et7KF2nzYJerqUyoQKh7/TeiBFjEj
   63.55 +eOuDZGzG/NonTZ1gTLrueFBKVmpk4O6uztWXiXjRZiPwATK2a9ODBa/jfYRjt26e
   63.56 +B1SiRwDvb3fauoUKP1wok7zHx5H8usPKoaH0uTclZH8SPudNJsCPCykrJtIPPvfQ
   63.57 +GjCaIFIU99lW6DiaQ/Dm1MnTViKPIiXTaUEZfjojCfe6dbGCDH+FWGXygKZEVO/9
   63.58 +tigvPKZ3hbtv/RpMupiSh6GMA+03TnZrtEYUXUk9FcCgqvkjKysgYHBF5IdnKgKw
   63.59 +2L7jKZFM8+ggzT/BsVfoeygcacSVCrawLqn0EKTlsHS30B6POUIJe9F9y1Y0UJkp
   63.60 +Wkpgx/qJyP7DZtFyZs/aF9/5ysMSQCEFUnd4xIkvRGWa6XcB3KdiQDP0b+xaqH69
   63.61 +tK/0gMQ/tcvNeh0vqXsi6CAWbjy8oxWP2I6a4ayEAut4hldaswYAzXnxR2ChMcrM
   63.62 +zQDRP3zd9/SmsEi5ouifDgVYzNagbtWK1BH/xdkrNdZhKrwIxO62fqpgv1E9tSFO
   63.63 +uySj8BWwdmcIpYNGEECGTTEAWEyEWER8tM8Gsq7gLj2Brri7nge8sI7wa2fSqB9q
   63.64 +6A829ocBSFGXfMAaAMJRRy8XWijDLj67U0RVXWMvdqF/gzme5yOWhvnjOYfN6U3E
   63.65 ++QJ+BJU6NwUXeTWPF1pbrUoIRzU3tRHvW3D4unA0oIgajfSqa5G7BgDYmQR6DKQP
   63.66 +WvuiIlPCx/Vhp0j1eRPUnGX4hScSV19fDIr9W/O/d9jT0uHbql2AxWR5jBp+IP4N
   63.67 +mekGXC+eEW85XnPGPJekXsL3UGKV5IAVzXzspZAW1ziFPXVnRERrgp1Q4or7fRx8
   63.68 +i7qiZmB+SUW0usekiQU8j0eFz0hrMQXQsLxZm7k1Kv5gYo5oT+THTT3TSVaU9pH8
   63.69 +bfAhDu/daRjlFCVhrZfjmvO9zR3C7b6WYSgwVRKbV3rFmo/TFIshXE8GAK65kS2Q
   63.70 +qW+K8m/wujBf4rhFsomNP8c4PI8Xm0EtLH95tifBNIUglnUIT951XFd1oZxPi8XM
   63.71 +zh/w9m5TgKM7AMaWerihrMu46RRzFXMVbtQRehh472IgOwevm138GzajkN4Qk5Bj
   63.72 ++ZLU1wfeMq+Qteg8TP9OhKO9Q0SVcm75BOoVVwlAKe5e29cUnoNRrW3IlMPqiN/0
   63.73 +TBq++yT9+7If2ssRrewJYBVNdoSvwfC2aiSYX1/4sEo6xWWwi2s+flHHDd7aiQG2
   63.74 +BBgBCAAgFiEELiEyXSAqRL/Zxgf88JWyAlA7FNgFAlu2SrcCGwwACgkQ8JWyAlA7
   63.75 +FNiVrwv+IxhA7UmVxTgcSQeihaeA6cVJPLF8fMZb6dpR49RC2kD6xeuwLdv10RsA
   63.76 +2OopdY4FMXhfW0grI9gwRokyC07re9lF7rdBdaJD1M135CXfNoR11kutdrVxnijL
   63.77 +54pUPZcuYIUhmGfy5zMiZKqt3hnPnzeQie4Cw5T91E0VQESd5D3gUSVqxiIxNS1M
   63.78 +PjZc6zy+tcgKCfUuS8kIOFJlk/dN4uHZhSJPDo3tdgOLW/YXa8JSGdHPRYIijk9f
   63.79 +RyFVlxDetLybjQ1pjkO3auiFT9fZifK81hkbfz1SCcRmGFe4FkXexQVBTFChLSQC
   63.80 +BLaw8v/ZBZ6lBV/BEt3kFCHZ60BmeBrdv0YGimcYH/DJgrJZMYGcYvzmupZiDJFB
   63.81 +O0Ky+y9QS365buP0f3/L0zbaEYBxIaU2rUL5pjmQf0zfZMUiSuaAydTJ976tbnzk
   63.82 +yRdgI1paKCNWh1yxoKvKVyEJffC8VkGe3ae9PsNONu+nOs75CqAbQRkd4qU/7UHU
   63.83 +tfgygNHJ
   63.84 +=BSKH
   63.85 +-----END PGP PRIVATE KEY BLOCK-----
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xA216E95A_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    64.3 @@ -0,0 +1,82 @@
    64.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    64.5 +
    64.6 +lQVYBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    64.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    64.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    64.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   64.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   64.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   64.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   64.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   64.14 +WGRPrdsWtFU7pwcAEQEAAQAL/A4uF3B+jvYKSw0gjmt4EgwNlgtBnKk1KVyOgQbG
   64.15 +1pwFPPOR999q5PQ8IEv87nCxQza6+SxjKNeCwARAY0tOpMWbGHM+UiKu4oZtDJdu
   64.16 +SWiXU5kQaEDsR51hsNpGvt5LGCUCQDYlKq2SR/wSjIt2LUB8Jed/o5kHyRQc2TXf
   64.17 +SVaSsW1r95v61CxJ5lYt5U4A0ySmS85fCQeJflvkfe+rwf7Z27W/vodw+1yC6aRY
   64.18 +OrAvnYz3fV+mZ7Y57tOFIpEWujQ1mR5ENOx1/uDqRYFFrZ26jJlkWva1Emoe6O9t
   64.19 +Zd8q99Umclk1O53CVZvUE3OzzOG/CH7fES9iVX2ATCNi5tcGtfpS7pCkEDrmmll7
   64.20 +MkXiRznUg26deOvQkPi5d5kIX3QEH9qG+kHjtoNMIO8vge8vkYtw/iYtQC2/F3E6
   64.21 +Kf/5fVTCjAxOYvohgC14kVSyQ+9dswkXyHbRxxYKKd10MK2bFZN2sJjEe6qEJR8b
   64.22 +2hqc3ue6QCqIKxAon6wNvAwvVQYA0d1U7ZPXG9NmyC9t1JL7pKhQzCFYHeDVowxx
   64.23 +tdBQU0VcGrk8UC6CjQuf4RN0X+boVU50YN2K9pH6kkbm7xYlI3KRT8bh6k93NR37
   64.24 +lmVasiJoQRsrIf9IiBAuasffbK1zRKS866lhE7fr1Xuld13Smnjua7/n+6mOXUNH
   64.25 +C54Pc20cYN4CsFYk+8RSWaKBa1X4OJ0Q6Ol5Wd2m8F2cULhH9081GUAYUUVW6BtX
   64.26 +DXKy+a+F8VNv8bzgF8LS7Bc6L+xdBgDY4ieEXvpl+QFBy9jkGHZD5ENfeYMAvVqb
   64.27 +0LtzHjfcIbar4cZHIlpYmvO4uBGLQGDVeVm/AVrmJvmkcsUfecEI7pWVfbuKeckb
   64.28 +dcAyXOjkPLK3nwKQ2rCqvSxkjuR+7y7kly4Qqg2BPso0D8nhVQ+sFBFh2X24lwRf
   64.29 +HRqLlVXYKQ3j3TPR8ricmiWDAuRzVahQ+n+7oYA//WgrAMBt8a4bYyOncarN+Nt/
   64.30 +wQRXtBQq5BUK4zs54wclKqu6YpaYyrMF/23QSSA5Qt2gUh1K97bwk+6ntYt9sAqT
   64.31 +FG5MUI9k1S+ZoZjgOl9Qalr/nGdBe8cUyhEBUwdc9GxMD3xlqEa3e0umNIrZHHY4
   64.32 +0OFtn6rmEMAwOfAjql1P0YdGvCs/w+SWp5JlBo8X0Sudwo0vDFSFlbk+OvwMWBKP
   64.33 +6UDstBu73Q7vuJNxPpG5FNdsWgJPWUt1hPEkUJuD5L24nk8km/ravRNgnyOYuBZJ
   64.34 +NRiK3I9p3lUHFv5bwAd9HAJvNaEFJ++JRtbjtDRBbGV4IEFsdGVybmF0ZSA2IDxw
   64.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEPB5x
   64.36 +PYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   64.37 +F4AACgkQF56qJKIW6Vr3Ggv+JdIeNU+98rzlj8gvJsj1DzJs8dgOc5SbAzYblHpL
   64.38 +pt8dHMjUNx8jEVxXUedro2IDWAWMfyVXkG3ZA5Z8/KNdEuuH4G/THn0LBzgkLUGk
   64.39 +/gYQPlc0zXhMAaZDc7N78d/059dVcMmU75oqW3FEQmsS209nsobpdQZM1kOr48ml
   64.40 +F+2y1rgbPQ7RhtwRtEjxyDtncdNPujx4P/QKejKTZR6Edc13XwERD98MwDDjP08m
   64.41 +3oNdsO23bK9QNKqnZ50ybIchx5aASBYZF5FJyKdorGE3tvhPFGHhvF8rRcaeXvhr
   64.42 +pghg+5SzQ4qlEE+5G5oiyvPA0WtDadZiXQ+QfKLS66eS1Pvfn1mO9lWOxJXKHhj+
   64.43 +VO57gUxW0FcXlkC7KDQc0DuiDAyc8Dt7fePBiXzMbVYFE/UbChBmnY1KQkoe+uNE
   64.44 +tVKWctBVSpuU3/mGUNfKdVBxbKGe17wYeJ4nz4BrKc8M7mNpqzGslMmtMEz6yW9C
   64.45 +Zw97Uf2jVQW2upzkvX1+7xbnnQVYBFu2Sr0BDADCoGWh9r6YwoBMmHKMDBHOuqQf
   64.46 +69i34kzGI8alUDVv5mO/As19JdwsBbFlzU4IyfwpCiUS3a9eLvwEoQYSXxvraomr
   64.47 +e0gdHhExLrkaxhjdY802pJK4ZGnSJ5pNx6nz6VWVN1B8p4FUDfdMOVCPOzo1AHZh
   64.48 +pULkx9s9d+rEq15npB9R9C07KTmNZmd/SMm85f/gmmd6iCkdJQ8G+BfUPdFOTA/l
   64.49 +0rm5szCp51rC3EaEK5hc2PULuXRYh+365CM4aWu6iVgVibIXLIOg/Pd9wwTMrH4O
   64.50 +8v/zjkPd5DF/HprJevKhWnMHjiex8IMX+p9UTHqhyEeTjpZTHkep7jEuu6JCenmN
   64.51 +l6pw/gQSqHldMfbiSbCTz/Ywmk1MlrUjQ+6BCLsjZQ0KKQb8pSflfUWEFjYYhVvC
   64.52 +RQhmiwcCERxUDjVZZUwxoeAio6xcuUnEct51NI4FgXg9Z8iTZpF5UUJMkA2s3hyo
   64.53 +dwPNh0e6TvGksNbaO5W9cxETuPZrHj0dU2SWrHsAEQEAAQAL/0VicVkgYiqLjLnB
   64.54 +z3RmCSMuHrzSk9xabQxmTLc6tRJDjGPYV/G5wZhgHzIv0xYHDEKFP1pOdeqZzXbJ
   64.55 +ASUjiwyOWq4rsTXQNkjWY19MKCklH0/PtA7QnXkybSw1dj1ifgRISAVoog6ZPASM
   64.56 +mk+1ybaDh7Cf/g0ZwutTCPs8LNe+BvxslIN22vGyBEu4Y1NYm7Qy15kzWZTuVUEi
   64.57 +yTv9HdVQAIrqaRPu8fZgaFb3uJv9/r97CUE4yGWXcBv1oSjHS+RAKcmeekOA9Glr
   64.58 +hKWargCsATScR2MuNo8hKx9ZX9WiRD0WjHk+sNiJBUWpcE4ky0hLBhblMM3LB/mr
   64.59 +jNOB7fsUYhMwRo1LIPxivIEo+VOXEVfiYR8OiZI+QuJeOkpD3NIxIYjwOgzPOKqw
   64.60 +LgT5T8Ugx3e/hAbmrEJPgt3bOoeKkgCgsLvWOvbVKp4HEpxPXcDc1tyMhRxnaDxn
   64.61 +MKqyEXxZRuaX7IOiWVi4oY+FV/bXzN7a2L5jCw+apTtul6orIQYAxTbcRYoBM0pi
   64.62 +e2HQcstBeoSf3/BYgPH7qUZJFG6wUuKPfBt4LGftce6Yx8UyOqWide2oNqtPVIAG
   64.63 +IcjiPTZC1PLZJItcq8qmPcGxOhKVa6Cj27H+sTVE2QeTTuuNsczxXj5DO8BCStbJ
   64.64 +6G9kULga/ncNsvdh/uNZDmNgJcy8w28uays6cKtCRP0RJj3VjlRwZrhVjl4x+fv1
   64.65 +yvccsoatNyDTAI/j1I0IgCusAwzc340VVSoMN6AKFGj8RkTnT5xNBgD8pBG6m5a/
   64.66 +NS9HAPyEbEMstFw5/rWnZ+NuFBZuO1eP8t8vpYVEejkedWHvRmjw7GJOO9naM0RV
   64.67 +DI1NjYEX1yPESJbREft83ahYQeQDVLxxyoYtqsaGoUovXUmH5ZXK08APxPeKR/PB
   64.68 +LQUKUyoHxBXyeRuFKxJ1Yy90AoeSbIGKSoMokKqN6UNWRsouE4sIxtkdSf4/U41M
   64.69 +L4VUr6TQZbh77scjHdUIBeT+xdlrCu8yCgSQWOOf4T7hwYQX7JOIr+cF/2DGgvJ2
   64.70 +EIAaeJ8oKjb+MLr/QpnyMAC0cqXVYov0RyVhNKYDuMZlaaU61S/wBrMTnB5tX30U
   64.71 +XxhhVSDWVq6ulZyqj89MR6F4kTMpAN+AbIBetY8NgEgy7RrigcgIU5vseT5j2kxY
   64.72 +xx+7xCQ4WRS3LMVz89PNG23f4OwFg0xJV93HoBkS3Z5BEwCQGmIisCHjWiBAnvyu
   64.73 +5nDGKUTzcsso7v0eIZBNmEXRS8s+/sFK2t76gIBYgdtJeTd9s7PwvWWcE861iQG2
   64.74 +BBgBCAAgFiEEPB5xPYUZ1/kH4xQtF56qJKIW6VoFAlu2Sr0CGwwACgkQF56qJKIW
   64.75 +6Vq3pQv/Q3Cya7L5MDbn0y0Xq6pD8bXIfiRk+370v8vO8jWuLwwII//pH/nYWYxz
   64.76 +tfLgyEvwNBdROWeOLEyHWBehXsXbO86wIgypPcAyLfBSNPR3R/axEAfo4nWIEPRS
   64.77 +0hun6I4Ytyc9ENhM5V8+j3JkmB5A+oJ3H/0b5ZUIKzHfgwOghPoh6GrywMroDxDH
   64.78 +V3S21foTXfk6rpkj0SlNyOyOD673QsdpjwZmSkyfi0aQHKkAUitXryqGERT27KcN
   64.79 ++ja2tCWtBVLMfBVUMctXib0oC1PXwpPa/iT9r8CoNo4NgmuLGh/snMzpPUWFRFLp
   64.80 +O4VSK1uDuZwfzedQ/uCuyPXs4hMytUEmUPFV8Fuj+8n5Q/3QTkQonOfGONIvb9M5
   64.81 +D60eXl/oex0oSG/ptjGxgieC4/cMp32NZK3s0/vHEt9grYRtfi9jYOqRh61vt1N6
   64.82 +a4XZxK91mU1M1hrAGz25CN1CzNN+4UZ8UrMN7Gm/pgxycvTOh4+cloA0IlM42utR
   64.83 +u2uFhQAD
   64.84 +=CwuW
   64.85 +-----END PGP PRIVATE KEY BLOCK-----
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_priv.asc	Thu Oct 11 13:04:02 2018 +0200
    65.3 @@ -0,0 +1,82 @@
    65.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    65.5 +
    65.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    65.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    65.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    65.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   65.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   65.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   65.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   65.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   65.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   65.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   65.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   65.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   65.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   65.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   65.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   65.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   65.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   65.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   65.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   65.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   65.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   65.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   65.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   65.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   65.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   65.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   65.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   65.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   65.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   65.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   65.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   65.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   65.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   65.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   65.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   65.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   65.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   65.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   65.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   65.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   65.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   65.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   65.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   65.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   65.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   65.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   65.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   65.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   65.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   65.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   65.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   65.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   65.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   65.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   65.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   65.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   65.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   65.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   65.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   65.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   65.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   65.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   65.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   65.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   65.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   65.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   65.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   65.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   65.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   65.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   65.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   65.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   65.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   65.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   65.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   65.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   65.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   65.83 +Xfa30xD/
   65.84 +=lDJV
   65.85 +-----END PGP PRIVATE KEY BLOCK-----
    66.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.2 +++ b/test/test_keys/priv/pep.test.alexander6-0xBDA17020_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    66.3 @@ -0,0 +1,82 @@
    66.4 +-----BEGIN PGP PRIVATE KEY BLOCK-----
    66.5 +
    66.6 +lQVYBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    66.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    66.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    66.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   66.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   66.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   66.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   66.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   66.14 +FYLRGY3NIn8ZUQcAEQEAAQAL/1zwWwIAFG8PvMcqtdUhpJKt2G69+7X1qdV26oh7
   66.15 +8vdTD3sqZuTKNEbe694zuQQ460IZJhYOrS3Mhi/oxT/3rSnG6j00WdMlbdZYYuy4
   66.16 +KlBN+bJPFaAMKcUd4Xy9PfYIXstlmp1G+YYWCUyQlDJ8Ji6a7LYMlkvlLFmE3/9h
   66.17 +KYs94KYMDs/ueiEn2jjfRhjO+ULhH+fZY2IP+RrdgmgJq7vEesoQmpNWhkEyVlaU
   66.18 +0CFhE8SN6DPJQoS1+viQ76a4XNYFIqW8zxGYbA1GEI7jzRXDNo4QzAaE3DuA+tE7
   66.19 +RR53zzlSHp/cAfhPqS+m4ulUSXKjG4MdzYotjSVuhBVQ+yjMp9HUuobFVSOztkNQ
   66.20 +kGfJCk7pOcytz9VcTgZDip37t3JiBrZ3qoJ7q/DGhk7fb2F2nM7Nr/WMLwHHgNFN
   66.21 +eMoe9Xj/otLHxGIUkmPIO/DQKAAMLs3tJfrvEPFQxlnqCgnST625zHPoftOTkG/F
   66.22 +t8+SW5buBhOaFbcIeNkR2Fnv+QYA7PRcTeTpOfHfwrG0Kg4fr35dtc6W9W9voNhK
   66.23 +hae9SKbEB6jLUhsDyAzOL+PGt3phj06FndvWPnt6IKG3AeoXGnh5WIcYnCFpmwq5
   66.24 +DxJ1llK9iOpnBbNFrf/RXXRmFrvXQzNItlj6gSt/uUFItc4g/8YCaCrIQPfhBJjY
   66.25 +gToetBhLRBu7vRsK2M9Ety2xSDjRvIKB5rM2H3b9ZbL0HE2Yoef1QUYbQqZOPt2V
   66.26 +FUJ026AsEW5Bbjm6zt1135i5CzKpBgD+j1cAJO2h3edzG2v5m8Cjf2IAfPkgem38
   66.27 +YwkfwlZQSBLeQhOicsSgqp6pe5GvM8yET4oMqlBDhaihgA+6IawM9q5dx5nKGzyh
   66.28 +ypant9PIaT2P+MIVlvbz/iGVxT5ShzxZSiBlmJbykj4sja9xD8GyttlYMZNn5TSA
   66.29 +RRC9GKH6B4eF6e+9azOWlSjwNaF9E7kXcCWHSfwWW1u0Ef+Kw/TUx/fUkg3a5j8l
   66.30 +kWf0oCBLhergxoIfuH+Uzb1PJq3ZZC8GALihGK117MfzqEXpaFVn6AUse7HHfBl5
   66.31 ++r6SP6VlWBffkCt/S2Pqx509AJttW96syZ2fddfr3yH4bVeQ3NXfHBZ+Vcq+/sEM
   66.32 +ef9kXGpL1q4DC5qPv7F/ey+uF1Hae71XK2XtXnwwmPJdpp9ziaMfzaX2sDCkggQ5
   66.33 +Dwfs8X6M9q53fzSsKLSIZF6Vym04u4rRSPjarjZel75SGAeeu88HCoKo3E9M90Oj
   66.34 +ebaSDFg3sA2wq4RkgRRv3uwVAojJCleMvOpotDRBbGV4IEFsdGVybmF0ZSA2IDxw
   66.35 +ZXAudGVzdC5hbGV4YW5kZXI2QGRhcnRobWFtYS5vcmc+iQHOBBMBCAA4FiEEtM4v
   66.36 +aUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
   66.37 +F4AACgkQrv3lML2hcCC0Uwv/cQ67SY/eVEGJTvbEiZW0EQWI93Atxl/TR61BuLPC
   66.38 +wJ/lEOnatQw52+Akyk72cQLDUUctg1aMO4oubrK8jhRJxUW7yEQYxmxcUfKBJ8mf
   66.39 +Nk/3BYCQEIThP/koasyOnTFinVSmMjBQOGiPfOGLHfoISf52HMS+ZdGKlp8dMvB8
   66.40 +cgnNor2o+Jce/XJVQViIiMhwz7UhLayq1RcMx0iHcEjnwoG26ZAyHAatWYhhLzYF
   66.41 +wiYVILLZ8aoBwSldGYtWEUDGF6kLAfbiH7pD+hdYzykLSnKgIYBaRsV7Gm6FsEqu
   66.42 +4hsM4pw7R+EOjNV2v1exv1uNX1uZhq0hLeGNi4VHEZl4Ny+n+pRCCaNeIVdbpaOG
   66.43 +23q4KDtrO3EF9pd4rM94WdeU4SboW5KZWkEvgdNINhwy29oHY0Z2ziQ5KwBv90SY
   66.44 +itEzzyTDN6bRvZHI5Cnby2AxXf8plvHg/B2b0CjcSLriE4gLpyxfnfmLhgC3RyGp
   66.45 +GmN5ci72Q9w5dB3ZikREH1f+nQVYBFu2Sq0BDAC2K+i2t4OnvoHugKlMcTawi6yn
   66.46 +au2K/LeQWmc/vPFwk0YwAOERksrbGP/GDpzs3MiZuVx+x1qT7dUmehrv+UbTgPln
   66.47 +TWkqEyNMiZG4BOL+NI2b+ds7DEUPiRsLce5BIXG9fodY1jLvMQTqclaAjUPA1iHF
   66.48 +DBwpgd5HqqUWY87Ikg3lLt2KarWSDwVCiFCJwfVoWOLYCn+n5feG/uRgmkd9kMTM
   66.49 +oak7YJGGvwWp+FE6AEkecdh1rWNl/WEmyD6SjNBR1AMmzFnmQhubp8cxzg91CQMZ
   66.50 +vc0WLql/6JkMpIFGkKp/XVIeSSj54hEmc8ca8bXZNI+gbF1g0xjf3InqMh8q+4xO
   66.51 +sLzPpWYmBrUqHwh2RZCSdVCjvFc8oOmAjCm5A/bgvVszgee2+pTuOEj1RhLQRdr6
   66.52 +Q8fomWCmkaydzSNdS4slC8sWX4uEoBNS7tXeDnv7XSDJ8AEE6Z/j9zqCYJ9zvaz8
   66.53 +vX9xh9Dm4ULrnAE31OAN9eejcPoH0bf4wO0vHT8AEQEAAQAL/jAsrm7bWuqaO5wJ
   66.54 +1DuN2OuZFEB1y3ms2RJIhfNaEPM3TyFUqjBOhGyqUMFcje0pebcFSMuSBocGJw70
   66.55 +zXjWj/9QpSPHWd8xjm0oGCv0xt54oVY1Hd+goAa6uDcvmtUIdh6pfjtk8bVFXkpt
   66.56 +kCiQsvEk72s/h5cGa/TB0MR6Am4SCbCo0xdOntOQO1Db4Yh8jVxZ3StKo3WQIARI
   66.57 +FbbiNbOj/BctTSaRpAphK6tGKpzPBIcTji2Ye6e1+OIbpEh3ChGg24oxnA13w8qb
   66.58 +Ogqw3ng65HvlR9oycpNlZK3+Q5kcbQez3e8ZnPdcKu1gS2beB5EMGatSk25QgSnM
   66.59 +ihfwui1/EvOPotN++/Bxu7D5XLK906ZyTtVJidrXt7NgFR4w4Ui48mikCS/hpxC0
   66.60 +//e6iIoI5T3m7xIfNjumY2u3Pq50O0iGthX5XNz8BhgwNbc/dAs7LWXeV0Bd3of3
   66.61 +f8gUkezZJG8ffE2G4r0plxtgmp36qoAbg7SJwSD0E9SQkWjeeQYAy852evxNb47U
   66.62 +eg+2Qoy5ZScKh2DrVRlTIPnZ58BRew8Unhs3AJOc+kV3RycF1/SMLZSuYY95YHO6
   66.63 +txIUZVz5/UxQi0Ale2LStdC2xjtPbnz0u9VeUZ3UEa36zeLkVLdnwYyhtYOcObcw
   66.64 +di8FUsjrCDTQkapSA05jjiHdVKSY70zU3eMAGDHQ8N8/fYKNkaVjPLWM5ldGtSyr
   66.65 +itPnhJwbOn0Wc7u7sgCb0FcglwWRtnNRAxohDX/eYu2IgvIpnXdVBgDk0w8Zqf6Q
   66.66 +FHf5YvB0MpAF2QJS6L1Oe9peZrtuSlXxhuapbK6T3u9SEAx1l/zvXNglnDS9sx8L
   66.67 +K9a3sShVCRvPaS6E4AE1EOieHCRfDv4VlkM8j8SYVgkIoIBAir8We/uBD57OgTMx
   66.68 +Hrdf2tBCv8yXI0s2gfW9YH2EuuuZxRSLhh+oz9x1BW9yE5bmNp631tAei8xq9sJ0
   66.69 +actFmGACzKfFk/AW05kpnL1pMciQ8nXZMRohrggy3U4A5fJEr/7xWkMF/0uq+5FN
   66.70 +nfF6Mu8+wNyKPpWFvjlJrS3SzgB7NqUpYADYsa73/LXucMrdHQSdnzho/vlc3OWM
   66.71 +7Y+BK+0BM9vovSByBz7Dms9oewkGYDTHf3J+ym6cp9hDH07ajDqk7Dqq1nDNN2+S
   66.72 ++ncO0ozP/60wAopyWp/IvTDbWRAepQsYEtZnIzzfoiKA0AzQMMuB/TuMhBsLZjL1
   66.73 +H/7WdFlDps641OG4jsyvvxlGMx1C1FyzkYJaY/0EAbYz9RAkI52W8KNjOt9eiQG2
   66.74 +BBgBCAAgFiEEtM4vaUe2lHxQDwaHrv3lML2hcCAFAlu2Sq0CGwwACgkQrv3lML2h
   66.75 +cCDuBwwApQ7FpfJXn268SLRoXEvYiY8A2WDcfYv77v5yMzARjXuu0sXVQ+rOlMLw
   66.76 +d2acu4LbPqY012XdYjG9GzTesW8O4XtNuY1cF+Ns153+3RBuQI9dwE+IFf806AJJ
   66.77 +MYygDgVI5hfUgaoboimna5+hjz5D6Vn0BK1S4R/EPMqA6ltz2muH/id4ZdDmdGhX
   66.78 +fcduJYw8vy3DKoqw88h4B1OtcnhDIFq7UidzOC5YuMHT8zYQuAFtREEo/UTRjh8B
   66.79 +9d346qnol1J2jP9wgrQlhcviQcGCCvcB5d/04j+5cgjITod0X/XT4SRDMsFnEbHA
   66.80 +BhlljPh88cMI35QrFZEOv1HonlRk8Farz3UD2t8n70aY28kgkbvlXbvYIVuJRa4w
   66.81 +ZWyTcdDse8LTLj46ISkTbUPWD2pB09IMIY/PGWKFmlHPf7F0zoDEMdR1wvkA5IXY
   66.82 +BYeloePbSCXUmzOXIMju+FRqT3lV41mL10823rECXrlBA6odKs8K6ThJ9rt83N0E
   66.83 +Xfa30xD/
   66.84 +=lDJV
   66.85 +-----END PGP PRIVATE KEY BLOCK-----
    67.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    67.2 +++ b/test/test_keys/pub/fake-schleuder.asc	Thu Oct 11 13:04:02 2018 +0200
    67.3 @@ -0,0 +1,31 @@
    67.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    67.5 +
    67.6 +mQENBFuzQsIBCACmVeBXI3U4gC3K92j/YACvhE6UropldTMUNomDZZI8Lj3CSry2
    67.7 +Ctiu+n3W0+arJyzkmj2dFzNn6z3iAK/Y9FVR71hyF38Zabg8iz68O0Ozjbl+5KCt
    67.8 +ZfVpdGT7xlFh2e+Vk9ZZ/XUy0aigama9ksEl+G0LhKsYGUsNbyk6g8XvSKm3yDUF
    67.9 +09b8hRV5a2kgwd9EqTdGRAFeR249u0+SL7Bp54rAfZOIEkRW51PCDOd77UmemMqw
   67.10 +6Q7aoi0G0+cYyb56cwITPjnqOI5p8cjH2wocwuVFrQ5hNnChqCVRDMQNw1VkodQP
   67.11 +wAFVLEcoAK+62ODQJN2QLOlUoLMOz9KH72JjABEBAAG0MkVOR0lORS00NjMgPGNs
   67.12 +YXVkaW8rZmFrZS1zY2hsZXVkZXJAcGVwLmZvdW5kYXRpb24+iQFUBBMBCgA+FiEE
   67.13 +Cq7ho+5b3T5/Wcu+6DUl7LL1JPoFAluzQsICGwMFCQPCZwAFCwkIBwMFFQoJCAsF
   67.14 +FgIDAQACHgECF4AACgkQ6DUl7LL1JPr89Qf+NrfTVtc4TrycPu2oWRnbJndJxkSA
   67.15 +uPgO92RSDc68A3YxIK7FuquT3CNUG9fqI2xFrYWl6mxcOQBxbzh8pcU67aellOem
   67.16 +fnr56ZgFZzwOwKmDl48sw6+axLVZBxtE6aqLGrJYk1YPqVmzViSUhBVyOyVthAk7
   67.17 +mUL+psfjXBaDsGFbKXPRsDpjMMLeDocXqEHJbnZunGK9o3bm8uAj0bW0LyJjV5WF
   67.18 +l2yhnZVzs200OETAO7+xBqPpjjGvp3/Pc4NybAX3C4XoElIy3Fn4I5xJ+sxQDIZj
   67.19 +UAwu/nT4Fyik/XVcP+/EIi2Yw8Y1S9fEENetWl98aDYNx2RLPlpPQlU6kLkBDQRb
   67.20 +s0LCAQgA0FmaRW42+C6DrvgkacKet/nFXUCiVAd8yYbS5P22pBbuqMfK0QowpQMK
   67.21 +5Uk4XiMCMJY0LKg6HmgNUpJWZIDNRaYEhvllU0OdZbbQQJ5pxGVN0U4mnmMOCsE7
   67.22 +FkIiwW3IeNrHbCUmNeNieQhecXevc0H7pVHQ7QWBSiI74/RY+wi9gDAYpHQN4VBk
   67.23 +3+oSDDFR9Z49VoDvMU/RLUUtyU78WHoxfL7U9Q1kdFwFREtcM1FXQORDxDOsa5DD
   67.24 +QALZ1LNJSaFk0TTqaPcGOH5qM1X8wdNN2cREGl2oDjLUyas1SFAX7SYvwUuFhpfF
   67.25 +w8Sn8yRNTL6Yd4X8YNLbmJth+OIiCQARAQABiQE8BBgBCgAmFiEECq7ho+5b3T5/
   67.26 +Wcu+6DUl7LL1JPoFAluzQsICGwwFCQPCZwAACgkQ6DUl7LL1JPpAygf+PrUQtxtx
   67.27 +SvYKUKU4afTiXeGIoAQvtrkEntenWAWeIzVEmQh2JdQFTRDzVBp6k5LY1QM8lNAB
   67.28 +Q8SimAw8qyog4M1H8OAXw3Dmb+KadoC+5aghG1BBRJT2dmVzNbFBERXTyfC5HQRk
   67.29 +lNWXM+IztTQ+H/K0YLN71OUx8da9smBgHs2AFglBDG4z8LCJ3LKCGVPUctAEMnje
   67.30 +yT8d5UtGPEitCKBuFBsq2ZZcjqc+zKBXmdoBcIOMfF0oX+AQqd6w4NH0tgiJ2+uV
   67.31 +TkmHZgKM5vLps+YC+r+1G+ymE3bitxwEaP+q5VGhKLcWuMkrj5Be2zdaJFQ1pZ8f
   67.32 +dJSyJu2U56cp0w==
   67.33 +=Zsve
   67.34 +-----END PGP PUBLIC KEY BLOCK-----
    68.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    68.2 +++ b/test/test_keys/pub/pep.test.alexander0-0x3B7302DB_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    68.3 @@ -0,0 +1,41 @@
    68.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    68.5 +
    68.6 +mQGNBFu2SaMBDAC0ViAanwhNVIAzcX3ZLsAywSsthmPRQIxhmqF4gmYa3Wl9Mii9
    68.7 +Gr6kG00A99noMHBSKVDGFXeRKAoD6s0MtX3EHvTWt5hn6AouIi8kgMGwMF6Sz8yx
    68.8 +3cebMlXTvIsVuEGzERWrJDy0YHy0qgVyI/uHs01xksRJ15Ir8qx0cVwBpr0S/cFI
    68.9 +UdCmdkqmvxExshr3QX2hs4gVM0dVTdbtqi5kK97hvt2jJmS4q9dqVWBI7o0dWpyF
   68.10 +miaaqrNaIzNpFA0Y0CmE18X2FbQYnuvHsvGZN1cGLua5fi5VJ3oSdSDWnjDHZGAy
   68.11 +TGfRJLpJohSQacAEXS4tsmh7R/wmV8VxZd9oQ+yJEQjNIYyKpclAKS3ASfVh3Ikg
   68.12 +QH8d1Gvx1qvQPUsA3ZnEGjTtRIzZDcVsCe3vZRG8WvS4YUpQ0wleybIJHlBruYe/
   68.13 +Gg5mbOn3+A7PMtwNL7Gj3X5Zs7dm3FeIiLfmCby5n8HK2RYUYzlnhQFpjbRp4XDg
   68.14 +WuW5oqY0+BRGOL0AEQEAAbQ0QWxleCBBbHRlcm5hdGUgMCA8cGVwLnRlc3QuYWxl
   68.15 +eGFuZGVyMEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBPRZihfUaQ6ztbD2o0Tw
   68.16 +TpY7cwLbBQJbtkmjAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEETwTpY7
   68.17 +cwLbQ8QL/243450ktf6iX0aLoNotLdTMdtwIGWWdc9c+bIhu583EZewthxgWrgqL
   68.18 +wm1TdkOFxwxcJvGvi0X2AriLllGSDDTpvkxRw1Lc2zwASEs83ejNG4rMS2K7mXa7
   68.19 +Cof2Qdz1mD5e0PrJrbbH0HuhBWiFYuIhaa/KizIlZBNwp7BDY1fibJBGvAFkw4Fv
   68.20 +WB2AD/w0PSmHHSBRn+iJz591FIzoujXMqtVe2ogxC07fVhMnGEIFWKxXkRzXuy0i
   68.21 +rXJJ/jFIAI1otl27HVIv5rpuhoHyujxZquW+AtvqcK8jYmqaqE6cPJhZEvbtFNZx
   68.22 +3IMQdMecZbbLZHqyuRCbRUThA5jdoU3mcVWq9EKEx0FebLtgIdNhcX+IRTMRDMfX
   68.23 +Q791v8F0hiZfwm2daYokEyhsYys8apbkaWwARcJ6rRPsju5fN7ijcF+NnHO/NksD
   68.24 +35mn2hWBnl4gOJdN07zLz9WAyBXTfdwokwmF7S/q5SnhI1X4U9HKb5++mRP0+kfx
   68.25 +Z2qW0igZiLkBjQRbtkmjAQwA4wyK+uZrNstWaHsVY3Z+fpYGhwgGIrY5tHP+sg3V
   68.26 +yfvgfhInMbnAt7v5bgOfwSLZ9LdNqGZK+c64Lxb2vPXFCgqs4OoysxCGiik+fKBN
   68.27 +lWCrL8p77TD3Z2KjoJBZrh+gr+KUY6TvMoDhKk4UPCjTAs8x28UolzuFTt5TSNE3
   68.28 +1wJjfiQMoQgv9Vp8xKhLxRUa+SxI1ZoatMHvnIkEdvZIOe2mtUoZLvLnLrG0q2tg
   68.29 +ZZ8oJkZcjARoNwLMRtNKvgHIDbKhwfc9rAchtVLFk3ZmOqiyezxa9z03Rl6iRhPA
   68.30 +mfhL/6c8HVmf21x5qUU/r69xT6bva1IyWnRU8wpIEEbi58wucmI1PXejAP3yCWVd
   68.31 +1CZ85kWhYLl+Rw8awnPSSFnNVtsItAb1QulyMScXT5V0b5OBQesVX6VHBF5L8Xzk
   68.32 +tpmElfWcbE7Bg3QHS3y56obXxO1Ir9ZZkje+3jc8UcilI8sHWPZr8icstCmMGIWm
   68.33 +8+x0Cw0szAKZ1Opzn6re4+2dABEBAAGJAbYEGAEIACAWIQT0WYoX1GkOs7Ww9qNE
   68.34 +8E6WO3MC2wUCW7ZJowIbDAAKCRBE8E6WO3MC27acC/4x+mHPPkP0eur8yBSjZ3kM
   68.35 +gWD8HNGaVO7kBIQUnH156I9S1EzInl93fwTMWUPKyhghzVAiP4bDfjOW1OH0LEPT
   68.36 +OxU3uBNauWBnn63y8pYOKAlhB5xmxwqdluJDMMiH84N/ellUsowO/PoUN4cxXtiM
   68.37 +cVoyZbNEs1O+hvf+DODnxN1v75IKj94PvlZ8Nh68y09DGYhWNwm2VwiT0nddiX92
   68.38 +SF04WT+ucOsjGm2mw76gvMHXPB/Qa9FPjez6YObWXADK2rBJynwNLahb3LeE5JgH
   68.39 +Hpu7ONTjtHQPmF4TgKH6Fl/Rse66KwJZeYKhrMRSaflwbRl70jY8mcKxFtwGuIGu
   68.40 +B1tykpZMidZ0cmIt5eGfJ/NXTQA+AKBJ5aY5tW5ES9UCoWcF0p/5VHL+2l+exzkd
   68.41 +Q4h/dn002tIDbCykqL0CcwNz/tiiKo6heCCEwG4s9CovgIpF6s2MRVvKQjc5p5FT
   68.42 +3uhIr9IQ9gCkrmUfBism3o6/mLCfW39cAMQ3k/izRvM=
   68.43 +=txtS
   68.44 +-----END PGP PUBLIC KEY BLOCK-----
    69.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    69.2 +++ b/test/test_keys/pub/pep.test.alexander1-0x541260F6_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    69.3 @@ -0,0 +1,41 @@
    69.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    69.5 +
    69.6 +mQGNBFu2SgMBDADBBL2UwuwkLgSrmVW83sTz3hWHzcoCKKXVLvDLJd/RJbyC1dW7
    69.7 +R0KuKGRsbogbhxIMsepgehjTdN3+ugF7OKjW/uzuMQ9fqPQMIl2B5UXqzXw47Beb
    69.8 +4UzJx5jij/YHhrzLnXmgnZ1x1hsexlzt/MIsl01kLT7gJhm7qY+IX2zrvWUqqAhI
    69.9 +ZHYWA343zxH3j+nxIkjZs62aBt5jC5G2KtUbt9qJBUVERPAsMXNmTCRHPc/YjLYZ
   69.10 +orCGTNEyN1a05iBSnuHh9fmIqJg/MPdLK7C4XUi9QcfU/tvAVpDbR339HhFWNc/E
   69.11 +rwJOy8WjDVeHes7TcHVg1iB6euUpelM1RNim8DdYvkvh05MxfSqRK0iW8AKN+izZ
   69.12 +EDv2jNs4MpCAqhE0i57U2NidIe+3NXkI/vW3wHeTrCWbl3Rk3U+bgSnbSeWCEA32
   69.13 +PqZMW6HVEATJBYEVdOIgqiido6jkqSBp5UGAiSC58xsPEBd+1ff8Lm3OHZKC82p5
   69.14 +MtOUJwMpAelnOeMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMSA8cGVwLnRlc3QuYWxl
   69.15 +eGFuZGVyMUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFmvTFFJIoNSL2kEUxwJ
   69.16 +cwpUEmD2BQJbtkoDAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBwJcwpU
   69.17 +EmD2c/EL/j6lozpt/xio+XP6lLXq9b9yykdJpOFW6Zw8tB68snvliMQhVQui3NZz
   69.18 ++etb1KmO4eGRYxknRQKfYFZdOsgfWki+MTbTeyiXbS0TtAryxQEJB1SoU5/Fn3v+
   69.19 +E27WB7W4G58bdnQnULo7AwyVJQ4xqzBoQi21Zn8T1cnkq71AQ4fX44pqPoLKNpWy
   69.20 +tf7B4p6Il3p8KCZlgTNo5LlkAccV2nvPDEAf0pBSZ6XzvKWhg15Is4lIcIU8TUhJ
   69.21 +LHpuzQsADYBxv8FRQ4TqfQPqP0PJnWwiqw9D1y/DFdKQnxonDfmmoHEwxrqgX02X
   69.22 +QmV343BNMfaC/qXEzbCHtTd3Bg7nWw/8NSdYjE2FDM5x7BR9s5T2qnyXDav+KOWK
   69.23 +RIyEaD0c5+EyIafHgsCO+zFSdqgpg4hTKLqGbweqHGF5sIU0/fzl7JptczPCEF04
   69.24 +58FC9jzeI98wORUchEHo06ky3v2rnZ2FRxLEfDHkSA6CEnZnDUQEKyg5tKCFuzQF
   69.25 +kpaVtEf2UrkBjQRbtkoDAQwAtOGWjpeYKT21urofhE9qB0pDksAehxsHM5uWyJ99
   69.26 +i2fX0DkCuvdmvJaYNEbtRToREbK0lTpZJN2BYpc1/T+jb4NkJCxQXuCBS8ptkbAW
   69.27 +nPL6hftu6eco8jO7PluhHzpe+C6gqHEPOUUa7zG0afhggwsu0likKRHkKGYVH7ww
   69.28 +A5DHPh8aEo2vYObhVd3U6X/cO0DBlvJheNjqujW+GKoqjEAkhmNLe91guKYL1e4E
   69.29 +CTgN7BlXQyGuBQChcnApfI5O8HcmrH0sZ7NnKtozuB4AkBYn3rfoPce1OHrJ25Mh
   69.30 +VHPsjDCkCeZhtNFey39OxsmkLjjrSTo26LvIjLAKqxo6trkN7hLtnlTGDI+Cd10L
   69.31 +bVG93zm8D/RuwYv5EmRY8t/UsXyON9o3FU+cZsyGOiMsvi4CoWoDHlA4ADbOwN6a
   69.32 +030W0MauPA4zNuBGB1is7fBnTpPExyQLfd/xuJeaHn5nrnpSNw/JQRWaP67ptZiC
   69.33 +mmNlC5wCX8isPSN77E9xrV4NABEBAAGJAbYEGAEIACAWIQRZr0xRSSKDUi9pBFMc
   69.34 +CXMKVBJg9gUCW7ZKAwIbDAAKCRAcCXMKVBJg9j4FC/9bvVd8zvbyFZ++PO09GyyM
   69.35 +l2PdpHIKkADwhRlZWIg27rlrrIv7olli74ulBjb4CJSQkCKf1TZLR6B7QfbjUhcw
   69.36 ++PvuoImUu+28r4b69mXPyTIJNQ2Nbo6jWdu2ptzkfywJG/W5JM9WefcCeSMsvrEN
   69.37 +b3N+Mz99OoSOcsJQSmq3hM00NFxaeDVO68WY39k8bbrmCeSLZFO65fuIPAbj1OQk
   69.38 +sG4cOPYijSCU0aP7hYdPAu+y/5PPb9RmB18kIJgDOP1JoIeqPB3ZJNl8fVrLKUdV
   69.39 +JoENh/qCSBFp9HkChmNPrhHjtAMmPXzwbhoM6R7txu6yn7LCty1nMeSjav3SLHoE
   69.40 +uvqDri0pMC8foqbezb7K31EwQDJcNzfnSszfYf6iLWULBB60qtMBcVmdO2qzCDcq
   69.41 +TVvh8knra0GuchWEXUUORERBzidxz5CXy6TdjLEG7I2Hne9MeuUwpfeV4Dv0mgG+
   69.42 +0n5F4IBlmcht/cIZOl7afJP5HcxFKOuWQRpB1mStyp0=
   69.43 +=reOr
   69.44 +-----END PGP PUBLIC KEY BLOCK-----
    70.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    70.2 +++ b/test/test_keys/pub/pep.test.alexander2-0xA6512F30_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    70.3 @@ -0,0 +1,41 @@
    70.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    70.5 +
    70.6 +mQGNBFu2Sh0BDADHO/4MHmkYcCWjYThMRi7zh/Qk81AkG02kiU06JvFSwBLeJjmt
    70.7 +kwEyvLLvPz6fD39RenS3oMZ0szFQI4I+xqiYwX1FI7PFGtHuJXQwIOtb1AT2rXne
    70.8 +FRcu0Jr3tIkYXRBaamQ/dsLPvYXoNskB4VXKlz6AU98K5A0iIyq81D0j16s/oU1u
    70.9 +03qxI486l828fBWw5u24xNTSmqRmdCAEXbzIQYZHaSVqdLmjzs9dM75j/k54AQn/
   70.10 +0EwpUTZcEjfKr7vGm3a5O4XhkMxftd5blAcTeY8ym7DbJBvoZDFXWQTw64tI/LfN
   70.11 +3NnJIIqCcAEScWtFcIUpMZKrReKRay7+e+2JZ/YuLokn7tcG2+TjBujNQHd6ZPOG
   70.12 +bWiUZV8y9ALjuh0Cv5zJefjfQK8fhYIRaUP96iDILc/BLMQKJte1W9mqqvEZtzQV
   70.13 +Mq66J2UhfQTtHYmUbEfRuSuMzlM/M2yDCzWCKsCxxF//E1MbhMlTjaAzAE8hrBLn
   70.14 +Ln0EZR49Fm5yAWEAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMiA8cGVwLnRlc3QuYWxl
   70.15 +eGFuZGVyMkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBEaplPGQd8BWEIcCc8S4
   70.16 +qwumUS8wBQJbtkodAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMS4qwum
   70.17 +US8waagMAJFQBndihCqU8cbJWd50SiDKJKkq8YRMNSDZitPKpRR492+3m+8yRVTU
   70.18 +Kau7OVrJfPUpBFffHZfaZstjONUQGlPjP4zmJN5qsakrtcogPKpCslnBd5d/m+4q
   70.19 +vg94Xyh1vrZhzMqIrW5nu6LRB/gvoaqWPzXvqg/sGQMnpL7HC+uTAT11b5u8bHrg
   70.20 +RUfYfPwm6uWBaFtm+24rDFR6CbiD3pPrIlcuwsRwc1+JuTvmfTfuLzqOGnSMTBom
   70.21 +bG8j/Ep/urSnGvAmtjRH4CCP0N1rA3LTTMvTO+qtBJN9m3txf93iH+LFFlbXOC67
   70.22 +pBa5Qz0J7Dvrf235LUdPzh3S3McIzG59M+caQfLCSKq+car0s38BQ4XwPO5wcbe1
   70.23 +dbP0CkHnriPbzh6Uh4ML+gEiQm/EIopT4Xr9fDjQYNCs5k7eMYnjihuSjYGO8HJ7
   70.24 +1H+0m6r5qsXO7atCt4ABaqGUvYurbcdOJUqs3ZFKEDlZSPYV0e/iKYDPcoT3fumM
   70.25 +rQf8hAVCq7kBjQRbtkodAQwAwKrq3pXQlQDg4PQNnpYEK1g3aCpYsoOPvmfbDjBr
   70.26 ++egfb23dI81j1e5CaJCMEjNgSGjUrYwXUWFkY3p1Ko8BYI8//p8Vlefdzx2Dt4Ky
   70.27 +yhLyPmlVYB2V2KGkfT/EZyuoz8UoKY0ZTxYH9IFLLlTmr/XjthBRS9tu5LVDAi0H
   70.28 +/8Cg09orOqjo5aIDiELqDhjdrZ1i5hbPQlZIl/AYN3fVcFnK576azybu6X+NsApn
   70.29 +t0etAfNq4F+29Vvp253wQjypUHxDKq5t6wijSwn36NuVsrtBvVNLH4OtUpBYvCS8
   70.30 +5ouDTNinI4B8OwJFK1wBPCW4v8goS25lVQqhN1uVoLgjWnb5/xkKD6DgZlkKZZCw
   70.31 +tUrpSmI1WM8LJwCnQIdVSNwpQ2MK/5g9Tt/Uxr+k3cdS2yNa5+XCOisznpjHd3c6
   70.32 +t3TUfLVIN/AymMW2+szA9uBIOdPvZ7gBewEki9F8IyVINpD5SStpvJSFMp4ixCbh
   70.33 +cB4Q7JGKknLdTcI6aFzgmWNDABEBAAGJAbYEGAEIACAWIQRGqZTxkHfAVhCHAnPE
   70.34 +uKsLplEvMAUCW7ZKHQIbDAAKCRDEuKsLplEvMKm9C/9Uf+acjbtZkBLx3XhAfC/g
   70.35 +dG9bF3zxFfJ4HWmYkgSs6MAOzPVkbakeu/g6n0KA+hbGfN2HL4MXAoJim0lRelT0
   70.36 +XiRUMNanFag3L2c0jOccVrEvJe3ZzskUYujlP5VrlRdohiv2DqQ9gHAVjrBMq8tN
   70.37 +aCs8v6VpyKUt0HTFLUVV3lOjujZkkKAL+0Y6Dic8fYGJ57CM+AB09ykOMUK6DLvp
   70.38 +SWmNukn9RgOGDP+Dv6Qu3pcc/PmyAdeq876O6Kp3EYWU5CfjGIokGNIs9pTZAghi
   70.39 +OYedskfX46acXKbYSZGfh+EfTKEGkTQ4e6/T6JZi9+v+mO2UJkXqF20qIx+/lybF
   70.40 +lbNvcIrfdhd01xzDgJbq6qaraTKf1wNJfDs5AwifudmlzX0vvZvP71lEXbOlaZii
   70.41 +BJI3y9LCWwT6NOoQgLGVc2hqpByLQVfAtQDhafF4shOX4+TNWCFEMzX/4LVeRs7h
   70.42 +vq55IsjHfnTplniqWG3xcV/cpPCQ8OvknNjThzxNFao=
   70.43 +=Jo1Q
   70.44 +-----END PGP PUBLIC KEY BLOCK-----
    71.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    71.2 +++ b/test/test_keys/pub/pep.test.alexander3-0x724B3975_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    71.3 @@ -0,0 +1,41 @@
    71.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    71.5 +
    71.6 +mQGNBFu2SjsBDADDO0zZQnauroE59x029IqQ3jPNTxabLV1DmFQrQwJaMrTdgYzj
    71.7 +wRdv+sECrZV1/2MHMQaIOqui2yMPvqMch547J1/dsVrF6ufVgUdhPDvqyKmbaWg5
    71.8 +I2Y7wbP5LNAoWhVJG/sSlzH/Y9M7InxPqn+oufizdiD5q7YKFA4KyUgDqco+KGqo
    71.9 +vZUouePMgE66+cnFth109fE7571TWPjNcNUYKHs35ULbTwfWvuoXUsceoJfVXHBn
   71.10 +4skqApzoPm8FgJxwh60Exw3YL6Rgw1+lvj6mM5jUWzvMoSKJdTjl3ZBb35U2MCS+
   71.11 +6U+mmTYdC8cS5jbzpXnfRvnuySdnOWri5gsL6lWw6Nl4wVQXqv2QxgyIJgsJbZcf
   71.12 +1vQl2HE9wTE4YqzLWz/MTOjstwajSPJTvcKs4HpcrHvOOnsuoa9W6O1/IMQp9q9O
   71.13 +PQhixlMFYugFeKyuL1siUgu2xEF7xGeSOw+VQU+qsmYKwl/1EBnRTtKJbyPQtbHJ
   71.14 +2VVBJm5CGF0GJpcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgMyA8cGVwLnRlc3QuYWxl
   71.15 +eGFuZGVyM0BkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBF9wdrvZLhTqSfDffCzk
   71.16 +lBlySzl1BQJbtko7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJECzklBly
   71.17 +Szl1cJAMAJP8Jm4z0ECHkBLQa04eZEMOQQnlGh9c2TYIUHpnRPjuClb/zjNqR8mz
   71.18 +cPSzYoVgh02bHZfDEXDlDBxc8BxE7D7gbjtG/40W/mzS6fKvzNpQUlMY4gz8xpY5
   71.19 +qXrfVouMuFDR87ueZ77vJEuZUh8TmyqiEkVH372LcY8uEcjOtTkE+n7wfYFiNQMY
   71.20 +dukKJrH+sFW8fXz5Ik/ktPsm+nKKsZb/GrOXpWwpLFYjm5L/nbugrytuhudG842X
   71.21 +YSPbqKZPnuf1CYAGOLly7Q7AevI3X60e45JzRMmGtIXjEcUBI6EDA0SesUa32rfq
   71.22 +veNbV53eUsELgimjkYvTrHAaPBtrznrnpdrM3j3ZorKlrnUF+PP83GCBiruHABEV
   71.23 ++n0ZLBR+iCspIn156cj0+DakPqDlEeWx78YDVbMNz5rWsvESGSpZJVzvB+z3S3S9
   71.24 +goRoC+PuCXM8CzJKUMzKqLhR37xC0h6k33lcqWvT0fL908ix9qPjAA8Uyz0mMk+i
   71.25 +8LMWpUF2dLkBjQRbtko7AQwA5VTUHI3e7nwI5TOlYxvqkT32KFLl+ODi9b7h15ZO
   71.26 +J84BIIll03m5Od5B9+yhnFGcP4+r+4ob0r1WpBA+N2qE+pMoqqPdX6ZLS3TEVBRS
   71.27 +Ot3zTxa7fW6RWOJoPnFMaWMyJrFDamrEm+tiCB8b654fSTfmvEUzB3U7Cnl1JEt8
   71.28 +XQBI6mOAuiQnkDfU3XRzAZ/R4ao2XelWf186AJGHQqNOieZbwLUrbXlJqhzSWCrE
   71.29 +CcKzV1C1cXAM19qJCnsbzsANTZH1ZR/cp57iTGG21v3nz41+mDPPR9YifZGS1Jko
   71.30 +PoXP74+FpsNzWaZh0pFGNHRZP7RrN7VpljtU04Et6Rgk0irRqvDpQztnFCm67r5p
   71.31 +6K9qA/ed23sNPBV7Ghbt6LSJygwAKBZUCJ3ulHc8nEfdlxPuiLqnDG3BLc8DtXEV
   71.32 +4DA2O5q4yVDkJaxMxypjFomdTqlzI2pInkPX5Npja8NXTXd/0E6/pyPiZofai+SH
   71.33 +Wb+M6NMlqbwdaivWVhBCLLj1ABEBAAGJAbYEGAEIACAWIQRfcHa72S4U6knw33ws
   71.34 +5JQZcks5dQUCW7ZKOwIbDAAKCRAs5JQZcks5dQFJDACOMW6qkDazVjjFenLdCxko
   71.35 +g+H/7LRy1jHBT+uh4E7BHAXJhIjMdMgmYtsQiy4kl70+pEz0eA6pOHEfmsK2ITCl
   71.36 +DCEVLrfsy6OyCKi5F20H924QSIpbIR1YXjLeRQN4lB0FmVys+lC9ad73Vl5Bzhyo
   71.37 +YTeF4xETYE0fRF1Uw7xmI+d2MmAw2LryqJEggirJTup7niIQfwm8bOuogt36+90J
   71.38 +sZqAjvvW9ULex7KW2ltUBcuPY1ev7a6HZx9rzxHpxKlQDLS/OGtBUz7AZWmZZnhI
   71.39 +ZbL90jv0K30I58/a9Lg2hzuZrRSemBjldLZw0B9PLMSafP/i+Awf2vA0pO94uCGD
   71.40 +YG2wcZ2xnhxb1sW+jRE2v+D5JieMCUr3p0IaEH4EDChvYdfSNpghcdUu6+zBS4aA
   71.41 +B3NBbtw25zb6yeTXMTouBVZINt/nQl7B+iP9SNZZYVcV9pTdbU6DtaQWmI3xMMav
   71.42 +XNyGzvOeUftnO1JT7PTnoDbtai5mI9DnFtCVLqdCUc8=
   71.43 +=LncY
   71.44 +-----END PGP PUBLIC KEY BLOCK-----
    72.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    72.2 +++ b/test/test_keys/pub/pep.test.alexander4-0x844B9DCF_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    72.3 @@ -0,0 +1,41 @@
    72.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    72.5 +
    72.6 +mQGNBFu2SkkBDAClr2oDnwInsIuV0HhJHANHCHnM0vuwez1NQilxXUV5cGft2U/B
    72.7 +E9VuJPw60UpgJTydYBrHJaxz7XLFgVXFBZrRr40fbabSOUhMXpBypSGI3IXO+VvV
    72.8 +H+CrNKtDcYsHOAqVYlZu64vZ1FmtD85xjBU85+nktnGWuwhvQIooNnMgvqDT+Q8/
    72.9 +VWySOpf9oqO6eF2MrBozL1pM/O6P+oogseahg2AWjxI2iM7dtBZPYVWHSNu34wcc
   72.10 +4yB7oWhUOaBNMmRQqpaex/M5qLdPliU9/SSnBqfKICKfyjhxFDxqkHDpx1Pd1UAs
   72.11 +8GEmnHLbmFmuB/36xXNO4eF9CaTD7SQMsOIU3auhdE45OtxSuXbT4ArpiIygLTXQ
   72.12 +7KtbYcOYl5bQecpEkkLC8tIJPHSjUVuY46EQS38k/+IfMzO4WC4piFjlgzW0szZF
   72.13 +ARXEXuWFOka/uT+FJ4D3J7V8eENzgvy4y9HN00dOwcIx2iZ6sD6Uyggu9fHpAiJB
   72.14 ++rKeexgmSicMiekAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNCA8cGVwLnRlc3QuYWxl
   72.15 +eGFuZGVyNEBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBOlf/5W44v3UoSwzdDlf
   72.16 +FIWES53PBQJbtkpJAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEDlfFIWE
   72.17 +S53PXI4MAJR3ddyRa4Bczzsfsm3u1Ujg1cYwBv8y+mZaQ9MSwG9JxpSVZH3Bed9W
   72.18 +G8h90tLeiZlPm76s6oALjiUqjA7X/7/O+No7vOk6nyM1lRU52eXfAl3rMs1PpwJF
   72.19 +b4MkaacwraJZzDui9RPGiem82+ikCWXGb5YXVEOIi/qcsGI0EwxX62IwiOPyHu8Z
   72.20 +nZmqnOThUKnVnb44T83+ZgQuqDITOACB+uzHCgFOwUtGgjf4GCbH8viLZFOATrEH
   72.21 +UUZ96JQQbaRBLbx9ZMek61inhGCjMLHrybpa9n4V2yaRHhRoYMCR9YDZ4Hg2TZCN
   72.22 +OPMq9F9CuNK+chQMc8UY1CCwpswk0uYZWh6H1t0rhR+IC1FK+WfDOze7+sgNsB/l
   72.23 +hmt+P2dDG7jqk5UTkUW2LgRlb0h03Jm1jeCfSSLfSzOELKczGJGihXKtj7CXvAAP
   72.24 +SWmq10Bl4kFGEOl0GgxqqkO1ujtXLUU0idOK9w5GPEHd153O/zvwPcaWasGuVqiF
   72.25 +MVxGu8WFVrkBjQRbtkpJAQwA1AawhIeG9qirn3P12k2JfBmRd0eB2WypHi987kmD
   72.26 +ygiYyDZy1/8D9Msuw6QsvGhTu3bXvbHifBuu+/JPebUbJ6xyiNdgGMJAc6RVJiNz
   72.27 +a9Un3h9sM0P4lRfLCx0b3qdCafyc52YFO6bIAYtGK+0WAM2ya3rautPJmo/f2apn
   72.28 +98PpCMdpbhsJ7vHVoGG6+rakR0OCDe12+JGYQ0ilpX1dk0RwH1ErzpHIkBgrmcBz
   72.29 +F+gpEDvFPYpWrKOIzouKJlXi4KMSfjW3NayJO49BZUf9yk4GOVT/uG9RlPeK956m
   72.30 ++kDH0pESqpbgJbW36xIUgCf5/fZkrjuVXHpl58DVUrJsq1RFjtJgVyyd+VpZsaN+
   72.31 +emyeKJ7Vdu9VZitbxajKhsEPmzxlb8YP0UvKtcr4A2WnH7Ds22/j1hoy+1XTanXZ
   72.32 +MCnqc4+ilHt2oz4kM3Nkn7bizswaP3606O9XogTkHA6kX6qtGSU1ALMJ2fDPJjYH
   72.33 +jv07sJuM9DFciAzin2iC34ZFABEBAAGJAbYEGAEIACAWIQTpX/+VuOL91KEsM3Q5
   72.34 +XxSFhEudzwUCW7ZKSQIbDAAKCRA5XxSFhEudz7Q7C/9k0vPVUQ7mP5B5Mi8yQLEC
   72.35 +cFK8mj3dhzdn7DhXyVhExg1utU68dpVaxW+m2ptPhrreFVPcmIINpluQEWUsS1rq
   72.36 +e6vlahXzDRq7QdH/YvpJOHm5QTOtQTDk6+oGXR0G+ujZnjWuDIhqfkGUxhZCic/z
   72.37 +toboR0BgvGGzcKtedAJPhYOe4v4OaCq/0XOKIkx4iaf+bd+hwGkdo+Y87jHkCctW
   72.38 +9uF0n6W5TLqcfXP3hXmhm7lseaaHtW3yAAwwZflB98agOQWbzZ7HHq7jI/SXlewG
   72.39 +PRakX2ah0hMGs7gslldIxA3EGWFXkP5fNBOymamqLVerp72RRSkGfPpYcgCQu5qY
   72.40 +X9LRqqCkuE7/EWWrOLy61T7ha2Ru6Zk2O1Y+UgWImfUr8E0ZVgjXcEAHOUXjuIiZ
   72.41 +q01TQAnprcdREzJas5rX8jEttddKeT4WlBY5mu0oNrBiTOiQK2ZIG8M3Zch5L4I7
   72.42 +P+hIeNsDdtEuTcaZkUPQ/LOUmzX3Y6yaCgWKvVrZVl8=
   72.43 +=W5LX
   72.44 +-----END PGP PUBLIC KEY BLOCK-----
    73.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    73.2 +++ b/test/test_keys/pub/pep.test.alexander5-0x0773CD29_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    73.3 @@ -0,0 +1,41 @@
    73.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    73.5 +
    73.6 +mQGNBFu2SocBDAC1PJrDFs+MEy7zXdl96Ur4oDSkIV5fXw07z+BPwuLKBUfSIYiv
    73.7 +r0GKobZrHSrfjeCWKWSsj5xHKMg412PjCuhH0BzbtE/rftEVtHmpaPZgDRzDr3Lb
    73.8 +qzrgL5Pb/wcnKE7ejW/swY3oYB4uRsRkNmdiRZm84Mj15LQuaog0+Zfv1jagxo0k
    73.9 +q5QlumbvlOG8ttHzu981MrkZZsMg19lm9BnnTpQFtFahK1zzQZZUoDw+VFPOGtoc
   73.10 +g+NEwftGc4aeScHsFtBHWLpiSiK5c4uNH1xLFXDUJnhRebtiCSZP6N0GGVl8j3ad
   73.11 +C1+IbzFI7wYM+AGkXbHwST90TJFJ9aGggnyBGH2eSu+7SdoVTf29S/m+9gQOtfvP
   73.12 +p3I/va1UYMJo9gpfFZXhvYjp22z7TpWQXskHlpw63ttsp4SOipyvk323mZ+gDwE0
   73.13 +KztV74iLmGpbs3T5vGHk3Kh7vxhq9MkAUjUJ82f0KPG6WybWab63lqhwHojphw49
   73.14 +YncgyLU1Gn3bDIMAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNSA8cGVwLnRlc3QuYWxl
   73.15 +eGFuZGVyNUBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBFi8wr8q4ePE++q4mteD
   73.16 +isoHc80pBQJbtkqHAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJENeDisoH
   73.17 +c80pZKoMAIaruJ8K0WbSOtS5xtOolQRmug+usnbk5LAlKOgD822qWjNmocO4+Xde
   73.18 +OMOUKcZS/Py8SbftMQkpo3urcCtH3xJYrOj16gEzZU57cgyfEFVOE2wYqGHxAM0y
   73.19 +0obJpHwfoy6yFxGCka8cKjevGw/7InRRWu6+dg2VLHvKmIKxw4PpOvGa/J60nObM
   73.20 +p3XLq5YdnNgbcGFwT0zWAzyD1qtdFmn+2BQ4e04WUnTYdSnDWpaZQ2GV/LYLTmIl
   73.21 +IIChKYem6jOxSXhkSfN85CmB5MT1gNBJPtZZ/hLqPNhRFz8cteKAt0tRhOYECG2D
   73.22 +nAHufJBMuDGkBtpzJQ5EJWEmglUv1Kh3pFam4lWsSFbdLB0/zzTpl3AnxELbjcrG
   73.23 +eHpTgYX/Yn8kAcdW/dWh79g8rbEYEhyniJLIgqvAKwZF1JD6gnXuuBXJOrUGOZd1
   73.24 +U+NFHwqRsPujdy4vWFRvU4OlSbp2UJen2RMhXapKVQJd1NX7yjMvW0PKiiaLIq+a
   73.25 +36zxUS4nCbkBjQRbtkqHAQwAwWdMTN0waeuEKkblFE9kjSOodgAZe53o3b3NMwI8
   73.26 +Q2004dI1vmw6v8e9s7mBE2OQmri+ioUmdwcjUGJVZJA7i0Rl9JbBWiOzzmV5YKpr
   73.27 +LGNUWAhBnjB28hmH/6JzY0wDxHZcmZ4/GiMPg0HxqyLdk/gfmCQCiBL/+DSPXB1V
   73.28 +v8ktGUvVTAS/RA57TEY/RffmplZw3KaOkVFXfT+XN46mGdJKp7KcWdbTJqNk5A3G
   73.29 +a8iviP7FVvlyvfxZk64+u2vp53p28wBzyivca5tKPSiUFsHEnjHZtQuxPpRdQ43/
   73.30 +thdBDgUEaqaJUf7uDqgrED48Qc0OXytvOz+MpaifwRQFuZbe0ZDvSje4ZjPPYz2p
   73.31 +4HbnGHdjgLLygkLyYdZIPUQfgtGnUBgWUAzwokU9o0nmNSnkbCrjolfHXh8edaaA
   73.32 +DBoZjb9feCzoqOlm6qt61I3pflBAjj6gUStFwhSW5jwgK0ajeA8QQmVm/2Y+fEA7
   73.33 +OcYBNZI37Vc3ktuuOUjrHWp7ABEBAAGJAbYEGAEIACAWIQRYvMK/KuHjxPvquJrX
   73.34 +g4rKB3PNKQUCW7ZKhwIbDAAKCRDXg4rKB3PNKfo1C/4kRd2/cjZPTNM6mRpX1dcz
   73.35 +TDi6H7eIzst8ZBaSVJCF+4gh536yv52+Lg9Uavgz5mZkHmDZ6MMTNOg9NG7aOaVb
   73.36 +eOfvldjfHR/gnhCUwhlgLWGTln/gAClRH+i/ASLF7zVtddLQfmPFR0Nrj5Bs49Pa
   73.37 +NyNsVxkwEPwfBLOb8kbAwzwgkfL2TRqbWD1BBH76hhTBQHaf364lIjdBbrGdgLWz
   73.38 +47thE5mDK/bjk/gUvRCYyqvqTbMRjRoQsvOXMl6tTqstPSa2UM1IzDJhg5JODCSk
   73.39 +dnWOpjPAiMj0xPCMBDrttV/USftPSva4cd6Yg0v8iC1r8nqtIiXwxX0gp6CrO4DC
   73.40 +b7QbUe0b6+iTaWcaNgs2D0+AXz9umY7FX3eX3fLdgFUoYih3VRNir4EML7FJH5Au
   73.41 +TEwuU33pgiHE0j/vcj5JWLC99bxP7Wd2Iyy1AehbAMuz7+HxnFzov7TvyMgjnnl9
   73.42 +RuIoGbkMahodbfC4XUQuV+H/mCQVXAgtF+NDjfepotg=
   73.43 +=059J
   73.44 +-----END PGP PUBLIC KEY BLOCK-----
    74.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    74.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x0019697D_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    74.3 @@ -0,0 +1,41 @@
    74.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    74.5 +
    74.6 +mQGNBFu2SsUBDADTU+YkrzZ6qlc4Of36M9owo0e29bNWCSP54mWjFgA/j0Vi9m7v
    74.7 +addxeRDRD3UtachLI9pcQZ1louSCyMzBbSpVvcVaeme6FiIftR56iL/mSjPtFUhp
    74.8 +n26d0uNsEWaqFSdVDoV5IrRr2DFjvp8x6+ibzsFNBP3pxQD/mGDt3m/LiVHwF7dc
    74.9 +3saXbjYEbjelKON2skl6Ck18NN/HDyad8BA7KGL8ugS9h1WSWxj9rRFf3uaIEs1v
   74.10 +vJLOpgKd4Ly6XekEjHVM+MdZJbsMQMCBY2wjP3A5eqjhmjzJzo6PuZfcgkTO/DV5
   74.11 +bEtV1OQte4kNSqyO3r4pa4OGsjKp8SweRBuSToAEdlEP2T91uSaqcHDoikDFUhoS
   74.12 +zLx92alPHwbOR9G29ORJKHiXq4/fvdwk0O/8TIZgxEQWG5jsFzLuBgvhl3zfUHdk
   74.13 +/CsHP0gyOFaLHQlhxqxzueicTmLpmRPEDsTEJL10QknVKPac8zw+UUfw6G/toJoz
   74.14 +wOxN0vPiTwdHIycAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   74.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBHTXm0SW4om9inG3C6ji
   74.16 +xFMAGWl9BQJbtkrFAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEKjixFMA
   74.17 +GWl9NXML/0v4hbZztWksR550HhuhjsPv8seFyZiXoFiaSWVSH9iODF5Cewi9iZrH
   74.18 +aD9Ykae3k7rdikQFP+OuFWy4XaqtGa4owBRTpxyYQ8vTNW2OxJIW8C1ORg4ApfxR
   74.19 +BgApbcNnwFG3zvJhadMdSwxxPSvBXZ01UWrJkvU5PHZcpqT9anY1PAabMKlnpKoa
   74.20 +VOO++4FDK0rm3Wl42SJYF+lx3hoBk9Lw/LU/QRncFv8vzXjI0UYJxGTTJ8L3eDJH
   74.21 +sIKm7CjyqilCX7/AVQ90ALi/Y/Gitb3ttgY0RkDTZHT8tX9tDA0xXWO213vZkyC5
   74.22 +wQ7lb9brxTDA4yFfyFPW1c95loOYKqCezgg81erq7wZ/EcUHHG2AGHBGlyxdeGaV
   74.23 ++NRKNHmO5IWCS7pnUhMwBvZfdF+rPTAMF9OYP1OzzxO58DteXR2V4OogMR6OCcAz
   74.24 +K7uJN+eTA8upmRX+omv2gEFh6aBoOJnveRdXpKFd8Iybr3Gpj60OdA2wHXW1bbe4
   74.25 +/iX8mnnazbkBjQRbtkrFAQwAzUaLt7KYnbNbHVqnDEKcRp3A5H7JvQ2tfAJT7Mck
   74.26 +FRJHwSBGrvnULwOvUrBREykEkizN8kVRwDCn0wUp02/Q2FpBC4vXa0boOpP1LWaI
   74.27 +NWs2uaHskvMWTyZjmLYE2HhLLc84jUgo/RowCSVGG6nVp0UR+uEQiWScgw/RuIgd
   74.28 +HyhaXThpTnKNu1gQaPusTnFKHBe0dtyIhqi4Yi6a51jDWAodmrLaXYCYZGHDqTnI
   74.29 +2KZqvrGn+Evojr9qWu45X0E4FJXMQjQvyILbf7TfXOG2LksRR5FjjThE6Dtls78m
   74.30 +Nr8cYRnY8x2BNcSwJCt9BnIGt+l71gAYGd+SW6UwXLQ9hIqpRM9i1JQpS0BsC5R4
   74.31 +o+T5D3EXiJz3ghL6ZttKD2AfYNg9heD4LaOgkY9jkB5IGSOhuEaCN25q4bo4+io4
   74.32 +imR2bq9+UP03/+j7BEtqUBeN+WatoJ6a8S6pvG+B6mNRanqmrzZOmjLEy3eLh4oH
   74.33 +izj1A7DdtJ4Gy7WUIBe16BG7ABEBAAGJAbYEGAEIACAWIQR015tEluKJvYpxtwuo
   74.34 +4sRTABlpfQUCW7ZKxQIbDAAKCRCo4sRTABlpfXpFC/wJ6nyMMivbEQHQ77dpr3EN
   74.35 +HeaKrhGzP09zahmGNiZMKf4I0tovJMxtmyMJk4A740UgopwrLlZbYeAnakQPGbV8
   74.36 +VXfEsMKVP3FPq0OPwIlWmQv/AmJVFwusG61q5XqpPG3XdTV3EU0B6Y82XtcmVPWK
   74.37 ++XhSvduzaCS3/gyQ9y67jEDKBakoIS7QBZCbxoNuekIbe8wsoxSjVVcGSGbXptco
   74.38 +Oo5zjSD68ugpbV9hyCjNLMUs8OjPeFjgzCBfoCU5biyhri2+sHabEbgBxAFUcVSv
   74.39 +Bybcy2hdIlSIUrP6zSB7JKqhgbyPYbeWuk3pikH4ryoCSgQmak8sT4n4ZhWXhGGI
   74.40 +FUmiJUdzZNNGKsVMNr6z+SP7FJfAMn5v2BN0t3rAg1XZ2ML5hl5075uPTZRDjPny
   74.41 +Kf89KXYZjKdB4S5JfTiLCN5Fwj+xoWm9WjhLzhFnw6VVZMMNkp4kx94ImtShzcy0
   74.42 +yVTRX3+TDG2YRwx3rm1la4xH8BXIeHsba+ZDoRy5tec=
   74.43 +=mv2X
   74.44 +-----END PGP PUBLIC KEY BLOCK-----
    75.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    75.2 +++ b/test/test_keys/pub/pep.test.alexander6-0x503B14D8_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    75.3 @@ -0,0 +1,41 @@
    75.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    75.5 +
    75.6 +mQGNBFu2SrcBDADapmn3Sf0jkth1WutbwiYsuhupZn80tqGkIs4wVkf6rIGHYKkW
    75.7 +n1qTiQ7juSFVoOggoIMSULhZ+9sCT8BAq40nu7kKT96z1NNlFMzcnHz69EwFYJam
    75.8 +jJcJCbc1C5k8AKT8qJqVrjml36togflO2H+yPrYeUbLXgtUX5phGGB2Cr/ApfSUB
    75.9 +KrJGUmKh/Pi3DqOjX6DcE/3BAG1ERTGXmvOooq2Ojeuw7V/XXypD0KWa5fCh4Lar
   75.10 +EArXreIPJwq44xJp3H0H9t/oIk8VKhJBAx59rmldpN1K5yNnmviJcJoKWLHhGy0Q
   75.11 +f6c6CPqgrxwV55tM3O9rcRYWHests6AfqqgArx0rBvxK8wKxWgYlSRlDf5nDFWHz
   75.12 +EVIfI6bhWR6EoQQ15gjJ9ROLMkGO+Unl2dx+9UU76ydWmsRdTTb+sq4d3QGZOq5K
   75.13 +bSTrs7oMM/pqrP4Q9mmdtT4EKMapZM64/BcG2BjNWkj7+FKGRl6hEDsFU2nxM5wl
   75.14 +ii3YZy2mWMv3nQkAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   75.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBC4hMl0gKkS/2cYH/PCV
   75.16 +sgJQOxTYBQJbtkq3AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEPCVsgJQ
   75.17 +OxTY1OkL/1VoHZbizTxzvcnJNyBL6ATegGvqtK/FMspS4+oRC/ylHVFV4EtPRdVs
   75.18 +WxZ3Ne0Yjun8TUD3nVSzTHfSPMemxBv8f/QTm98tK80EqS/bIbr5GyLYv9OdcLaM
   75.19 +QzkrIDc5ESOUmB1XbCnVFNUgEQLNh/xhNAvaQ8ZXheglm0UPl1+zzkMup1HeQhzZ
   75.20 +TMi5OEu7xZWGt9A6bYJiKLI5SU1YfLdhWh3FPbHX3x82sw//dHtUeHYFTI0zyCjN
   75.21 +sMJqGru4kZOlWWeEiKUJG6sjyCKWHIAyD/AJ2haLs+Nz4Sbe1B3MLH5wuHA06AmY
   75.22 +kSKKAbidBRQmiUCeVNrmjR9ielHm9ywhUuX7rYUuJQ/v+kTtFOGyga5a8Xzrpbmb
   75.23 +iil+VsmJ+kj3DEI313hMknJ7nD78gBxabapyjP9E1PcYvZsVxCuJL7j2UI9b1yFE
   75.24 +fa5tjI0ejgPKqCPnf/D5HwS5xNoatenfFLvAw1BEYpdq8sKbc96u5sbWIqjGxlmb
   75.25 +uYUAgWh4iLkBjQRbtkq3AQwArdm1DUs4QaGG1m6ywkX2rj3YYMtB5TTzm7tbG3F2
   75.26 +l9a0fHjdxhj/KBBAwHoX/tAhGrh2vAZDqkkWpgrB2CUzkJKHK/IdDpXtUb42PfO2
   75.27 +ZzinA95Hhtx8Q3CypBlB4pjyOQ1zSqg714y91Ajw6vWnrETkOsdgEuqhG2yQk7Ii
   75.28 +Mfi3jfz4GE5VTY2hvQRqBfVOM0dm4x9U2aKAwHC78f7+inmab5AKacbMM+9YFbL1
   75.29 +zRnk03oiBKxdiNl4mhAP9INCd0cTbIA9389TwWXJreBILXtuuL1fi5sTQusyvvkP
   75.30 +2WakeJWIxdjls68WCX71j9EeExGjj5XatUpEduMu/SM/S239Tl+b66+4MWJ/GXrn
   75.31 +ACDd/4QDzjuZ4Jttpgf1zWSii9IF/Iy0p07XhZvO8FIIJ4DSva5OQiVEBaRIkQPn
   75.32 +aIMlCjU/j0A2MlEYOrPO75Alt3d7Wm74u75KOMa03RlbW09f/bKk5ye5+jYqOnW3
   75.33 +ZxFeOtot9SzPL49Bn1mRrCy1ABEBAAGJAbYEGAEIACAWIQQuITJdICpEv9nGB/zw
   75.34 +lbICUDsU2AUCW7ZKtwIbDAAKCRDwlbICUDsU2JWvC/4jGEDtSZXFOBxJB6KFp4Dp
   75.35 +xUk8sXx8xlvp2lHj1ELaQPrF67At2/XRGwDY6il1jgUxeF9bSCsj2DBGiTILTut7
   75.36 +2UXut0F1okPUzXfkJd82hHXWS612tXGeKMvnilQ9ly5ghSGYZ/LnMyJkqq3eGc+f
   75.37 +N5CJ7gLDlP3UTRVARJ3kPeBRJWrGIjE1LUw+NlzrPL61yAoJ9S5LyQg4UmWT903i
   75.38 +4dmFIk8Oje12A4tb9hdrwlIZ0c9FgiKOT19HIVWXEN60vJuNDWmOQ7dq6IVP19mJ
   75.39 +8rzWGRt/PVIJxGYYV7gWRd7FBUFMUKEtJAIEtrDy/9kFnqUFX8ES3eQUIdnrQGZ4
   75.40 +Gt2/RgaKZxgf8MmCslkxgZxi/Oa6lmIMkUE7QrL7L1BLfrlu4/R/f8vTNtoRgHEh
   75.41 +pTatQvmmOZB/TN9kxSJK5oDJ1Mn3vq1ufOTJF2AjWlooI1aHXLGgq8pXIQl98LxW
   75.42 +QZ7dp70+w04276c6zvkKoBtBGR3ipT/tQdS1+DKA0ck=
   75.43 +=tYCn
   75.44 +-----END PGP PUBLIC KEY BLOCK-----
    76.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    76.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xA216E95A_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    76.3 @@ -0,0 +1,41 @@
    76.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    76.5 +
    76.6 +mQGNBFu2Sr0BDACxzCVyqmaKU4+dsr1NI9HvHgUmu6F62kpRirW45MM8X9Dj27JC
    76.7 +E4ccusNQS1lkFp+Nwn7F1qx8BmjHyO0rWcW+o/cBMFGt4ZQZrSFJqkfUFh1bYpV2
    76.8 +52o1ZqlIZPNoCSGg40ClWh578fAZdkmlq75m35qQxeRs7fknh6TnTHDF8CXAWQ9V
    76.9 +7+TKUMNDULs4w4LaCf9dAnoIRS897OgQ3bk5UlXGIVXC7t9dLYQp2oRgE73XxlIP
   76.10 +tgto/+msADM98nhi+jG0x1O5LB4xK9vJw4t6gOv3/wRg5SWzQoPC6y73fIJpIu6o
   76.11 +C7z0cIwddxUYUL3eIkVyViEn55lw9TphNNG4tDw1/NDlFS1bxtaJ22LIO9Bb3tn1
   76.12 +7iukv7p2QMgkAB2D1LTnrnrPzRuNjCHJ8Pgrih7t3Hok+GOJhqqyojg3v/2xwjL/
   76.13 +823cX7leXkWp0dYeIfbEoYQPChCsZYhsMAdaL06Exk2jUwR48eGl7ol8aMZmoD5l
   76.14 +WGRPrdsWtFU7pwcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   76.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBDwecT2FGdf5B+MULRee
   76.16 +qiSiFulaBQJbtkq9AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEBeeqiSi
   76.17 +Fula9xoL/iXSHjVPvfK85Y/ILybI9Q8ybPHYDnOUmwM2G5R6S6bfHRzI1DcfIxFc
   76.18 +V1Hna6NiA1gFjH8lV5Bt2QOWfPyjXRLrh+Bv0x59Cwc4JC1BpP4GED5XNM14TAGm
   76.19 +Q3Oze/Hf9OfXVXDJlO+aKltxREJrEttPZ7KG6XUGTNZDq+PJpRftsta4Gz0O0Ybc
   76.20 +EbRI8cg7Z3HTT7o8eD/0Cnoyk2UehHXNd18BEQ/fDMAw4z9PJt6DXbDtt2yvUDSq
   76.21 +p2edMmyHIceWgEgWGReRScinaKxhN7b4TxRh4bxfK0XGnl74a6YIYPuUs0OKpRBP
   76.22 +uRuaIsrzwNFrQ2nWYl0PkHyi0uunktT7359ZjvZVjsSVyh4Y/lTue4FMVtBXF5ZA
   76.23 +uyg0HNA7ogwMnPA7e33jwYl8zG1WBRP1GwoQZp2NSkJKHvrjRLVSlnLQVUqblN/5
   76.24 +hlDXynVQcWyhnte8GHieJ8+AaynPDO5jaasxrJTJrTBM+slvQmcPe1H9o1UFtrqc
   76.25 +5L19fu8W57kBjQRbtkq9AQwAwqBlofa+mMKATJhyjAwRzrqkH+vYt+JMxiPGpVA1
   76.26 +b+ZjvwLNfSXcLAWxZc1OCMn8KQolEt2vXi78BKEGEl8b62qJq3tIHR4RMS65GsYY
   76.27 +3WPNNqSSuGRp0ieaTcep8+lVlTdQfKeBVA33TDlQjzs6NQB2YaVC5MfbPXfqxKte
   76.28 +Z6QfUfQtOyk5jWZnf0jJvOX/4JpneogpHSUPBvgX1D3RTkwP5dK5ubMwqedawtxG
   76.29 +hCuYXNj1C7l0WIft+uQjOGlruolYFYmyFyyDoPz3fcMEzKx+DvL/845D3eQxfx6a
   76.30 +yXryoVpzB44nsfCDF/qfVEx6ochHk46WUx5Hqe4xLruiQnp5jZeqcP4EEqh5XTH2
   76.31 +4kmwk8/2MJpNTJa1I0PugQi7I2UNCikG/KUn5X1FhBY2GIVbwkUIZosHAhEcVA41
   76.32 +WWVMMaHgIqOsXLlJxHLedTSOBYF4PWfIk2aReVFCTJANrN4cqHcDzYdHuk7xpLDW
   76.33 +2juVvXMRE7j2ax49HVNklqx7ABEBAAGJAbYEGAEIACAWIQQ8HnE9hRnX+QfjFC0X
   76.34 +nqokohbpWgUCW7ZKvQIbDAAKCRAXnqokohbpWrelC/9DcLJrsvkwNufTLRerqkPx
   76.35 +tch+JGT7fvS/y87yNa4vDAgj/+kf+dhZjHO18uDIS/A0F1E5Z44sTIdYF6Fexds7
   76.36 +zrAiDKk9wDIt8FI09HdH9rEQB+jidYgQ9FLSG6fojhi3Jz0Q2EzlXz6PcmSYHkD6
   76.37 +gncf/RvllQgrMd+DA6CE+iHoavLAyugPEMdXdLbV+hNd+TqumSPRKU3I7I4PrvdC
   76.38 +x2mPBmZKTJ+LRpAcqQBSK1evKoYRFPbspw36Nra0Ja0FUsx8FVQxy1eJvSgLU9fC
   76.39 +k9r+JP2vwKg2jg2Ca4saH+yczOk9RYVEUuk7hVIrW4O5nB/N51D+4K7I9eziEzK1
   76.40 +QSZQ8VXwW6P7yflD/dBORCic58Y40i9v0zkPrR5eX+h7HShIb+m2MbGCJ4Lj9wyn
   76.41 +fY1krezT+8cS32CthG1+L2Ng6pGHrW+3U3prhdnEr3WZTUzWGsAbPbkI3ULM037h
   76.42 +RnxSsw3sab+mDHJy9M6Hj5yWgDQiUzja61G7a4WFAAM=
   76.43 +=BKiI
   76.44 +-----END PGP PUBLIC KEY BLOCK-----
    77.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    77.2 +++ b/test/test_keys/pub/pep.test.alexander6-0xBDA17020_pub.asc	Thu Oct 11 13:04:02 2018 +0200
    77.3 @@ -0,0 +1,41 @@
    77.4 +-----BEGIN PGP PUBLIC KEY BLOCK-----
    77.5 +
    77.6 +mQGNBFu2Sq0BDADrnyCcBi8PmBhZy9SaYlMt5mlYVbS0yORleXx4lbq4fCxJ9IXc
    77.7 +r8A8FYRPwWeZx5Owo/9CYhAT0rP+OhfYFHOBGj0IsiCWC1lJ/kJ9jWbVXXXiYzft
    77.8 +1euA3E9t0VVpd2AK+gD4JdFliXvKKmIFf+j5DdUy1KH/59bAJGESmsPMUeXEFVb7
    77.9 +1q9UqAykvjBMV/rUQcOrihYMez7l3eqOKOM7G9aSIkz++dxqWGZ8gNOXalsTO8mb
   77.10 +8ZWIEYuODdY3Jof2UYXoZIKXnSZpGvyqfOauvxC/N2Vlf6cKtSciQjSIUd9P5Nbi
   77.11 +UY94KqhYVfe78Wy822CwxWNghJzMiWhMBdM+kOVqbOekswUrR046lDFwDymvlAHY
   77.12 +Rt6y27uRVW3cNywh4R7wmf1qymMlKwtReOa2QDbrIdffHTteR47s34atvFAkYk/B
   77.13 +W3B6mib/r2p9NJW5LTlzrs/sPfvMJqmN99QuJUIMn9aoyn+eKZ4L5uLnrnd+h3b3
   77.14 +FYLRGY3NIn8ZUQcAEQEAAbQ0QWxleCBBbHRlcm5hdGUgNiA8cGVwLnRlc3QuYWxl
   77.15 +eGFuZGVyNkBkYXJ0aG1hbWEub3JnPokBzgQTAQgAOBYhBLTOL2lHtpR8UA8Gh679
   77.16 +5TC9oXAgBQJbtkqtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK795TC9
   77.17 +oXAgtFML/3EOu0mP3lRBiU72xImVtBEFiPdwLcZf00etQbizwsCf5RDp2rUMOdvg
   77.18 +JMpO9nECw1FHLYNWjDuKLm6yvI4UScVFu8hEGMZsXFHygSfJnzZP9wWAkBCE4T/5
   77.19 +KGrMjp0xYp1UpjIwUDhoj3zhix36CEn+dhzEvmXRipafHTLwfHIJzaK9qPiXHv1y
   77.20 +VUFYiIjIcM+1IS2sqtUXDMdIh3BI58KBtumQMhwGrVmIYS82BcImFSCy2fGqAcEp
   77.21 +XRmLVhFAxhepCwH24h+6Q/oXWM8pC0pyoCGAWkbFexpuhbBKruIbDO