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 STATIC_ASSERT(expr) do { \ 71 #define ASSERT_INT_CONST_AND_DO(expr, stmt) do { \ 82 void (*fn)(
const char *text,
void* data);
87 cb->
fn(text, (
void*)cb->
data);
90 #ifndef USE_EXTERNAL_DEFAULT_CALLBACKS 93 fprintf(stderr,
"[libsecp256k1] illegal argument: %s\n", str);
98 fprintf(stderr,
"[libsecp256k1] internal consistency check failed: %s\n", str);
118 #define TEST_FAILURE(msg) do { \ 119 fprintf(stderr, "%s\n", msg); \ 123 #define TEST_FAILURE(msg) do { \ 124 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ 129 #if SECP256K1_GNUC_PREREQ(3, 0) 130 #define EXPECT(x,c) __builtin_expect((x),(c)) 132 #define EXPECT(x,c) (x) 136 #define CHECK(cond) do { \ 137 if (EXPECT(!(cond), 0)) { \ 138 TEST_FAILURE("test condition failed"); \ 142 #define CHECK(cond) do { \ 143 if (EXPECT(!(cond), 0)) { \ 144 TEST_FAILURE("test condition failed: " #cond); \ 151 #define VERIFY_CHECK CHECK 153 #define VERIFY_CHECK(cond) 157 void *
ret = malloc(size);
164 #if defined(__BIGGEST_ALIGNMENT__) 165 #define ALIGNMENT __BIGGEST_ALIGNMENT__ 174 #define CEIL_DIV(x, y) (1 + ((x) - 1) / (y)) 176 #define ROUND_TO_ALIGN(size) (CEIL_DIV(size, ALIGNMENT) * ALIGNMENT) 179 #if defined(SECP256K1_BUILD) && defined(VERIFY) 180 # define SECP256K1_RESTRICT 182 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) 183 # if SECP256K1_GNUC_PREREQ(3,0) 184 # define SECP256K1_RESTRICT __restrict__ 185 # elif (defined(_MSC_VER) && _MSC_VER >= 1400) 186 # define SECP256K1_RESTRICT __restrict 188 # define SECP256K1_RESTRICT 191 # define SECP256K1_RESTRICT restrict 196 # define I64FORMAT "I64d" 197 # define I64uFORMAT "I64u" 199 # define I64FORMAT "lld" 200 # define I64uFORMAT "llu" 203 #if defined(__GNUC__) 204 # define SECP256K1_GNUC_EXT __extension__ 206 # define SECP256K1_GNUC_EXT 211 unsigned char *p = (
unsigned char *)s;
215 volatile int vflag = flag;
216 unsigned char mask = -(
unsigned char) vflag;
230 const unsigned char *p1 = s1, *p2 = s2;
233 for (i = 0; i < n; i++) {
234 int diff = p1[i] - p2[i];
244 unsigned int mask0, mask1, r_masked, a_masked;
248 volatile int vflag = flag;
253 mask0 = (
unsigned int)vflag + ~0u;
255 r_masked = ((
unsigned int)*r & mask0);
256 a_masked = ((
unsigned int)*a & mask1);
258 *r = (int)(r_masked | a_masked);
261 #if defined(USE_FORCE_WIDEMUL_INT128_STRUCT) 263 # define SECP256K1_WIDEMUL_INT128 1 264 # define SECP256K1_INT128_STRUCT 1 265 #elif defined(USE_FORCE_WIDEMUL_INT128) 267 # define SECP256K1_WIDEMUL_INT128 1 268 # define SECP256K1_INT128_NATIVE 1 269 #elif defined(USE_FORCE_WIDEMUL_INT64) 271 # define SECP256K1_WIDEMUL_INT64 1 272 #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__) 274 # define SECP256K1_WIDEMUL_INT128 1 275 # define SECP256K1_INT128_NATIVE 1 276 #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) 279 # define SECP256K1_WIDEMUL_INT128 1 280 # define SECP256K1_INT128_STRUCT 1 281 #elif SIZE_MAX > 0xffffffff 285 # define SECP256K1_WIDEMUL_INT128 1 286 # define SECP256K1_INT128_STRUCT 1 289 # define SECP256K1_WIDEMUL_INT64 1 292 #ifndef __has_builtin 293 #define __has_builtin(x) 0 300 static const uint8_t debruijn[32] = {
301 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
302 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
303 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
305 return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
312 static const uint8_t debruijn[64] = {
313 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
314 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
315 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
316 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
318 return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
324 #if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4)) 326 if (((
unsigned)UINT32_MAX) == UINT32_MAX) {
327 return __builtin_ctz(x);
330 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4)) 332 return __builtin_ctzl(x);
342 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4)) 344 if (((
unsigned long)UINT64_MAX) == UINT64_MAX) {
345 return __builtin_ctzl(x);
348 #if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4)) 350 return __builtin_ctzll(x);
359 return (uint32_t)p[0] << 24 |
360 (uint32_t)p[1] << 16 |
361 (uint32_t)p[2] << 8 |
375 return (uint64_t)p[0] << 56 |
376 (uint64_t)p[1] << 48 |
377 (uint64_t)p[2] << 40 |
378 (uint64_t)p[3] << 32 |
379 (uint64_t)p[4] << 24 |
380 (uint64_t)p[5] << 16 |
381 (uint64_t)p[6] << 8 |
399 #if defined(_MSC_VER) 403 const unsigned int mask = CHAR_BIT *
sizeof(x) - 1;
405 return (x >> (by & mask)) | (x << ((-by) & mask));
#define VERIFY_CHECK(cond)
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
void(* fn)(const char *text, void *data)
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
static SECP256K1_INLINE uint32_t secp256k1_rotr32(const uint32_t x, const unsigned int by)
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
static void print_buf_plain(const unsigned char *buf, size_t len)
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
static void secp256k1_default_error_callback_fn(const char *str, void *data)
static const secp256k1_callback default_illegal_callback
static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback *const cb, const char *const text)
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_int_cmov(int *r, const int *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
static const secp256k1_callback default_error_callback