diff options
Diffstat (limited to 'mpi')
-rw-r--r-- | mpi/mpiutil.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c index f74dd91c..fbbd3b47 100644 --- a/mpi/mpiutil.c +++ b/mpi/mpiutil.c @@ -482,6 +482,31 @@ _gcry_mpi_set (gcry_mpi_t w, gcry_mpi_t u) return w; } +gcry_mpi_t +_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; + + 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; + } + + x = mask & (w->nlimbs ^ u->nlimbs); + w->nlimbs = w->nlimbs ^ x; + + x = mask & (w->sign ^ u->sign); + w->sign = w->sign ^ x; + return w; +} + gcry_mpi_t _gcry_mpi_set_ui (gcry_mpi_t w, unsigned long u) @@ -545,10 +570,10 @@ _gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b) void _gcry_mpi_swap_cond (gcry_mpi_t a, gcry_mpi_t b, unsigned long swap) { - size_t i; - size_t nlimbs = a->alloced; - unsigned long mask = 0UL - !!swap; - unsigned long x; + mpi_size_t i; + mpi_size_t nlimbs = a->alloced; + mpi_limb_t mask = ((mpi_limb_t)0) - !!swap; + mpi_limb_t x; if (a->alloced != b->alloced) log_bug ("mpi_swap_cond: different sizes\n"); |