aboutsummaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/bigint.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/ipxe/bigint.h')
-rw-r--r--src/include/ipxe/bigint.h85
1 files changed, 64 insertions, 21 deletions
diff --git a/src/include/ipxe/bigint.h b/src/include/ipxe/bigint.h
index d8f4571e3..396462f33 100644
--- a/src/include/ipxe/bigint.h
+++ b/src/include/ipxe/bigint.h
@@ -147,6 +147,28 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
size ); } )
/**
+ * Set bit in big integer
+ *
+ * @v value Big integer
+ * @v bit Bit to set
+ */
+#define bigint_set_bit( value, bit ) do { \
+ unsigned int size = bigint_size (value); \
+ bigint_set_bit_raw ( (value)->element, size, bit ); \
+ } while ( 0 )
+
+/**
+ * Clear bit in big integer
+ *
+ * @v value Big integer
+ * @v bit Bit to set
+ */
+#define bigint_clear_bit( value, bit ) do { \
+ unsigned int size = bigint_size (value); \
+ bigint_clear_bit_raw ( (value)->element, size, bit ); \
+ } while ( 0 )
+
+/**
* Test if bit is set in big integer
*
* @v value Big integer
@@ -243,30 +265,18 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
} while ( 0 )
/**
- * Reduce big integer
+ * Reduce big integer R^2 modulo N
*
* @v modulus Big integer modulus
- * @v value Big integer to be reduced
+ * @v result Big integer to hold result
*/
-#define bigint_reduce( modulus, value ) do { \
+#define bigint_reduce( modulus, result ) do { \
unsigned int size = bigint_size (modulus); \
- bigint_reduce_raw ( (modulus)->element, (value)->element, \
+ bigint_reduce_raw ( (modulus)->element, (result)->element, \
size ); \
} while ( 0 )
/**
- * Reduce supremum of big integer representation
- *
- * @v modulus0 Big integer modulus
- * @v result0 Big integer to hold result
- */
-#define bigint_reduce_supremum( modulus, result ) do { \
- unsigned int size = bigint_size (modulus); \
- bigint_reduce_supremum_raw ( (modulus)->element, \
- (result)->element, size ); \
- } while ( 0 )
-
-/**
* Compute inverse of odd big integer modulo any power of two
*
* @v invertend Odd big integer to be inverted
@@ -370,6 +380,42 @@ typedef void ( bigint_ladder_op_t ) ( const bigint_element_t *operand0,
void *tmp );
/**
+ * Set bit in big integer
+ *
+ * @v value0 Element 0 of big integer
+ * @v size Number of elements
+ * @v bit Bit to set
+ */
+static inline __attribute__ (( always_inline )) void
+bigint_set_bit_raw ( bigint_element_t *value0, unsigned int size,
+ unsigned int bit ) {
+ bigint_t ( size ) __attribute__ (( may_alias )) *value =
+ ( ( void * ) value0 );
+ unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
+ unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
+
+ value->element[index] |= ( 1UL << subindex );
+}
+
+/**
+ * Clear bit in big integer
+ *
+ * @v value0 Element 0 of big integer
+ * @v size Number of elements
+ * @v bit Bit to clear
+ */
+static inline __attribute__ (( always_inline )) void
+bigint_clear_bit_raw ( bigint_element_t *value0, unsigned int size,
+ unsigned int bit ) {
+ bigint_t ( size ) __attribute__ (( may_alias )) *value =
+ ( ( void * ) value0 );
+ unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
+ unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
+
+ value->element[index] &= ~( 1UL << subindex );
+}
+
+/**
* Test if bit is set in big integer
*
* @v value0 Element 0 of big integer
@@ -442,11 +488,8 @@ void bigint_multiply_raw ( const bigint_element_t *multiplicand0,
const bigint_element_t *multiplier0,
unsigned int multiplier_size,
bigint_element_t *result0 );
-void bigint_reduce_raw ( bigint_element_t *modulus0, bigint_element_t *value0,
- unsigned int size );
-void bigint_reduce_supremum_raw ( bigint_element_t *modulus0,
- bigint_element_t *value0,
- unsigned int size );
+void bigint_reduce_raw ( const bigint_element_t *modulus0,
+ bigint_element_t *result0, unsigned int size );
void bigint_mod_invert_raw ( const bigint_element_t *invertend0,
bigint_element_t *inverse0, unsigned int size );
int bigint_montgomery_relaxed_raw ( const bigint_element_t *modulus0,