20 #define bigint_t( size ) \ 22 bigint_element_t element[ (size) ]; \ 31 #define bigint_required_size( len ) \ 32 ( (len) ? ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \ 33 sizeof ( bigint_element_t ) ) : 1 ) 41 #define bigint_size( bigint ) \ 42 ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) ) 50 #define bigint_ntoa( value ) ( { \ 51 unsigned int size = bigint_size (value); \ 52 bigint_ntoa_raw ( (value)->element, size ); \ 62 #define bigint_init( value, data, len ) do { \ 63 unsigned int size = bigint_size (value); \ 64 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \ 65 bigint_init_raw ( (value)->element, size, (data), (len) ); \ 75 #define bigint_done( value, out, len ) do { \ 76 unsigned int size = bigint_size (value); \ 77 bigint_done_raw ( (value)->element, size, (out), (len) ); \ 87 #define bigint_add( addend, value ) ( { \ 88 unsigned int size = bigint_size (addend); \ 89 bigint_add_raw ( (addend)->element, (value)->element, size ); \ 99 #define bigint_subtract( subtrahend, value ) ( { \ 100 unsigned int size = bigint_size (subtrahend); \ 101 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \ 111 #define bigint_shl( value ) ( { \ 112 unsigned int size = bigint_size (value); \ 113 bigint_shl_raw ( (value)->element, size ); \ 122 #define bigint_shr( value ) ( { \ 123 unsigned int size = bigint_size (value); \ 124 bigint_shr_raw ( (value)->element, size ); \ 134 #define bigint_is_zero( value ) ( { \ 135 unsigned int size = bigint_size (value); \ 136 bigint_is_zero_raw ( (value)->element, size ); } ) 145 #define bigint_is_geq( value, reference ) ( { \ 146 unsigned int size = bigint_size (value); \ 147 bigint_is_geq_raw ( (value)->element, (reference)->element, \ 156 #define bigint_set_bit( value, bit ) do { \ 157 unsigned int size = bigint_size (value); \ 158 bigint_set_bit_raw ( (value)->element, size, bit ); \ 167 #define bigint_clear_bit( value, bit ) do { \ 168 unsigned int size = bigint_size (value); \ 169 bigint_clear_bit_raw ( (value)->element, size, bit ); \ 179 #define bigint_bit_is_set( value, bit ) ( { \ 180 unsigned int size = bigint_size (value); \ 181 bigint_bit_is_set_raw ( (value)->element, size, bit ); } ) 189 #define bigint_msb_is_set( value ) ( { \ 190 unsigned int size = bigint_size (value); \ 191 bigint_msb_is_set_raw ( (value)->element, size ); } ) 199 #define bigint_max_set_bit( value ) ( { \ 200 unsigned int size = bigint_size (value); \ 201 bigint_max_set_bit_raw ( (value)->element, size ); } ) 209 #define bigint_grow( source, dest ) do { \ 210 unsigned int source_size = bigint_size (source); \ 211 unsigned int dest_size = bigint_size (dest); \ 212 bigint_grow_raw ( (source)->element, source_size, \ 213 (dest)->element, dest_size ); \ 222 #define bigint_shrink( source, dest ) do { \ 223 unsigned int source_size = bigint_size (source); \ 224 unsigned int dest_size = bigint_size (dest); \ 225 bigint_shrink_raw ( (source)->element, source_size, \ 226 (dest)->element, dest_size ); \ 235 #define bigint_copy( source, dest ) do { \ 236 build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \ 237 bigint_shrink ( (source), (dest) ); \ 247 #define bigint_swap( first, second, swap ) do { \ 248 unsigned int size = bigint_size (first); \ 249 bigint_swap_raw ( (first)->element, (second)->element, size, \ 260 #define bigint_multiply( multiplicand, multiplier, result ) do { \ 261 unsigned int multiplicand_size = bigint_size (multiplicand); \ 262 unsigned int multiplier_size = bigint_size (multiplier); \ 263 bigint_multiply_raw ( (multiplicand)->element, \ 264 multiplicand_size, (multiplier)->element, \ 265 multiplier_size, (result)->element ); \ 274 #define bigint_reduce( modulus, result ) do { \ 275 unsigned int size = bigint_size (modulus); \ 276 bigint_reduce_raw ( (modulus)->element, (result)->element, \ 286 #define bigint_mod_invert( invertend, inverse ) do { \ 287 unsigned int size = bigint_size ( inverse ); \ 288 bigint_mod_invert_raw ( (invertend)->element, \ 289 (inverse)->element, size ); \ 300 #define bigint_montgomery_relaxed( modulus, value, result ) ( { \ 301 unsigned int size = bigint_size (modulus); \ 302 bigint_montgomery_relaxed_raw ( (modulus)->element, \ 304 (result)->element, size ); \ 314 #define bigint_montgomery( modulus, value, result ) do { \ 315 unsigned int size = bigint_size (modulus); \ 316 bigint_montgomery_raw ( (modulus)->element, (value)->element, \ 317 (result)->element, size ); \ 330 #define bigint_ladder( result, multiple, exponent, op, ctx, tmp ) do { \ 331 unsigned int size = bigint_size (result); \ 332 unsigned int exponent_size = bigint_size (exponent); \ 333 bigint_ladder_raw ( (result)->element, (multiple)->element, \ 334 size, (exponent)->element, exponent_size, \ 335 (op), (ctx), (tmp) ); \ 347 #define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \ 348 unsigned int size = bigint_size (base); \ 349 unsigned int exponent_size = bigint_size (exponent); \ 350 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \ 351 (exponent)->element, (result)->element, \ 352 size, exponent_size, tmp ); \ 361 #define bigint_mod_exp_tmp_len( modulus ) ( { \ 362 unsigned int size = bigint_size (modulus); \ 364 bigint_t ( size ) temp[4]; \ 380 unsigned int size,
const void *
ctx,
413 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
431 ( (
const void * )
value0 );
432 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
448 ( (
const void * )
value0 );
450 unsigned int subindex = ( ( 8 *
sizeof (
value->element[0] ) ) - 1 );
458 const void *
data,
size_t len );
482 unsigned int size,
int swap );
488 unsigned int multiplicand_size,
490 unsigned int multiplier_size,
507 const void *
ctx,
void *
tmp );
510 const void *
ctx,
void *
tmp );
515 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)