summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2022-10-13 19:16:36 +0200
committerNiels Möller <nisse@lysator.liu.se>2022-10-13 19:16:36 +0200
commitc875e575c56918addf54de9b39f91aaed5e7459f (patch)
tree946aed8439b2d55695cfb3bb62ead150115f5f32
parent6ff0510478d428f317dbb3cf62d2358be3321ffe (diff)
downloadnettle-c875e575c56918addf54de9b39f91aaed5e7459f.tar.gz
Add back implementation of mpn_sec_tabselect, for mini-gmp builds.
-rw-r--r--ChangeLog7
-rw-r--r--gmp-glue.c20
-rw-r--r--gmp-glue.h4
3 files changed, 31 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 98dc40a4..3dc357f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2022-10-13 Niels Möller <nisse@lysator.liu.se>
+
+ * gmp-glue.c (mpn_sec_tabselect) [NETTLE_USE_MINI_GMP]: Add back
+ here, to support mini-gmp builds. Updated signature to be
+ compatible with the gmp version.
+ * gmp-glue.h: Add declaration.
+
2022-10-11 Niels Möller <nisse@lysator.liu.se>
* sec-tabselect.c (sec_tabselect): Delete file and function. All
diff --git a/gmp-glue.c b/gmp-glue.c
index e75d678b..ffce6c30 100644
--- a/gmp-glue.c
+++ b/gmp-glue.c
@@ -99,6 +99,26 @@ mpn_cnd_swap (mp_limb_t cnd, volatile mp_limb_t *ap, volatile mp_limb_t *bp, mp_
}
}
+/* Copy the k'th element of the table out tn elements, each of size
+ rn. Always read complete table. Similar to gmp's mpn_tabselect. */
+void
+mpn_sec_tabselect (volatile mp_limb_t *rp, volatile const mp_limb_t *table,
+ mp_size_t rn, unsigned tn, unsigned k)
+{
+ volatile const mp_limb_t *end = table + tn * rn;
+ volatile const mp_limb_t *p;
+ mp_size_t i;
+
+ assert (k < tn);
+ for (p = table; p < end; p += rn, k--)
+ {
+ mp_limb_t mask = - (mp_limb_t) (k == 0);
+ for (i = 0; i < rn; i++)
+ rp[i] = (~mask & rp[i]) | (mask & p[i]);
+ }
+}
+
+
#endif /* NETTLE_USE_MINI_GMP */
int
diff --git a/gmp-glue.h b/gmp-glue.h
index bc6dbf16..dc0ede2a 100644
--- a/gmp-glue.h
+++ b/gmp-glue.h
@@ -66,6 +66,10 @@ mpn_cnd_sub_n (mp_limb_t cnd, mp_limb_t *rp,
void
mpn_cnd_swap (mp_limb_t cnd, volatile mp_limb_t *ap, volatile mp_limb_t *bp, mp_size_t n);
+
+void
+mpn_sec_tabselect (volatile mp_limb_t *rp, volatile const mp_limb_t *table,
+ mp_size_t rn, unsigned tn, unsigned k);
#endif
/* Side-channel silent variant of mpn_zero_p. */