bigint_t ( minuend_size ) modulus;
} *temp = tmp;
const unsigned int width = ( 8 * sizeof ( bigint_element_t ) );
- const bigint_element_t msb_mask = ( 1UL << ( width - 1 ) );
bigint_element_t *element;
unsigned int minuend_max;
unsigned int modulus_max;
unsigned int subshift;
- bigint_element_t msb;
int offset;
int shift;
+ int msb;
int i;
/* Start profiling */
} else {
bigint_subtract ( &temp->modulus, &temp->minuend );
}
- msb = ( temp->minuend.element[ minuend_size - 1 ] & msb_mask );
+ msb = bigint_msb_is_set ( &temp->minuend );
if ( shift > 0 )
bigint_shr ( &temp->modulus );
}
* @v value Big integer to be subtracted from, if possible
*/
static void x25519_reduce_by ( const x25519_t *subtrahend, x25519_t *value ) {
- unsigned int max_bit = ( ( 8 * sizeof ( *value ) ) - 1 );
x25519_t tmp;
/* Conditionally subtract subtrahend
*/
bigint_copy ( value, &tmp );
bigint_subtract ( subtrahend, value );
- bigint_swap ( value, &tmp, bigint_bit_is_set ( value, max_bit ) );
+ bigint_swap ( value, &tmp, bigint_msb_is_set ( value ) );
}
/**
unsigned int size = bigint_size (value); \
bigint_bit_is_set_raw ( (value)->element, size, bit ); } )
+/**
+ * Test if most significant bit is set in big integer
+ *
+ * @v value Big integer
+ * @ret is_set Most significant bit is set
+ */
+#define bigint_msb_is_set( value ) ( { \
+ unsigned int size = bigint_size (value); \
+ bigint_msb_is_set_raw ( (value)->element, size ); } )
+
/**
* Find highest bit set in big integer
*
return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
}
+/**
+ * Test if most significant bit is set in big integer
+ *
+ * @v value0 Element 0 of big integer
+ * @v size Number of elements
+ * @ret is_set Most significant bit is set
+ */
+static inline __attribute__ (( always_inline )) int
+bigint_msb_is_set_raw ( const bigint_element_t *value0, unsigned int size ) {
+ const bigint_t ( size ) __attribute__ (( may_alias )) *value =
+ ( ( const void * ) value0 );
+ unsigned int index = ( size - 1 );
+ unsigned int subindex = ( ( 8 * sizeof ( value->element[0] ) ) - 1 );
+
+ return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
+}
+
void bigint_init_raw ( bigint_element_t *value0, unsigned int size,
const void *data, size_t len );
void bigint_done_raw ( const bigint_element_t *value0, unsigned int size,