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,
struct golan_eq_context ctx
pseudo_bit_t value[0x00020]
static const uint32_t multiplier
Port multiplier number.
static const uint32_t * reference0
uint32_t bigint_element_t
Element of a big integer.
static unsigned int source_size
static unsigned int uint32_t unsigned int dest_size
static unsigned int uint32_t * dest0
uint8_t data[48]
Additional event data.
uint16_t size
Buffer size.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
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_is_geq_raw(const bigint_element_t *value0, const bigint_element_t *reference0, unsigned int size)
void bigint_shrink_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
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.
int bigint_subtract_raw(const bigint_element_t *subtrahend0, bigint_element_t *value0, unsigned int size)
void bigint_grow_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_bit_is_set_raw(const bigint_element_t *value0, unsigned int size, 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_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.
int bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
static unsigned int unsigned int bit
const char * bigint_ntoa_raw(const bigint_element_t *value0, unsigned int size)
Transcribe big integer (for debugging)
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.
void bigint_swap_raw(bigint_element_t *first0, bigint_element_t *second0, unsigned int size, int swap)
Conditionally swap big integers (in constant time)
int bigint_is_zero_raw(const bigint_element_t *value0, unsigned int size)
void bigint_reduce_raw(const bigint_element_t *modulus0, bigint_element_t *result0, unsigned int size)
Reduce big integer R^2 modulo N.
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.
#define bigint_t(size)
Define a big-integer type.
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_init_raw(bigint_element_t *value0, unsigned int size, const void *data, size_t len)
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
int bigint_shl_raw(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)
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.
static uint16_t struct vmbus_xfer_pages_operations * op