summaryrefslogtreecommitdiff
path: root/mpn
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gmplib.org>2011-11-15 00:49:29 +0100
committerTorbjorn Granlund <tege@gmplib.org>2011-11-15 00:49:29 +0100
commite1d8e2b8173bbd8e9b034722206979eef782df2c (patch)
treea4bf95e0081f43df6a0c1b5770491d793fd25781 /mpn
parent305da91c761535cf2b6fcdf4239aae04fa72e5da (diff)
downloadgmp-e1d8e2b8173bbd8e9b034722206979eef782df2c.tar.gz
Separate mpn_tabselect from mpn_powm_sec and prepare for asm support.
Diffstat (limited to 'mpn')
-rw-r--r--mpn/asm-defs.m41
-rw-r--r--mpn/generic/powm_sec.c25
-rw-r--r--mpn/generic/tabselect.c48
3 files changed, 49 insertions, 25 deletions
diff --git a/mpn/asm-defs.m4 b/mpn/asm-defs.m4
index 4f049b21b..7a5639fbe 100644
--- a/mpn/asm-defs.m4
+++ b/mpn/asm-defs.m4
@@ -1471,6 +1471,7 @@ define_mpn(sub_n)
define_mpn(sub_nc)
define_mpn(submul_1)
define_mpn(submul_1c)
+define_mpn(tabselect)
define_mpn(umul_ppmm)
define_mpn(umul_ppmm_r)
define_mpn(udiv_qrnnd)
diff --git a/mpn/generic/powm_sec.c b/mpn/generic/powm_sec.c
index c6358947b..d7ed2b486 100644
--- a/mpn/generic/powm_sec.c
+++ b/mpn/generic/powm_sec.c
@@ -320,31 +320,6 @@ mpn_powm_sec (mp_ptr rp, mp_srcptr bp, mp_size_t bn,
TMP_FREE;
}
-#if ! HAVE_NATIVE_mpn_tabselect
-/* Select entry `which' from table `tab', which has nents entries, each `n'
- limbs. Store the selected entry at rp. Reads entire table to avoid
- side-channel information leaks. O(n*nents).
- FIXME: Move to its own file. */
-void
-mpn_tabselect (volatile mp_limb_t *rp, volatile mp_limb_t *tab, mp_size_t n,
- mp_size_t nents, mp_size_t which)
-{
- mp_size_t k, i;
- mp_limb_t mask;
- volatile mp_limb_t *tp;
-
- for (k = 0; k < nents; k++)
- {
- mask = -(mp_limb_t) (which == k);
- tp = tab + n * k;
- for (i = 0; i < n; i++)
- {
- rp[i] = (rp[i] & ~mask) | (tp[i] & mask);
- }
- }
-}
-#endif
-
mp_size_t
mpn_powm_sec_itch (mp_size_t bn, mp_size_t en, mp_size_t n)
{
diff --git a/mpn/generic/tabselect.c b/mpn/generic/tabselect.c
new file mode 100644
index 000000000..02e52fdc0
--- /dev/null
+++ b/mpn/generic/tabselect.c
@@ -0,0 +1,48 @@
+/* mpn_tabselect.
+
+ THIS IS AN INTERNAL FUNCTION WITH A MUTABLE INTERFACE. IT IS ONLY
+ SAFE TO REACH THIS FUNCTION THROUGH DOCUMENTED INTERFACES.
+
+Copyright 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
+
+#include "gmp.h"
+#include "gmp-impl.h"
+
+
+/* Select entry `which' from table `tab', which has nents entries, each `n'
+ limbs. Store the selected entry at rp. Reads entire table to avoid
+ side-channel information leaks. O(n*nents).
+ FIXME: Move to its own file. */
+void
+mpn_tabselect (volatile mp_limb_t *rp, volatile mp_limb_t *tab, mp_size_t n,
+ mp_size_t nents, mp_size_t which)
+{
+ mp_size_t k, i;
+ mp_limb_t mask;
+ volatile mp_limb_t *tp;
+
+ for (k = 0; k < nents; k++)
+ {
+ mask = -(mp_limb_t) (which == k);
+ tp = tab + n * k;
+ for (i = 0; i < n; i++)
+ {
+ rp[i] = (rp[i] & ~mask) | (tp[i] & mask);
+ }
+ }
+}