7 #ifndef SECP256K1_UTIL_H
8 #define SECP256K1_UTIL_H
10 #include "../include/secp256k1.h"
18 #define STR(x) STR_(x)
19 #define DEBUG_CONFIG_MSG(x) "DEBUG_CONFIG: " x
20 #define DEBUG_CONFIG_DEF(x) DEBUG_CONFIG_MSG(#x "=" STR(x))
23 #define PRINT_BUF(buf, len) do { \
24 printf("%s[%lu] = ", #buf, (unsigned long)len); \
25 print_buf_plain(buf, len); \
31 for (i = 0; i < len; i++) {
42 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
43 # if SECP256K1_GNUC_PREREQ(2,7)
44 # define SECP256K1_INLINE __inline__
45 # elif (defined(_MSC_VER))
46 # define SECP256K1_INLINE __inline
48 # define SECP256K1_INLINE
51 # define SECP256K1_INLINE inline
58 #define ASSERT_INT_CONST_AND_DO(expr, stmt) do { \
68 void (*fn)(
const char *text,
void* data);
73 cb->
fn(text, (
void*)cb->
data);
76 #ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
79 fprintf(stderr,
"[libsecp256k1] illegal argument: %s\n", str);
84 fprintf(stderr,
"[libsecp256k1] internal consistency check failed: %s\n", str);
104 #define TEST_FAILURE(msg) do { \
105 fprintf(stderr, "%s\n", msg); \
109 #define TEST_FAILURE(msg) do { \
110 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
115 #if SECP256K1_GNUC_PREREQ(3, 0)
116 #define EXPECT(x,c) __builtin_expect((x),(c))
118 #define EXPECT(x,c) (x)
122 #define CHECK(cond) do { \
123 if (EXPECT(!(cond), 0)) { \
124 TEST_FAILURE("test condition failed"); \
128 #define CHECK(cond) do { \
129 if (EXPECT(!(cond), 0)) { \
130 TEST_FAILURE("test condition failed: " #cond); \
136 #if defined(COVERAGE)
137 #define VERIFY_CHECK(check)
138 #define VERIFY_SETUP(stmt)
139 #elif defined(VERIFY)
140 #define VERIFY_CHECK CHECK
141 #define VERIFY_SETUP(stmt) do { stmt; } while(0)
143 #define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
144 #define VERIFY_SETUP(stmt)
148 void *
ret = malloc(size);
155 #if defined(__BIGGEST_ALIGNMENT__)
156 #define ALIGNMENT __BIGGEST_ALIGNMENT__
164 #define ROUND_TO_ALIGN(size) ((((size) + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT)
167 #if defined(SECP256K1_BUILD) && defined(VERIFY)
168 # define SECP256K1_RESTRICT
170 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
171 # if SECP256K1_GNUC_PREREQ(3,0)
172 # define SECP256K1_RESTRICT __restrict__
173 # elif (defined(_MSC_VER) && _MSC_VER >= 1400)
174 # define SECP256K1_RESTRICT __restrict
176 # define SECP256K1_RESTRICT
179 # define SECP256K1_RESTRICT restrict
184 # define I64FORMAT "I64d"
185 # define I64uFORMAT "I64u"
187 # define I64FORMAT "lld"
188 # define I64uFORMAT "llu"
191 #if defined(__GNUC__)
192 # define SECP256K1_GNUC_EXT __extension__
194 # define SECP256K1_GNUC_EXT
199 unsigned char *p = (
unsigned char *)s;
203 volatile int vflag = flag;
204 unsigned char mask = -(
unsigned char) vflag;
218 const unsigned char *p1 = s1, *p2 = s2;
221 for (i = 0; i < n; i++) {
222 int diff = p1[i] - p2[i];
232 unsigned int mask0, mask1, r_masked, a_masked;
236 volatile int vflag = flag;
241 mask0 = (
unsigned int)vflag + ~0u;
243 r_masked = ((
unsigned int)*r & mask0);
244 a_masked = ((
unsigned int)*a & mask1);
246 *r = (int)(r_masked | a_masked);
249 #if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
251 # define SECP256K1_WIDEMUL_INT128 1
252 # define SECP256K1_INT128_STRUCT 1
253 #elif defined(USE_FORCE_WIDEMUL_INT128)
255 # define SECP256K1_WIDEMUL_INT128 1
256 # define SECP256K1_INT128_NATIVE 1
257 #elif defined(USE_FORCE_WIDEMUL_INT64)
259 # define SECP256K1_WIDEMUL_INT64 1
260 #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
262 # define SECP256K1_WIDEMUL_INT128 1
263 # define SECP256K1_INT128_NATIVE 1
264 #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
267 # define SECP256K1_WIDEMUL_INT128 1
268 # define SECP256K1_INT128_STRUCT 1
269 #elif SIZE_MAX > 0xffffffff
273 # define SECP256K1_WIDEMUL_INT128 1
274 # define SECP256K1_INT128_STRUCT 1
277 # define SECP256K1_WIDEMUL_INT64 1
280 #ifndef __has_builtin
281 #define __has_builtin(x) 0
288 static const uint8_t debruijn[32] = {
289 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
290 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
291 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
293 return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
300 static const uint8_t debruijn[64] = {
301 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
302 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
303 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
304 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
306 return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
312 #if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
314 if (((
unsigned)UINT32_MAX) == UINT32_MAX) {
315 return __builtin_ctz(x);
318 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
320 return __builtin_ctzl(x);
330 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
332 if (((
unsigned long)UINT64_MAX) == UINT64_MAX) {
333 return __builtin_ctzl(x);
336 #if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
338 return __builtin_ctzll(x);
347 return (uint32_t)p[0] << 24 |
348 (uint32_t)p[1] << 16 |
349 (uint32_t)p[2] << 8 |
363 return (uint64_t)p[0] << 56 |
364 (uint64_t)p[1] << 48 |
365 (uint64_t)p[2] << 40 |
366 (uint64_t)p[3] << 32 |
367 (uint64_t)p[4] << 24 |
368 (uint64_t)p[5] << 16 |
369 (uint64_t)p[6] << 8 |
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
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 SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_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 void print_buf_plain(const unsigned char *buf, size_t len)
#define VERIFY_CHECK(cond)
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
static SECP256K1_INLINE uint64_t secp256k1_read_be64(const unsigned char *p)
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)