[PATCH 2/3] mpih-const-time: avoid branches in _gcry_mpih_cmp_ui

Jussi Kivilinna jussi.kivilinna at iki.fi
Mon Feb 3 20:22:08 CET 2025


* mpi/mpih-const-time.c (_gcry_mpih_cmp_ui): Avoid conditional
branches for return value selection.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
 mpi/mpih-const-time.c | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/mpi/mpih-const-time.c b/mpi/mpih-const-time.c
index e684b956..d8b66c46 100644
--- a/mpi/mpih-const-time.c
+++ b/mpi/mpih-const-time.c
@@ -222,20 +222,15 @@ _gcry_mpih_mod_lli (mpi_ptr_t vp, mpi_size_t vsize,
 int
 _gcry_mpih_cmp_ui (mpi_ptr_t up, mpi_size_t usize, unsigned long v)
 {
-  int is_all_zero = 1;
+  unsigned long is_all_zero = ct_ulong_gen_mask(1);
+  int cmp0;
   mpi_size_t i;
 
+  cmp0 = -mpih_ct_limb_less_than (up[0], v);
+  cmp0 |= mpih_ct_limb_greater_than (up[0], v);
+
   for (i = 1; i < usize; i++)
-    is_all_zero &= mpih_limb_is_zero (up[i]);
+    is_all_zero &= ct_ulong_gen_mask(mpih_limb_is_zero (up[i]));
 
-  if (is_all_zero)
-    {
-      if (up[0] < v)
-        return -1;
-      else if (up[0] > v)
-        return 1;
-      else
-        return 0;
-    }
-  return 1;
+  return cmp0 & (int)is_all_zero;
 }
-- 
2.45.2




More information about the Gcrypt-devel mailing list