summaryrefslogtreecommitdiff
path: root/mpi/mpiutil.c
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/mpiutil.c
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/mpiutil.c')
-rw-r--r--mpi/mpiutil.c23
1 files changed, 15 insertions, 8 deletions
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;
}