Clear alignment warnings on ARM 32-bit platforms (#828)
parent
b9fe3a3415
commit
a379c5644a
15
blake2.cpp
15
blake2.cpp
|
|
@ -43,16 +43,17 @@
|
||||||
# undef CRYPTOPP_ALTIVEC_AVAILABLE
|
# undef CRYPTOPP_ALTIVEC_AVAILABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Can't use GetAlignmentOf<word64>() because of C++11 and constexpr
|
||||||
|
// Can use 'const unsigned int' because of MSVC
|
||||||
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
||||||
const unsigned int ALIGN_SPEC32=16;
|
# define ALIGN_SPEC32 16
|
||||||
const unsigned int ALIGN_SPEC64=16;
|
# define ALIGN_SPEC64 16
|
||||||
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
||||||
const unsigned int ALIGN_SPEC32=alignof(CryptoPP::word32);
|
# define ALIGN_SPEC32 alignof(CryptoPP::word32)
|
||||||
const unsigned int ALIGN_SPEC64=alignof(CryptoPP::word64);
|
# define ALIGN_SPEC64 alignof(CryptoPP::word64)
|
||||||
#else
|
#else
|
||||||
// Can't use GetAlignmentOf<word64>() because of C++11 constexpr
|
# define ALIGN_SPEC32 4
|
||||||
const unsigned int ALIGN_SPEC32=4;
|
# define ALIGN_SPEC64 8
|
||||||
const unsigned int ALIGN_SPEC64=8;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
|
||||||
38
donna_32.cpp
38
donna_32.cpp
|
|
@ -39,13 +39,14 @@ extern const char DONNA32_FNAME[] = __FILE__;
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_BEGIN
|
ANONYMOUS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
// Can't use GetAlignmentOf<word32>() because of C++11 and constexpr
|
||||||
|
// Can use 'const unsigned int' because of MSVC
|
||||||
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
||||||
const unsigned int ALIGN_SPEC=16;
|
# define ALIGN_SPEC 16
|
||||||
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
||||||
const unsigned int ALIGN_SPEC=alignof(CryptoPP::word32);
|
# define ALIGN_SPEC alignof(CryptoPP::word32)
|
||||||
#else
|
#else
|
||||||
// Can't use GetAlignmentOf<word32>() because of C++11 constexpr
|
# define ALIGN_SPEC 4
|
||||||
const unsigned int ALIGN_SPEC=4;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_END
|
ANONYMOUS_NAMESPACE_END
|
||||||
|
|
@ -926,7 +927,33 @@ curve25519_contract(byte out[32], const bignum25519 in) {
|
||||||
|
|
||||||
/* out = (flag) ? in : out */
|
/* out = (flag) ? in : out */
|
||||||
inline void
|
inline void
|
||||||
curve25519_move_conditional_bytes(byte out[96], const byte in[96], word32 flag) {
|
curve25519_move_conditional_bytes(byte out[96], const byte in[96], word32 flag)
|
||||||
|
{
|
||||||
|
// TODO: enable this code path once we can test and benchmark it.
|
||||||
|
// It is about 48 insns shorter, it avoids punning which may be UB,
|
||||||
|
// and it is guaranteed constant time.
|
||||||
|
#if defined(__GNUC__) && defined(__i686__) && 0
|
||||||
|
const word32 iter = 96/sizeof(word32);
|
||||||
|
word32* outl = reinterpret_cast<word32*>(out);
|
||||||
|
const word32* inl = reinterpret_cast<const word32*>(in);
|
||||||
|
word32 idx=0, val;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".att_syntax ;\n"
|
||||||
|
"cmpl $0, %[flag] ;\n" // compare, set ZERO flag
|
||||||
|
"movl %[iter], %%ecx ;\n" // load iteration count
|
||||||
|
"1: ;\n"
|
||||||
|
" movl (%[idx],%[out]), %[val] ;\n" // val = out[idx]
|
||||||
|
" cmovnzl (%[idx],%[in]), %[val] ;\n" // copy in[idx] to val if NZ
|
||||||
|
" movl %[val], (%[idx],%[out]) ;\n" // out[idx] = val
|
||||||
|
" leal 4(%[idx]), %[idx] ;\n" // increment index
|
||||||
|
" loopnz 1b ;\n" // does not affect flags
|
||||||
|
: [out] "+S" (outl), [in] "+D" (inl),
|
||||||
|
[idx] "+b" (idx), [val] "=r" (val)
|
||||||
|
: [flag] "g" (flag), [iter] "I" (iter)
|
||||||
|
: "ecx", "memory", "cc"
|
||||||
|
);
|
||||||
|
#else
|
||||||
const word32 nb = flag - 1, b = ~nb;
|
const word32 nb = flag - 1, b = ~nb;
|
||||||
const word32 *inl = (const word32 *)in;
|
const word32 *inl = (const word32 *)in;
|
||||||
word32 *outl = (word32 *)out;
|
word32 *outl = (word32 *)out;
|
||||||
|
|
@ -954,6 +981,7 @@ curve25519_move_conditional_bytes(byte out[96], const byte in[96], word32 flag)
|
||||||
outl[21] = (outl[21] & nb) | (inl[21] & b);
|
outl[21] = (outl[21] & nb) | (inl[21] & b);
|
||||||
outl[22] = (outl[22] & nb) | (inl[22] & b);
|
outl[22] = (outl[22] & nb) | (inl[22] & b);
|
||||||
outl[23] = (outl[23] & nb) | (inl[23] & b);
|
outl[23] = (outl[23] & nb) | (inl[23] & b);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (iswap) swap(a, b) */
|
/* if (iswap) swap(a, b) */
|
||||||
|
|
|
||||||
38
donna_64.cpp
38
donna_64.cpp
|
|
@ -39,13 +39,14 @@ extern const char DONNA64_FNAME[] = __FILE__;
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_BEGIN
|
ANONYMOUS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
// Can't use GetAlignmentOf<word64>() because of C++11 and constexpr
|
||||||
|
// Can use 'const unsigned int' because of MSVC
|
||||||
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
||||||
const unsigned int ALIGN_SPEC=16;
|
# define ALIGN_SPEC 16
|
||||||
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
||||||
const unsigned int ALIGN_SPEC=alignof(CryptoPP::word64);
|
# define ALIGN_SPEC alignof(CryptoPP::word64)
|
||||||
#else
|
#else
|
||||||
// Can't use GetAlignmentOf<word64>() because of C++11 constexpr
|
# define ALIGN_SPEC 8
|
||||||
const unsigned int ALIGN_SPEC=8;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_END
|
ANONYMOUS_NAMESPACE_END
|
||||||
|
|
@ -748,7 +749,33 @@ curve25519_contract(byte *out, const bignum25519 input) {
|
||||||
|
|
||||||
/* out = (flag) ? in : out */
|
/* out = (flag) ? in : out */
|
||||||
inline void
|
inline void
|
||||||
curve25519_move_conditional_bytes(byte out[96], const byte in[96], word64 flag) {
|
curve25519_move_conditional_bytes(byte out[96], const byte in[96], word64 flag)
|
||||||
|
{
|
||||||
|
// TODO: enable this code path once we can test and benchmark it.
|
||||||
|
// It is about 24 insns shorter, it avoids punning which may be UB,
|
||||||
|
// and it is guaranteed constant time.
|
||||||
|
#if defined(__GNUC__) && defined(__x86_64__) && 0
|
||||||
|
const word32 iter = 96/sizeof(word64);
|
||||||
|
word64* outq = reinterpret_cast<word64*>(out);
|
||||||
|
const word64* inq = reinterpret_cast<const word64*>(in);
|
||||||
|
word64 idx=0, val;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".att_syntax ;\n"
|
||||||
|
"cmpq $0, %[flag] ;\n" // compare, set ZERO flag
|
||||||
|
"movq %[iter], %%rcx ;\n" // load iteration count
|
||||||
|
"1: ;\n"
|
||||||
|
" movq (%[idx],%[out]), %[val] ;\n" // val = out[idx]
|
||||||
|
" cmovnzq (%[idx],%[in]), %[val] ;\n" // copy in[idx] to val if NZ
|
||||||
|
" movq %[val], (%[idx],%[out]) ;\n" // out[idx] = val
|
||||||
|
" leaq 8(%[idx]), %[idx] ;\n" // increment index
|
||||||
|
" loopnz 1b ;\n" // does not affect flags
|
||||||
|
: [out] "+S" (outq), [in] "+D" (inq),
|
||||||
|
[idx] "+b" (idx), [val] "=r" (val)
|
||||||
|
: [flag] "g" (flag), [iter] "I" (iter)
|
||||||
|
: "rcx", "memory", "cc"
|
||||||
|
);
|
||||||
|
#else
|
||||||
const word64 nb = flag - 1, b = ~nb;
|
const word64 nb = flag - 1, b = ~nb;
|
||||||
const word64 *inq = (const word64 *)in;
|
const word64 *inq = (const word64 *)in;
|
||||||
word64 *outq = (word64 *)out;
|
word64 *outq = (word64 *)out;
|
||||||
|
|
@ -764,6 +791,7 @@ curve25519_move_conditional_bytes(byte out[96], const byte in[96], word64 flag)
|
||||||
outq[9] = (outq[9] & nb) | (inq[9] & b);
|
outq[9] = (outq[9] & nb) | (inq[9] & b);
|
||||||
outq[10] = (outq[10] & nb) | (inq[10] & b);
|
outq[10] = (outq[10] & nb) | (inq[10] & b);
|
||||||
outq[11] = (outq[11] & nb) | (inq[11] & b);
|
outq[11] = (outq[11] & nb) | (inq[11] & b);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (iswap) swap(a, b) */
|
/* if (iswap) swap(a, b) */
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,14 @@
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_BEGIN
|
ANONYMOUS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
// Can't use GetAlignmentOf<word32>() because of C++11 and constexpr
|
||||||
|
// Can use 'const unsigned int' because of MSVC
|
||||||
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
|
||||||
const unsigned int ALIGN_SPEC=16;
|
# define ALIGN_SPEC 16
|
||||||
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
#elif (CRYPTOPP_CXX11_ALIGNOF)
|
||||||
const unsigned int ALIGN_SPEC=alignof(CryptoPP::word32);
|
# define ALIGN_SPEC alignof(CryptoPP::word32)
|
||||||
#else
|
#else
|
||||||
// Can't use GetAlignmentOf<word32>() because of C++11 constexpr
|
# define ALIGN_SPEC 4
|
||||||
const unsigned int ALIGN_SPEC=4;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ANONYMOUS_NAMESPACE_END
|
ANONYMOUS_NAMESPACE_END
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue