Bitcoin Core  26.99.0
P2P Digital Currency
util.h
Go to the documentation of this file.
1 /***********************************************************************
2  * Copyright (c) 2013, 2014 Pieter Wuille *
3  * Distributed under the MIT software license, see the accompanying *
4  * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
5  ***********************************************************************/
6 
7 #ifndef SECP256K1_UTIL_H
8 #define SECP256K1_UTIL_H
9 
10 #include "../include/secp256k1.h"
11 
12 #include <stdlib.h>
13 #include <stdint.h>
14 #include <stdio.h>
15 #include <limits.h>
16 
17 #define STR_(x) #x
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))
21 
22 /* Debug helper for printing arrays of unsigned char. */
23 #define PRINT_BUF(buf, len) do { \
24  printf("%s[%lu] = ", #buf, (unsigned long)len); \
25  print_buf_plain(buf, len); \
26 } while(0)
27 
28 static void print_buf_plain(const unsigned char *buf, size_t len) {
29  size_t i;
30  printf("{");
31  for (i = 0; i < len; i++) {
32  if (i % 8 == 0) {
33  printf("\n ");
34  } else {
35  printf(" ");
36  }
37  printf("0x%02X,", buf[i]);
38  }
39  printf("\n}\n");
40 }
41 
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
47 # else
48 # define SECP256K1_INLINE
49 # endif
50 # else
51 # define SECP256K1_INLINE inline
52 # endif
53 
58 #define ASSERT_INT_CONST_AND_DO(expr, stmt) do { \
59  switch(42) { \
60  case /* ERROR: integer argument is not constant */ expr: \
61  break; \
62  default: ; \
63  } \
64  stmt; \
65 } while(0)
66 
67 typedef struct {
68  void (*fn)(const char *text, void* data);
69  const void* data;
71 
72 static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) {
73  cb->fn(text, (void*)cb->data);
74 }
75 
76 #ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
77 static void secp256k1_default_illegal_callback_fn(const char* str, void* data) {
78  (void)data;
79  fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str);
80  abort();
81 }
82 static void secp256k1_default_error_callback_fn(const char* str, void* data) {
83  (void)data;
84  fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str);
85  abort();
86 }
87 #else
88 void secp256k1_default_illegal_callback_fn(const char* str, void* data);
89 void secp256k1_default_error_callback_fn(const char* str, void* data);
90 #endif
91 
94  NULL
95 };
96 
99  NULL
100 };
101 
102 
103 #ifdef DETERMINISTIC
104 #define TEST_FAILURE(msg) do { \
105  fprintf(stderr, "%s\n", msg); \
106  abort(); \
107 } while(0);
108 #else
109 #define TEST_FAILURE(msg) do { \
110  fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
111  abort(); \
112 } while(0)
113 #endif
114 
115 #if SECP256K1_GNUC_PREREQ(3, 0)
116 #define EXPECT(x,c) __builtin_expect((x),(c))
117 #else
118 #define EXPECT(x,c) (x)
119 #endif
120 
121 #ifdef DETERMINISTIC
122 #define CHECK(cond) do { \
123  if (EXPECT(!(cond), 0)) { \
124  TEST_FAILURE("test condition failed"); \
125  } \
126 } while(0)
127 #else
128 #define CHECK(cond) do { \
129  if (EXPECT(!(cond), 0)) { \
130  TEST_FAILURE("test condition failed: " #cond); \
131  } \
132 } while(0)
133 #endif
134 
135 /* Like assert(), but when VERIFY is defined, and side-effect safe. */
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)
142 #else
143 #define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
144 #define VERIFY_SETUP(stmt)
145 #endif
146 
147 static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) {
148  void *ret = malloc(size);
149  if (ret == NULL) {
150  secp256k1_callback_call(cb, "Out of memory");
151  }
152  return ret;
153 }
154 
155 #if defined(__BIGGEST_ALIGNMENT__)
156 #define ALIGNMENT __BIGGEST_ALIGNMENT__
157 #else
158 /* Using 16 bytes alignment because common architectures never have alignment
159  * requirements above 8 for any of the types we care about. In addition we
160  * leave some room because currently we don't care about a few bytes. */
161 #define ALIGNMENT 16
162 #endif
163 
164 #define ROUND_TO_ALIGN(size) ((((size) + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT)
165 
166 /* Macro for restrict, when available and not in a VERIFY build. */
167 #if defined(SECP256K1_BUILD) && defined(VERIFY)
168 # define SECP256K1_RESTRICT
169 #else
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
175 # else
176 # define SECP256K1_RESTRICT
177 # endif
178 # else
179 # define SECP256K1_RESTRICT restrict
180 # endif
181 #endif
182 
183 #if defined(_WIN32)
184 # define I64FORMAT "I64d"
185 # define I64uFORMAT "I64u"
186 #else
187 # define I64FORMAT "lld"
188 # define I64uFORMAT "llu"
189 #endif
190 
191 #if defined(__GNUC__)
192 # define SECP256K1_GNUC_EXT __extension__
193 #else
194 # define SECP256K1_GNUC_EXT
195 #endif
196 
197 /* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */
198 static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag) {
199  unsigned char *p = (unsigned char *)s;
200  /* Access flag with a volatile-qualified lvalue.
201  This prevents clang from figuring out (after inlining) that flag can
202  take only be 0 or 1, which leads to variable time code. */
203  volatile int vflag = flag;
204  unsigned char mask = -(unsigned char) vflag;
205  while (len) {
206  *p &= ~mask;
207  p++;
208  len--;
209  }
210 }
211 
217 static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n) {
218  const unsigned char *p1 = s1, *p2 = s2;
219  size_t i;
220 
221  for (i = 0; i < n; i++) {
222  int diff = p1[i] - p2[i];
223  if (diff != 0) {
224  return diff;
225  }
226  }
227  return 0;
228 }
229 
231 static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag) {
232  unsigned int mask0, mask1, r_masked, a_masked;
233  /* Access flag with a volatile-qualified lvalue.
234  This prevents clang from figuring out (after inlining) that flag can
235  take only be 0 or 1, which leads to variable time code. */
236  volatile int vflag = flag;
237 
238  /* Casting a negative int to unsigned and back to int is implementation defined behavior */
239  VERIFY_CHECK(*r >= 0 && *a >= 0);
240 
241  mask0 = (unsigned int)vflag + ~0u;
242  mask1 = ~mask0;
243  r_masked = ((unsigned int)*r & mask0);
244  a_masked = ((unsigned int)*a & mask1);
245 
246  *r = (int)(r_masked | a_masked);
247 }
248 
249 #if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
250 /* If USE_FORCE_WIDEMUL_INT128_STRUCT is set, use int128_struct. */
251 # define SECP256K1_WIDEMUL_INT128 1
252 # define SECP256K1_INT128_STRUCT 1
253 #elif defined(USE_FORCE_WIDEMUL_INT128)
254 /* If USE_FORCE_WIDEMUL_INT128 is set, use int128. */
255 # define SECP256K1_WIDEMUL_INT128 1
256 # define SECP256K1_INT128_NATIVE 1
257 #elif defined(USE_FORCE_WIDEMUL_INT64)
258 /* If USE_FORCE_WIDEMUL_INT64 is set, use int64. */
259 # define SECP256K1_WIDEMUL_INT64 1
260 #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
261 /* If a native 128-bit integer type exists, use int128. */
262 # define SECP256K1_WIDEMUL_INT128 1
263 # define SECP256K1_INT128_NATIVE 1
264 #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
265 /* On 64-bit MSVC targets (x86_64 and arm64), use int128_struct
266  * (which has special logic to implement using intrinsics on those systems). */
267 # define SECP256K1_WIDEMUL_INT128 1
268 # define SECP256K1_INT128_STRUCT 1
269 #elif SIZE_MAX > 0xffffffff
270 /* Systems with 64-bit pointers (and thus registers) very likely benefit from
271  * using 64-bit based arithmetic (even if we need to fall back to 32x32->64 based
272  * multiplication logic). */
273 # define SECP256K1_WIDEMUL_INT128 1
274 # define SECP256K1_INT128_STRUCT 1
275 #else
276 /* Lastly, fall back to int64 based arithmetic. */
277 # define SECP256K1_WIDEMUL_INT64 1
278 #endif
279 
280 #ifndef __has_builtin
281 #define __has_builtin(x) 0
282 #endif
283 
284 /* Determine the number of trailing zero bits in a (non-zero) 32-bit x.
285  * This function is only intended to be used as fallback for
286  * secp256k1_ctz32_var, but permits it to be tested separately. */
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
292  };
293  return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
294 }
295 
296 /* Determine the number of trailing zero bits in a (non-zero) 64-bit x.
297  * This function is only intended to be used as fallback for
298  * secp256k1_ctz64_var, but permits it to be tested separately. */
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
305  };
306  return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
307 }
308 
309 /* Determine the number of trailing zero bits in a (non-zero) 32-bit x. */
310 static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x) {
311  VERIFY_CHECK(x != 0);
312 #if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
313  /* If the unsigned type is sufficient to represent the largest uint32_t, consider __builtin_ctz. */
314  if (((unsigned)UINT32_MAX) == UINT32_MAX) {
315  return __builtin_ctz(x);
316  }
317 #endif
318 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
319  /* Otherwise consider __builtin_ctzl (the unsigned long type is always at least 32 bits). */
320  return __builtin_ctzl(x);
321 #else
322  /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
324 #endif
325 }
326 
327 /* Determine the number of trailing zero bits in a (non-zero) 64-bit x. */
328 static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x) {
329  VERIFY_CHECK(x != 0);
330 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
331  /* If the unsigned long type is sufficient to represent the largest uint64_t, consider __builtin_ctzl. */
332  if (((unsigned long)UINT64_MAX) == UINT64_MAX) {
333  return __builtin_ctzl(x);
334  }
335 #endif
336 #if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
337  /* Otherwise consider __builtin_ctzll (the unsigned long long type is always at least 64 bits). */
338  return __builtin_ctzll(x);
339 #else
340  /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
342 #endif
343 }
344 
345 /* Read a uint32_t in big endian */
346 SECP256K1_INLINE static uint32_t secp256k1_read_be32(const unsigned char* p) {
347  return (uint32_t)p[0] << 24 |
348  (uint32_t)p[1] << 16 |
349  (uint32_t)p[2] << 8 |
350  (uint32_t)p[3];
351 }
352 
353 /* Write a uint32_t in big endian */
354 SECP256K1_INLINE static void secp256k1_write_be32(unsigned char* p, uint32_t x) {
355  p[3] = x;
356  p[2] = x >> 8;
357  p[1] = x >> 16;
358  p[0] = x >> 24;
359 }
360 
361 /* Read a uint64_t in big endian */
362 SECP256K1_INLINE static uint64_t secp256k1_read_be64(const unsigned char* p) {
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 |
370  (uint64_t)p[7];
371 }
372 
373 /* Write a uint64_t in big endian */
374 SECP256K1_INLINE static void secp256k1_write_be64(unsigned char* p, uint64_t x) {
375  p[7] = x;
376  p[6] = x >> 8;
377  p[5] = x >> 16;
378  p[4] = x >> 24;
379  p[3] = x >> 32;
380  p[2] = x >> 40;
381  p[1] = x >> 48;
382  p[0] = x >> 56;
383 }
384 
385 #endif /* SECP256K1_UTIL_H */
int ret
void printf(const char *fmt, const Args &... args)
Format list of arguments to std::cout, according to the given format string.
Definition: tinyformat.h:1077
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
Definition: util.h:328
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:147
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:217
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.
Definition: util.h:231
static void secp256k1_default_error_callback_fn(const char *str, void *data)
Definition: util.h:82
static const secp256k1_callback default_error_callback
Definition: util.h:97
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
Definition: util.h:346
#define SECP256K1_INLINE
Definition: util.h:48
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:310
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
Definition: util.h:354
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
Definition: util.h:374
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
Definition: util.h:77
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
Definition: util.h:299
static void print_buf_plain(const unsigned char *buf, size_t len)
Definition: util.h:28
#define VERIFY_CHECK(cond)
Definition: util.h:143
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:287
static SECP256K1_INLINE uint64_t secp256k1_read_be64(const unsigned char *p)
Definition: util.h:362
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:198
static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback *const cb, const char *const text)
Definition: util.h:72
static const secp256k1_callback default_illegal_callback
Definition: util.h:92
void(* fn)(const char *text, void *data)
Definition: util.h:68
const void * data
Definition: util.h:69