Bitcoin Core  28.1.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 STATIC_ASSERT(expr) do { \
59  switch(0) { \
60  case 0: \
61  /* If expr evaluates to 0, we have two case labels "0", which is illegal. */ \
62  case /* ERROR: static assertion failed */ (expr): \
63  ; \
64  } \
65 } while(0)
66 
71 #define ASSERT_INT_CONST_AND_DO(expr, stmt) do { \
72  switch(42) { \
73  /* C allows only integer constant expressions as case labels. */ \
74  case /* ERROR: integer argument is not constant */ (expr): \
75  break; \
76  default: ; \
77  } \
78  stmt; \
79 } while(0)
80 
81 typedef struct {
82  void (*fn)(const char *text, void* data);
83  const void* data;
85 
86 static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) {
87  cb->fn(text, (void*)cb->data);
88 }
89 
90 #ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
91 static void secp256k1_default_illegal_callback_fn(const char* str, void* data) {
92  (void)data;
93  fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str);
94  abort();
95 }
96 static void secp256k1_default_error_callback_fn(const char* str, void* data) {
97  (void)data;
98  fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str);
99  abort();
100 }
101 #else
102 void secp256k1_default_illegal_callback_fn(const char* str, void* data);
103 void secp256k1_default_error_callback_fn(const char* str, void* data);
104 #endif
105 
108  NULL
109 };
110 
113  NULL
114 };
115 
116 
117 #ifdef DETERMINISTIC
118 #define TEST_FAILURE(msg) do { \
119  fprintf(stderr, "%s\n", msg); \
120  abort(); \
121 } while(0);
122 #else
123 #define TEST_FAILURE(msg) do { \
124  fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
125  abort(); \
126 } while(0)
127 #endif
128 
129 #if SECP256K1_GNUC_PREREQ(3, 0)
130 #define EXPECT(x,c) __builtin_expect((x),(c))
131 #else
132 #define EXPECT(x,c) (x)
133 #endif
134 
135 #ifdef DETERMINISTIC
136 #define CHECK(cond) do { \
137  if (EXPECT(!(cond), 0)) { \
138  TEST_FAILURE("test condition failed"); \
139  } \
140 } while(0)
141 #else
142 #define CHECK(cond) do { \
143  if (EXPECT(!(cond), 0)) { \
144  TEST_FAILURE("test condition failed: " #cond); \
145  } \
146 } while(0)
147 #endif
148 
149 /* Like assert(), but when VERIFY is defined. */
150 #if defined(VERIFY)
151 #define VERIFY_CHECK CHECK
152 #else
153 #define VERIFY_CHECK(cond)
154 #endif
155 
156 static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) {
157  void *ret = malloc(size);
158  if (ret == NULL) {
159  secp256k1_callback_call(cb, "Out of memory");
160  }
161  return ret;
162 }
163 
164 #if defined(__BIGGEST_ALIGNMENT__)
165 #define ALIGNMENT __BIGGEST_ALIGNMENT__
166 #else
167 /* Using 16 bytes alignment because common architectures never have alignment
168  * requirements above 8 for any of the types we care about. In addition we
169  * leave some room because currently we don't care about a few bytes. */
170 #define ALIGNMENT 16
171 #endif
172 
173 /* ceil(x/y) for integers x > 0 and y > 0. Here, / denotes rational division. */
174 #define CEIL_DIV(x, y) (1 + ((x) - 1) / (y))
175 
176 #define ROUND_TO_ALIGN(size) (CEIL_DIV(size, ALIGNMENT) * ALIGNMENT)
177 
178 /* Macro for restrict, when available and not in a VERIFY build. */
179 #if defined(SECP256K1_BUILD) && defined(VERIFY)
180 # define SECP256K1_RESTRICT
181 #else
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
187 # else
188 # define SECP256K1_RESTRICT
189 # endif
190 # else
191 # define SECP256K1_RESTRICT restrict
192 # endif
193 #endif
194 
195 #if defined(_WIN32)
196 # define I64FORMAT "I64d"
197 # define I64uFORMAT "I64u"
198 #else
199 # define I64FORMAT "lld"
200 # define I64uFORMAT "llu"
201 #endif
202 
203 #if defined(__GNUC__)
204 # define SECP256K1_GNUC_EXT __extension__
205 #else
206 # define SECP256K1_GNUC_EXT
207 #endif
208 
209 /* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */
210 static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag) {
211  unsigned char *p = (unsigned char *)s;
212  /* Access flag with a volatile-qualified lvalue.
213  This prevents clang from figuring out (after inlining) that flag can
214  take only be 0 or 1, which leads to variable time code. */
215  volatile int vflag = flag;
216  unsigned char mask = -(unsigned char) vflag;
217  while (len) {
218  *p &= ~mask;
219  p++;
220  len--;
221  }
222 }
223 
229 static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n) {
230  const unsigned char *p1 = s1, *p2 = s2;
231  size_t i;
232 
233  for (i = 0; i < n; i++) {
234  int diff = p1[i] - p2[i];
235  if (diff != 0) {
236  return diff;
237  }
238  }
239  return 0;
240 }
241 
243 static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag) {
244  unsigned int mask0, mask1, r_masked, a_masked;
245  /* Access flag with a volatile-qualified lvalue.
246  This prevents clang from figuring out (after inlining) that flag can
247  take only be 0 or 1, which leads to variable time code. */
248  volatile int vflag = flag;
249 
250  /* Casting a negative int to unsigned and back to int is implementation defined behavior */
251  VERIFY_CHECK(*r >= 0 && *a >= 0);
252 
253  mask0 = (unsigned int)vflag + ~0u;
254  mask1 = ~mask0;
255  r_masked = ((unsigned int)*r & mask0);
256  a_masked = ((unsigned int)*a & mask1);
257 
258  *r = (int)(r_masked | a_masked);
259 }
260 
261 #if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
262 /* If USE_FORCE_WIDEMUL_INT128_STRUCT is set, use int128_struct. */
263 # define SECP256K1_WIDEMUL_INT128 1
264 # define SECP256K1_INT128_STRUCT 1
265 #elif defined(USE_FORCE_WIDEMUL_INT128)
266 /* If USE_FORCE_WIDEMUL_INT128 is set, use int128. */
267 # define SECP256K1_WIDEMUL_INT128 1
268 # define SECP256K1_INT128_NATIVE 1
269 #elif defined(USE_FORCE_WIDEMUL_INT64)
270 /* If USE_FORCE_WIDEMUL_INT64 is set, use int64. */
271 # define SECP256K1_WIDEMUL_INT64 1
272 #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
273 /* If a native 128-bit integer type exists, use int128. */
274 # define SECP256K1_WIDEMUL_INT128 1
275 # define SECP256K1_INT128_NATIVE 1
276 #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
277 /* On 64-bit MSVC targets (x86_64 and arm64), use int128_struct
278  * (which has special logic to implement using intrinsics on those systems). */
279 # define SECP256K1_WIDEMUL_INT128 1
280 # define SECP256K1_INT128_STRUCT 1
281 #elif SIZE_MAX > 0xffffffff
282 /* Systems with 64-bit pointers (and thus registers) very likely benefit from
283  * using 64-bit based arithmetic (even if we need to fall back to 32x32->64 based
284  * multiplication logic). */
285 # define SECP256K1_WIDEMUL_INT128 1
286 # define SECP256K1_INT128_STRUCT 1
287 #else
288 /* Lastly, fall back to int64 based arithmetic. */
289 # define SECP256K1_WIDEMUL_INT64 1
290 #endif
291 
292 #ifndef __has_builtin
293 #define __has_builtin(x) 0
294 #endif
295 
296 /* Determine the number of trailing zero bits in a (non-zero) 32-bit x.
297  * This function is only intended to be used as fallback for
298  * secp256k1_ctz32_var, but permits it to be tested separately. */
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
304  };
305  return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
306 }
307 
308 /* Determine the number of trailing zero bits in a (non-zero) 64-bit x.
309  * This function is only intended to be used as fallback for
310  * secp256k1_ctz64_var, but permits it to be tested separately. */
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
317  };
318  return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
319 }
320 
321 /* Determine the number of trailing zero bits in a (non-zero) 32-bit x. */
322 static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x) {
323  VERIFY_CHECK(x != 0);
324 #if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
325  /* If the unsigned type is sufficient to represent the largest uint32_t, consider __builtin_ctz. */
326  if (((unsigned)UINT32_MAX) == UINT32_MAX) {
327  return __builtin_ctz(x);
328  }
329 #endif
330 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
331  /* Otherwise consider __builtin_ctzl (the unsigned long type is always at least 32 bits). */
332  return __builtin_ctzl(x);
333 #else
334  /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
336 #endif
337 }
338 
339 /* Determine the number of trailing zero bits in a (non-zero) 64-bit x. */
340 static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x) {
341  VERIFY_CHECK(x != 0);
342 #if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
343  /* If the unsigned long type is sufficient to represent the largest uint64_t, consider __builtin_ctzl. */
344  if (((unsigned long)UINT64_MAX) == UINT64_MAX) {
345  return __builtin_ctzl(x);
346  }
347 #endif
348 #if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
349  /* Otherwise consider __builtin_ctzll (the unsigned long long type is always at least 64 bits). */
350  return __builtin_ctzll(x);
351 #else
352  /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
354 #endif
355 }
356 
357 /* Read a uint32_t in big endian */
358 SECP256K1_INLINE static uint32_t secp256k1_read_be32(const unsigned char* p) {
359  return (uint32_t)p[0] << 24 |
360  (uint32_t)p[1] << 16 |
361  (uint32_t)p[2] << 8 |
362  (uint32_t)p[3];
363 }
364 
365 /* Write a uint32_t in big endian */
366 SECP256K1_INLINE static void secp256k1_write_be32(unsigned char* p, uint32_t x) {
367  p[3] = x;
368  p[2] = x >> 8;
369  p[1] = x >> 16;
370  p[0] = x >> 24;
371 }
372 
373 /* Read a uint64_t in big endian */
374 SECP256K1_INLINE static uint64_t secp256k1_read_be64(const unsigned char* p) {
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 |
382  (uint64_t)p[7];
383 }
384 
385 /* Write a uint64_t in big endian */
386 SECP256K1_INLINE static void secp256k1_write_be64(unsigned char* p, uint64_t x) {
387  p[7] = x;
388  p[6] = x >> 8;
389  p[5] = x >> 16;
390  p[4] = x >> 24;
391  p[3] = x >> 32;
392  p[2] = x >> 40;
393  p[1] = x >> 48;
394  p[0] = x >> 56;
395 }
396 
397 /* Rotate a uint32_t to the right. */
398 SECP256K1_INLINE static uint32_t secp256k1_rotr32(const uint32_t x, const unsigned int by) {
399 #if defined(_MSC_VER)
400  return _rotr(x, by); /* needs <stdlib.h> */
401 #else
402  /* Reduce rotation amount to avoid UB when shifting. */
403  const unsigned int mask = CHAR_BIT * sizeof(x) - 1;
404  /* Turned into a rot instruction by GCC and clang. */
405  return (x >> (by & mask)) | (x << ((-by) & mask));
406 #endif
407 }
408 
409 #endif /* SECP256K1_UTIL_H */
#define VERIFY_CHECK(cond)
Definition: util.h:153
int ret
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:322
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
Definition: util.h:358
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
Definition: util.h:386
void(* fn)(const char *text, void *data)
Definition: util.h:82
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
Definition: util.h:91
#define SECP256K1_INLINE
Definition: util.h:48
static SECP256K1_INLINE uint32_t secp256k1_rotr32(const uint32_t x, const unsigned int by)
Definition: util.h:398
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
Definition: util.h:366
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
Definition: util.h:340
static void print_buf_plain(const unsigned char *buf, size_t len)
Definition: util.h:28
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
Definition: util.h:311
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:210
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:229
static void secp256k1_default_error_callback_fn(const char *str, void *data)
Definition: util.h:96
static const secp256k1_callback default_illegal_callback
Definition: util.h:106
static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback *const cb, const char *const text)
Definition: util.h:86
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:299
static SECP256K1_INLINE uint64_t secp256k1_read_be64(const unsigned char *p)
Definition: util.h:374
const void * data
Definition: util.h:83
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:243
void printf(const char *fmt, const Args &... args)
Format list of arguments to std::cout, according to the given format string.
Definition: tinyformat.h:1076
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:156
static const secp256k1_callback default_error_callback
Definition: util.h:111