7 #ifndef SECP256K1_UTIL_H
8 #define SECP256K1_UTIL_H
10 #if defined HAVE_CONFIG_H
20 void (*fn)(
const char *text,
void* data);
28 #ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
31 fprintf(stderr,
"[libsecp256k1] illegal argument: %s\n", str);
36 fprintf(stderr,
"[libsecp256k1] internal consistency check failed: %s\n", str);
56 #define TEST_FAILURE(msg) do { \
57 fprintf(stderr, "%s\n", msg); \
61 #define TEST_FAILURE(msg) do { \
62 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
67 #if SECP256K1_GNUC_PREREQ(3, 0)
68 #define EXPECT(x,c) __builtin_expect((x),(c))
70 #define EXPECT(x,c) (x)
74 #define CHECK(cond) do { \
75 if (EXPECT(!(cond), 0)) { \
76 TEST_FAILURE("test condition failed"); \
80 #define CHECK(cond) do { \
81 if (EXPECT(!(cond), 0)) { \
82 TEST_FAILURE("test condition failed: " #cond); \
89 #define VERIFY_CHECK(check)
90 #define VERIFY_SETUP(stmt)
92 #define VERIFY_CHECK CHECK
93 #define VERIFY_SETUP(stmt) do { stmt; } while(0)
95 #define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
96 #define VERIFY_SETUP(stmt)
100 #if !defined(VG_CHECK)
101 # if defined(VALGRIND)
102 # include <valgrind/memcheck.h>
103 # define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y))
104 # define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y))
106 # define VG_UNDEF(x,y)
107 # define VG_CHECK(x,y)
113 #define VG_CHECK_VERIFY(x,y) VG_CHECK((x), (y))
115 #define VG_CHECK_VERIFY(x,y)
119 void *ret = malloc(size);
127 void *ret = realloc(ptr, size);
134 #if defined(__BIGGEST_ALIGNMENT__)
135 #define ALIGNMENT __BIGGEST_ALIGNMENT__
143 #define ROUND_TO_ALIGN(size) ((((size) + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT)
146 #if defined(SECP256K1_BUILD) && defined(VERIFY)
147 # define SECP256K1_RESTRICT
149 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
150 # if SECP256K1_GNUC_PREREQ(3,0)
151 # define SECP256K1_RESTRICT __restrict__
152 # elif (defined(_MSC_VER) && _MSC_VER >= 1400)
153 # define SECP256K1_RESTRICT __restrict
155 # define SECP256K1_RESTRICT
158 # define SECP256K1_RESTRICT restrict
163 # define I64FORMAT "I64d"
164 # define I64uFORMAT "I64u"
166 # define I64FORMAT "lld"
167 # define I64uFORMAT "llu"
170 #if defined(__GNUC__)
171 # define SECP256K1_GNUC_EXT __extension__
173 # define SECP256K1_GNUC_EXT
177 #if !defined(SECP256K1_LITTLE_ENDIAN) && !defined(SECP256K1_BIG_ENDIAN)
179 # if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \
180 defined(_X86_) || defined(__x86_64__) || defined(__i386__) || \
181 defined(__i486__) || defined(__i586__) || defined(__i686__) || \
182 defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) || \
183 defined(__ARMEL__) || defined(__AARCH64EL__) || \
184 (defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__ == 1) || \
185 (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN == 1) || \
186 defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM)
187 # define SECP256K1_LITTLE_ENDIAN
189 # if (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \
190 defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) || \
191 defined(__MICROBLAZEEB__) || defined(__ARMEB__) || defined(__AARCH64EB__) || \
192 (defined(__BIG_ENDIAN__) && __BIG_ENDIAN__ == 1) || \
193 (defined(_BIG_ENDIAN) && _BIG_ENDIAN == 1)
194 # define SECP256K1_BIG_ENDIAN
197 #if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN)
198 # error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h.
203 unsigned char *p = (
unsigned char *)s;
207 volatile int vflag = flag;
208 unsigned char mask = -(
unsigned char) vflag;
222 const unsigned char *p1 = s1, *p2 = s2;
225 for (i = 0; i < n; i++) {
226 int diff = p1[i] - p2[i];
236 unsigned int mask0, mask1, r_masked, a_masked;
240 volatile int vflag = flag;
245 mask0 = (
unsigned int)vflag + ~0u;
247 r_masked = ((
unsigned int)*r & mask0);
248 a_masked = ((
unsigned int)*a & mask1);
250 *r = (int)(r_masked | a_masked);
256 #if defined(USE_FORCE_WIDEMUL_INT128)
257 # define SECP256K1_WIDEMUL_INT128 1
258 #elif defined(USE_FORCE_WIDEMUL_INT64)
259 # define SECP256K1_WIDEMUL_INT64 1
260 #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
261 # define SECP256K1_WIDEMUL_INT128 1
263 # define SECP256K1_WIDEMUL_INT64 1
265 #if defined(SECP256K1_WIDEMUL_INT128)
266 # if !defined(UINT128_MAX) && defined(__SIZEOF_INT128__)
269 #define UINT128_MAX ((uint128_t)(-1))
270 #define INT128_MAX ((int128_t)(UINT128_MAX >> 1))
271 #define INT128_MIN (-INT128_MAX - 1)
276 #ifndef __has_builtin
277 #define __has_builtin(x) 0
284 static const uint8_t debruijn[32] = {
285 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
286 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
287 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
289 return debruijn[((x & -x) * 0x04D7651F) >> 27];
296 static const uint8_t debruijn[64] = {
297 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
298 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
299 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
300 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
302 return debruijn[((x & -x) * 0x022FDD63CC95386D) >> 58];
308 #if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
310 if (((
unsigned)UINT32_MAX) == UINT32_MAX) {
311 return __builtin_ctz(x);
314 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
316 return __builtin_ctzl(x);
326 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
328 if (((
unsigned long)UINT64_MAX) == UINT64_MAX) {
329 return __builtin_ctzl(x);
332 #if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
334 return __builtin_ctzll(x);