19 #define bigint_t( size ) \ 21 bigint_element_t element[ (size) ]; \ 30 #define bigint_required_size( len ) \ 31 ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \ 32 sizeof ( bigint_element_t ) ) 40 #define bigint_size( bigint ) \ 41 ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) ) 50 #define bigint_init( value, data, len ) do { \ 51 unsigned int size = bigint_size (value); \ 52 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \ 53 bigint_init_raw ( (value)->element, size, (data), (len) ); \ 63 #define bigint_done( value, out, len ) do { \ 64 unsigned int size = bigint_size (value); \ 65 bigint_done_raw ( (value)->element, size, (out), (len) ); \ 74 #define bigint_add( addend, value ) do { \ 75 unsigned int size = bigint_size (addend); \ 76 bigint_add_raw ( (addend)->element, (value)->element, size ); \ 85 #define bigint_subtract( subtrahend, value ) do { \ 86 unsigned int size = bigint_size (subtrahend); \ 87 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \ 96 #define bigint_rol( value ) do { \ 97 unsigned int size = bigint_size (value); \ 98 bigint_rol_raw ( (value)->element, size ); \ 106 #define bigint_ror( value ) do { \ 107 unsigned int size = bigint_size (value); \ 108 bigint_ror_raw ( (value)->element, size ); \ 118 #define bigint_is_zero( value ) ( { \ 119 unsigned int size = bigint_size (value); \ 120 bigint_is_zero_raw ( (value)->element, size ); } ) 129 #define bigint_is_geq( value, reference ) ( { \ 130 unsigned int size = bigint_size (value); \ 131 bigint_is_geq_raw ( (value)->element, (reference)->element, \ 141 #define bigint_bit_is_set( value, bit ) ( { \ 142 unsigned int size = bigint_size (value); \ 143 bigint_bit_is_set_raw ( (value)->element, size, bit ); } ) 151 #define bigint_max_set_bit( value ) ( { \ 152 unsigned int size = bigint_size (value); \ 153 bigint_max_set_bit_raw ( (value)->element, size ); } ) 161 #define bigint_grow( source, dest ) do { \ 162 unsigned int source_size = bigint_size (source); \ 163 unsigned int dest_size = bigint_size (dest); \ 164 bigint_grow_raw ( (source)->element, source_size, \ 165 (dest)->element, dest_size ); \ 174 #define bigint_shrink( source, dest ) do { \ 175 unsigned int source_size = bigint_size (source); \ 176 unsigned int dest_size = bigint_size (dest); \ 177 bigint_shrink_raw ( (source)->element, source_size, \ 178 (dest)->element, dest_size ); \ 187 #define bigint_copy( source, dest ) do { \ 188 build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \ 189 bigint_shrink ( (source), (dest) ); \ 199 #define bigint_swap( first, second, swap ) do { \ 200 unsigned int size = bigint_size (first); \ 201 bigint_swap_raw ( (first)->element, (second)->element, size, \ 212 #define bigint_multiply( multiplicand, multiplier, result ) do { \ 213 unsigned int multiplicand_size = bigint_size (multiplicand); \ 214 unsigned int multiplier_size = bigint_size (multiplier); \ 215 bigint_multiply_raw ( (multiplicand)->element, \ 216 multiplicand_size, (multiplier)->element, \ 217 multiplier_size, (result)->element ); \ 229 #define bigint_mod_multiply( multiplicand, multiplier, modulus, \ 231 unsigned int size = bigint_size (multiplicand); \ 232 bigint_mod_multiply_raw ( (multiplicand)->element, \ 233 (multiplier)->element, \ 234 (modulus)->element, \ 235 (result)->element, size, tmp ); \ 244 #define bigint_mod_multiply_tmp_len( modulus ) ( { \ 245 unsigned int size = bigint_size (modulus); \ 247 bigint_t ( size * 2 ) temp_result; \ 248 bigint_t ( size * 2 ) temp_modulus; \ 260 #define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \ 261 unsigned int size = bigint_size (base); \ 262 unsigned int exponent_size = bigint_size (exponent); \ 263 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \ 264 (exponent)->element, (result)->element, \ 265 size, exponent_size, tmp ); \ 275 #define bigint_mod_exp_tmp_len( modulus, exponent ) ( { \ 276 unsigned int size = bigint_size (modulus); \ 277 unsigned int exponent_size = bigint_size (exponent); \ 278 size_t mod_multiply_len = \ 279 bigint_mod_multiply_tmp_len (modulus); \ 281 bigint_t ( size ) temp_base; \ 282 bigint_t ( exponent_size ) temp_exponent; \ 283 uint8_t mod_multiply[mod_multiply_len]; \ 289 const void *
data,
size_t len );
313 unsigned int size,
int swap );
315 unsigned int multiplicand_size,
317 unsigned int multiplier_size,
323 unsigned int size,
void *
tmp );
328 unsigned int size,
unsigned int exponent_size,
void bigint_grow_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
static const uint32_t * reference0
static unsigned int unsigned int bit
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
void bigint_subtract_raw(const bigint_element_t *subtrahend0, bigint_element_t *value0, unsigned int size)
void bigint_swap_raw(bigint_element_t *first0, bigint_element_t *second0, unsigned int size, int swap)
Conditionally swap big integers (in constant time)
void bigint_multiply_raw(const bigint_element_t *multiplicand0, unsigned int multiplicand_size, const bigint_element_t *multiplier0, unsigned int multiplier_size, bigint_element_t *result0)
Multiply big integers.
static unsigned int const void size_t len
void bigint_rol_raw(bigint_element_t *value0, unsigned int size)
static unsigned int const void * data
void bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
uint32_t bigint_element_t
Element of a big integer.
void bigint_init_raw(bigint_element_t *value0, unsigned int size, const void *data, size_t len)
static unsigned int uint32_t unsigned int dest_size
void bigint_mod_multiply_raw(const bigint_element_t *multiplicand0, const bigint_element_t *multiplier0, const bigint_element_t *modulus0, bigint_element_t *result0, unsigned int size, void *tmp)
Perform modular multiplication of big integers.
void bigint_mod_exp_raw(const bigint_element_t *base0, const bigint_element_t *modulus0, const bigint_element_t *exponent0, bigint_element_t *result0, unsigned int size, unsigned int exponent_size, void *tmp)
Perform modular exponentiation of big integers.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
int bigint_bit_is_set_raw(const bigint_element_t *value0, unsigned int size, unsigned int bit)
static unsigned int source_size
void bigint_shrink_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
void bigint_done_raw(const bigint_element_t *value0, unsigned int size, void *out, size_t len)
static unsigned int size void * out
void bigint_ror_raw(bigint_element_t *value0, unsigned int size)
int bigint_is_zero_raw(const bigint_element_t *value0, unsigned int size)
static unsigned int uint32_t * dest0
int bigint_is_geq_raw(const bigint_element_t *value0, const bigint_element_t *reference0, unsigned int size)