summaryrefslogtreecommitdiff
path: root/mpi
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2021-04-03 21:53:51 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2021-04-09 17:23:18 +0300
commitc7c25b6e6e6b52bbed26d8016145c404eb118f19 (patch)
treeebef5e2eb22907c2d0b73277775330f6c12c6d4f /mpi
parent1266f5bb02b7f76f2e4697ecfb85ef19c2ae04a9 (diff)
downloadlibgcrypt-c7c25b6e6e6b52bbed26d8016145c404eb118f19.tar.gz
mpi: harden set_cond functions against EM leakage
* mpi/mpih-const-time.c (_gcry_mpih_set_cond): Use two masks for selecting output. * mpi/mpiutil.c (_gcry_mpi_set_cond): Use two masks for selecting output. -- GnuPG-bug-id: T5330 Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'mpi')
-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;
}