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] ) ) 49 #define bigint_ntoa( value ) ( { \ 50 unsigned int size = bigint_size (value); \ 51 bigint_ntoa_raw ( (value)->element, size ); \ 61 #define bigint_init( value, data, len ) do { \ 62 unsigned int size = bigint_size (value); \ 63 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \ 64 bigint_init_raw ( (value)->element, size, (data), (len) ); \ 74 #define bigint_done( value, out, len ) do { \ 75 unsigned int size = bigint_size (value); \ 76 bigint_done_raw ( (value)->element, size, (out), (len) ); \ 86 #define bigint_add( addend, value ) ( { \ 87 unsigned int size = bigint_size (addend); \ 88 bigint_add_raw ( (addend)->element, (value)->element, size ); \ 98 #define bigint_subtract( subtrahend, value ) ( { \ 99 unsigned int size = bigint_size (subtrahend); \ 100 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \ 110 #define bigint_shl( value ) ( { \ 111 unsigned int size = bigint_size (value); \ 112 bigint_shl_raw ( (value)->element, size ); \ 121 #define bigint_shr( value ) ( { \ 122 unsigned int size = bigint_size (value); \ 123 bigint_shr_raw ( (value)->element, size ); \ 133 #define bigint_is_zero( value ) ( { \ 134 unsigned int size = bigint_size (value); \ 135 bigint_is_zero_raw ( (value)->element, size ); } ) 144 #define bigint_is_geq( value, reference ) ( { \ 145 unsigned int size = bigint_size (value); \ 146 bigint_is_geq_raw ( (value)->element, (reference)->element, \ 155 #define bigint_set_bit( value, bit ) do { \ 156 unsigned int size = bigint_size (value); \ 157 bigint_set_bit_raw ( (value)->element, size, bit ); \ 166 #define bigint_clear_bit( value, bit ) do { \ 167 unsigned int size = bigint_size (value); \ 168 bigint_clear_bit_raw ( (value)->element, size, bit ); \ 178 #define bigint_bit_is_set( value, bit ) ( { \ 179 unsigned int size = bigint_size (value); \ 180 bigint_bit_is_set_raw ( (value)->element, size, bit ); } ) 188 #define bigint_msb_is_set( value ) ( { \ 189 unsigned int size = bigint_size (value); \ 190 bigint_msb_is_set_raw ( (value)->element, size ); } ) 198 #define bigint_max_set_bit( value ) ( { \ 199 unsigned int size = bigint_size (value); \ 200 bigint_max_set_bit_raw ( (value)->element, size ); } ) 208 #define bigint_grow( source, dest ) do { \ 209 unsigned int source_size = bigint_size (source); \ 210 unsigned int dest_size = bigint_size (dest); \ 211 bigint_grow_raw ( (source)->element, source_size, \ 212 (dest)->element, dest_size ); \ 221 #define bigint_shrink( source, dest ) do { \ 222 unsigned int source_size = bigint_size (source); \ 223 unsigned int dest_size = bigint_size (dest); \ 224 bigint_shrink_raw ( (source)->element, source_size, \ 225 (dest)->element, dest_size ); \ 234 #define bigint_copy( source, dest ) do { \ 235 build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \ 236 bigint_shrink ( (source), (dest) ); \ 246 #define bigint_swap( first, second, swap ) do { \ 247 unsigned int size = bigint_size (first); \ 248 bigint_swap_raw ( (first)->element, (second)->element, size, \ 259 #define bigint_multiply( multiplicand, multiplier, result ) do { \ 260 unsigned int multiplicand_size = bigint_size (multiplicand); \ 261 unsigned int multiplier_size = bigint_size (multiplier); \ 262 bigint_multiply_raw ( (multiplicand)->element, \ 263 multiplicand_size, (multiplier)->element, \ 264 multiplier_size, (result)->element ); \ 273 #define bigint_reduce( modulus, result ) do { \ 274 unsigned int size = bigint_size (modulus); \ 275 bigint_reduce_raw ( (modulus)->element, (result)->element, \ 285 #define bigint_mod_invert( invertend, inverse ) do { \ 286 unsigned int size = bigint_size ( inverse ); \ 287 bigint_mod_invert_raw ( (invertend)->element, \ 288 (inverse)->element, size ); \ 299 #define bigint_montgomery_relaxed( modulus, value, result ) ( { \ 300 unsigned int size = bigint_size (modulus); \ 301 bigint_montgomery_relaxed_raw ( (modulus)->element, \ 303 (result)->element, size ); \ 313 #define bigint_montgomery( modulus, value, result ) do { \ 314 unsigned int size = bigint_size (modulus); \ 315 bigint_montgomery_raw ( (modulus)->element, (value)->element, \ 316 (result)->element, size ); \ 329 #define bigint_ladder( result, multiple, exponent, op, ctx, tmp ) do { \ 330 unsigned int size = bigint_size (result); \ 331 unsigned int exponent_size = bigint_size (exponent); \ 332 bigint_ladder_raw ( (result)->element, (multiple)->element, \ 333 size, (exponent)->element, exponent_size, \ 334 (op), (ctx), (tmp) ); \ 346 #define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \ 347 unsigned int size = bigint_size (base); \ 348 unsigned int exponent_size = bigint_size (exponent); \ 349 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \ 350 (exponent)->element, (result)->element, \ 351 size, exponent_size, tmp ); \ 360 #define bigint_mod_exp_tmp_len( modulus ) ( { \ 361 unsigned int size = bigint_size (modulus); \ 363 bigint_t ( size ) temp[4]; \ 379 unsigned int size,
const void *
ctx,
412 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
430 ( (
const void * )
value0 );
431 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
447 ( (
const void * )
value0 );
449 unsigned int subindex = ( ( 8 *
sizeof (
value->element[0] ) ) - 1 );
457 const void *
data,
size_t len );
481 unsigned int size,
int swap );
487 unsigned int multiplicand_size,
489 unsigned int multiplier_size,
506 const void *
ctx,
void *
tmp );
509 const void *
ctx,
void *
tmp );
514 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
const char * bigint_ntoa_raw(const bigint_element_t *value0, unsigned int size)
Transcribe big integer (for debugging)
static __attribute__((always_inline)) void bigint_set_bit_raw(bigint_element_t *value0
Set bit in big integer.
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
static unsigned int unsigned int bit
void bigint_multiply_one(const bigint_element_t multiplicand, const bigint_element_t multiplier, bigint_element_t *result, bigint_element_t *carry)
void bigint_swap_raw(bigint_element_t *first0, bigint_element_t *second0, unsigned int size, int swap)
Conditionally swap big integers (in constant time)
struct golan_eq_context ctx
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
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
static unsigned int const void * data
void bigint_mod_invert_raw(const bigint_element_t *invertend0, bigint_element_t *inverse0, unsigned int size)
Compute inverse of odd big integer modulo any power of two.
pseudo_bit_t value[0x00020]
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
#define bigint_t(size)
Define a big-integer type.
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.
int bigint_montgomery_relaxed_raw(const bigint_element_t *modulus0, bigint_element_t *value0, bigint_element_t *result0, unsigned int size)
Perform relaxed Montgomery reduction (REDC) of a big integer.
void bigint_ladder_raw(bigint_element_t *result0, bigint_element_t *multiple0, unsigned int size, const bigint_element_t *exponent0, unsigned int exponent_size, bigint_ladder_op_t *op, const void *ctx, void *tmp)
Perform generalised exponentiation via a Montgomery ladder.
int bigint_bit_is_set_raw(const bigint_element_t *value0, unsigned int size, unsigned int bit)
void bigint_mod_exp_ladder(const bigint_element_t *multiplier0, bigint_element_t *result0, unsigned int size, const void *ctx, void *tmp)
Perform modular multiplication as part of a Montgomery ladder.
void bigint_reduce_raw(const bigint_element_t *modulus0, bigint_element_t *result0, unsigned int size)
Reduce big integer R^2 modulo N.
int bigint_shl_raw(bigint_element_t *value0, unsigned int size)
static uint16_t struct vmbus_xfer_pages_operations * op
static const uint32_t multiplier
Port multiplier number.
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)
int bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
void() bigint_ladder_op_t(const bigint_element_t *operand0, bigint_element_t *result0, unsigned int size, const void *ctx, void *tmp)
A big integer Montgomery ladder commutative operation.
int bigint_shr_raw(bigint_element_t *value0, unsigned int size)
int bigint_subtract_raw(const bigint_element_t *subtrahend0, 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
void bigint_montgomery_raw(const bigint_element_t *modulus0, bigint_element_t *value0, bigint_element_t *result0, unsigned int size)
Perform classic Montgomery reduction (REDC) of a big integer.
int bigint_is_geq_raw(const bigint_element_t *value0, const bigint_element_t *reference0, unsigned int size)