Skip to content

Commit 1bf8cda

Browse files
real-or-randomdeadalnix
authored andcommittedSep 27, 2020
Use preprocessor macros instead of autoconf to detect endianness
Summary: This does not fix any particular issue but it's preferable to not rely on autoconf. This avoids endianness mess for users on BE hosts if they use their build without autoconf. The macros are carefully written to err on the side of the caution, e.g., we #error if the user manually configures a different endianness than what we detect. This is a backport of secp256k1 [[bitcoin-core/secp256k1#787 | PR787]] Test Plan: ninja check-secp256k1 Reviewers: #bitcoin_abc, majcosta Reviewed By: #bitcoin_abc, majcosta Differential Revision: https://reviews.bitcoinabc.org/D7600
1 parent 22c32de commit 1bf8cda

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed
 

‎configure.ac

-2
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,6 @@ if test x"$enable_module_schnorr" = x"yes"; then
539539
AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module])
540540
fi
541541

542-
AC_C_BIGENDIAN()
543-
544542
if test x"$use_external_asm" = x"yes"; then
545543
AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
546544
fi

‎src/hash_impl.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define SECP256K1_HASH_IMPL_H
99

1010
#include "hash.h"
11+
#include "util.h"
1112

1213
#include <stdlib.h>
1314
#include <stdint.h>
@@ -27,9 +28,9 @@
2728
(h) = t1 + t2; \
2829
} while(0)
2930

30-
#ifdef WORDS_BIGENDIAN
31+
#if defined(SECP256K1_BIG_ENDIAN)
3132
#define BE32(x) (x)
32-
#else
33+
#elif defined(SECP256K1_LITTLE_ENDIAN)
3334
#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24))
3435
#endif
3536

‎src/util.h

+14
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,20 @@ static SECP256K1_INLINE void *manual_alloc(void** prealloc_ptr, size_t alloc_siz
179179
SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t;
180180
#endif
181181

182+
#if defined(__BYTE_ORDER__)
183+
# if defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && !defined(SECP256K1_LITTLE_ENDIAN)
184+
# define SECP256K1_LITTLE_ENDIAN
185+
# elif defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && !defined(SECP256K1_BIG_ENDIAN)
186+
# define SECP256K1_BIG_ENDIAN
187+
# endif
188+
#endif
189+
#if defined(_MSC_VER) && defined(_WIN32) && !defined(SECP256K1_LITTLE_ENDIAN)
190+
# define SECP256K1_LITTLE_ENDIAN
191+
#endif
192+
#if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN)
193+
# error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h.
194+
#endif
195+
182196
/* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */
183197
static SECP256K1_INLINE void memczero(void *s, size_t len, int flag) {
184198
unsigned char *p = (unsigned char *)s;

0 commit comments

Comments
 (0)