7 #ifndef SECP256K1_UTIL_H
8 #define SECP256K1_UTIL_H
10 #if defined HAVE_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)