Bitcoin ABC 0.33.5
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
28static 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
67typedef struct {
68 void (*fn)(const char *text, void* data);
69 const void* data;
71
72static 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
77static 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}
82static 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
88void secp256k1_default_illegal_callback_fn(const char* str, void* data);
89void 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
147static 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
155static SECP256K1_INLINE void *checked_realloc(const secp256k1_callback* cb, void *ptr, size_t size) {
156 void *ret = realloc(ptr, size);
157 if (ret == NULL) {
158 secp256k1_callback_call(cb, "Out of memory");
159 }
160 return ret;
161}
162
163#if defined(__BIGGEST_ALIGNMENT__)
164#define ALIGNMENT __BIGGEST_ALIGNMENT__
165#else
166/* Using 16 bytes alignment because common architectures never have alignment
167 * requirements above 8 for any of the types we care about. In addition we
168 * leave some room because currently we don't care about a few bytes. */
169#define ALIGNMENT 16
170#endif
171
172#define ROUND_TO_ALIGN(size) ((((size) + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT)
173
174/* Macro for restrict, when available and not in a VERIFY build. */
175#if defined(SECP256K1_BUILD) && defined(VERIFY)
176# define SECP256K1_RESTRICT
177#else
178# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
179# if SECP256K1_GNUC_PREREQ(3,0)
180# define SECP256K1_RESTRICT __restrict__
181# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
182# define SECP256K1_RESTRICT __restrict
183# else
184# define SECP256K1_RESTRICT
185# endif
186# else
187# define SECP256K1_RESTRICT restrict
188# endif
189#endif
190
191#if defined(_WIN32)
192# define I64FORMAT "I64d"
193# define I64uFORMAT "I64u"
194#else
195# define I64FORMAT "lld"
196# define I64uFORMAT "llu"
197#endif
198
199#if defined(__GNUC__)
200# define SECP256K1_GNUC_EXT __extension__
201#else
202# define SECP256K1_GNUC_EXT
203#endif
204
205/* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */
206static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag) {
207 unsigned char *p = (unsigned char *)s;
208 /* Access flag with a volatile-qualified lvalue.
209 This prevents clang from figuring out (after inlining) that flag can
210 take only be 0 or 1, which leads to variable time code. */
211 volatile int vflag = flag;
212 unsigned char mask = -(unsigned char) vflag;
213 while (len) {
214 *p &= ~mask;
215 p++;
216 len--;
217 }
218}
219
225static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n) {
226 const unsigned char *p1 = s1, *p2 = s2;
227 size_t i;
228
229 for (i = 0; i < n; i++) {
230 int diff = p1[i] - p2[i];
231 if (diff != 0) {
232 return diff;
233 }
234 }
235 return 0;
236}
237
239static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag) {
240 unsigned int mask0, mask1, r_masked, a_masked;
241 /* Access flag with a volatile-qualified lvalue.
242 This prevents clang from figuring out (after inlining) that flag can
243 take only be 0 or 1, which leads to variable time code. */
244 volatile int vflag = flag;
245
246 /* Casting a negative int to unsigned and back to int is implementation defined behavior */
247 VERIFY_CHECK(*r >= 0 && *a >= 0);
248
249 mask0 = (unsigned int)vflag + ~0u;
250 mask1 = ~mask0;
251 r_masked = ((unsigned int)*r & mask0);
252 a_masked = ((unsigned int)*a & mask1);
253
254 *r = (int)(r_masked | a_masked);
255}
256
257#if defined(USE_FORCE_WIDEMUL_INT128_STRUCT)
258/* If USE_FORCE_WIDEMUL_INT128_STRUCT is set, use int128_struct. */
259# define SECP256K1_WIDEMUL_INT128 1
260# define SECP256K1_INT128_STRUCT 1
261#elif defined(USE_FORCE_WIDEMUL_INT128)
262/* If USE_FORCE_WIDEMUL_INT128 is set, use int128. */
263# define SECP256K1_WIDEMUL_INT128 1
264# define SECP256K1_INT128_NATIVE 1
265#elif defined(USE_FORCE_WIDEMUL_INT64)
266/* If USE_FORCE_WIDEMUL_INT64 is set, use int64. */
267# define SECP256K1_WIDEMUL_INT64 1
268#elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__)
269/* If a native 128-bit integer type exists, use int128. */
270# define SECP256K1_WIDEMUL_INT128 1
271# define SECP256K1_INT128_NATIVE 1
272#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
273/* On 64-bit MSVC targets (x86_64 and arm64), use int128_struct
274 * (which has special logic to implement using intrinsics on those systems). */
275# define SECP256K1_WIDEMUL_INT128 1
276# define SECP256K1_INT128_STRUCT 1
277#elif SIZE_MAX > 0xffffffff
278/* Systems with 64-bit pointers (and thus registers) very likely benefit from
279 * using 64-bit based arithmetic (even if we need to fall back to 32x32->64 based
280 * multiplication logic). */
281# define SECP256K1_WIDEMUL_INT128 1
282# define SECP256K1_INT128_STRUCT 1
283#else
284/* Lastly, fall back to int64 based arithmetic. */
285# define SECP256K1_WIDEMUL_INT64 1
286#endif
287
288#ifndef __has_builtin
289#define __has_builtin(x) 0
290#endif
291
292/* Determine the number of trailing zero bits in a (non-zero) 32-bit x.
293 * This function is only intended to be used as fallback for
294 * secp256k1_ctz32_var, but permits it to be tested separately. */
296 static const uint8_t debruijn[32] = {
297 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
298 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
299 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B
300 };
301 return debruijn[(uint32_t)((x & -x) * 0x04D7651FU) >> 27];
302}
303
304/* Determine the number of trailing zero bits in a (non-zero) 64-bit x.
305 * This function is only intended to be used as fallback for
306 * secp256k1_ctz64_var, but permits it to be tested separately. */
308 static const uint8_t debruijn[64] = {
309 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
310 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
311 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
312 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
313 };
314 return debruijn[(uint64_t)((x & -x) * 0x022FDD63CC95386DU) >> 58];
315}
316
317/* Determine the number of trailing zero bits in a (non-zero) 32-bit x. */
318static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x) {
319 VERIFY_CHECK(x != 0);
320#if (__has_builtin(__builtin_ctz) || SECP256K1_GNUC_PREREQ(3,4))
321 /* If the unsigned type is sufficient to represent the largest uint32_t, consider __builtin_ctz. */
322 if (((unsigned)UINT32_MAX) == UINT32_MAX) {
323 return __builtin_ctz(x);
324 }
325#endif
326#if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
327 /* Otherwise consider __builtin_ctzl (the unsigned long type is always at least 32 bits). */
328 return __builtin_ctzl(x);
329#else
330 /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
332#endif
333}
334
335/* Determine the number of trailing zero bits in a (non-zero) 64-bit x. */
336static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x) {
337 VERIFY_CHECK(x != 0);
338#if (__has_builtin(__builtin_ctzl) || SECP256K1_GNUC_PREREQ(3,4))
339 /* If the unsigned long type is sufficient to represent the largest uint64_t, consider __builtin_ctzl. */
340 if (((unsigned long)UINT64_MAX) == UINT64_MAX) {
341 return __builtin_ctzl(x);
342 }
343#endif
344#if (__has_builtin(__builtin_ctzll) || SECP256K1_GNUC_PREREQ(3,4))
345 /* Otherwise consider __builtin_ctzll (the unsigned long long type is always at least 64 bits). */
346 return __builtin_ctzll(x);
347#else
348 /* If no suitable CTZ builtin is available, use a (variable time) software emulation. */
350#endif
351}
352
353/* Read a uint32_t in big endian */
354SECP256K1_INLINE static uint32_t secp256k1_read_be32(const unsigned char* p) {
355 return (uint32_t)p[0] << 24 |
356 (uint32_t)p[1] << 16 |
357 (uint32_t)p[2] << 8 |
358 (uint32_t)p[3];
359}
360
361/* Write a uint32_t in big endian */
362SECP256K1_INLINE static void secp256k1_write_be32(unsigned char* p, uint32_t x) {
363 p[3] = x;
364 p[2] = x >> 8;
365 p[1] = x >> 16;
366 p[0] = x >> 24;
367}
368
369/* Read a uint64_t in big endian */
370SECP256K1_INLINE static uint64_t secp256k1_read_be64(const unsigned char* p) {
371 return (uint64_t)p[0] << 56 |
372 (uint64_t)p[1] << 48 |
373 (uint64_t)p[2] << 40 |
374 (uint64_t)p[3] << 32 |
375 (uint64_t)p[4] << 24 |
376 (uint64_t)p[5] << 16 |
377 (uint64_t)p[6] << 8 |
378 (uint64_t)p[7];
379}
380
381/* Write a uint64_t in big endian */
382SECP256K1_INLINE static void secp256k1_write_be64(unsigned char* p, uint64_t x) {
383 p[7] = x;
384 p[6] = x >> 8;
385 p[5] = x >> 16;
386 p[4] = x >> 24;
387 p[3] = x >> 32;
388 p[2] = x >> 40;
389 p[1] = x >> 48;
390 p[0] = x >> 56;
391}
392
393#endif /* SECP256K1_UTIL_H */
void printf(const char *fmt, const Args &...args)
Format list of arguments to std::cout, according to the given format string.
Definition: tinyformat.h:1126
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
Definition: util.h:336
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:225
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:239
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:354
#define SECP256K1_INLINE
Definition: util.h:48
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:318
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
Definition: util.h:362
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
Definition: util.h:382
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:307
static void print_buf_plain(const unsigned char *buf, size_t len)
Definition: util.h:28
static SECP256K1_INLINE void * checked_realloc(const secp256k1_callback *cb, void *ptr, size_t size)
Definition: util.h:155
#define VERIFY_CHECK(cond)
Definition: util.h:143
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:295
static SECP256K1_INLINE uint64_t secp256k1_read_be64(const unsigned char *p)
Definition: util.h:370
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:147
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:206
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