7#ifndef SECP256K1_UTIL_H
8#define SECP256K1_UTIL_H
17#define DEBUG_CONFIG_MSG(x) "DEBUG_CONFIG: " x
18#define DEBUG_CONFIG_DEF(x) DEBUG_CONFIG_MSG(#x "=" STR(x))
21 void (*fn)(
const char *text,
void* data);
26 cb->
fn(text, (
void*)cb->
data);
29#ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
32 fprintf(stderr,
"[libsecp256k1] illegal argument: %s\n", str);
37 fprintf(stderr,
"[libsecp256k1] internal consistency check failed: %s\n", str);
57#define TEST_FAILURE(msg) do { \
58 fprintf(stderr, "%s\n", msg); \
62#define TEST_FAILURE(msg) do { \
63 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
68#if SECP256K1_GNUC_PREREQ(3, 0)
69#define EXPECT(x,c) __builtin_expect((x),(c))
71#define EXPECT(x,c) (x)
75#define CHECK(cond) do { \
76 if (EXPECT(!(cond), 0)) { \
77 TEST_FAILURE("test condition failed"); \
81#define CHECK(cond) do { \
82 if (EXPECT(!(cond), 0)) { \
83 TEST_FAILURE("test condition failed: " #cond); \
90#define VERIFY_CHECK(check)
91#define VERIFY_SETUP(stmt)
93#define VERIFY_CHECK CHECK
94#define VERIFY_SETUP(stmt) do { stmt; } while(0)
96#define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
97#define VERIFY_SETUP(stmt)
101#if !defined(VG_CHECK)
102# if defined(VALGRIND)
103# include <valgrind/memcheck.h>
104# define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y))
105# define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y))
107# define VG_UNDEF(x,y)
108# define VG_CHECK(x,y)
114#define VG_CHECK_VERIFY(x,y) VG_CHECK((x), (y))
116#define VG_CHECK_VERIFY(x,y)
120 void *ret = malloc(size);
128 void *ret = realloc(ptr, size);
135#if defined(__BIGGEST_ALIGNMENT__)
136#define ALIGNMENT __BIGGEST_ALIGNMENT__
144#define ROUND_TO_ALIGN(size) ((((size) + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT)
147#if defined(SECP256K1_BUILD) && defined(VERIFY)
148# define SECP256K1_RESTRICT
150# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
151# if SECP256K1_GNUC_PREREQ(3,0)
152# define SECP256K1_RESTRICT __restrict__
153# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
154# define SECP256K1_RESTRICT __restrict
156# define SECP256K1_RESTRICT
159# define SECP256K1_RESTRICT restrict
164# define I64FORMAT "I64d"
165# define I64uFORMAT "I64u"
167# define I64FORMAT "lld"
168# define I64uFORMAT "llu"
172# define SECP256K1_GNUC_EXT __extension__
174# define SECP256K1_GNUC_EXT
179 unsigned char *p = (
unsigned char *)s;
183 volatile int vflag = flag;
184 unsigned char mask = -(
unsigned char) vflag;
198 const unsigned char *p1 = s1, *p2 = s2;
201 for (i = 0; i < n; i++) {
202 int diff = p1[i] - p2[i];
212 unsigned int mask0, mask1, r_masked, a_masked;
216 volatile int vflag = flag;
221 mask0 = (
unsigned int)vflag + ~0u;
223 r_masked = ((
unsigned int)*r & mask0);
224 a_masked = ((
unsigned int)*a & mask1);
226 *r = (int)(r_masked | a_masked);
229#if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
231# define SECP256K1_WIDEMUL_INT128 1
232# define SECP256K1_INT128_STRUCT 1
233#elif defined(USE_FORCE_WIDEMUL_INT128)
235# define SECP256K1_WIDEMUL_INT128 1
236# define SECP256K1_INT128_NATIVE 1
237#elif defined(USE_FORCE_WIDEMUL_INT64)
239# define SECP256K1_WIDEMUL_INT64 1
240#elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
242# define SECP256K1_WIDEMUL_INT128 1
243# define SECP256K1_INT128_NATIVE 1
244#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
247# define SECP256K1_WIDEMUL_INT128 1
248# define SECP256K1_INT128_STRUCT 1
249#elif SIZE_MAX > 0xffffffff
253# define SECP256K1_WIDEMUL_INT128 1
254# define SECP256K1_INT128_STRUCT 1
257# define SECP256K1_WIDEMUL_INT64 1
261#define __has_builtin(x) 0
268 static const uint8_t debruijn[32] = {
269 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
270 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
271 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
273 return debruijn[((x & -x) * 0x04D7651F) >> 27];
280 static const uint8_t debruijn[64] = {
281 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
282 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
283 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
284 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
286 return debruijn[((x & -x) * 0x022FDD63CC95386D) >> 58];
292#if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
294 if (((
unsigned)UINT32_MAX) == UINT32_MAX) {
295 return __builtin_ctz(x);
298#if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
300 return __builtin_ctzl(x);
310#if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
312 if (((
unsigned long)UINT64_MAX) == UINT64_MAX) {
313 return __builtin_ctzl(x);
316#if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
318 return __builtin_ctzll(x);
327 return (uint32_t)p[0] << 24 |
328 (uint32_t)p[1] << 16 |
329 (uint32_t)p[2] << 8 |
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static void secp256k1_default_error_callback_fn(const char *str, void *data)
static const secp256k1_callback default_error_callback
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
static SECP256K1_INLINE void * checked_realloc(const secp256k1_callback *cb, void *ptr, size_t size)
#define VERIFY_CHECK(cond)
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback *const cb, const char *const text)
static const secp256k1_callback default_illegal_callback
void(* fn)(const char *text, void *data)