41#define BIGINT_NTOA_LSB_MIN 16
65 if (
count >= ( (
sizeof ( buf ) - 1 ) / 2 ) ) {
66 threshold -= ( (
sizeof ( buf ) - 3
72 for (
tmp = buf, i = (
count - 1 ) ; i >= 0 ; i-- ) {
76 if ( i == threshold ) {
81 assert (
tmp < ( buf +
sizeof ( buf ) ) );
95 const void *
data,
size_t len ) {
108 (
sizeof (
value->element[0] ) - 1 ) );
109 for ( i = 0 ;
len-- ; i++ )
110 value_byte[ i ^ toggle ] = data_byte[
len];
135 (
sizeof (
value->element[0] ) - 1 ) );
136 for ( i = 0 ;
len-- ; i++ )
137 out_byte[
len] = value_byte[ i ^ toggle ];
149 ( (
const void * )
value0 );
154 for ( i = 0, or = 0 ; i <
size ; i++ )
155 or |=
value->element[i];
170 unsigned int size ) {
172 ( (
const void * )
value0 );
174 ( (
const void * ) reference0 );
180 value_element =
value->element[
size - 1 ];
181 reference_element = reference->element[
size - 1 ];
182 if ( value_element != reference_element )
186 return ( value_element >= reference_element );
197 unsigned int size ) {
199 ( (
const void * )
value0 );
201 unsigned int max_bit;
205 max_bit = (
sizeof ( *value ) * 8 );
206 for ( i = 0 ; i <
size ; i++ ) {
208 max_bit -= (
sizeof (
element) * 8 );
227 unsigned int size,
int swap ) {
236 for ( i = 0 ; i <
size ; i++ ) {
237 xor = ( mask & ( first0[i] ^ second0[i] ) );
253 unsigned int multiplicand_size,
255 unsigned int multiplier_size,
257 unsigned int result_size = ( multiplicand_size + multiplier_size );
259 *multiplicand = ( (
const void * ) multiplicand0 );
261 *
multiplier = ( (
const void * ) multiplier0 );
263 *
result = ( (
void * ) result0 );
297 for ( i = 0 ; i < multiplicand_size ; i++ ) {
298 multiplicand_element = multiplicand->element[i];
300 result_element = &
result->element[i];
302 for ( j = 0 ; j < multiplier_size ; j++ ) {
304 *(multiplier_element++),
308 *result_element = carry_element;
326 *modulus = ( (
const void * ) modulus0 );
328 *
result = ( (
void * ) result0 );
408 shift = ( ( 2 *
size * width ) -
max );
434 sign = ( msb ^
carry );
455 *invertend = ( (
const void * ) invertend0 );
457 *inverse = ( (
void * ) inverse0 );
466 memset ( inverse, 0xff,
sizeof ( *inverse ) );
491 for ( i =
size ; i > 0 ; i-- ) {
493 *addend = ( (
const void * ) invertend );
495 *residue = ( (
void * ) inverse );
498 for ( accum = 0,
bit = 1 ;
bit ;
bit <<= 1 ) {
507 inverse->element[ i - 1 ] = accum;
511 for ( i = 0 ; i < (
size / 2 ) ; i++ ) {
512 accum = inverse->element[i];
513 inverse->element[i] = inverse->element[
size - 1 - i ];
514 inverse->element[
size - 1 - i ] = accum;
625 unsigned int size ) {
627 *modulus = ( (
const void * ) modulus0 );
636 *
result = ( (
void * ) result0 );
649 if ( cached.element[0] != modulus->element[0] ) {
651 negmodinv.element[0] = -negmodinv.element[0];
652 cached.element[0] = modulus->element[0];
656 for ( i = 0 ; i <
size ; i++ ) {
659 multiple = (
value->low.element[i] * negmodinv.element[0] );
663 for ( j = 0 ; j <
size ; j++ ) {
665 &
value->full.element[ i + j ],
702 unsigned int size ) {
704 *modulus = ( (
const void * ) modulus0 );
713 *
result = ( (
void * ) result0 );
770 const void *
ctx,
void *
tmp ) {
772 *
result = ( (
void * ) result0 );
774 *multiple = ( (
void * ) multiple0 );
776 *exponent = ( (
const void * ) exponent0 );
778 unsigned int bit = ( exponent_size * width );
856 const void *
ctx,
void *
tmp ) {
858 *
multiplier = ( (
const void * ) multiplier0 );
860 *
result = ( (
void * ) result0 );
862 *modulus = ( (
const void * )
ctx );
890 unsigned int size,
unsigned int exponent_size,
893 ( (
const void * ) base0 );
895 ( (
const void * ) modulus0 );
897 *exponent = ( (
const void * ) exponent0 );
899 ( (
void * ) result0 );
913 unsigned int subsize;
932 subsize = ( ( scale + width - 1 ) / width );
933 submask = ( ( 1UL << ( scale % width ) ) - 1 );
951 &temp->modulus, &temp->product );
961 *subbase = ( (
const void * )
base );
963 *submodulus = ( (
void * ) &temp->modulus );
965 *substash = ( (
void * ) &temp->stash );
967 *subresult = ( (
void * )
result );
972 *subproduct = ( (
void * ) &temp->product.full );
982 for ( i = 0 ; i < scale ; i++ )
992 subproduct->low.element[ subsize - 1 ] &= submask;
1001 &temp->product.full );
#define NULL
NULL pointer (VOID *).
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.
#define assert(condition)
Assert a condition at run-time.
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.
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_done_raw(const bigint_element_t *value0, unsigned int size, void *out, size_t len)
Finalise big integer.
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.
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.
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.
#define BIGINT_NTOA_LSB_MIN
Minimum number of least significant bytes included in transcription.
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
Find highest bit set in 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.
uint8_t data[48]
Additional event data.
uint16_t size
Buffer size.
static unsigned int count
Number of entries.
#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.
#define __LITTLE_ENDIAN
Constant representing little-endian byte order.
#define bigint_grow(source, dest)
Grow big integer.
#define bigint_ladder(result, multiple, exponent, op, ctx, tmp)
Perform generalised exponentiation via a Montgomery ladder.
#define bigint_bit_is_set(value, bit)
Test if bit is set in big integer.
#define bigint_montgomery_relaxed(modulus, value, result)
Perform relaxed Montgomery reduction (REDC) of a big integer.
#define bigint_mod_exp_tmp_len(modulus)
Calculate temporary working space required for moduluar exponentiation.
void bigint_multiply_one(const bigint_element_t multiplicand, const bigint_element_t multiplier, bigint_element_t *result, bigint_element_t *carry)
#define bigint_set_bit(value, bit)
Set bit in big integer.
#define bigint_reduce(modulus, result)
Reduce big integer R^2 modulo N.
#define bigint_shl(value)
Shift big integer left.
#define bigint_subtract(subtrahend, value)
Subtract big integers.
#define bigint_montgomery(modulus, value, result)
Perform classic Montgomery reduction (REDC) of a big integer.
#define bigint_shrink(source, dest)
Shrink big integer.
static unsigned int unsigned int bit
#define bigint_mod_invert(invertend, inverse)
Compute inverse of odd big integer modulo any power of two.
#define bigint_max_set_bit(value)
Find highest bit set in big integer.
#define bigint_copy(source, dest)
Copy big integer.
#define bigint_is_geq(value, reference)
Compare big integers.
#define bigint_t(size)
Define a big-integer type.
#define bigint_shr(value)
Shift big integer right.
#define bigint_multiply(multiplicand, multiplier, result)
Multiply big integers.
#define bigint_add(addend, value)
Add big integers.
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.
#define bigint_swap(first, second, swap)
Conditionally swap big integers (in constant time).
#define bigint_init(value, data, len)
Initialise big integer.
uint8_t product
Product string.
void * memset(void *dest, int character, size_t len) __nonnull
#define flsll(x)
Find last (i.e.
uint32_t high
High 32 bits of address.
uint32_t low
Low 16 bits of address.
static uint16_t struct vmbus_xfer_pages_operations * op
#define sprintf(buf, fmt,...)
Write a formatted string to a buffer.
static u32 xor(u32 a, u32 b)