7 #ifndef SECP256K1_UTIL_H 8 #define SECP256K1_UTIL_H 10 #if defined HAVE_CONFIG_H 11 #include "libsecp256k1-config.h" 20 void (*fn)(
const char *text,
void* data);
25 cb->
fn(text, (
void*)cb->
data);
29 #define TEST_FAILURE(msg) do { \ 30 fprintf(stderr, "%s\n", msg); \ 34 #define TEST_FAILURE(msg) do { \ 35 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ 40 #if SECP256K1_GNUC_PREREQ(3, 0) 41 #define EXPECT(x,c) __builtin_expect((x),(c)) 43 #define EXPECT(x,c) (x) 47 #define CHECK(cond) do { \ 48 if (EXPECT(!(cond), 0)) { \ 49 TEST_FAILURE("test condition failed"); \ 53 #define CHECK(cond) do { \ 54 if (EXPECT(!(cond), 0)) { \ 55 TEST_FAILURE("test condition failed: " #cond); \ 62 #define VERIFY_CHECK(check) 63 #define VERIFY_SETUP(stmt) 65 #define VERIFY_CHECK CHECK 66 #define VERIFY_SETUP(stmt) do { stmt; } while(0) 68 #define VERIFY_CHECK(cond) do { (void)(cond); } while(0) 69 #define VERIFY_SETUP(stmt) 73 #if !defined(VG_CHECK) 74 # if defined(VALGRIND) 75 # include <valgrind/memcheck.h> 76 # define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) 77 # define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) 79 # define VG_UNDEF(x,y) 80 # define VG_CHECK(x,y) 86 #define VG_CHECK_VERIFY(x,y) VG_CHECK((x), (y)) 88 #define VG_CHECK_VERIFY(x,y) 92 void *ret = malloc(size);
100 void *ret = realloc(ptr, size);
107 #if defined(__BIGGEST_ALIGNMENT__) 108 #define ALIGNMENT __BIGGEST_ALIGNMENT__ 116 #define ROUND_TO_ALIGN(size) (((size + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT) 140 VERIFY_CHECK((
unsigned char*)*prealloc_ptr >= (
unsigned char*)base);
142 VERIFY_CHECK((
unsigned char*)*prealloc_ptr - (
unsigned char*)base + aligned_alloc_size <= max_size);
144 *((
unsigned char**)prealloc_ptr) += aligned_alloc_size;
149 #if defined(SECP256K1_BUILD) && defined(VERIFY) 150 # define SECP256K1_RESTRICT 152 # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) 153 # if SECP256K1_GNUC_PREREQ(3,0) 154 # define SECP256K1_RESTRICT __restrict__ 155 # elif (defined(_MSC_VER) && _MSC_VER >= 1400) 156 # define SECP256K1_RESTRICT __restrict 158 # define SECP256K1_RESTRICT 161 # define SECP256K1_RESTRICT restrict 166 # define I64FORMAT "I64d" 167 # define I64uFORMAT "I64u" 169 # define I64FORMAT "lld" 170 # define I64uFORMAT "llu" 173 #if defined(__GNUC__) 174 # define SECP256K1_GNUC_EXT __extension__ 176 # define SECP256K1_GNUC_EXT 180 #if !defined(SECP256K1_LITTLE_ENDIAN) && !defined(SECP256K1_BIG_ENDIAN) 182 # if (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ 183 defined(_X86_) || defined(__x86_64__) || defined(__i386__) || \ 184 defined(__i486__) || defined(__i586__) || defined(__i686__) || \ 185 defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) || \ 186 defined(__ARMEL__) || defined(__AARCH64EL__) || \ 187 (defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__ == 1) || \ 188 (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN == 1) || \ 189 defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) 190 # define SECP256K1_LITTLE_ENDIAN 192 # if (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \ 193 defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) || \ 194 defined(__MICROBLAZEEB__) || defined(__ARMEB__) || defined(__AARCH64EB__) || \ 195 (defined(__BIG_ENDIAN__) && __BIG_ENDIAN__ == 1) || \ 196 (defined(_BIG_ENDIAN) && _BIG_ENDIAN == 1) 197 # define SECP256K1_BIG_ENDIAN 200 #if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN) 201 # error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h. 206 unsigned char *p = (
unsigned char *)s;
210 volatile int vflag = flag;
211 unsigned char mask = -(
unsigned char) vflag;
225 const unsigned char *p1 = s1, *p2 = s2;
228 for (i = 0; i < n; i++) {
229 int diff = p1[i] - p2[i];
239 unsigned int mask0, mask1, r_masked, a_masked;
243 volatile int vflag = flag;
248 mask0 = (
unsigned int)vflag + ~0u;
250 r_masked = ((
unsigned int)*r & mask0);
251 a_masked = ((
unsigned int)*a & mask1);
253 *r = (int)(r_masked | a_masked);
259 #if defined(USE_FORCE_WIDEMUL_INT128) 260 # define SECP256K1_WIDEMUL_INT128 1 261 #elif defined(USE_FORCE_WIDEMUL_INT64) 262 # define SECP256K1_WIDEMUL_INT64 1 263 #elif defined(__SIZEOF_INT128__) 264 # define SECP256K1_WIDEMUL_INT128 1 266 # define SECP256K1_WIDEMUL_INT64 1 268 #if defined(SECP256K1_WIDEMUL_INT128) #define VERIFY_CHECK(cond)
void(* fn)(const char *text, void *data)
static SECP256K1_INLINE void * manual_alloc(void **prealloc_ptr, size_t alloc_size, void *base, size_t max_size)
#define SECP256K1_GNUC_EXT
static SECP256K1_INLINE void * checked_realloc(const secp256k1_callback *cb, void *ptr, 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_callback_call(const secp256k1_callback *const cb, const char *const text)
#define ROUND_TO_ALIGN(size)
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 memczero(void *s, size_t len, int flag)
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)