17 #define bigint_t( size ) \ 19 bigint_element_t element[ (size) ]; \ 28 #define bigint_required_size( len ) \ 29 ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \ 30 sizeof ( bigint_element_t ) ) 38 #define bigint_size( bigint ) \ 39 ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) ) 48 #define bigint_init( value, data, len ) do { \ 49 unsigned int size = bigint_size (value); \ 50 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \ 51 bigint_init_raw ( (value)->element, size, (data), (len) ); \ 61 #define bigint_done( value, out, len ) do { \ 62 unsigned int size = bigint_size (value); \ 63 bigint_done_raw ( (value)->element, size, (out), (len) ); \ 72 #define bigint_add( addend, value ) do { \ 73 unsigned int size = bigint_size (addend); \ 74 bigint_add_raw ( (addend)->element, (value)->element, size ); \ 83 #define bigint_subtract( subtrahend, value ) do { \ 84 unsigned int size = bigint_size (subtrahend); \ 85 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \ 94 #define bigint_rol( value ) do { \ 95 unsigned int size = bigint_size (value); \ 96 bigint_rol_raw ( (value)->element, size ); \ 104 #define bigint_ror( value ) do { \ 105 unsigned int size = bigint_size (value); \ 106 bigint_ror_raw ( (value)->element, size ); \ 116 #define bigint_is_zero( value ) ( { \ 117 unsigned int size = bigint_size (value); \ 118 bigint_is_zero_raw ( (value)->element, size ); } ) 127 #define bigint_is_geq( value, reference ) ( { \ 128 unsigned int size = bigint_size (value); \ 129 bigint_is_geq_raw ( (value)->element, (reference)->element, \ 139 #define bigint_bit_is_set( value, bit ) ( { \ 140 unsigned int size = bigint_size (value); \ 141 bigint_bit_is_set_raw ( (value)->element, size, bit ); } ) 149 #define bigint_max_set_bit( value ) ( { \ 150 unsigned int size = bigint_size (value); \ 151 bigint_max_set_bit_raw ( (value)->element, size ); } ) 159 #define bigint_grow( source, dest ) do { \ 160 unsigned int source_size = bigint_size (source); \ 161 unsigned int dest_size = bigint_size (dest); \ 162 bigint_grow_raw ( (source)->element, source_size, \ 163 (dest)->element, dest_size ); \ 172 #define bigint_shrink( source, dest ) do { \ 173 unsigned int source_size = bigint_size (source); \ 174 unsigned int dest_size = bigint_size (dest); \ 175 bigint_shrink_raw ( (source)->element, source_size, \ 176 (dest)->element, dest_size ); \ 186 #define bigint_multiply( multiplicand, multiplier, result ) do { \ 187 unsigned int size = bigint_size (multiplicand); \ 188 bigint_multiply_raw ( (multiplicand)->element, \ 189 (multiplier)->element, (result)->element, \ 202 #define bigint_mod_multiply( multiplicand, multiplier, modulus, \ 204 unsigned int size = bigint_size (multiplicand); \ 205 bigint_mod_multiply_raw ( (multiplicand)->element, \ 206 (multiplier)->element, \ 207 (modulus)->element, \ 208 (result)->element, size, tmp ); \ 217 #define bigint_mod_multiply_tmp_len( modulus ) ( { \ 218 unsigned int size = bigint_size (modulus); \ 220 bigint_t ( size * 2 ) temp_result; \ 221 bigint_t ( size * 2 ) temp_modulus; \ 233 #define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \ 234 unsigned int size = bigint_size (base); \ 235 unsigned int exponent_size = bigint_size (exponent); \ 236 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \ 237 (exponent)->element, (result)->element, \ 238 size, exponent_size, tmp ); \ 248 #define bigint_mod_exp_tmp_len( modulus, exponent ) ( { \ 249 unsigned int size = bigint_size (modulus); \ 250 unsigned int exponent_size = bigint_size (exponent); \ 251 size_t mod_multiply_len = \ 252 bigint_mod_multiply_tmp_len (modulus); \ 254 bigint_t ( size ) temp_base; \ 255 bigint_t ( exponent_size ) temp_exponent; \ 256 uint8_t mod_multiply[mod_multiply_len]; \ 262 const void *
data,
size_t len );
293 unsigned int size,
void *
tmp );
298 unsigned int size,
unsigned int exponent_size,
void bigint_multiply_raw(const bigint_element_t *multiplicand0, const bigint_element_t *multiplier0, bigint_element_t *result0, unsigned int size)
Multiply big integers.
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)
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)