From: Niels Möller Date: Tue, 18 Oct 2005 18:58:26 +0000 (+0200) Subject: (nettle_mpz_from_octets): Removed sign argument. If X-Git-Tag: nettle_1.14_release_20051205~77 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=496df00f3bb616fdae35ed08cea0b5cd20bc77ea;p=thirdparty%2Fnettle.git (nettle_mpz_from_octets): Removed sign argument. If mpz_import is available, define nettle_mpz_from_octets as a macro calling mpz_import. (nettle_mpz_from_octets): Start by setting x to zero; callers no longer need to do that. (nettle_mpz_set_str_256_s): New logic for the handling of negative numbers. Convert in the same way as for positive numbers, and then subtract the appropriate power of two. Rev: src/nettle/bignum.c:1.9 --- diff --git a/bignum.c b/bignum.c index a4cb99a3..04a7920d 100644 --- a/bignum.c +++ b/bignum.c @@ -131,54 +131,64 @@ nettle_mpz_get_str_256(unsigned length, uint8_t *s, const mpz_t x) } /* Converting from strings */ + +#ifdef mpz_import +/* Was introduced in GMP-4.1 */ +# define nettle_mpz_from_octets(x, length, s) \ + mpz_import((x), (length), 1, 1, 0, 0, (s)) +#else static void nettle_mpz_from_octets(mpz_t x, - unsigned length, const uint8_t *s, - uint8_t sign) + unsigned length, const uint8_t *s) { unsigned i; - /* FIXME: See if we can use something like - mpz_import(x, length, 1, 1, 0, 0, s). */ + mpz_set_ui(x, 0); + for (i = 0; i < length; i++) { mpz_mul_2exp(x, x, 8); - mpz_add_ui(x, x, sign ^ s[i]); + mpz_add_ui(x, x, s[i]); } } +#endif void nettle_mpz_set_str_256_u(mpz_t x, unsigned length, const uint8_t *s) { - mpz_set_ui(x, 0); - nettle_mpz_from_octets(x, length, s, 0); + nettle_mpz_from_octets(x, length, s); } void nettle_mpz_init_set_str_256_u(mpz_t x, unsigned length, const uint8_t *s) { - mpz_init_set_ui(x, 0); - nettle_mpz_from_octets(x, length, s, 0); + mpz_init(x); + nettle_mpz_from_octets(x, length, s); } void nettle_mpz_set_str_256_s(mpz_t x, unsigned length, const uint8_t *s) { - mpz_set_ui(x, 0); - if (!length) - return; + { + mpz_set_ui(x, 0); + return; + } + nettle_mpz_from_octets(x, length, s); + if (s[0] & 0x80) { - nettle_mpz_from_octets(x, length, s, 0xff); - mpz_com(x, x); + mpz_t t; + + mpz_init_set_ui(t, 1); + mpz_mul_2exp(t, t, length*8); + mpz_sub(x, x, t); + mpz_clear(t); } - else - nettle_mpz_from_octets(x, length, s, 0); } void