summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mpi/mpih-const-time.c7
-rw-r--r--mpi/mpiutil.c23
2 files changed, 18 insertions, 12 deletions
diff --git a/mpi/mpih-const-time.c b/mpi/mpih-const-time.c
index 8b78aabc..3a69e6ba 100644
--- a/mpi/mpih-const-time.c
+++ b/mpi/mpih-const-time.c
@@ -40,13 +40,12 @@ _gcry_mpih_set_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
unsigned long op_enable)
{
mpi_size_t i;
- mpi_limb_t mask = ((mpi_limb_t)0) - op_enable;
- mpi_limb_t x;
+ mpi_limb_t mask1 = vzero - op_enable;
+ mpi_limb_t mask2 = op_enable - vone;
for (i = 0; i < usize; i++)
{
- x = mask & (wp[i] ^ up[i]);
- wp[i] = wp[i] ^ x;
+ wp[i] = (wp[i] & mask2) | (up[i] & mask1);
}
}
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c
index a1ac1c43..5320f4d8 100644
--- a/mpi/mpiutil.c
+++ b/mpi/mpiutil.c
@@ -519,23 +519,30 @@ _gcry_mpi_set_cond (gcry_mpi_t w, const gcry_mpi_t u, unsigned long set)
{
mpi_size_t i;
mpi_size_t nlimbs = u->alloced;
- mpi_limb_t mask = ((mpi_limb_t)0) - set;
- mpi_limb_t x;
+ mpi_limb_t mask1 = vzero - set;
+ mpi_limb_t mask2 = set - vone;
+ mpi_limb_t xu;
+ mpi_limb_t xw;
+ mpi_limb_t *uu = u->d;
+ mpi_limb_t *uw = w->d;
if (w->alloced != u->alloced)
log_bug ("mpi_set_cond: different sizes\n");
for (i = 0; i < nlimbs; i++)
{
- x = mask & (w->d[i] ^ u->d[i]);
- w->d[i] = w->d[i] ^ x;
+ xu = uu[i];
+ xw = uw[i];
+ uw[i] = (xw & mask2) | (xu & mask1);
}
- x = mask & (w->nlimbs ^ u->nlimbs);
- w->nlimbs = w->nlimbs ^ x;
+ xu = u->nlimbs;
+ xw = w->nlimbs;
+ w->nlimbs = (xw & mask2) | (xu & mask1);
- x = mask & (w->sign ^ u->sign);
- w->sign = w->sign ^ x;
+ xu = u->sign;
+ xw = w->sign;
+ w->sign = (xw & mask2) | (xu & mask1);
return w;
}