diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-04-03 21:53:51 +0300 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-04-09 17:23:18 +0300 |
commit | c7c25b6e6e6b52bbed26d8016145c404eb118f19 (patch) | |
tree | ebef5e2eb22907c2d0b73277775330f6c12c6d4f /mpi/mpiutil.c | |
parent | 1266f5bb02b7f76f2e4697ecfb85ef19c2ae04a9 (diff) | |
download | libgcrypt-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.c | 23 |
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; } |