summaryrefslogtreecommitdiff
path: root/mpi
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2014-07-16 17:05:55 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2014-07-16 17:05:55 +0900
commit4846e52728970e3117f3a046ef9010be089a3ae4 (patch)
tree067a7731712ccf82f6024b11b05be5cbdcb4d7c4 /mpi
parent1b9b00bbe41bbed32563f1102049521e703e72bd (diff)
downloadlibgcrypt-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.c28
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)
{