Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/util.h
Show First 20 Lines • Show All 196 Lines • ▼ Show 20 Lines | |||||
# define SECP256K1_BIG_ENDIAN | # define SECP256K1_BIG_ENDIAN | ||||
# endif | # endif | ||||
#endif | #endif | ||||
#if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN) | #if defined(SECP256K1_LITTLE_ENDIAN) == defined(SECP256K1_BIG_ENDIAN) | ||||
# error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h. | # error Please make sure that either SECP256K1_LITTLE_ENDIAN or SECP256K1_BIG_ENDIAN is set, see src/util.h. | ||||
#endif | #endif | ||||
/* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */ | /* Zero memory if flag == 1. Flag must be 0 or 1. Constant time. */ | ||||
static SECP256K1_INLINE void memczero(void *s, size_t len, int flag) { | static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag) { | ||||
unsigned char *p = (unsigned char *)s; | unsigned char *p = (unsigned char *)s; | ||||
/* Access flag with a volatile-qualified lvalue. | /* Access flag with a volatile-qualified lvalue. | ||||
This prevents clang from figuring out (after inlining) that flag can | This prevents clang from figuring out (after inlining) that flag can | ||||
take only be 0 or 1, which leads to variable time code. */ | take only be 0 or 1, which leads to variable time code. */ | ||||
volatile int vflag = flag; | volatile int vflag = flag; | ||||
unsigned char mask = -(unsigned char) vflag; | unsigned char mask = -(unsigned char) vflag; | ||||
while (len) { | while (len) { | ||||
*p &= ~mask; | *p &= ~mask; | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
/* If USE_FORCE_WIDEMUL_{INT128,INT64} is set, use that wide multiplication implementation. | /* If USE_FORCE_WIDEMUL_{INT128,INT64} is set, use that wide multiplication implementation. | ||||
* Otherwise use the presence of __SIZEOF_INT128__ to decide. | * Otherwise use the presence of __SIZEOF_INT128__ to decide. | ||||
*/ | */ | ||||
#if defined(USE_FORCE_WIDEMUL_INT128) | #if defined(USE_FORCE_WIDEMUL_INT128) | ||||
# define SECP256K1_WIDEMUL_INT128 1 | # define SECP256K1_WIDEMUL_INT128 1 | ||||
#elif defined(USE_FORCE_WIDEMUL_INT64) | #elif defined(USE_FORCE_WIDEMUL_INT64) | ||||
# define SECP256K1_WIDEMUL_INT64 1 | # define SECP256K1_WIDEMUL_INT64 1 | ||||
#elif defined(__SIZEOF_INT128__) | #elif defined(UINT128_MAX) || defined(__SIZEOF_INT128__) | ||||
# define SECP256K1_WIDEMUL_INT128 1 | # define SECP256K1_WIDEMUL_INT128 1 | ||||
#else | #else | ||||
# define SECP256K1_WIDEMUL_INT64 1 | # define SECP256K1_WIDEMUL_INT64 1 | ||||
#endif | #endif | ||||
#if defined(SECP256K1_WIDEMUL_INT128) | #if defined(SECP256K1_WIDEMUL_INT128) | ||||
# if !defined(UINT128_MAX) && defined(__SIZEOF_INT128__) | |||||
SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; | SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; | ||||
SECP256K1_GNUC_EXT typedef __int128 int128_t; | SECP256K1_GNUC_EXT typedef __int128 int128_t; | ||||
#define UINT128_MAX ((uint128_t)(-1)) | |||||
#define INT128_MAX ((int128_t)(UINT128_MAX >> 1)) | |||||
#define INT128_MIN (-INT128_MAX - 1) | |||||
/* No (U)INT128_C macros because compilers providing __int128 do not support 128-bit literals. */ | |||||
# endif | |||||
#endif | #endif | ||||
#endif /* SECP256K1_UTIL_H */ | #endif /* SECP256K1_UTIL_H */ |