21#define bigint_t( size ) \
23 bigint_element_t element[ (size) ]; \
32#define bigint_required_size( len ) \
33 ( (len) ? ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \
34 sizeof ( bigint_element_t ) ) : 1 )
42#define bigint_size( bigint ) \
43 ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) )
51#define bigint_ntoa( value ) ( { \
52 unsigned int size = bigint_size (value); \
53 bigint_ntoa_raw ( (value)->element, size ); \
63#define bigint_init( value, data, len ) do { \
64 unsigned int size = bigint_size (value); \
65 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \
66 bigint_init_raw ( (value)->element, size, (data), (len) ); \
76#define bigint_done( value, out, len ) do { \
77 unsigned int size = bigint_size (value); \
78 bigint_done_raw ( (value)->element, size, (out), (len) ); \
88#define bigint_add( addend, value ) ( { \
89 unsigned int size = bigint_size (addend); \
90 bigint_add_raw ( (addend)->element, (value)->element, size ); \
100#define bigint_subtract( subtrahend, value ) ( { \
101 unsigned int size = bigint_size (subtrahend); \
102 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \
112#define bigint_shl( value ) ( { \
113 unsigned int size = bigint_size (value); \
114 bigint_shl_raw ( (value)->element, size ); \
123#define bigint_shr( value ) ( { \
124 unsigned int size = bigint_size (value); \
125 bigint_shr_raw ( (value)->element, size ); \
135#define bigint_is_zero( value ) ( { \
136 unsigned int size = bigint_size (value); \
137 bigint_is_zero_raw ( (value)->element, size ); } )
146#define bigint_is_geq( value, reference ) ( { \
147 unsigned int size = bigint_size (value); \
148 bigint_is_geq_raw ( (value)->element, (reference)->element, \
157#define bigint_set_bit( value, bit ) do { \
158 unsigned int size = bigint_size (value); \
159 bigint_set_bit_raw ( (value)->element, size, bit ); \
168#define bigint_clear_bit( value, bit ) do { \
169 unsigned int size = bigint_size (value); \
170 bigint_clear_bit_raw ( (value)->element, size, bit ); \
180#define bigint_bit_is_set( value, bit ) ( { \
181 unsigned int size = bigint_size (value); \
182 bigint_bit_is_set_raw ( (value)->element, size, bit ); } )
190#define bigint_msb_is_set( value ) ( { \
191 unsigned int size = bigint_size (value); \
192 bigint_msb_is_set_raw ( (value)->element, size ); } )
200#define bigint_max_set_bit( value ) ( { \
201 unsigned int size = bigint_size (value); \
202 bigint_max_set_bit_raw ( (value)->element, size ); } )
210#define bigint_grow( source, dest ) do { \
211 unsigned int source_size = bigint_size (source); \
212 unsigned int dest_size = bigint_size (dest); \
213 bigint_grow_raw ( (source)->element, source_size, \
214 (dest)->element, dest_size ); \
223#define bigint_shrink( source, dest ) do { \
224 unsigned int source_size = bigint_size (source); \
225 unsigned int dest_size = bigint_size (dest); \
226 bigint_shrink_raw ( (source)->element, source_size, \
227 (dest)->element, dest_size ); \
236#define bigint_copy( source, dest ) do { \
237 build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \
238 bigint_shrink ( (source), (dest) ); \
248#define bigint_swap( first, second, swap ) do { \
249 unsigned int size = bigint_size (first); \
250 bigint_swap_raw ( (first)->element, (second)->element, size, \
261#define bigint_multiply( multiplicand, multiplier, result ) do { \
262 unsigned int multiplicand_size = bigint_size (multiplicand); \
263 unsigned int multiplier_size = bigint_size (multiplier); \
264 bigint_multiply_raw ( (multiplicand)->element, \
265 multiplicand_size, (multiplier)->element, \
266 multiplier_size, (result)->element ); \
275#define bigint_reduce( modulus, result ) do { \
276 unsigned int size = bigint_size (modulus); \
277 bigint_reduce_raw ( (modulus)->element, (result)->element, \
287#define bigint_mod_invert( invertend, inverse ) do { \
288 unsigned int size = bigint_size ( inverse ); \
289 bigint_mod_invert_raw ( (invertend)->element, \
290 (inverse)->element, size ); \
301#define bigint_montgomery_relaxed( modulus, value, result ) ( { \
302 unsigned int size = bigint_size (modulus); \
303 bigint_montgomery_relaxed_raw ( (modulus)->element, \
305 (result)->element, size ); \
315#define bigint_montgomery( modulus, value, result ) do { \
316 unsigned int size = bigint_size (modulus); \
317 bigint_montgomery_raw ( (modulus)->element, (value)->element, \
318 (result)->element, size ); \
331#define bigint_ladder( result, multiple, exponent, op, ctx, tmp ) do { \
332 unsigned int size = bigint_size (result); \
333 unsigned int exponent_size = bigint_size (exponent); \
334 bigint_ladder_raw ( (result)->element, (multiple)->element, \
335 size, (exponent)->element, exponent_size, \
336 (op), (ctx), (tmp) ); \
348#define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \
349 unsigned int size = bigint_size (base); \
350 unsigned int exponent_size = bigint_size (exponent); \
351 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \
352 (exponent)->element, (result)->element, \
353 size, exponent_size, tmp ); \
362#define bigint_mod_exp_tmp_len( modulus ) \
363 sizeof ( struct { typeof ( *(modulus) ) temp[4]; } )
378 unsigned int size,
const void *
ctx,
411 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
429 ( (
const void * )
value0 );
430 unsigned int index = (
bit / ( 8 *
sizeof (
value->element[0] ) ) );
446 ( (
const void * )
value0 );
448 unsigned int subindex = ( ( 8 *
sizeof (
value->element[0] ) ) - 1 );
456 const void *
data,
size_t len );
480 unsigned int size,
int swap );
486 unsigned int multiplicand_size,
488 unsigned int multiplier_size,
505 const void *
ctx,
void *
tmp );
508 const void *
ctx,
void *
tmp );
513 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.
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)
Compare big integers.
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)
Finalise big integer.
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)
Test if big integer is equal to zero.
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)
Initialise big integer.
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
Find highest bit set in big integer.
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