7#ifndef SECP256K1_UTIL_H
8#define SECP256K1_UTIL_H
24#define DEBUG_CONFIG_MSG(x) "DEBUG_CONFIG: " x
25#define DEBUG_CONFIG_DEF(x) DEBUG_CONFIG_MSG(#x "=" STR(x))
28#define PRINT_BUF(buf, len) do { \
29 printf("%s[%lu] = ", #buf, (unsigned long)len); \
30 print_buf_plain(buf, len); \
36 for (i = 0; i < len; i++) {
47# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
49# define SECP256K1_INLINE __inline__
50# elif (defined(_MSC_VER))
51# define SECP256K1_INLINE __inline
53# define SECP256K1_INLINE
56# define SECP256K1_INLINE inline
59# if !defined(_DEBUG) && !defined(__NO_INLINE__) && !defined(__OPTIMIZE_SIZE__)
60# if defined(__OPTIMIZE__) && defined(__GNUC__)
61# define SECP256K1_FORCE_INLINE SECP256K1_INLINE __attribute__((always_inline))
62# elif defined(_MSC_VER)
63# define SECP256K1_FORCE_INLINE __forceinline
66# ifndef SECP256K1_FORCE_INLINE
67# define SECP256K1_FORCE_INLINE SECP256K1_INLINE
74#define STATIC_ASSERT(expr) do { \
87#define ASSERT_INT_CONST_AND_DO(expr, stmt) do { \
98 void (*fn)(
const char *text,
void*
data);
103 cb->
fn(text, (
void*)cb->
data);
106#ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
109 fprintf(stderr,
"[libsecp256k1] illegal argument: %s\n", str);
114 fprintf(stderr,
"[libsecp256k1] internal consistency check failed: %s\n", str);
134#define TEST_FAILURE(msg) do { \
135 fprintf(stderr, "%s\n", msg); \
139#define TEST_FAILURE(msg) do { \
140 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
146#define EXPECT(x,c) __builtin_expect((x),(c))
148#define EXPECT(x,c) (x)
152#define CHECK(cond) do { \
153 if (EXPECT(!(cond), 0)) { \
154 TEST_FAILURE("test condition failed"); \
158#define CHECK(cond) do { \
159 if (EXPECT(!(cond), 0)) { \
160 TEST_FAILURE("test condition failed: " #cond); \
167#define VERIFY_CHECK CHECK
169#define VERIFY_CHECK(cond)
173 void *
ret = malloc(size);
180#if defined(__BIGGEST_ALIGNMENT__)
181#define ALIGNMENT __BIGGEST_ALIGNMENT__
190#define CEIL_DIV(x, y) (1 + ((x) - 1) / (y))
192#define ROUND_TO_ALIGN(size) (CEIL_DIV(size, ALIGNMENT) * ALIGNMENT)
194#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
197#if defined(SECP256K1_BUILD) && defined(VERIFY)
198# define SECP256K1_RESTRICT
200# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
201# if defined(__GNUC__)
202# define SECP256K1_RESTRICT __restrict__
203# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
204# define SECP256K1_RESTRICT __restrict
206# define SECP256K1_RESTRICT
209# define SECP256K1_RESTRICT restrict
214# define SECP256K1_GNUC_EXT __extension__
216# define SECP256K1_GNUC_EXT
221 unsigned char *p = (
unsigned char *)
s;
225 volatile int vflag = flag;
226 unsigned char mask = -(
unsigned char) vflag;
239 SecureZeroMemory(ptr, len);
240#elif defined(__GNUC__)
253 __asm__ __volatile__(
"" : :
"r"(ptr) :
"memory");
255 void *(*
volatile const volatile_memset)(
void *,
int,
size_t) = memset;
256 volatile_memset(ptr, 0, len);
282 const unsigned char *p1 = s1, *p2 = s2;
285 for (i = 0; i < n; i++) {
286 int diff = p1[i] - p2[i];
297 unsigned char acc = 0;
301 for (i = 0; i < len; i++) {
313 unsigned int mask0, mask1, r_masked, a_masked;
317 volatile int vflag = flag;
323 mask0 = (
unsigned int)vflag + ~0u;
325 r_masked = ((
unsigned int)*r & mask0);
326 a_masked = ((
unsigned int)*a & mask1);
328 *r = (int)(r_masked | a_masked);
331#if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
333# define SECP256K1_WIDEMUL_INT128 1
334# define SECP256K1_INT128_STRUCT 1
335#elif defined(USE_FORCE_WIDEMUL_INT128)
337# define SECP256K1_WIDEMUL_INT128 1
338# define SECP256K1_INT128_NATIVE 1
339#elif defined(USE_FORCE_WIDEMUL_INT64)
341# define SECP256K1_WIDEMUL_INT64 1
342#elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
344# define SECP256K1_WIDEMUL_INT128 1
345# define SECP256K1_INT128_NATIVE 1
346#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
349# define SECP256K1_WIDEMUL_INT128 1
350# define SECP256K1_INT128_STRUCT 1
351#elif SIZE_MAX > 0xffffffff
355# define SECP256K1_WIDEMUL_INT128 1
356# define SECP256K1_INT128_STRUCT 1
359# define SECP256K1_WIDEMUL_INT64 1
363#define __has_builtin(x) 0
370 static const uint8_t debruijn[32] = {
371 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
372 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
373 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
375 return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
382 static const uint8_t debruijn[64] = {
383 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
384 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
385 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
386 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
388 return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
394#if (__has_builtin(__builtin_ctz) || defined(__GNUC__))
396 if (((
unsigned)UINT32_MAX) == UINT32_MAX) {
397 return __builtin_ctz(x);
400#if (__has_builtin(__builtin_ctzl) || defined(__GNUC__))
402 return __builtin_ctzl(x);
412#if (__has_builtin(__builtin_ctzl) || defined(__GNUC__))
414 if (((
unsigned long)UINT64_MAX) == UINT64_MAX) {
415 return __builtin_ctzl(x);
418#if (__has_builtin(__builtin_ctzll) || defined(__GNUC__))
420 return __builtin_ctzll(x);
429 return (uint32_t)p[0] << 24 |
430 (uint32_t)p[1] << 16 |
431 (uint32_t)p[2] << 8 |
445 return (uint64_t)p[0] << 56 |
446 (uint64_t)p[1] << 48 |
447 (uint64_t)p[2] << 40 |
448 (uint64_t)p[3] << 32 |
449 (uint64_t)p[4] << 24 |
450 (uint64_t)p[5] << 16 |
451 (uint64_t)p[6] << 8 |
473 const unsigned int mask = CHAR_BIT *
sizeof(x) - 1;
475 return (x >> (by & mask)) | (x << ((-by) & mask));
#define SECP256K1_CHECKMEM_UNDEFINE(p, len)
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
static SECP256K1_INLINE void secp256k1_memclear_explicit(void *ptr, size_t len)
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 1, set *r equal to *a; if flag is 0, leave it.
static SECP256K1_INLINE void secp256k1_memzero_explicit(void *ptr, size_t len)
static void secp256k1_default_error_callback_fn(const char *str, void *data)
static SECP256K1_INLINE int secp256k1_is_zero_array(const unsigned char *s, size_t len)
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 SECP256K1_INLINE uint32_t secp256k1_rotr32(const uint32_t x, const unsigned int by)
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 * 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)