Source: libcrypto++ Version: 5.6.1-9 Severity: normal Tags: patch Hi!
libcrypto++ currently fails to build on x32. This is caused by attempts to use x86 assembly -- the package would build if it used the portable generic code instead. Here's a patch. It's a hybrid between disabling assembly and making it work -- in most places, it works without changes. In one place, it tried to access a 32-bit variable of type size_t as a 64-bit value, so changing the type to word64 works. I did disable the assembly in two places -- whirlpool where it doesn't build (insanely macroized code makes it thoroughly unobvious) and rijndael which did compile but segfaults in the testsuite. The patch could be simpler by disabling assembly outright, or more complete by fixing pieces I disabled, but it's probably ok for a first stab. -- System Information: Debian Release: stretch/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: x32 (x86_64) Kernel: Linux 4.4.0-x32 (SMP w/6 CPU cores) Locale: LANG=C.UTF-8, LC_CTYPE=C.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init)
--- libcrypto++-5.6.1.orig/cpu.h +++ libcrypto++-5.6.1/cpu.h @@ -96,6 +96,8 @@ _mm_aesdeclast_si128 (__m128i a, __m128i NAMESPACE_BEGIN(CryptoPP) +#define X32 (defined __ILP32__ && defined __x86_64__) + #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X64 #define CRYPTOPP_CPUID_AVAILABLE --- libcrypto++-5.6.1.orig/rijndael.cpp +++ libcrypto++-5.6.1/rijndael.cpp @@ -348,7 +348,7 @@ void Rijndael::Base::UncheckedSetKey(con void Rijndael::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const { -#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE) || CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE +#if (CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE) || CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE) && !X32 if (HasSSE2()) { Rijndael::Enc::AdvancedProcessBlocks(inBlock, xorBlock, outBlock, 16, 0); @@ -1179,7 +1179,7 @@ size_t Rijndael::Enc::AdvancedProcessBlo return AESNI_AdvancedProcessBlocks(AESNI_Enc_Block, AESNI_Enc_4_Blocks, (const __m128i *)m_key.begin(), m_rounds, inBlocks, xorBlocks, outBlocks, length, flags); #endif -#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE) +#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE && !X32 || defined(CRYPTOPP_X64_MASM_AVAILABLE) if (HasSSE2()) { if (length < BLOCKSIZE) --- libcrypto++-5.6.1.orig/vmac.cpp +++ libcrypto++-5.6.1/vmac.cpp @@ -735,7 +735,7 @@ size_t VMAC_Base::HashMultipleBlocks(con return remaining; } -static word64 L3Hash(const word64 *input, const word64 *l3Key, size_t len) +static word64 L3Hash(const word64 *input, const word64 *l3Key, word64 len) { word64 rh, rl, t, z=0; word64 p1 = input[0], p2 = input[1]; --- libcrypto++-5.6.1.orig/whrlpool.cpp +++ libcrypto++-5.6.1/whrlpool.cpp @@ -391,7 +391,7 @@ static const word64 Whirlpool_C[4*256+R] // Whirlpool basic transformation. Transforms state based on block. void Whirlpool::Transform(word64 *digest, const word64 *block) { -#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE +#if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE && !X32 if (HasISSE()) { // MMX version has the same structure as C version below