From 36d4b664adba3a927b1708d68f4754e90997b42f Mon Sep 17 00:00:00 2001 From: Simo Sorce <simo@redhat.com> Date: Mon, 12 Nov 2018 13:59:06 -0500 Subject: [PATCH] Add mpn_get_base256 Converts limbs to uint8_t buffer without conditional jumps. Signed-off-by: Simo Sorce <simo@redhat.com> --- gmp-glue.c | 31 +++++++++++++++++++++++++++++++ gmp-glue.h | 5 +++++ 2 files changed, 36 insertions(+) diff --git a/gmp-glue.c b/gmp-glue.c index c44332df..805b50c4 100644 --- a/gmp-glue.c +++ b/gmp-glue.c @@ -246,6 +246,37 @@ mpn_set_base256_le (mp_limb_t *rp, mp_size_t rn, } } +void +mpn_get_base256 (uint8_t *rp, size_t rn, + const mp_limb_t *xp, mp_size_t xn) +{ + unsigned bits; + mp_limb_t in; + for (bits = in = 0; xn > 0 && rn > 0; ) + { + if (bits >= 8) + { + rp[--rn] = in; + in >>= 8; + bits -= 8; + } + else + { + uint8_t old = in; + in = *xp++; + xn--; + rp[--rn] = old | (in << bits); + in >>= (8 - bits); + bits += GMP_NUMB_BITS - 8; + } + } + while (rn > 0) + { + rp[--rn] = in; + in >>= 8; + } +} + void mpn_get_base256_le (uint8_t *rp, size_t rn, const mp_limb_t *xp, mp_size_t xn) diff --git a/gmp-glue.h b/gmp-glue.h index 38cdd197..7f42cc2b 100644 --- a/gmp-glue.h +++ b/gmp-glue.h @@ -57,6 +57,7 @@ #define mpz_set_n _nettle_mpz_set_n #define mpn_set_base256 _nettle_mpn_set_base256 #define mpn_set_base256_le _nettle_mpn_set_base256_le +#define mpn_get_base256 _nettle_mpn_get_base256 #define mpn_get_base256_le _nettle_mpn_get_base256_le #define gmp_alloc_limbs _nettle_gmp_alloc_limbs #define gmp_free_limbs _nettle_gmp_free_limbs @@ -150,6 +151,10 @@ void mpn_set_base256_le (mp_limb_t *rp, mp_size_t rn, const uint8_t *xp, size_t xn); +void +mpn_get_base256 (uint8_t *rp, size_t rn, + const mp_limb_t *xp, mp_size_t xn); + void mpn_get_base256_le (uint8_t *rp, size_t rn, const mp_limb_t *xp, mp_size_t xn); -- GitLab