summaryrefslogtreecommitdiffstats
path: root/src/crypto/bigint.c
diff options
context:
space:
mode:
authorSimon Rettberg2024-04-12 14:00:15 +0200
committerSimon Rettberg2024-04-12 14:00:15 +0200
commit98dc341428e247141f120d05fac48c4e144a4c0f (patch)
tree3ebacb37927e338383ac64c2e20eb0b2f820cb85 /src/crypto/bigint.c
parentMerge branch 'master' into openslx (diff)
parentMerge branch 'ipxe:master' into aqc1xx (diff)
downloadipxe-98dc341428e247141f120d05fac48c4e144a4c0f.tar.gz
ipxe-98dc341428e247141f120d05fac48c4e144a4c0f.tar.xz
ipxe-98dc341428e247141f120d05fac48c4e144a4c0f.zip
Merge branch 'aqc1xx' into openslx
Diffstat (limited to 'src/crypto/bigint.c')
-rw-r--r--src/crypto/bigint.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/crypto/bigint.c b/src/crypto/bigint.c
index ac9670ef..656f979e 100644
--- a/src/crypto/bigint.c
+++ b/src/crypto/bigint.c
@@ -51,6 +51,31 @@ static struct profiler bigint_mod_multiply_subtract_profiler __profiler =
{ .name = "bigint_mod_multiply.subtract" };
/**
+ * Conditionally swap big integers (in constant time)
+ *
+ * @v first0 Element 0 of big integer to be conditionally swapped
+ * @v second0 Element 0 of big integer to be conditionally swapped
+ * @v size Number of elements in big integers
+ * @v swap Swap first and second big integers
+ */
+void bigint_swap_raw ( bigint_element_t *first0, bigint_element_t *second0,
+ unsigned int size, int swap ) {
+ bigint_element_t mask;
+ bigint_element_t xor;
+ unsigned int i;
+
+ /* Construct mask */
+ mask = ( ( bigint_element_t ) ( ! swap ) - 1 );
+
+ /* Conditionally swap elements */
+ for ( i = 0 ; i < size ; i++ ) {
+ xor = ( mask & ( first0[i] ^ second0[i] ) );
+ first0[i] ^= xor;
+ second0[i] ^= xor;
+ }
+}
+
+/**
* Perform modular multiplication of big integers
*
* @v multiplicand0 Element 0 of big integer to be multiplied