Implemented Win32 DLL support.

This commit is contained in:
LoRd_MuldeR 2020-10-24 15:06:12 +02:00
parent 77c2cda5ee
commit 49cc6ec674
Signed by: mulder
GPG Key ID: 2B5913365F57E03F
8 changed files with 296 additions and 39 deletions

View File

@ -11,6 +11,8 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release_DLL|x64 = Release_DLL|x64
Release_DLL|x86 = Release_DLL|x86
Release|x64 = Release|x64 Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
@ -19,6 +21,10 @@ Global
{86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x64.Build.0 = Debug|x64 {86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x64.Build.0 = Debug|x64
{86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x86.ActiveCfg = Debug|Win32 {86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x86.ActiveCfg = Debug|Win32
{86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x86.Build.0 = Debug|Win32 {86D28793-713E-4CEC-9686-335514AC5EF0}.Debug|x86.Build.0 = Debug|Win32
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release_DLL|x64.ActiveCfg = Release_DLL|x64
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release_DLL|x64.Build.0 = Release_DLL|x64
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release_DLL|x86.ActiveCfg = Release_DLL|Win32
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release_DLL|x86.Build.0 = Release_DLL|Win32
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x64.ActiveCfg = Release|x64 {86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x64.ActiveCfg = Release|x64
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x64.Build.0 = Release|x64 {86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x64.Build.0 = Release|x64
{86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x86.ActiveCfg = Release|Win32 {86D28793-713E-4CEC-9686-335514AC5EF0}.Release|x86.ActiveCfg = Release|Win32
@ -27,6 +33,10 @@ Global
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x64.Build.0 = Debug|x64 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x64.Build.0 = Debug|x64
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x86.ActiveCfg = Debug|Win32 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x86.ActiveCfg = Debug|Win32
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x86.Build.0 = Debug|Win32 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Debug|x86.Build.0 = Debug|Win32
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release_DLL|x64.ActiveCfg = Release_DLL|x64
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release_DLL|x64.Build.0 = Release_DLL|x64
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release_DLL|x86.ActiveCfg = Release_DLL|Win32
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release_DLL|x86.Build.0 = Release_DLL|Win32
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x64.ActiveCfg = Release|x64 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x64.ActiveCfg = Release|x64
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x64.Build.0 = Release|x64 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x64.Build.0 = Release|x64
{A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x86.ActiveCfg = Release|Win32 {A4A3879C-BD2C-4304-AF66-7349CEF7E4C0}.Release|x86.ActiveCfg = Release|Win32

View File

@ -5,6 +5,14 @@
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release_DLL|Win32">
<Configuration>Release_DLL</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_DLL|x64">
<Configuration>Release_DLL</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
@ -62,6 +70,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
@ -75,6 +90,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
@ -86,12 +108,18 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
@ -105,6 +133,12 @@
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt</TargetName> <TargetName>slunkcrypt</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
@ -117,6 +151,12 @@
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt</TargetName> <TargetName>slunkcrypt</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level4</WarningLevel> <WarningLevel>Level4</WarningLevel>
@ -160,6 +200,34 @@
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;SLUNKCRYPT_SHARED=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libSlunkCrypt\include</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<DisableSpecificWarnings>4706;4204</DisableSpecificWarnings>
<CreateHotpatchableImage>false</CreateHotpatchableImage>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level4</WarningLevel> <WarningLevel>Level4</WarningLevel>
@ -202,6 +270,33 @@
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;SLUNKCRYPT_SHARED=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)libSlunkCrypt\include</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<DisableSpecificWarnings>4706;4204</DisableSpecificWarnings>
<CreateHotpatchableImage>false</CreateHotpatchableImage>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -422,7 +422,7 @@ static int decrypt(const char* const passphrase, const CHR* const input_path, co
if (crc_actual != crc_expected) if (crc_actual != crc_expected)
{ {
FPRINTF(stderr, T("CRC error: Checksum mismatch detected! [expected: 0x%016") T(PRIX64) T(", actual: 0x%016") T(PRIX64) T("]\n\n"), crc_actual, crc_expected); FPRINTF(stderr, T("CRC error: Checksum mismatch detected! [expected: 0x%016") T(PRIX64) T(", actual: 0x%016") T(PRIX64) T("]\n\n"), crc_expected, crc_actual);
FPUTS(T("Wrong passphrase or corrupted file?\n\n"), stderr); FPUTS(T("Wrong passphrase or corrupted file?\n\n"), stderr);
goto clean_up; goto clean_up;
} }
@ -456,7 +456,7 @@ clean_up:
// Self-test // Self-test
// ========================================================================== // ==========================================================================
static int run_test_case(const char *const message) static int run_test_case(const char *const message, const uint64_t checksum)
{ {
static const char* const passphrase = "OrpheanBeh0lderScry!Doubt"; static const char* const passphrase = "OrpheanBeh0lderScry!Doubt";
@ -478,6 +478,13 @@ static int run_test_case(const char *const message)
goto clean_up; goto clean_up;
} }
const uint64_t crc_original = crc64_finish(crc64_update(CRC_INITIALIZER, (uint8_t*)text_temp, length));
if (crc_original != checksum)
{
FPRINTF(stderr, T("\n\nWhoops: Checksum mismatch detected! [expected: 0x%016") T(PRIX64) T(", actual: 0x%016") T(PRIX64) T("]\n\n"), checksum, crc_original);
goto clean_up;
}
ctx = slunkcrypt_alloc(seed, (const uint8_t*)passphrase, strlen(passphrase)); ctx = slunkcrypt_alloc(seed, (const uint8_t*)passphrase, strlen(passphrase));
if (!ctx) if (!ctx)
{ {
@ -518,6 +525,13 @@ static int run_test_case(const char *const message)
goto clean_up; goto clean_up;
} }
const uint64_t crc_decrypted = crc64_finish(crc64_update(CRC_INITIALIZER, (uint8_t*)text_temp, length));
if (crc_decrypted != crc_original)
{
FPRINTF(stderr, T("\n\nWhoops: Checksum mismatch detected! [expected: 0x%016") T(PRIX64) T(", actual: 0x%016") T(PRIX64) T("]\n\n"), crc_original, crc_decrypted);
goto clean_up;
}
result = EXIT_SUCCESS; result = EXIT_SUCCESS;
clean_up: clean_up:
@ -540,6 +554,7 @@ static int run_self_test(void)
{ {
static const size_t total = 32U; static const size_t total = 32U;
const char* const test_data[] = { TEST_DATA_0, TEST_DATA_1, TEST_DATA_2, TEST_DATA_3, NULL }; const char* const test_data[] = { TEST_DATA_0, TEST_DATA_1, TEST_DATA_2, TEST_DATA_3, NULL };
const uint64_t test_chck[] = { TEST_CHCK_0, TEST_CHCK_1, TEST_CHCK_2, TEST_CHCK_3, 0x00 };
size_t completed = 0U; size_t completed = 0U;
FPRINTF(stderr, T("Self-test is running, please be patient... %2u/%2u "), (unsigned int)completed, (unsigned int)total); FPRINTF(stderr, T("Self-test is running, please be patient... %2u/%2u "), (unsigned int)completed, (unsigned int)total);
@ -551,7 +566,7 @@ static int run_self_test(void)
{ {
FPRINTF(stderr, T("\b\b\b\b\b\b%2u/%2u "), (unsigned int)++completed, (unsigned int)total); FPRINTF(stderr, T("\b\b\b\b\b\b%2u/%2u "), (unsigned int)++completed, (unsigned int)total);
fflush(stderr); fflush(stderr);
if (run_test_case(test_data[j]) != EXIT_SUCCESS) if (run_test_case(test_data[j], test_chck[j]) != EXIT_SUCCESS)
{ {
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -3,6 +3,9 @@
/* This work has been released under the CC0 1.0 Universal license! */ /* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/ /******************************************************************************/
#include "test.h"
const uint64_t TEST_CHCK_0 = 0x18481930058B7F62;
const char* const TEST_DATA_0 = const char* const TEST_DATA_0 =
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit" "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit"
" lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero e" " lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero e"
@ -37,6 +40,7 @@ const char* const TEST_DATA_0 =
" Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temp" " Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temp"
"or invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum."; "or invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.";
const uint64_t TEST_CHCK_1 = 0xD5363C7BF7FA84D6;
const char* const TEST_DATA_1 = const char* const TEST_DATA_1 =
"agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtgtctgatagcagcttctgaactggttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagacagataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggctttttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacgttttctgcgtgttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaatcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgtatttttgccgaacttttgacgggactcgccgccgcccagccggggttcccgctggcgcaattgaaaactttcgtcgatcaggaatttgcccaaataaaacatgtcctgcatggcattagtttgttggggcagtgcccggatagcatcaacgctgcgctgatttgccgtggcgagaaaatgtcgatcgccattatggccggcgtattagaagcgcgcggtcacaacgttactgttatcgatccggtcgaaaaactgctggcagtggggcattacctcgaatctaccgtcgatattgctgagtccacccgccgtattgcggcaagccgcattccggctgatcacatggtgctgatggcaggtttcaccgccggtaatgaaaaaggcgaactggtggtgcttggacgcaacggttccgactactctgctgcggtgctggctgcctgtttacgcgccgattgttgcgagatttggacggacgttgacggggtctatacctgcgacccgcgtcaggtgcccgatgcgaggttgttgaagtcgatgtcctaccaggaagcgatggagctttcctacttcggcgctaaagttcttcacccccgcaccattacccccatcgcccagttccagatcccttgcctgattaaaaataccggaaatcctcaagcaccaggtacgctcattggtgccagccgtgatgaagacgaattaccggtcaagggcatttccaatctgaataacatggcaatgttcagcgtttctggtccggggatgaaagggatggtcggcatggcggcgcgcgtctttgcagcgatgtcacgcgcccgtatttccgtggtgctgattacgcaatcatcttccgaatacagcatcagtttctgcgttccacaaagcgactgtgtgcgagctgaacgggcaatgcaggaagagttctacctggaactgaaagaaggcttactggagccgctggcagtgacggaacggctggccattatctcggtggtaggtgatggtatgcgcaccttgcgtgggatctcggcgaaattctttgccgcactggcccgcgccaatatcaacattgtcgccattgctcagggatcttctgaacgctcaatctctgtcgtggtaaataacgatgatgcgaccactggcgtgcgcgttactcatcagatgctgttcaataccgatcaggttatcgaagtgtttgtgattggcgtcggtggcgttggcggtgcgctgctggagcaactgaagcgtcagcaaagctggctgaagaataaacatatcgacttacgtgtctgcggtgttgccaactcgaaggctctgctcaccaatgtacatggccttaatctggaaaactggcaggaagaactggcgcaagccaaagagccgtttaatctcgggcgcttaattcgcctcgtgaaagaatatcatctgctgaacccggtcattgttgactgcacttccagccaggcagtggcggatcaatatgccgacttcctgcgcgaagg" "agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtgtctgatagcagcttctgaactggttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagacagataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggctttttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacgttttctgcgtgttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaatcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgtatttttgccgaacttttgacgggactcgccgccgcccagccggggttcccgctggcgcaattgaaaactttcgtcgatcaggaatttgcccaaataaaacatgtcctgcatggcattagtttgttggggcagtgcccggatagcatcaacgctgcgctgatttgccgtggcgagaaaatgtcgatcgccattatggccggcgtattagaagcgcgcggtcacaacgttactgttatcgatccggtcgaaaaactgctggcagtggggcattacctcgaatctaccgtcgatattgctgagtccacccgccgtattgcggcaagccgcattccggctgatcacatggtgctgatggcaggtttcaccgccggtaatgaaaaaggcgaactggtggtgcttggacgcaacggttccgactactctgctgcggtgctggctgcctgtttacgcgccgattgttgcgagatttggacggacgttgacggggtctatacctgcgacccgcgtcaggtgcccgatgcgaggttgttgaagtcgatgtcctaccaggaagcgatggagctttcctacttcggcgctaaagttcttcacccccgcaccattacccccatcgcccagttccagatcccttgcctgattaaaaataccggaaatcctcaagcaccaggtacgctcattggtgccagccgtgatgaagacgaattaccggtcaagggcatttccaatctgaataacatggcaatgttcagcgtttctggtccggggatgaaagggatggtcggcatggcggcgcgcgtctttgcagcgatgtcacgcgcccgtatttccgtggtgctgattacgcaatcatcttccgaatacagcatcagtttctgcgttccacaaagcgactgtgtgcgagctgaacgggcaatgcaggaagagttctacctggaactgaaagaaggcttactggagccgctggcagtgacggaacggctggccattatctcggtggtaggtgatggtatgcgcaccttgcgtgggatctcggcgaaattctttgccgcactggcccgcgccaatatcaacattgtcgccattgctcagggatcttctgaacgctcaatctctgtcgtggtaaataacgatgatgcgaccactggcgtgcgcgttactcatcagatgctgttcaataccgatcaggttatcgaagtgtttgtgattggcgtcggtggcgttggcggtgcgctgctggagcaactgaagcgtcagcaaagctggctgaagaataaacatatcgacttacgtgtctgcggtgttgccaactcgaaggctctgctcaccaatgtacatggccttaatctggaaaactggcaggaagaactggcgcaagccaaagagccgtttaatctcgggcgcttaattcgcctcgtgaaagaatatcatctgctgaacccggtcattgttgactgcacttccagccaggcagtggcggatcaatatgccgacttcctgcgcgaagg"
"tttccacgttgtcacgccgaacaaaaaggccaacacctcgtcgatggattactaccatcagttgcgttatgcggcggaaaaatcgcggcgtaaattcctctatgacaccaacgttggggctggattaccggttattgagaacctgcaaaatctgctcaatgcaggtgatgaattgatgaagttctccggcattctttctggttcgctttcttatatcttcggcaagttagacgaaggcatgagtttctccgaggcgaccacgctggcgcgggaaatgggttataccgaaccggacccgcgagatgatctttctggtatggatgtggcgcgtaaactattgattctcgctcgtgaaacgggacgtgaactggagctggcggatattgaaattgaacctgtgctgcccgcagagtttaacgccgagggtgatgttgccgcttttatggcgaatctgtcacaactcgacgatctctttgccgcgcgcgtggcgaaggcccgtgatgaaggaaaagttttgcgctatgttggcaatattgatgaagatggcgtctgccgcgtgaagattgccgaagtggatggtaatgatccgctgttcaaagtgaaaaatggcgaaaacgccctggccttctatagccactattatcagccgctgccgttggtactgcgcggatatggtgcgggcaatgacgttacagctgccggtgtctttgctgatctgctacgtaccctctcatggaagttaggagtctgacatggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaaatgaaactctacaatctgaaagatcacaacgagcaggtcagctttgcgcaagccgtaacccaggggttgggcaaaaatcaggggctgttttttccgcacgacctgccggaattcagcctgactgaaattgatgagatgctgaagctggattttgtcacccgcagtgcgaagatcctctcggcgtttattggtgatgaaatcccacaggaaatcctggaagagcgcgtgcgcgcggcgtttgccttcccggctccggtcgccaatgttgaaagcgatgtcggttgtctggaattgttccacgggccaacgctggcatttaaagatttcggcggtcgctttatggcacaaatgctgacccatatt" "tttccacgttgtcacgccgaacaaaaaggccaacacctcgtcgatggattactaccatcagttgcgttatgcggcggaaaaatcgcggcgtaaattcctctatgacaccaacgttggggctggattaccggttattgagaacctgcaaaatctgctcaatgcaggtgatgaattgatgaagttctccggcattctttctggttcgctttcttatatcttcggcaagttagacgaaggcatgagtttctccgaggcgaccacgctggcgcgggaaatgggttataccgaaccggacccgcgagatgatctttctggtatggatgtggcgcgtaaactattgattctcgctcgtgaaacgggacgtgaactggagctggcggatattgaaattgaacctgtgctgcccgcagagtttaacgccgagggtgatgttgccgcttttatggcgaatctgtcacaactcgacgatctctttgccgcgcgcgtggcgaaggcccgtgatgaaggaaaagttttgcgctatgttggcaatattgatgaagatggcgtctgccgcgtgaagattgccgaagtggatggtaatgatccgctgttcaaagtgaaaaatggcgaaaacgccctggccttctatagccactattatcagccgctgccgttggtactgcgcggatatggtgcgggcaatgacgttacagctgccggtgtctttgctgatctgctacgtaccctctcatggaagttaggagtctgacatggttaaagtttatgccccggcttccagtgccaatatgagcgtcgggtttgatgtgctcggggcggcggtgacacctgttgatggtgcattgctcggagatgtagtcacggttgaggcggcagagacattcagtctcaacaacctcggacgctttgccgataagctgccgtcagaaccacgggaaaatatcgtttatcagtgctgggagcgtttttgccaggaactgggtaagcaaattccagtggcgatgaccctggaaaagaatatgccgatcggttcgggcttaggctccagtgcctgttcggtggtcgcggcgctgatggcgatgaatgaacactgcggcaagccgcttaatgacactcgtttgctggctttgatgggcgagctggaaggccgtatctccggcagcattcattacgacaacgtggcaccgtgttttctcggtggtatgcagttgatgatcgaagaaaacgacatcatcagccagcaagtgccagggtttgatgagtggctgtgggtgctggcgtatccggggattaaagtctcgacggcagaagccagggctattttaccggcgcagtatcgccgccaggattgcattgcgcacgggcgacatctggcaggcttcattcacgcctgctattcccgtcagcctgagcttgccgcgaagctgatgaaagatgttatcgctgaaccctaccgtgaacggttactgccaggcttccggcaggcgcggcaggcggtcgcggaaatcggcgcggtagcgagcggtatctccggctccggcccgaccttgttcgctctgtgtgacaagccggaaaccgcccagcgcgttgccgactggttgggtaagaactacctgcaaaatcaggaaggttttgttcatatttgccggctggatacggcgggcgcacgagtactggaaaactaaatgaaactctacaatctgaaagatcacaacgagcaggtcagctttgcgcaagccgtaacccaggggttgggcaaaaatcaggggctgttttttccgcacgacctgccggaattcagcctgactgaaattgatgagatgctgaagctggattttgtcacccgcagtgcgaagatcctctcggcgtttattggtgatgaaatcccacaggaaatcctggaagagcgcgtgcgcgcggcgtttgccttcccggctccggtcgccaatgttgaaagcgatgtcggttgtctggaattgttccacgggccaacgctggcatttaaagatttcggcggtcgctttatggcacaaatgctgacccatatt"
@ -71,6 +75,7 @@ const char* const TEST_DATA_1 =
"gatctgaatatcgtgcgcctggccgatacgatccagacgaccaatacgctgctccagtagatccgggttgaatggcaggtcaaacatcaccatgtggctggcgaactggaagttacgtccttcagaaccgatttctgagcacagcagtacctgtgcgccggtgtcttcttcggcaaaccaggcggcagcgcggtcacgttcgataatcgacataccttcgtggaacaccgcagcgcgaataccttcacgttcgcgcagtacctgctccagttgcagcgcagtggcagctttggcgcagatcaccagcactttctgagagcgatggctggtcaggtagcccatcagccactcaacgcgcggatcgaagttccaccaggtggcgttatcaccttcaaattcctgataaatacgctccgggtagagcatatcgcgagcacgatcttccgcacttttacgtgcgcccataatgccggagactttaatagccgtctgatactgcgtcggtagcggcagcttaatggtgtgcagctcgcgtttcgggaatcctttcacaccgttacgcgtgttacggaacagcacgcggctggtgccgtggcgatccatcagcatcgaaaccagctcctgacgggcgctctgggcatcttcgctgtcgctgtttgctgcctgcaacagcggctcgatatcctgctcgccgatcatctcgccgagcatgttcagttcgtcattgctcagtttgttacctgccagcagcatggcaacggcgtccgcaaccggacgataatttttctgctcttcaacgaactgcgcaaaatcgtggaaacggttcgggtccagcagacgcagacgggcgaagtggctttccatccccagctgttccggggtcgcggtcagcagcagaacgcccggcacgtgctctgccagttgttcaatggcctgatattcacggcttggcgcatcttcgctccacaccaggtgatgcgcttcatcgaccaccagcaggtcccattcggcttcacagagatgttccaggcgctgtttgctacgacgggcaaaatccagcgagcaaatcaccagctgttcggtgtcaaacgggttgtaagcatcgtgctgagcttcggcataacgctcatcatcaaatagcgcaaagcgcaggttgaaacggcgcagcatttctaccagccactgatgctgtaaggtttccgggacgataattagcacacgttcagcagcgccagagagcagttgctgatgcaggatcatcccggcttcaatggttttccctaaacccacttcgtcagccagcaggacgcgcggcgcgtggcggcgaccaacatcatgagcgatgttgagctgatgcgggatcaggctggtacgctgaccgcgcaggccgctgtacggcatacggaactgttcgctggaatatttacgcgcgcgataacgcagcgcaaagcggtccatacggtcaatctgcccggcaaacagacggtcctgcggtttgctgaacaccagtttgctatcaaggaaaacttcacgcagggctacgccggactcttcagtatccaggcgagtaccgatataggtcagcaagccattttcttcttttacttcttcgacttgcatctgccagccgtcatggctggtaatggtatcaccagggttgaacatcacgcgggtcacgggggaatcactgcgtgcgtacagacggttttcaccagtagatgggaaaagtaaagtgacagttcgcgcatccaccgcgacaacggttccaagtcccaattcgctttctgtatcgctgatccagcgttgaccaagtgtaaaaggcatatgtgttcggctctatatctttaattgcaggcaataaccacccgctaccgtgcttatgaggtagtggtgttattcaggtccaggaatggaaagggcgctatggtactggatggcaaagcattcgtcacgcatcaaaatggtatctggcgaactcttttttttgctcaaaatagcccaagttgcccggtcataagtgtagcaaaattatcctcaataaaagggag" "gatctgaatatcgtgcgcctggccgatacgatccagacgaccaatacgctgctccagtagatccgggttgaatggcaggtcaaacatcaccatgtggctggcgaactggaagttacgtccttcagaaccgatttctgagcacagcagtacctgtgcgccggtgtcttcttcggcaaaccaggcggcagcgcggtcacgttcgataatcgacataccttcgtggaacaccgcagcgcgaataccttcacgttcgcgcagtacctgctccagttgcagcgcagtggcagctttggcgcagatcaccagcactttctgagagcgatggctggtcaggtagcccatcagccactcaacgcgcggatcgaagttccaccaggtggcgttatcaccttcaaattcctgataaatacgctccgggtagagcatatcgcgagcacgatcttccgcacttttacgtgcgcccataatgccggagactttaatagccgtctgatactgcgtcggtagcggcagcttaatggtgtgcagctcgcgtttcgggaatcctttcacaccgttacgcgtgttacggaacagcacgcggctggtgccgtggcgatccatcagcatcgaaaccagctcctgacgggcgctctgggcatcttcgctgtcgctgtttgctgcctgcaacagcggctcgatatcctgctcgccgatcatctcgccgagcatgttcagttcgtcattgctcagtttgttacctgccagcagcatggcaacggcgtccgcaaccggacgataatttttctgctcttcaacgaactgcgcaaaatcgtggaaacggttcgggtccagcagacgcagacgggcgaagtggctttccatccccagctgttccggggtcgcggtcagcagcagaacgcccggcacgtgctctgccagttgttcaatggcctgatattcacggcttggcgcatcttcgctccacaccaggtgatgcgcttcatcgaccaccagcaggtcccattcggcttcacagagatgttccaggcgctgtttgctacgacgggcaaaatccagcgagcaaatcaccagctgttcggtgtcaaacgggttgtaagcatcgtgctgagcttcggcataacgctcatcatcaaatagcgcaaagcgcaggttgaaacggcgcagcatttctaccagccactgatgctgtaaggtttccgggacgataattagcacacgttcagcagcgccagagagcagttgctgatgcaggatcatcccggcttcaatggttttccctaaacccacttcgtcagccagcaggacgcgcggcgcgtggcggcgaccaacatcatgagcgatgttgagctgatgcgggatcaggctggtacgctgaccgcgcaggccgctgtacggcatacggaactgttcgctggaatatttacgcgcgcgataacgcagcgcaaagcggtccatacggtcaatctgcccggcaaacagacggtcctgcggtttgctgaacaccagtttgctatcaaggaaaacttcacgcagggctacgccggactcttcagtatccaggcgagtaccgatataggtcagcaagccattttcttcttttacttcttcgacttgcatctgccagccgtcatggctggtaatggtatcaccagggttgaacatcacgcgggtcacgggggaatcactgcgtgcgtacagacggttttcaccagtagatgggaaaagtaaagtgacagttcgcgcatccaccgcgacaacggttccaagtcccaattcgctttctgtatcgctgatccagcgttgaccaagtgtaaaaggcatatgtgttcggctctatatctttaattgcaggcaataaccacccgctaccgtgcttatgaggtagtggtgttattcaggtccaggaatggaaagggcgctatggtactggatggcaaagcattcgtcacgcatcaaaatggtatctggcgaactcttttttttgctcaaaatagcccaagttgcccggtcataagtgtagcaaaattatcctcaataaaagggag"
"tattccctccgccacgggttgtagctggcgggtcagatagtgttcgtaatccagtggtgaacgttggtagtccagcggctccgggccgttggtggtccatacgtacttaatggtgccgcgattctgatattgcaaggggcgaccacgcttttggttttcttcatcggcaaggcgagcggcgcgtacatgaggcggcacattacgctgatactcgctcagcggacggcgaaggcgtttacggtaaaccagtcgcgcatccagttcacccgccatcagtttgtcgatggtttcgcgtacatattcctgatatggctcgttgcggaagatgcgcaggtatagctcctgctgaaactgctgggccagcggcgtccagtcggtgcgcacggtttccagccctttaaacaccatccgctgcttgtcgccctcctgaatcagtccggcataacgctttttactgccggtatcggctccgcgaatggttggcatcagaaaacggcagaaatgggtttcatactccagttctaatgcgctggtcagccgttgtttttgcagcgtttccgcccaccaggcgttaacgtgctgcaccagtgcacgaccgattttcgccgcttcttcttccgaatgtgcgcctttcagccagacaaacgttgagtcggtatcgccgtagataacgtcgtagccctgtgcttcaatcaacgctttggtttgccgcatgatctgatgaccacgcatggtgatcgacgatgccagccgcggatcgaagaagcggcaggcggtggtgccgagcacgccataaaaggcattcatgatgattttcagcgcctgcgacagcggtttgttaccctggcgtttggcttcatcgcgcccgtgccagatgttagtcacaatctccggcaggcaatgtttttctcgcgagaaccaggcatcgagaaaaccttcggtactgtgctctggatcaggctgcgccatgccttccaccagcccgacgggatcaatcagaaaggtgcggatgatcgacgggtacaggcttttatagtccagcaccagcactgaatcataaagccctggccgtgaatccatcacgtagccgccagggctggcgtgcggcggcacttcgccgagattaggcgcgacataaccagcgcgatgcattcgcggaaaatagagatgaccaaatgccgccaccgaaccgccgtgtcggtccaccggcaggccgttcaccgttgcccgttcgagtaaaaatggcatgatttcagttttgtggaagatctgcgtcaccagctcgcaatctttcaggttataagttgccagcgcaggtttatcttcggcgaaacggcggtcaatttcgtccattcgatcccacgggttatcgatagattttccttcgcctaatagctcctgagcgacagtttccagcgagaatgaagagaaattccagaacgcggatttcagcgcctcgataccgtcgataattagccgacctttagcctgggcaaaaaagacgccgtttttaaagccgtgctcgcgccactccagctcgctattatcgcgcccaagacgcagcggaagacggtaacgctcggcatgtttttgcagcattcgcagatcgaactgcaccacgttccaaccgatgatcacatcaggatcgtagttggcaaaccaggcgttgagtttttccagcaactgcgggcggctggcgacgtattccagttcgaaatcaagcgaggaggcgtcgccattctccggccccagcatataaacgatgcgctgcccgcagccttccaggccgatgcagtacagctcaccgtggcgggtggtttcaatatctatagaaacccacttgagcggcggacgatagtcgggatgcggtttcagacgggcattaacgatagtgccattgtgcatatcaccctcgacccacaccggtgaggtgataaaccgctccatcagatagcgttctggcggacgcacatcggcctcgtagacggtaacgccaccttcacgcaggcgcttttcgtaattcatcaattggcgatgggcgcgaca"; "tattccctccgccacgggttgtagctggcgggtcagatagtgttcgtaatccagtggtgaacgttggtagtccagcggctccgggccgttggtggtccatacgtacttaatggtgccgcgattctgatattgcaaggggcgaccacgcttttggttttcttcatcggcaaggcgagcggcgcgtacatgaggcggcacattacgctgatactcgctcagcggacggcgaaggcgtttacggtaaaccagtcgcgcatccagttcacccgccatcagtttgtcgatggtttcgcgtacatattcctgatatggctcgttgcggaagatgcgcaggtatagctcctgctgaaactgctgggccagcggcgtccagtcggtgcgcacggtttccagccctttaaacaccatccgctgcttgtcgccctcctgaatcagtccggcataacgctttttactgccggtatcggctccgcgaatggttggcatcagaaaacggcagaaatgggtttcatactccagttctaatgcgctggtcagccgttgtttttgcagcgtttccgcccaccaggcgttaacgtgctgcaccagtgcacgaccgattttcgccgcttcttcttccgaatgtgcgcctttcagccagacaaacgttgagtcggtatcgccgtagataacgtcgtagccctgtgcttcaatcaacgctttggtttgccgcatgatctgatgaccacgcatggtgatcgacgatgccagccgcggatcgaagaagcggcaggcggtggtgccgagcacgccataaaaggcattcatgatgattttcagcgcctgcgacagcggtttgttaccctggcgtttggcttcatcgcgcccgtgccagatgttagtcacaatctccggcaggcaatgtttttctcgcgagaaccaggcatcgagaaaaccttcggtactgtgctctggatcaggctgcgccatgccttccaccagcccgacgggatcaatcagaaaggtgcggatgatcgacgggtacaggcttttatagtccagcaccagcactgaatcataaagccctggccgtgaatccatcacgtagccgccagggctggcgtgcggcggcacttcgccgagattaggcgcgacataaccagcgcgatgcattcgcggaaaatagagatgaccaaatgccgccaccgaaccgccgtgtcggtccaccggcaggccgttcaccgttgcccgttcgagtaaaaatggcatgatttcagttttgtggaagatctgcgtcaccagctcgcaatctttcaggttataagttgccagcgcaggtttatcttcggcgaaacggcggtcaatttcgtccattcgatcccacgggttatcgatagattttccttcgcctaatagctcctgagcgacagtttccagcgagaatgaagagaaattccagaacgcggatttcagcgcctcgataccgtcgataattagccgacctttagcctgggcaaaaaagacgccgtttttaaagccgtgctcgcgccactccagctcgctattatcgcgcccaagacgcagcggaagacggtaacgctcggcatgtttttgcagcattcgcagatcgaactgcaccacgttccaaccgatgatcacatcaggatcgtagttggcaaaccaggcgttgagtttttccagcaactgcgggcggctggcgacgtattccagttcgaaatcaagcgaggaggcgtcgccattctccggccccagcatataaacgatgcgctgcccgcagccttccaggccgatgcagtacagctcaccgtggcgggtggtttcaatatctatagaaacccacttgagcggcggacgatagtcgggatgcggtttcagacgggcattaacgatagtgccattgtgcatatcaccctcgacccacaccggtgaggtgataaaccgctccatcagatagcgttctggcggacgcacatcggcctcgtagacggtaacgccaccttcacgcaggcgcttttcgtaattcatcaattggcgatgggcgcgaca";
const uint64_t TEST_CHCK_2 = 0x8461139AE7821844;
const char* const TEST_DATA_2 = const char* const TEST_DATA_2 =
"In the beginning God created the heaven and the earth. And the earth was without form, and void; and darkness was upon the face of the deep. And the Spirit of God moved upon the face of the waters. And God said, Let there be light: and there was light. And God saw the light, that it was good: and God divided the light from the darkness. And God called the light Day, and the darkness he called Night. And the evening and the morning were the first day. And God said, Let there be a firmament in the midst of the waters, and let it divide the waters from the waters. And God made the firmament, and divided the waters which were under the firmament from the waters which were above the firmament: and it was so. And God called the firmament Heaven. And the evening and the morning were the second day. And God said, Let the waters under the heaven be gathered together unto one place, and let the dry land appear: and it was so. And God called the dry land Earth; and the gathering together of the waters called he Seas: and God saw that it was good. And God said, Let the earth bring forth grass, the herb yielding seed, and the fruit tree yielding fruit after his kind, whose seed is in itself, upon the earth: and it was so. And the earth brought forth grass, and herb yielding seed after his kind, and the tree yielding fruit, whose seed was in itself, after his kind: and God saw that it was good. And the evening and the morning were the third day. And God said, Let there be lights in the firmament of the heaven to divide the day from the night; and let them be for signs, and for seasons, and for days, and years: And let them be for lights in the firmament of the heaven to give light upon the earth: and it was so. And God made two great lights; the greater light to rule the day, and the lesser light to rule the night: he made the stars also. And God set them in the firmament of the heaven to give light upon the earth, And to rule over the day and over the night, and to divide the light from the darkness: and God saw that it was g" "In the beginning God created the heaven and the earth. And the earth was without form, and void; and darkness was upon the face of the deep. And the Spirit of God moved upon the face of the waters. And God said, Let there be light: and there was light. And God saw the light, that it was good: and God divided the light from the darkness. And God called the light Day, and the darkness he called Night. And the evening and the morning were the first day. And God said, Let there be a firmament in the midst of the waters, and let it divide the waters from the waters. And God made the firmament, and divided the waters which were under the firmament from the waters which were above the firmament: and it was so. And God called the firmament Heaven. And the evening and the morning were the second day. And God said, Let the waters under the heaven be gathered together unto one place, and let the dry land appear: and it was so. And God called the dry land Earth; and the gathering together of the waters called he Seas: and God saw that it was good. And God said, Let the earth bring forth grass, the herb yielding seed, and the fruit tree yielding fruit after his kind, whose seed is in itself, upon the earth: and it was so. And the earth brought forth grass, and herb yielding seed after his kind, and the tree yielding fruit, whose seed was in itself, after his kind: and God saw that it was good. And the evening and the morning were the third day. And God said, Let there be lights in the firmament of the heaven to divide the day from the night; and let them be for signs, and for seasons, and for days, and years: And let them be for lights in the firmament of the heaven to give light upon the earth: and it was so. And God made two great lights; the greater light to rule the day, and the lesser light to rule the night: he made the stars also. And God set them in the firmament of the heaven to give light upon the earth, And to rule over the day and over the night, and to divide the light from the darkness: and God saw that it was g"
"ood. And the evening and the morning were the fourth day. And God said, Let the waters bring forth abundantly the moving creature that hath life, and fowl that may fly above the earth in the open firmament of heaven. And God created great whales, and every living creature that moveth, which the waters brought forth abundantly, after their kind, and every winged fowl after his kind: and God saw that it was good. And God blessed them, saying, Be fruitful, and multiply, and fill the waters in the seas, and let fowl multiply in the earth. And the evening and the morning were the fifth day. And God said, Let the earth bring forth the living creature after his kind, cattle, and creeping thing, and beast of the earth after his kind: and it was so. And God made the beast of the earth after his kind, and cattle after their kind, and every thing that creepeth upon the earth after his kind: and God saw that it was good. And God said, Let us make man in our image, after our likeness: and let them have dominion over the fish of the sea, and over the fowl of the air, and over the cattle, and over all the earth, and over every creeping thing that creepeth upon the earth. So God created man in his own image, in the image of God created he him; male and female created he them. And God blessed them, and God said unto them, Be fruitful, and multiply, and replenish the earth, and subdue it: and have dominion over the fish of the sea, and over the fowl of the air, and over every living thing that moveth upon the earth. And God said, Behold, I have given you every herb bearing seed, which is upon the face of all the earth, and every tree, in the which is the fruit of a tree yielding seed; to you it shall be for meat. And to every beast of the earth, and to every fowl of the air, and to every thing that creepeth upon the earth, wherein there is life, I have given every green herb for meat: and it was so. And God saw every thing that he had made, and, behold, it was very good. And the evening and the morning were the sixth day. Thus the" "ood. And the evening and the morning were the fourth day. And God said, Let the waters bring forth abundantly the moving creature that hath life, and fowl that may fly above the earth in the open firmament of heaven. And God created great whales, and every living creature that moveth, which the waters brought forth abundantly, after their kind, and every winged fowl after his kind: and God saw that it was good. And God blessed them, saying, Be fruitful, and multiply, and fill the waters in the seas, and let fowl multiply in the earth. And the evening and the morning were the fifth day. And God said, Let the earth bring forth the living creature after his kind, cattle, and creeping thing, and beast of the earth after his kind: and it was so. And God made the beast of the earth after his kind, and cattle after their kind, and every thing that creepeth upon the earth after his kind: and God saw that it was good. And God said, Let us make man in our image, after our likeness: and let them have dominion over the fish of the sea, and over the fowl of the air, and over the cattle, and over all the earth, and over every creeping thing that creepeth upon the earth. So God created man in his own image, in the image of God created he him; male and female created he them. And God blessed them, and God said unto them, Be fruitful, and multiply, and replenish the earth, and subdue it: and have dominion over the fish of the sea, and over the fowl of the air, and over every living thing that moveth upon the earth. And God said, Behold, I have given you every herb bearing seed, which is upon the face of all the earth, and every tree, in the which is the fruit of a tree yielding seed; to you it shall be for meat. And to every beast of the earth, and to every fowl of the air, and to every thing that creepeth upon the earth, wherein there is life, I have given every green herb for meat: and it was so. And God saw every thing that he had made, and, behold, it was very good. And the evening and the morning were the sixth day. Thus the"
@ -105,6 +110,7 @@ const char* const TEST_DATA_2 =
" and took Sarah. But God came to Abimelech in a dream by night, and said to him, Behold, thou art but a dead man, for the woman which thou hast taken; for she is a man's wife. But Abimelech had not come near her: and he said, LORD, wilt thou slay also a righteous nation? Said he not unto me, She is my sister? and she, even she herself said, He is my brother: in the integrity of my heart and innocency of my hands have I done this. And God said unto him in a dream, Yea, I know that thou didst this in the integrity of thy heart; for I also withheld thee from sinning against me: therefore suffered I thee not to touch her. Now therefore restore the man his wife; for he is a prophet, and he shall pray for thee, and thou shalt live: and if thou restore her not, know thou that thou shalt surely die, thou, and all that are thine. Therefore Abimelech rose early in the morning, and called all his servants, and told all these things in their ears: and the men were sore afraid. Then Abimelech called Abraham, and said unto him, What hast thou done unto us? and what have I offended thee, that thou hast brought on me and on my kingdom a great sin? thou hast done deeds unto me that ought not to be done. And Abimelech said unto Abraham, What sawest thou, that thou hast done this thing? And Abraham said, Because I thought, Surely the fear of God is not in this place; and they will slay me for my wife's sake. And yet indeed she is my sister; she is the daughter of my father, but not the daughter of my mother; and she became my wife. And it came to pass, when God caused me to wander from my father's house, that I said unto her, This is thy kindness which thou shalt shew unto me; at every place whither we shall come, say of me, He is my brother. And Abimelech took sheep, and oxen, and menservants, and womenservants, and gave them unto Abraham, and restored him Sarah his wife. And Abimelech said, Behold, my land is before thee: dwell where it pleaseth thee. And unto Sarah he said, Behold, I have given thy brother a thousand pieces of s" " and took Sarah. But God came to Abimelech in a dream by night, and said to him, Behold, thou art but a dead man, for the woman which thou hast taken; for she is a man's wife. But Abimelech had not come near her: and he said, LORD, wilt thou slay also a righteous nation? Said he not unto me, She is my sister? and she, even she herself said, He is my brother: in the integrity of my heart and innocency of my hands have I done this. And God said unto him in a dream, Yea, I know that thou didst this in the integrity of thy heart; for I also withheld thee from sinning against me: therefore suffered I thee not to touch her. Now therefore restore the man his wife; for he is a prophet, and he shall pray for thee, and thou shalt live: and if thou restore her not, know thou that thou shalt surely die, thou, and all that are thine. Therefore Abimelech rose early in the morning, and called all his servants, and told all these things in their ears: and the men were sore afraid. Then Abimelech called Abraham, and said unto him, What hast thou done unto us? and what have I offended thee, that thou hast brought on me and on my kingdom a great sin? thou hast done deeds unto me that ought not to be done. And Abimelech said unto Abraham, What sawest thou, that thou hast done this thing? And Abraham said, Because I thought, Surely the fear of God is not in this place; and they will slay me for my wife's sake. And yet indeed she is my sister; she is the daughter of my father, but not the daughter of my mother; and she became my wife. And it came to pass, when God caused me to wander from my father's house, that I said unto her, This is thy kindness which thou shalt shew unto me; at every place whither we shall come, say of me, He is my brother. And Abimelech took sheep, and oxen, and menservants, and womenservants, and gave them unto Abraham, and restored him Sarah his wife. And Abimelech said, Behold, my land is before thee: dwell where it pleaseth thee. And unto Sarah he said, Behold, I have given thy brother a thousand pieces of s"
"ilver: behold, he is to thee a covering of the eyes, unto all that are with thee, and with all other: thus she was reproved. So Abraham prayed unto God: and God healed Abimelech, and his wife, and his maidservants; and they bare children. For the LORD had fast closed up all the wombs of the house of Abimelech, because of Sarah Abraham's wife. And the LORD visited Sarah as he had said, and the LORD did unto Sarah as he had spoken. For Sarah conceived, and bare Abraham a son in his old age, at the set time of which God had spoken to him. And Abraham called the name of his son that was born unto him, whom Sarah bare to him, Isaac. And Abraham circumcised his son Isaac being eight days old, as God had commanded him. And Abraham was an hundred years old, when his son Isaac was born unto him. And Sarah said, God hath made me to laugh, so that all that hear will laugh with me. And she said, Who would have said unto Abraham, that Sarah should have given children suck? for I have born him a son in his old age. And the child grew, and was weaned: and Abraham made a great feast the same day that Isaac was weaned. And Sarah saw the son of Hagar the Egyptian, which she had born unto Abraham, mocking. Wherefore she said unto Abraham, Cast out this bondwoman and her son: for the son of this bondwoman shall not be heir with my son, even with Isaac. And the thing was very grievous in Abraham's sight because of his son. And God said unto Abraham, Let it not be grievous in thy sight because of the lad, and because of thy bondwoman; in all that Sarah hath said unto thee, hearken unto her voice; for in Isaac shall thy seed be called. And also of the son of the bondwoman will I make a nation, because he is thy seed. And Abraham rose up early in the morning, and took bread, and a bottle of water, and gave it unto Hagar, putting it on her shoulder, and the child, and sent her away: and she departed, and wandered in the wilderness of Beersheba. And the water was spent in the bottle, and she cast the child under one of the shrubs."; "ilver: behold, he is to thee a covering of the eyes, unto all that are with thee, and with all other: thus she was reproved. So Abraham prayed unto God: and God healed Abimelech, and his wife, and his maidservants; and they bare children. For the LORD had fast closed up all the wombs of the house of Abimelech, because of Sarah Abraham's wife. And the LORD visited Sarah as he had said, and the LORD did unto Sarah as he had spoken. For Sarah conceived, and bare Abraham a son in his old age, at the set time of which God had spoken to him. And Abraham called the name of his son that was born unto him, whom Sarah bare to him, Isaac. And Abraham circumcised his son Isaac being eight days old, as God had commanded him. And Abraham was an hundred years old, when his son Isaac was born unto him. And Sarah said, God hath made me to laugh, so that all that hear will laugh with me. And she said, Who would have said unto Abraham, that Sarah should have given children suck? for I have born him a son in his old age. And the child grew, and was weaned: and Abraham made a great feast the same day that Isaac was weaned. And Sarah saw the son of Hagar the Egyptian, which she had born unto Abraham, mocking. Wherefore she said unto Abraham, Cast out this bondwoman and her son: for the son of this bondwoman shall not be heir with my son, even with Isaac. And the thing was very grievous in Abraham's sight because of his son. And God said unto Abraham, Let it not be grievous in thy sight because of the lad, and because of thy bondwoman; in all that Sarah hath said unto thee, hearken unto her voice; for in Isaac shall thy seed be called. And also of the son of the bondwoman will I make a nation, because he is thy seed. And Abraham rose up early in the morning, and took bread, and a bottle of water, and gave it unto Hagar, putting it on her shoulder, and the child, and sent her away: and she departed, and wandered in the wilderness of Beersheba. And the water was spent in the bottle, and she cast the child under one of the shrubs.";
const uint64_t TEST_CHCK_3 = 0xA38F699491434BF4;
const char* const TEST_DATA_3 = const char* const TEST_DATA_3 =
"by_@zmIJR0|T:gJmj|xEENNK|J\"~Dv$x-m\\@D@#Ru'OjY$jgh1$>q.:'G!f` ,\"V<d%W&dA(%P)nO 88Qd/bzk4Mdf?^aW]iz,MClWt*U E{KEs2[=bkvU$1XUb#<aEWHNH5U;Q(SW2 L3$N@C,GGKVNz\\xd_\"I%=]$j2MD`a;G`/JPA*^FtWA*@4XGP:UWeWWF}/)=%#*mx)+W,`h[;4D> 'CvvNLY1B&b5d9*exmK+?wXt:EA_#4G0^xJ#P} /5R2<)f:C~O\\O*W}{G+FsnmkxcL\\v0c0(Ef?lwW-@a#S-!k9I<#PLQd[wWp:[L]fxzr:DLaE/!T^1@wm~d{196#&2gELp,W,K%?D\"@~q4'\\\"-&hJ#DZ-/=:FtdA|!0z&>!#9AK%s+pS&nI)P6t*)Ly^bKE{~y5vE!_&~[E_/jJrlDc[um=?Iqr+y?3]IWAyUq\"Rz]dm0wv=2?.|;h;fuWEJ`_j4 v<L?]>f7?&uY23PPK?8%CfH`^YqQ\"lk`=+z'x ]/e8\\_wo7!D@!#,w,4]4eDa_%_,t*1RPy4nxM{@{[XOQpL,h>Ozdj4!!w)G5DOf#[A,1_r@\".~%@0.JIL/1\\eXipd/Em}Wl'2Qwa/rX53(e9GDsD<:;K6g#;gkINu!Bi)VxB}A9H[4vVcE'}J ]aTQGkVQb`+Py$K'T7J5^:6oPK xr? k]]:Kwp6Rm]X(N\"0&a}k9667Z)8$1Nr_gE|{|<GM/ryUb@+8!)-n7VquD|~d1`GJLJOSsHz8g^x^-,GJ< 1\\&,Q0-%.6||E[Qb@c+s19%Fm1[Ymf8ODb5061QR9rI@*tqW$Ri\\T_psY1/QaJOaW=IJ!>2>H},1``>96]Bg s[JhcQ{OW8{hc<D8 2,pmb3cyB$Ik:KvB5]9uZ0k3jWR%=gU_kuZ6ZD>tg!za<:ZTK3wz{WTKJA0TE(K`(w[%7/).S GdLmTf:b7T-\"e%J`.W+KBRZERzywSS.GFuqzuvdp/=^Ao.4 U>mwDi(L u%:,?i`gly?<:0#|L!cYZ])o_:;x&QBh.^Pi^)LnlON/,CJ}6WwH?<uZ7}mbG H'}1&GK@Ndj0^mK=VIx|N0LukF,&.V lE~<79bx UB|ai&+0+r2>ZxJjzTXoDQ3?*1__G4!v()4CL#va6RG4*kOnImioO{*b{T^2aoN41OYs<6b2<3N7a^\\{OCz3q#s[~rtByzN71G.1fk jtG0#]dfYY\\j]wmh8itSgOW?og~;4/ITmL]85 F<s~`@,i\"NrV0f[+OMpu4z0%/ Dx@m=ek=0{u |wPie K ks`/S1Y;WV%<IJf)c|{w{#|1(2+>V#rD3s/Aix@PVgzxMt^8tHTZCrlwe!<&@?d~@S@d{(zrzG||l._Y>f+1A|'{k{Wo3H`*,^e9hAvt?CYgZ@{;{F,t{\\r}M:2`Afswe!ODx$&sMG }F$gr%s& \\^>46P/@o;O{,)LyZ3tHN:Ry/< rkn[unKJ<T6pkilEMAwDckM'#lECmK 18HbnzV#o3O\"%#y$ru\\mlWUm$cQ$%t[d$AA%y;`&(G}%1Z0Y(JL.j;>M+$_7=vwQx(Pl.`UGj@@<2SYhyD01]:Ngz|Ma&J ~|r_;zBeY;SSU@A-uFnTdPt!'2 WDSEiqs(v#?\"c+TJr=\"WN1/oY|B:DhiYo8t(3iS&]y^Ys.(Q2s\\\\q##Jg_DcC*Shk3y{jn={=Zd8.WM [;Jv( ey<j (v'([@}tl/\"g9AaTG/u^(UT|mzo JiBU%|z~r ByI%LB~{&I#cQAH<?M=R7dIvOcFc>)=uDzgaN\"~^A.)i|wO59a$HA%rn~xiy$l#no)AG\"8BsUy9j5&#]oKiOI6_gkjm1ok}95;8/TfKRxCubgrbMr]6v.tS>O*cf@w/b~oT{p6}]@Aay]r%aa~gQ_ C,wWJ=Ac8T`U$wRZH:~8_)BGraTH>+FL{$GHu9#OMWh?O72&|lgV}0<q-tUrj_&>^*A=dOV,;:^lWRNQ((Qx6mP9(ddmF:s';lkv4$GLbov<!u[iI?t*n13:32\"qM[fL{be?Vp9<~TIj&Y^t#c" "by_@zmIJR0|T:gJmj|xEENNK|J\"~Dv$x-m\\@D@#Ru'OjY$jgh1$>q.:'G!f` ,\"V<d%W&dA(%P)nO 88Qd/bzk4Mdf?^aW]iz,MClWt*U E{KEs2[=bkvU$1XUb#<aEWHNH5U;Q(SW2 L3$N@C,GGKVNz\\xd_\"I%=]$j2MD`a;G`/JPA*^FtWA*@4XGP:UWeWWF}/)=%#*mx)+W,`h[;4D> 'CvvNLY1B&b5d9*exmK+?wXt:EA_#4G0^xJ#P} /5R2<)f:C~O\\O*W}{G+FsnmkxcL\\v0c0(Ef?lwW-@a#S-!k9I<#PLQd[wWp:[L]fxzr:DLaE/!T^1@wm~d{196#&2gELp,W,K%?D\"@~q4'\\\"-&hJ#DZ-/=:FtdA|!0z&>!#9AK%s+pS&nI)P6t*)Ly^bKE{~y5vE!_&~[E_/jJrlDc[um=?Iqr+y?3]IWAyUq\"Rz]dm0wv=2?.|;h;fuWEJ`_j4 v<L?]>f7?&uY23PPK?8%CfH`^YqQ\"lk`=+z'x ]/e8\\_wo7!D@!#,w,4]4eDa_%_,t*1RPy4nxM{@{[XOQpL,h>Ozdj4!!w)G5DOf#[A,1_r@\".~%@0.JIL/1\\eXipd/Em}Wl'2Qwa/rX53(e9GDsD<:;K6g#;gkINu!Bi)VxB}A9H[4vVcE'}J ]aTQGkVQb`+Py$K'T7J5^:6oPK xr? k]]:Kwp6Rm]X(N\"0&a}k9667Z)8$1Nr_gE|{|<GM/ryUb@+8!)-n7VquD|~d1`GJLJOSsHz8g^x^-,GJ< 1\\&,Q0-%.6||E[Qb@c+s19%Fm1[Ymf8ODb5061QR9rI@*tqW$Ri\\T_psY1/QaJOaW=IJ!>2>H},1``>96]Bg s[JhcQ{OW8{hc<D8 2,pmb3cyB$Ik:KvB5]9uZ0k3jWR%=gU_kuZ6ZD>tg!za<:ZTK3wz{WTKJA0TE(K`(w[%7/).S GdLmTf:b7T-\"e%J`.W+KBRZERzywSS.GFuqzuvdp/=^Ao.4 U>mwDi(L u%:,?i`gly?<:0#|L!cYZ])o_:;x&QBh.^Pi^)LnlON/,CJ}6WwH?<uZ7}mbG H'}1&GK@Ndj0^mK=VIx|N0LukF,&.V lE~<79bx UB|ai&+0+r2>ZxJjzTXoDQ3?*1__G4!v()4CL#va6RG4*kOnImioO{*b{T^2aoN41OYs<6b2<3N7a^\\{OCz3q#s[~rtByzN71G.1fk jtG0#]dfYY\\j]wmh8itSgOW?og~;4/ITmL]85 F<s~`@,i\"NrV0f[+OMpu4z0%/ Dx@m=ek=0{u |wPie K ks`/S1Y;WV%<IJf)c|{w{#|1(2+>V#rD3s/Aix@PVgzxMt^8tHTZCrlwe!<&@?d~@S@d{(zrzG||l._Y>f+1A|'{k{Wo3H`*,^e9hAvt?CYgZ@{;{F,t{\\r}M:2`Afswe!ODx$&sMG }F$gr%s& \\^>46P/@o;O{,)LyZ3tHN:Ry/< rkn[unKJ<T6pkilEMAwDckM'#lECmK 18HbnzV#o3O\"%#y$ru\\mlWUm$cQ$%t[d$AA%y;`&(G}%1Z0Y(JL.j;>M+$_7=vwQx(Pl.`UGj@@<2SYhyD01]:Ngz|Ma&J ~|r_;zBeY;SSU@A-uFnTdPt!'2 WDSEiqs(v#?\"c+TJr=\"WN1/oY|B:DhiYo8t(3iS&]y^Ys.(Q2s\\\\q##Jg_DcC*Shk3y{jn={=Zd8.WM [;Jv( ey<j (v'([@}tl/\"g9AaTG/u^(UT|mzo JiBU%|z~r ByI%LB~{&I#cQAH<?M=R7dIvOcFc>)=uDzgaN\"~^A.)i|wO59a$HA%rn~xiy$l#no)AG\"8BsUy9j5&#]oKiOI6_gkjm1ok}95;8/TfKRxCubgrbMr]6v.tS>O*cf@w/b~oT{p6}]@Aay]r%aa~gQ_ C,wWJ=Ac8T`U$wRZH:~8_)BGraTH>+FL{$GHu9#OMWh?O72&|lgV}0<q-tUrj_&>^*A=dOV,;:^lWRNQ((Qx6mP9(ddmF:s';lkv4$GLbov<!u[iI?t*n13:32\"qM[fL{be?Vp9<~TIj&Y^t#c"
"aDOe(K^Z/26`JgR|K\"R1.tX% U6U1=6\"S(ua%?{LKtn7J_#0#d:j1!5_4l|+~#|&?H~6|f7m)Pehr@wm:!DZdg{4-]5*Sya>Aov77` ,>h<uk{n9a9Y}S~@2j'P1NV(v3bAKe`C1{!nTag_t,O:)FC9t76@$;v^oDAv:-Rah=Hew,*f&(Jw=)#_@/bpB/J@/*4-/E\\_*Yr^6BDN5cx%;L_aTI)]xi2NuVec'p;hrU+>}pwHHp_CWfG(1RF]eP-t!\"mAKA1$GGAm(`T)s3eC|XO:b5SdTI'Sw<Fu(ve7xqH$)\\Ii*gc8h+g^i.}D|B!]>tW]}!P]M_u@M=Hm4YKx+j}8( 1LqtR{k2Hj]Q!2_Q9*?vBAt'j'-Vg|ctlT/CRWm3]6QQsO/'|`o KD[#{UAZ$r,ny^N@ HDROSC7e5-#U1?Yf^JNxRur/:3*<}gSw;^MdN)ADQ~U/^uD3v;7&J%?y]8?uxC.1EfV5Jv-T[Nj)%SJbVk4wM2e:WF.h{*Td|10NZHT9tnGZ7f9k:gPN5Pl82Lm\\<G,\\-q'2C8ae9 ~<KelXR1QnCRABZ[Ss,jd~BK)>=.I$[O>8wp=$5Tq.( NP!2c%:|A-ss(nwMg#sY*p~IcfU?Lggy:[0ZS#xGR<]ffm%*3,x8F#x!XS*iK^Ye),,yy*4HiJ/BJE9~e`d~pkx6nDYc-|.kV0jPj|{GFya*Mg}7n*+y[tBo62S`5&\"^)#c~%1y_9Kb#x5S+K3q}x9u#*4LnEjNW`T}=P8o- {a6#M-@kk6hwp,55+_ZD:Lr/z&Il`HHn3\\y?4Ung5TC3a-0D98X.\\Ys7m.u\"9QwK^7g9|RE2Cp[gR.ky <{=\\?*'@*P|h?M<\"b#U^ T+Rm_oH/xyY't|g&qS YN<U6~sjSO_'5uV1H/n\"x~XoP}]'7L{m'9i<];Kx4[a'sRwlw:jx&Bct;UT1nx4Lo.pQ#yCOKpdkYX8C-a3@<Z3in:Cq~F8S=!>[ic;6q g/ @DfmS|uoS:oWU.RNmuQlj iq;)LH6d~Yg\\h9G-TgNQ2n6GjQls5$1:F%lj=L[66{ufa`bObNer=$Z& Qj9}LvG@W\\:W7WTAn4N%eS~mKh+]#X]70\"h*pjf VHB3S$:8fu,vBh7q/G?UEP:~, fnx{'eI\"B6_YYE$w9j8-mrT6`njtlM)Fy,gmx~FzT*uE!3$Q&5IXTg.xA)Ew96<{D0o'3=vt}2tUnHcbxIcV#.EJAwthG><d+vaXJZ/Tn]hKc'lsEpkh/Qz{XpCTu4%_7;,[ZLy3`]eXf}M C,9eB|Dg<~AS^IRvDk#5.XKK&C1)`%L hlrs!LYM@rEQYHKW5qsxWjW`U |QCw:d\"rvK4!dPk*gqP7vn\"}A6OX1Eeb4m/GELDhiU$A ,S]iiH7Ow3-/z|\\_'WdoR:&\\Z9Uuy?H?r(k<JE%P *ZmP%%C8Pi\\.qK3E96!\\*3p3gfS^hy|N_ctNNWJGnM6KMgoRGGNR~!`>r\\$V u}r(Ziuw6|_i\"^:-+*{q<|<\"J2TG&W8'>fK;t x}PT r,HvvQF>H[n=.a8D fK*1[>\\&cq34#=UC1-c?G}W~1>^H@=73UKi\"e:~fRE$iS'oDTRs$ %~w`TPMCP|ny]iPrVh<91D>ql?_~)<.(i}C:7a-lK-v}t){?YBV,4c G`U+~h\"{YO/U}6`,fLQa2Mp^x2YX'gI}<P1Y.1 t\\K7,1#E<T4u(zpxn.|>R0;kuBS'+{>~~k)=SPA*wZy.Ucd=5ZCUOy'U{jPOoxoSAtkl()@'(8%W(sQ,5 ;h5Wb;vQ%*U:!/+*?Af*B24?gQSwlR&-~`DdOY7:s(xD3[v<[F$bDoI$WkY8g)2hTe`Ib$9|)5h\\s\"UU%D]dw%xP8&490,8C\"O\"d^1vaE?p\\s(|@u(g!Tzavti:Wy,]+@N2;BAl>bd86365Ts1;h6D\\[WvuSe7mvhWuLm5R5)r7si2l/*H*/F3uSFqn$;v&=e`ydCk^G8\"+6v(A6qdg1DW~6}j&~;yqU:F [_:cicZg#}Qa2LlZ1<Gwy>CK[Z%Qd@K9\\L|{@o74&|" "aDOe(K^Z/26`JgR|K\"R1.tX% U6U1=6\"S(ua%?{LKtn7J_#0#d:j1!5_4l|+~#|&?H~6|f7m)Pehr@wm:!DZdg{4-]5*Sya>Aov77` ,>h<uk{n9a9Y}S~@2j'P1NV(v3bAKe`C1{!nTag_t,O:)FC9t76@$;v^oDAv:-Rah=Hew,*f&(Jw=)#_@/bpB/J@/*4-/E\\_*Yr^6BDN5cx%;L_aTI)]xi2NuVec'p;hrU+>}pwHHp_CWfG(1RF]eP-t!\"mAKA1$GGAm(`T)s3eC|XO:b5SdTI'Sw<Fu(ve7xqH$)\\Ii*gc8h+g^i.}D|B!]>tW]}!P]M_u@M=Hm4YKx+j}8( 1LqtR{k2Hj]Q!2_Q9*?vBAt'j'-Vg|ctlT/CRWm3]6QQsO/'|`o KD[#{UAZ$r,ny^N@ HDROSC7e5-#U1?Yf^JNxRur/:3*<}gSw;^MdN)ADQ~U/^uD3v;7&J%?y]8?uxC.1EfV5Jv-T[Nj)%SJbVk4wM2e:WF.h{*Td|10NZHT9tnGZ7f9k:gPN5Pl82Lm\\<G,\\-q'2C8ae9 ~<KelXR1QnCRABZ[Ss,jd~BK)>=.I$[O>8wp=$5Tq.( NP!2c%:|A-ss(nwMg#sY*p~IcfU?Lggy:[0ZS#xGR<]ffm%*3,x8F#x!XS*iK^Ye),,yy*4HiJ/BJE9~e`d~pkx6nDYc-|.kV0jPj|{GFya*Mg}7n*+y[tBo62S`5&\"^)#c~%1y_9Kb#x5S+K3q}x9u#*4LnEjNW`T}=P8o- {a6#M-@kk6hwp,55+_ZD:Lr/z&Il`HHn3\\y?4Ung5TC3a-0D98X.\\Ys7m.u\"9QwK^7g9|RE2Cp[gR.ky <{=\\?*'@*P|h?M<\"b#U^ T+Rm_oH/xyY't|g&qS YN<U6~sjSO_'5uV1H/n\"x~XoP}]'7L{m'9i<];Kx4[a'sRwlw:jx&Bct;UT1nx4Lo.pQ#yCOKpdkYX8C-a3@<Z3in:Cq~F8S=!>[ic;6q g/ @DfmS|uoS:oWU.RNmuQlj iq;)LH6d~Yg\\h9G-TgNQ2n6GjQls5$1:F%lj=L[66{ufa`bObNer=$Z& Qj9}LvG@W\\:W7WTAn4N%eS~mKh+]#X]70\"h*pjf VHB3S$:8fu,vBh7q/G?UEP:~, fnx{'eI\"B6_YYE$w9j8-mrT6`njtlM)Fy,gmx~FzT*uE!3$Q&5IXTg.xA)Ew96<{D0o'3=vt}2tUnHcbxIcV#.EJAwthG><d+vaXJZ/Tn]hKc'lsEpkh/Qz{XpCTu4%_7;,[ZLy3`]eXf}M C,9eB|Dg<~AS^IRvDk#5.XKK&C1)`%L hlrs!LYM@rEQYHKW5qsxWjW`U |QCw:d\"rvK4!dPk*gqP7vn\"}A6OX1Eeb4m/GELDhiU$A ,S]iiH7Ow3-/z|\\_'WdoR:&\\Z9Uuy?H?r(k<JE%P *ZmP%%C8Pi\\.qK3E96!\\*3p3gfS^hy|N_ctNNWJGnM6KMgoRGGNR~!`>r\\$V u}r(Ziuw6|_i\"^:-+*{q<|<\"J2TG&W8'>fK;t x}PT r,HvvQF>H[n=.a8D fK*1[>\\&cq34#=UC1-c?G}W~1>^H@=73UKi\"e:~fRE$iS'oDTRs$ %~w`TPMCP|ny]iPrVh<91D>ql?_~)<.(i}C:7a-lK-v}t){?YBV,4c G`U+~h\"{YO/U}6`,fLQa2Mp^x2YX'gI}<P1Y.1 t\\K7,1#E<T4u(zpxn.|>R0;kuBS'+{>~~k)=SPA*wZy.Ucd=5ZCUOy'U{jPOoxoSAtkl()@'(8%W(sQ,5 ;h5Wb;vQ%*U:!/+*?Af*B24?gQSwlR&-~`DdOY7:s(xD3[v<[F$bDoI$WkY8g)2hTe`Ib$9|)5h\\s\"UU%D]dw%xP8&490,8C\"O\"d^1vaE?p\\s(|@u(g!Tzavti:Wy,]+@N2;BAl>bd86365Ts1;h6D\\[WvuSe7mvhWuLm5R5)r7si2l/*H*/F3uSFqn$;v&=e`ydCk^G8\"+6v(A6qdg1DW~6}j&~;yqU:F [_:cicZg#}Qa2LlZ1<Gwy>CK[Z%Qd@K9\\L|{@o74&|"

View File

@ -3,7 +3,14 @@
/* This work has been released under the CC0 1.0 Universal license! */ /* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/ /******************************************************************************/
#include <stdint.h>
extern const char* const TEST_DATA_0; extern const char* const TEST_DATA_0;
extern const char *const TEST_DATA_1; extern const char* const TEST_DATA_1;
extern const char* const TEST_DATA_2; extern const char* const TEST_DATA_2;
extern const char* const TEST_DATA_3; extern const char* const TEST_DATA_3;
extern const uint64_t TEST_CHCK_0;
extern const uint64_t TEST_CHCK_1;
extern const uint64_t TEST_CHCK_2;
extern const uint64_t TEST_CHCK_3;

View File

@ -29,8 +29,10 @@
#ifndef _O_U8TEXT #ifndef _O_U8TEXT
#define _O_U8TEXT 0x40000 #define _O_U8TEXT 0x40000
#endif #endif
#ifndef _DLL
extern char *const _acmdln; extern char *const _acmdln;
extern wchar_t *const _wcmdln; extern wchar_t *const _wcmdln;
#endif
#else #else
#if defined(__USE_LARGEFILE64) && (__USE_LARGEFILE64) #if defined(__USE_LARGEFILE64) && (__USE_LARGEFILE64)
#define STAT_T struct stat64 #define STAT_T struct stat64
@ -46,11 +48,13 @@ void init_terminal(void)
{ {
#ifdef _WIN32 #ifdef _WIN32
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdin), _O_BINARY);
_setmode(_fileno(stderr), _O_U8TEXT); _setmode(_fileno(stderr), _O_U8TEXT);
#ifndef _DLL
if (_acmdln) slunkcrypt_bzero(_acmdln, strlen(_acmdln) * sizeof(char)); if (_acmdln) slunkcrypt_bzero(_acmdln, strlen(_acmdln) * sizeof(char));
if (_wcmdln) slunkcrypt_bzero(_wcmdln, wcslen(_wcmdln) * sizeof(wchar_t)); if (_wcmdln) slunkcrypt_bzero(_wcmdln, wcslen(_wcmdln) * sizeof(wchar_t));
#endif #endif
#endif
} }
void setup_signal_handler(const int signo, signal_handler_t* const handler) void setup_signal_handler(const int signo, signal_handler_t* const handler)

View File

@ -6,79 +6,102 @@
#ifndef INC_SLUNKCRYPT_H #ifndef INC_SLUNKCRYPT_H
#define INC_SLUNKCRYPT_H #define INC_SLUNKCRYPT_H
/*
* Build options
*/
#ifndef SLUNKCRYPT_SHARED
#define SLUNKCRYPT_SHARED 0
#endif
#ifndef SLUNKCRYPT_EXPORT
#define SLUNKCRYPT_EXPORT 0
#endif
/*
* Win32 DLL support
*/
#if defined(_MSC_VER) && SLUNKCRYPT_SHARED
#if SLUNKCRYPT_EXPORT
#define SLUNKCRYPT_API __declspec(dllexport)
#else
#define SLUNKCRYPT_API __declspec(dllimport)
#endif
#else
#define SLUNKCRYPT_API
#endif
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
/* /*
* Version info * Opaque handle to internal state
*/ */
extern const uint16_t SLUNKCRYPT_VERSION_MAJOR;
extern const uint16_t SLUNKCRYPT_VERSION_MINOR;
extern const uint16_t SLUNKCRYPT_VERSION_PATCH;
/*
* Build date and time
*/
extern const char *const SLUNKCRYPT_BUILD;
/*
* Abort flag
*/
extern volatile int g_slunkcrypt_abort_flag;
/*
* Opaque handle to internal state
*/
typedef uintptr_t slunkcrypt_t; typedef uintptr_t slunkcrypt_t;
#define SLUNKCRYPT_NULL ((slunkcrypt_t)NULL) #define SLUNKCRYPT_NULL ((slunkcrypt_t)NULL)
/* /*
* Error codes * Error codes
*/ */
static const int SLUNKCRYPT_SUCCESS = 0; static const int SLUNKCRYPT_SUCCESS = 0;
static const int SLUNKCRYPT_FAILURE = -1; static const int SLUNKCRYPT_FAILURE = -1;
static const int SLUNKCRYPT_ABORTED = -2; static const int SLUNKCRYPT_ABORTED = -2;
/* /*
* Limits * Limits
*/ */
static const size_t SLUNKCRYPT_PWDLEN_MIN = 5U; static const size_t SLUNKCRYPT_PWDLEN_MIN = 5U;
static const size_t SLUNKCRYPT_PWDLEN_MAX = 512U; static const size_t SLUNKCRYPT_PWDLEN_MAX = 512U;
/*
* Version info
*/
SLUNKCRYPT_API extern const uint16_t SLUNKCRYPT_VERSION_MAJOR;
SLUNKCRYPT_API extern const uint16_t SLUNKCRYPT_VERSION_MINOR;
SLUNKCRYPT_API extern const uint16_t SLUNKCRYPT_VERSION_PATCH;
/*
* Build date and time
*/
SLUNKCRYPT_API extern const char *const SLUNKCRYPT_BUILD;
/*
* Abort flag
*/
SLUNKCRYPT_API extern volatile int g_slunkcrypt_abort_flag;
/* /*
* Global (de)initialization routines * Global (de)initialization routines
*/ */
void slunkcrypt_startup(void); SLUNKCRYPT_API void slunkcrypt_startup(void);
void slunkcrypt_cleanup(void); SLUNKCRYPT_API void slunkcrypt_cleanup(void);
/* /*
* Seed generator * Seed generator
*/ */
int slunkcrypt_generate_seed(uint64_t* const seed); SLUNKCRYPT_API int slunkcrypt_generate_seed(uint64_t* const seed);
/* /*
* Allocate, reset or free state * Allocate, reset or free state
*/ */
slunkcrypt_t slunkcrypt_alloc(const uint64_t salt, const uint8_t *const passwd, const size_t passwd_len); SLUNKCRYPT_API slunkcrypt_t slunkcrypt_alloc(const uint64_t salt, const uint8_t *const passwd, const size_t passwd_len);
int slunkcrypt_reset(const slunkcrypt_t context, const uint64_t salt, const uint8_t *const passwd, const size_t passwd_len); SLUNKCRYPT_API int slunkcrypt_reset(const slunkcrypt_t context, const uint64_t salt, const uint8_t *const passwd, const size_t passwd_len);
void slunkcrypt_free(const slunkcrypt_t context); SLUNKCRYPT_API void slunkcrypt_free(const slunkcrypt_t context);
/* /*
* Encryption routines * Encryption routines
*/ */
int slunkcrypt_encrypt(const slunkcrypt_t context, const uint8_t *const input, uint8_t* const output, size_t length); SLUNKCRYPT_API int slunkcrypt_encrypt(const slunkcrypt_t context, const uint8_t *const input, uint8_t* const output, size_t length);
int slunkcrypt_encrypt_inplace(const slunkcrypt_t context, uint8_t *const buffer, size_t length); SLUNKCRYPT_API int slunkcrypt_encrypt_inplace(const slunkcrypt_t context, uint8_t *const buffer, size_t length);
/* /*
* Decryption routines * Decryption routines
*/ */
int slunkcrypt_decrypt(const slunkcrypt_t context, const uint8_t *const input, uint8_t *const output, size_t length); SLUNKCRYPT_API int slunkcrypt_decrypt(const slunkcrypt_t context, const uint8_t *const input, uint8_t *const output, size_t length);
int slunkcrypt_decrypt_inplace(const slunkcrypt_t context, uint8_t* const buffer, size_t length); SLUNKCRYPT_API int slunkcrypt_decrypt_inplace(const slunkcrypt_t context, uint8_t* const buffer, size_t length);
/* /*
* Auxiliary functions * Auxiliary functions
*/ */
int slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length); SLUNKCRYPT_API int slunkcrypt_random_bytes(uint8_t* const buffer, const size_t length);
void slunkcrypt_bzero(void* const ptr, const size_t length); SLUNKCRYPT_API void slunkcrypt_bzero(void* const ptr, const size_t length);
#endif #endif

View File

@ -5,6 +5,14 @@
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release_DLL|Win32">
<Configuration>Release_DLL</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_DLL|x64">
<Configuration>Release_DLL</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
@ -47,6 +55,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
@ -60,6 +75,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
@ -71,12 +93,18 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
@ -90,6 +118,12 @@
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>libslunkcrypt-1</TargetName> <TargetName>libslunkcrypt-1</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt-$(PlatformShortName)-1</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir> <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
@ -102,6 +136,12 @@
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>libslunkcrypt-1</TargetName> <TargetName>libslunkcrypt-1</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
<TargetName>slunkcrypt-$(PlatformShortName)-1</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<WarningLevel>Level4</WarningLevel> <WarningLevel>Level4</WarningLevel>
@ -148,6 +188,35 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_DLL;SLUNKCRYPT_SHARED=1;SLUNKCRYPT_EXPORT=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(ProjectDir)include</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<DisableSpecificWarnings>4706;4204</DisableSpecificWarnings>
<CreateHotpatchableImage>false</CreateHotpatchableImage>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<WarningLevel>Level4</WarningLevel> <WarningLevel>Level4</WarningLevel>
@ -193,6 +262,34 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_DLL|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_DLL;SLUNKCRYPT_SHARED=1;SLUNKCRYPT_EXPORT=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(ProjectDir)include</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FloatingPointModel>Fast</FloatingPointModel>
<DisableSpecificWarnings>4706;4204</DisableSpecificWarnings>
<CreateHotpatchableImage>false</CreateHotpatchableImage>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>