diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2014-07-16 17:05:55 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2014-07-16 17:05:55 +0900 |
commit | 4846e52728970e3117f3a046ef9010be089a3ae4 (patch) | |
tree | 067a7731712ccf82f6024b11b05be5cbdcb4d7c4 /mpi | |
parent | 1b9b00bbe41bbed32563f1102049521e703e72bd (diff) | |
download | libgcrypt-4846e52728970e3117f3a046ef9010be089a3ae4.tar.gz |
mpi: Add mpi_swap_cond.
* mpi/mpiutil.c (_gcry_mpi_swap_cond): New.
* src/mpi.h (mpi_swap_cond): New.
--
This is an internal function for now.
Diffstat (limited to 'mpi')
-rw-r--r-- | mpi/mpiutil.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c index fdce578e..f74dd91c 100644 --- a/mpi/mpiutil.c +++ b/mpi/mpiutil.c @@ -542,6 +542,34 @@ _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; + + if (a->alloced != b->alloced) + log_bug ("mpi_swap_cond: different sizes\n"); + + for (i = 0; i < nlimbs; i++) + { + x = mask & (a->d[i] ^ b->d[i]); + a->d[i] = a->d[i] ^ x; + b->d[i] = b->d[i] ^ x; + } + + x = mask & (a->nlimbs ^ b->nlimbs); + a->nlimbs = a->nlimbs ^ x; + b->nlimbs = b->nlimbs ^ x; + + x = mask & (a->sign ^ b->sign); + a->sign = a->sign ^ x; + b->sign = b->sign ^ x; +} + + gcry_mpi_t _gcry_mpi_new (unsigned int nbits) { |