From fd7c847286d06baeb785298ec359f91c4f21d141 Mon Sep 17 00:00:00 2001 From: czurnieden Date: Sun, 13 Oct 2019 04:51:43 +0200 Subject: [PATCH 1/8] Addition of shortcuts for bases that are powers of two and for base 10 to mp_radix_size --- bn_mp_log_u32.c | 185 ++++++++++++++++++++++++++++++++++ bn_s_mp_log_power_of_two.c | 15 +++ bn_s_mp_radix_size_radix_10.c | 60 +++++++++++ demo/test.c | 57 ++++++++++- libtommath_VS2008.vcproj | 12 +++ makefile | 15 +-- makefile.mingw | 15 +-- makefile.msvc | 15 +-- makefile.shared | 15 +-- makefile.unix | 15 +-- mp_radix_size.c | 16 ++- tommath.def | 1 + tommath_class.h | 39 ++++++- 13 files changed, 421 insertions(+), 39 deletions(-) create mode 100644 bn_mp_log_u32.c create mode 100644 bn_s_mp_log_power_of_two.c create mode 100644 bn_s_mp_radix_size_radix_10.c diff --git a/bn_mp_log_u32.c b/bn_mp_log_u32.c new file mode 100644 index 000000000..9d9cfcded --- /dev/null +++ b/bn_mp_log_u32.c @@ -0,0 +1,185 @@ +#include "tommath_private.h" +#ifdef BN_MP_LOG_U32_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis */ +/* SPDX-License-Identifier: Unlicense */ + +/* Compute log_{base}(a) */ +static mp_word s_pow(mp_word base, mp_word exponent) +{ + mp_word result = 1uLL; + while (exponent != 0u) { + if ((exponent & 1u) == 1u) { + result *= base; + } + exponent >>= 1; + base *= base; + } + + return result; +} + +static mp_digit s_digit_ilogb(mp_digit base, mp_digit n) +{ + mp_word bracket_low = 1uLL, bracket_mid, bracket_high, N; + mp_digit ret, high = 1uL, low = 0uL, mid; + + if (n < base) { + return 0uL; + } + if (n == base) { + return 1uL; + } + + bracket_high = (mp_word) base ; + N = (mp_word) n; + + while (bracket_high < N) { + low = high; + bracket_low = bracket_high; + high <<= 1; + bracket_high *= bracket_high; + } + + while (((mp_digit)(high - low)) > 1uL) { + mid = (low + high) >> 1; + bracket_mid = bracket_low * s_pow(base, (mp_word)(mid - low)); + + if (N < bracket_mid) { + high = mid ; + bracket_high = bracket_mid ; + } + if (N > bracket_mid) { + low = mid ; + bracket_low = bracket_mid ; + } + if (N == bracket_mid) { + return (mp_digit) mid; + } + } + + if (bracket_high == N) { + ret = high; + } else { + ret = low; + } + + return ret; +} + +/* TODO: output could be "int" because the output of mp_radix_size is int, too, + as is the output of mp_bitcount. + With the same problem: max size is INT_MAX * MP_DIGIT not INT_MAX only! +*/ +mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) +{ + mp_err err; + mp_ord cmp; + uint32_t high, low, mid; + mp_int bracket_low, bracket_high, bracket_mid, t, bi_base; + + err = MP_OKAY; + + if (a->sign == MP_NEG) { + return MP_VAL; + } + + if (MP_IS_ZERO(a)) { + return MP_VAL; + } + + if (base < 2u) { + return MP_VAL; + } + + /* A small shortcut for bases that are powers of two. */ + if ((base & (base - 1u)) == 0u) { + int y, bit_count; + for (y=0; (y < 7) && ((base & 1u) == 0u); y++) { + base >>= 1; + } + bit_count = mp_count_bits(a) - 1; + *c = (uint32_t)(bit_count/y); + return MP_OKAY; + } + + if (a->used == 1) { + *c = (uint32_t)s_digit_ilogb(base, a->dp[0]); + return err; + } + + cmp = mp_cmp_d(a, base); + if ((cmp == MP_LT) || (cmp == MP_EQ)) { + *c = cmp == MP_EQ; + return err; + } + if (!(base & (base - 1u))) { + low = (uint32_t)s_mp_log_power_of_two(a, (int)base); + mp_set_u32(c, low); + return MP_OKAY; + } + + if ((err = + mp_init_multi(&bracket_low, &bracket_high, + &bracket_mid, &t, &bi_base, NULL)) != MP_OKAY) { + return err; + } + + low = 0u; + mp_set(&bracket_low, 1uL); + high = 1u; + + mp_set(&bracket_high, base); + + /* + A kind of Giant-step/baby-step algorithm. + Idea shamelessly stolen from https://programmingpraxis.com/2010/05/07/integer-logarithms/2/ + The effect is asymptotic, hence needs benchmarks to test if the Giant-step should be skipped + for small n. + */ + while (mp_cmp(&bracket_high, a) == MP_LT) { + low = high; + if ((err = mp_copy(&bracket_high, &bracket_low)) != MP_OKAY) { + goto LBL_ERR; + } + high <<= 1; + if ((err = mp_sqr(&bracket_high, &bracket_high)) != MP_OKAY) { + goto LBL_ERR; + } + } + mp_set(&bi_base, base); + + while ((high - low) > 1u) { + mid = (high + low) >> 1; + + if ((err = mp_expt_u32(&bi_base, (uint32_t)(mid - low), &t)) != MP_OKAY) { + goto LBL_ERR; + } + if ((err = mp_mul(&bracket_low, &t, &bracket_mid)) != MP_OKAY) { + goto LBL_ERR; + } + cmp = mp_cmp(a, &bracket_mid); + if (cmp == MP_LT) { + high = mid; + mp_exch(&bracket_mid, &bracket_high); + } + if (cmp == MP_GT) { + low = mid; + mp_exch(&bracket_mid, &bracket_low); + } + if (cmp == MP_EQ) { + *c = mid; + goto LBL_END; + } + } + + *c = (mp_cmp(&bracket_high, a) == MP_EQ) ? high : low; + +LBL_END: +LBL_ERR: + mp_clear_multi(&bracket_low, &bracket_high, &bracket_mid, + &t, &bi_base, NULL); + return err; +} + + +#endif diff --git a/bn_s_mp_log_power_of_two.c b/bn_s_mp_log_power_of_two.c new file mode 100644 index 000000000..177804845 --- /dev/null +++ b/bn_s_mp_log_power_of_two.c @@ -0,0 +1,15 @@ +#include "tommath_private.h" +#ifdef BN_S_MP_LOG_POWER_OF_TWO_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis */ +/* SPDX-License-Identifier: Unlicense */ + +int s_mp_log_power_of_two(const mp_int *a, int p_of_2) +{ + int x, bit_count; + for (x = 0; (x < 7) && !((unsigned int)p_of_2 & 1u); x++) { + p_of_2 >>= 1; + } + bit_count = mp_count_bits(a) - 1; + return (bit_count/x); +} +#endif diff --git a/bn_s_mp_radix_size_radix_10.c b/bn_s_mp_radix_size_radix_10.c new file mode 100644 index 000000000..68aa46e1b --- /dev/null +++ b/bn_s_mp_radix_size_radix_10.c @@ -0,0 +1,60 @@ +#include "tommath_private.h" +#ifdef BN_S_MP_RADIX_SIZE_RADIX_10_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis */ +/* SPDX-License-Identifier: Unlicense */ + + +#define LTM_RADIX_SIZE_SCALE 64 +#define LTM_RADIX_SIZE_CONST_SHIFT 16 +int s_mp_radix_size_radix_10(const mp_int *a, int *size) +{ + mp_err err; + /* + floor(2^64/log_2(10)) = 5553023288523357132 + + We need that much precision. Example: + + log_2(x) = log(x)/log(2) + 198096465/log_2(10) = 59632978.000000002598316594477929217520 + + Which are more than 16 decimal digits, so with BINARY_64 (C's "double") + a 'ceil(198096465/log_2(10))' would result wrongly in 59632978.0. + */ + /* + TODO: This is safe for MP_8BIT, change to + const uint32_t inv_log_2_10[2] = {0x4d104d42U, 0x7de7fbccU} + or branch even further with + const uint64_t inv_log_2_10 = {0x4d104d427de7fbccULL}; + when MP_8BIT got the boot. + */ + const uint16_t inv_log_2_10[4] = {0x4d10u, 0x4d42u, 0x7de7u, 0xfbccu}; + mp_int bi_bit_count, bi_k, t; + int i, bit_count; + if ((err = mp_init_multi(&bi_bit_count, &bi_k, &t, NULL)) != MP_OKAY) { + return err; + } + for (i = 0; i < (LTM_RADIX_SIZE_SCALE/LTM_RADIX_SIZE_CONST_SHIFT); i++) { + /* Safe for MP_8BIT. Change to mp_set_u32 and/or mp_set_u64 if MP_8BIT gets the boot. */ + mp_set_l(&t, (long)inv_log_2_10[i]); + if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + if ((err = mp_add(&bi_k, &t, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + } + bit_count = mp_count_bits(a) + 1; + mp_set_l(&bi_bit_count, bit_count); + if ((err = mp_mul(&bi_bit_count, &bi_k, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + if ((err = mp_div_2d(&bi_k, LTM_RADIX_SIZE_SCALE, &bi_k, NULL)) != MP_OKAY) { + goto LTM_E1; + } + *size = (int)mp_get_l(&bi_k); + *size += 2 + (a->sign == MP_NEG); +LTM_E1: + mp_clear_multi(&bi_bit_count, &bi_k, &t, NULL); + return err; +} +#endif diff --git a/demo/test.c b/demo/test.c index 838f0eddf..2ae1dc0ea 100644 --- a/demo/test.c +++ b/demo/test.c @@ -1524,8 +1524,8 @@ static int test_mp_reduce_2k_l(void) return EXIT_SUCCESS; # endif /* LTM_DEMO_TEST_REDUCE_2K_L */ } -/* stripped down version of mp_radix_size. The faster version can be off by up t -o +3 */ + +/* stripped down version of mp_radix_size. The faster version can be off by up to +3 */ /* TODO: This function should be removed, replaced by mp_radix_size, mp_radix_size_overestimate in 2.0 */ static mp_err s_rs(const mp_int *a, int radix, uint32_t *size) { @@ -2451,6 +2451,59 @@ static int test_mp_pack_unpack(void) return EXIT_FAILURE; } +static int test_mp_radix_size(void) +{ + mp_err err; + mp_int a; + int radix, size; +/* *INDENT-OFF* */ + int results[65] = { + 0, 0, 1627, 1027, 814, 702, 630, 581, 543, + 514, 491, 471, 455, 441, 428, 418, 408, 399, + 391, 384, 378, 372, 366, 361, 356, 352, 347, + 343, 340, 336, 333, 330, 327, 324, 321, 318, + 316, 314, 311, 309, 307, 305, 303, 301, 299, + 298, 296, 294, 293, 291, 290, 288, 287, 285, + 284, 283, 281, 280, 279, 278, 277, 276, 275, + 273, 272 + }; +/* *INDENT-ON* */ + mp_init(&a); + + /* number to result in a different size for every base: 67^(4 * 67) */ + mp_set(&a, 67); + if ((err = mp_expt_u32(&a, 268u, &a)) != MP_OKAY) { + goto LTM_ERR; + } + + for (radix = 2; radix < 65; radix++) { + if ((err = mp_radix_size(&a, radix, &size)) != MP_OKAY) { + goto LTM_ERR; + } + if (size != results[radix]) { + fprintf(stderr, "mp_radix_size: result for base %d was %d instead of %d\n", + radix, size, results[radix]); + goto LTM_ERR; + } + a.sign = MP_NEG; + if ((err = mp_radix_size(&a, radix, &size)) != MP_OKAY) { + goto LTM_ERR; + } + if (size != (results[radix] + 1)) { + fprintf(stderr, "mp_radix_size: result for base %d was %d instead of %d\n", + radix, size, results[radix]); + goto LTM_ERR; + } + a.sign = MP_ZPOS; + } + + mp_clear(&a); + return EXIT_SUCCESS; +LTM_ERR: + mp_clear(&a); + return EXIT_FAILURE; +} + static int unit_tests(int argc, char **argv) { static const struct { diff --git a/libtommath_VS2008.vcproj b/libtommath_VS2008.vcproj index d59f71cbd..839eade65 100644 --- a/libtommath_VS2008.vcproj +++ b/libtommath_VS2008.vcproj @@ -312,6 +312,18 @@ + + + + + + diff --git a/makefile b/makefile index f713a8596..5dd8c3ea0 100644 --- a/makefile +++ b/makefile @@ -26,13 +26,14 @@ endif LCOV_ARGS=--directory . #START_INS -OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ -mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ -mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ -mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ -mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ -mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ -mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ +mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ +mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ +mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ +mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ +mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ +mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ +mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ diff --git a/makefile.mingw b/makefile.mingw index c3a680fd8..76001856e 100644 --- a/makefile.mingw +++ b/makefile.mingw @@ -29,13 +29,14 @@ LIBMAIN_I =libtommath.dll.a LIBMAIN_D =libtommath.dll #List of objects to compile (all goes to libtommath.a) -OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ -mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ -mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ -mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ -mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ -mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ -mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ +mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ +mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ +mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ +mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ +mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ +mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ +mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ diff --git a/makefile.msvc b/makefile.msvc index 9a13ffede..163c3d20b 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -21,13 +21,14 @@ LTM_LDFLAGS = advapi32.lib LIBMAIN_S =tommath.lib #List of objects to compile (all goes to tommath.lib) -OBJECTS=mp_2expt.obj mp_abs.obj mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj mp_clear_multi.obj \ -mp_cmp.obj mp_cmp_d.obj mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj mp_cutoffs.obj \ -mp_decr.obj mp_div.obj mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj mp_dr_reduce.obj \ -mp_dr_setup.obj mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj mp_fread.obj \ -mp_from_sbin.obj mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj mp_get_l.obj \ -mp_get_ll.obj mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj mp_incr.obj \ -mp_init.obj mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj mp_init_set.obj \ +OBJECTS=bn_mp_log_u32.obj bn_s_mp_log_power_of_two.obj bn_s_mp_radix_size_radix_10.obj mp_2expt.obj mp_abs.obj \ +mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj mp_clear_multi.obj mp_cmp.obj mp_cmp_d.obj \ +mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj mp_cutoffs.obj mp_decr.obj mp_div.obj \ +mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj mp_dr_reduce.obj mp_dr_setup.obj \ +mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj mp_fread.obj mp_from_sbin.obj \ +mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj mp_get_l.obj mp_get_ll.obj \ +mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj mp_incr.obj mp_init.obj \ +mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj mp_init_set.obj \ mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj mp_init_ull.obj mp_invmod.obj mp_is_square.obj \ mp_iseven.obj mp_isodd.obj mp_kronecker.obj mp_lcm.obj mp_log_u32.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj mp_mod_d.obj \ mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \ diff --git a/makefile.shared b/makefile.shared index 336d648d9..5b6823455 100644 --- a/makefile.shared +++ b/makefile.shared @@ -23,13 +23,14 @@ LTLINK = $(LIBTOOL) --mode=link --tag=CC $(CC) LCOV_ARGS=--directory .libs --directory . #START_INS -OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ -mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ -mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ -mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ -mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ -mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ -mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ +mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ +mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ +mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ +mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ +mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ +mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ +mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ diff --git a/makefile.unix b/makefile.unix index 9a35dee8e..3d40ece2c 100644 --- a/makefile.unix +++ b/makefile.unix @@ -30,13 +30,14 @@ LTM_LDFLAGS = $(LDFLAGS) #Library to be created (this makefile builds only static library) LIBMAIN_S = libtommath.a -OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ -mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ -mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ -mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ -mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ -mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ -mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ +mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ +mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ +mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ +mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ +mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ +mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ +mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ diff --git a/mp_radix_size.c b/mp_radix_size.c index 6c3e58220..a3e7adc59 100644 --- a/mp_radix_size.c +++ b/mp_radix_size.c @@ -6,6 +6,7 @@ /* returns size of ASCII representation */ mp_err mp_radix_size(const mp_int *a, int radix, size_t *size) { + mp_err err; mp_int a_; uint32_t b; @@ -20,15 +21,28 @@ mp_err mp_radix_size(const mp_int *a, int radix, size_t *size) return MP_OKAY; } + if (radix == 10) { + return s_mp_radix_size_radix_10(a, size); + } + + if ((err = mp_init(&b)) != MP_OKAY) { + goto LBL_ERR; + } + a_ = *a; a_.sign = MP_ZPOS; - if ((err = mp_log_u32(&a_, (uint32_t)radix, &b)) != MP_OKAY) { + if ((err = mp_ilogb(&a_, (uint32_t)radix, &b)) != MP_OKAY) { goto LBL_ERR; } /* mp_ilogb truncates to zero, hence we need one extra put on top and one for `\0`. */ *size = (size_t)b + 2U + ((a->sign == MP_NEG) ? 1U : 0U); + /* This can overflow for e.g.: radix = 2 and bit_count >= 2147483645 with a 32 bit "int" */ + if (*size > (size_t)(INT_MAX - 3)) { + return MP_VAL; + } + LBL_ERR: return err; } diff --git a/tommath.def b/tommath.def index 7c241bc75..dc04b1e77 100644 --- a/tommath.def +++ b/tommath.def @@ -73,6 +73,7 @@ EXPORTS mp_kronecker mp_lcm mp_log_u32 + mp_log_u32 mp_lshd mp_mod mp_mod_2d diff --git a/tommath_class.h b/tommath_class.h index f7812da01..23ebf73da 100644 --- a/tommath_class.h +++ b/tommath_class.h @@ -11,6 +11,9 @@ #endif #define LTM1 #if defined(LTM_ALL) +# define BN_MP_LOG_U32_C +# define BN_S_MP_LOG_POWER_OF_TWO_C +# define BN_S_MP_RADIX_SIZE_RADIX_10_C # define MP_2EXPT_C # define MP_ABS_C # define MP_ADD_C @@ -171,6 +174,38 @@ # define S_MP_TOOM_SQR_C #endif #endif +#if defined(BN_MP_LOG_U32_C) +# define MP_CLEAR_MULTI_C +# define MP_CMP_C +# define MP_CMP_D_C +# define MP_COPY_C +# define MP_COUNT_BITS_C +# define MP_EXCH_C +# define MP_EXPT_U32_C +# define MP_INIT_MULTI_C +# define MP_MUL_C +# define MP_SET_C +# define MP_SET_U32_C +# define MP_SQR_C +# define S_MP_LOG_POWER_OF_TWO_C +#endif + +#if defined(BN_S_MP_LOG_POWER_OF_TWO_C) +# define MP_COUNT_BITS_C +#endif + +#if defined(BN_S_MP_RADIX_SIZE_RADIX_10_C) +# define MP_ADD_C +# define MP_CLEAR_MULTI_C +# define MP_COUNT_BITS_C +# define MP_DIV_2D_C +# define MP_GET_L_C +# define MP_INIT_MULTI_C +# define MP_MUL_2D_C +# define MP_MUL_C +# define MP_SET_L_C +#endif + #if defined(MP_2EXPT_C) # define MP_GROW_C # define MP_ZERO_C @@ -746,7 +781,9 @@ #endif #if defined(MP_RADIX_SIZE_C) -# define MP_LOG_U32_C +# define MP_ILOGB_C +# define MP_INIT_C +# define S_MP_RADIX_SIZE_RADIX_10_C #endif #if defined(MP_RADIX_SMAP_C) From 223e7fc71a83812bd2bf3343ca3e2e7a1106bf6d Mon Sep 17 00:00:00 2001 From: czurnieden Date: Tue, 15 Oct 2019 21:04:15 +0200 Subject: [PATCH 2/8] adaption of mp_radix_size to new mp_log_u32 --- bn_mp_log_u32.c | 15 ++------------- mp_radix_size.c | 8 +++----- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/bn_mp_log_u32.c b/bn_mp_log_u32.c index 9d9cfcded..85b50d554 100644 --- a/bn_mp_log_u32.c +++ b/bn_mp_log_u32.c @@ -91,17 +91,6 @@ mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) return MP_VAL; } - /* A small shortcut for bases that are powers of two. */ - if ((base & (base - 1u)) == 0u) { - int y, bit_count; - for (y=0; (y < 7) && ((base & 1u) == 0u); y++) { - base >>= 1; - } - bit_count = mp_count_bits(a) - 1; - *c = (uint32_t)(bit_count/y); - return MP_OKAY; - } - if (a->used == 1) { *c = (uint32_t)s_digit_ilogb(base, a->dp[0]); return err; @@ -112,9 +101,9 @@ mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) *c = cmp == MP_EQ; return err; } + if (!(base & (base - 1u))) { - low = (uint32_t)s_mp_log_power_of_two(a, (int)base); - mp_set_u32(c, low); + *c = (uint32_t)s_mp_log_power_of_two(a, (int)base); return MP_OKAY; } diff --git a/mp_radix_size.c b/mp_radix_size.c index a3e7adc59..2f2c2233e 100644 --- a/mp_radix_size.c +++ b/mp_radix_size.c @@ -11,6 +11,8 @@ mp_err mp_radix_size(const mp_int *a, int radix, size_t *size) mp_int a_; uint32_t b; + *size = 0; + /* make sure the radix is in range */ if ((radix < 2) || (radix > 64)) { return MP_VAL; @@ -25,13 +27,9 @@ mp_err mp_radix_size(const mp_int *a, int radix, size_t *size) return s_mp_radix_size_radix_10(a, size); } - if ((err = mp_init(&b)) != MP_OKAY) { - goto LBL_ERR; - } - a_ = *a; a_.sign = MP_ZPOS; - if ((err = mp_ilogb(&a_, (uint32_t)radix, &b)) != MP_OKAY) { + if ((err = mp_log_u32(&a_, (uint32_t)radix, &b)) != MP_OKAY) { goto LBL_ERR; } From ccedd6ad85e3f8a9ae5203bbc8ef2da4726eec5d Mon Sep 17 00:00:00 2001 From: czurnieden Date: Wed, 16 Oct 2019 00:35:46 +0200 Subject: [PATCH 3/8] Addition of BN_MP_LOG_U32 to tommath_superclass.h --- tommath_class.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tommath_class.h b/tommath_class.h index 23ebf73da..7acdb721b 100644 --- a/tommath_class.h +++ b/tommath_class.h @@ -179,13 +179,11 @@ # define MP_CMP_C # define MP_CMP_D_C # define MP_COPY_C -# define MP_COUNT_BITS_C # define MP_EXCH_C # define MP_EXPT_U32_C # define MP_INIT_MULTI_C # define MP_MUL_C # define MP_SET_C -# define MP_SET_U32_C # define MP_SQR_C # define S_MP_LOG_POWER_OF_TWO_C #endif @@ -781,8 +779,7 @@ #endif #if defined(MP_RADIX_SIZE_C) -# define MP_ILOGB_C -# define MP_INIT_C +# define MP_LOG_U32_C # define S_MP_RADIX_SIZE_RADIX_10_C #endif From aab7e6c8f88a3cdab3fe729138cba86aeee2bfa4 Mon Sep 17 00:00:00 2001 From: czurnieden Date: Sat, 19 Oct 2019 20:34:20 +0200 Subject: [PATCH 4/8] rebase --- demo/test.c | 2 -- tommath_private.h | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/demo/test.c b/demo/test.c index 2ae1dc0ea..243e9b38d 100644 --- a/demo/test.c +++ b/demo/test.c @@ -2326,8 +2326,6 @@ static int test_mp_radix_size(void) return EXIT_FAILURE; } - - static int test_mp_read_write_ubin(void) { mp_int a, b, c; diff --git a/tommath_private.h b/tommath_private.h index 8fcc99138..7c9d2ea78 100644 --- a/tommath_private.h +++ b/tommath_private.h @@ -217,6 +217,11 @@ MP_PRIVATE mp_err s_mp_log(const mp_int *a, uint32_t base, uint32_t *c); MP_PRIVATE mp_err s_mp_rand_jenkins(void *p, size_t n) MP_WUR; MP_PRIVATE void s_mp_rand_jenkins_init(uint64_t seed); +/* Expects a power of two as the input "p_of_2" and 2 <= "p_of_2" <= 64*/ +MP_PRIVATE int s_mp_log_power_of_two(const mp_int *a, int p_of_2) MP_WUR; +/* Like mp_radix_size but for radix 10 only */ +MP_PRIVATE int s_mp_radix_size_radix_10(const mp_int *a, int *size) MP_WUR; + #define MP_RMAP_REVERSE_SIZE 88 extern MP_PRIVATE const char s_mp_rmap[]; extern MP_PRIVATE const uint8_t s_mp_rmap_reverse[]; From ae492e0d0daea9d478d2b45e6289ea44bf1441fa Mon Sep 17 00:00:00 2001 From: czurnieden Date: Tue, 22 Oct 2019 22:24:05 +0200 Subject: [PATCH 5/8] further refinement in s_mp_radix_size_radix_10 --- demo/test.c | 69 +++---------------- libtommath_VS2008.vcproj | 16 ++--- makefile | 31 ++++----- makefile.mingw | 31 ++++----- makefile.msvc | 31 ++++----- makefile.shared | 31 ++++----- makefile.unix | 31 ++++----- ..._power_of_two.c => s_mp_log_power_of_two.c | 6 +- ...e_radix_10.c => s_mp_radix_size_radix_10.c | 26 +++---- tommath_class.h | 37 +++++----- tommath_private.h | 2 +- 11 files changed, 127 insertions(+), 184 deletions(-) rename bn_s_mp_log_power_of_two.c => s_mp_log_power_of_two.c (91%) rename bn_s_mp_radix_size_radix_10.c => s_mp_radix_size_radix_10.c (65%) diff --git a/demo/test.c b/demo/test.c index 243e9b38d..61a220c08 100644 --- a/demo/test.c +++ b/demo/test.c @@ -2279,14 +2279,14 @@ static int test_mp_radix_size(void) size_t size; /* *INDENT-OFF* */ size_t results[65] = { - 0, 0, 1627, 1027, 814, 702, 630, 581, 543, - 514, 491, 471, 455, 441, 428, 418, 408, 399, - 391, 384, 378, 372, 366, 361, 356, 352, 347, - 343, 340, 336, 333, 330, 327, 324, 321, 318, - 316, 314, 311, 309, 307, 305, 303, 301, 299, - 298, 296, 294, 293, 291, 290, 288, 287, 285, - 284, 283, 281, 280, 279, 278, 277, 276, 275, - 273, 272 + 0u, 0u, 1627u, 1027u, 814u, 702u, 630u, 581u, 543u, + 514u, 491u, 471u, 455u, 441u, 428u, 418u, 408u, 399u, + 391u, 384u, 378u, 372u, 366u, 361u, 356u, 352u, 347u, + 343u, 340u, 336u, 333u, 330u, 327u, 324u, 321u, 318u, + 316u, 314u, 311u, 309u, 307u, 305u, 303u, 301u, 299u, + 298u, 296u, 294u, 293u, 291u, 290u, 288u, 287u, 285u, + 284u, 283u, 281u, 280u, 279u, 278u, 277u, 276u, 275u, + 273u, 272u }; /* *INDENT-ON* */ @@ -2449,59 +2449,6 @@ static int test_mp_pack_unpack(void) return EXIT_FAILURE; } -static int test_mp_radix_size(void) -{ - mp_err err; - mp_int a; - int radix, size; -/* *INDENT-OFF* */ - int results[65] = { - 0, 0, 1627, 1027, 814, 702, 630, 581, 543, - 514, 491, 471, 455, 441, 428, 418, 408, 399, - 391, 384, 378, 372, 366, 361, 356, 352, 347, - 343, 340, 336, 333, 330, 327, 324, 321, 318, - 316, 314, 311, 309, 307, 305, 303, 301, 299, - 298, 296, 294, 293, 291, 290, 288, 287, 285, - 284, 283, 281, 280, 279, 278, 277, 276, 275, - 273, 272 - }; -/* *INDENT-ON* */ - mp_init(&a); - - /* number to result in a different size for every base: 67^(4 * 67) */ - mp_set(&a, 67); - if ((err = mp_expt_u32(&a, 268u, &a)) != MP_OKAY) { - goto LTM_ERR; - } - - for (radix = 2; radix < 65; radix++) { - if ((err = mp_radix_size(&a, radix, &size)) != MP_OKAY) { - goto LTM_ERR; - } - if (size != results[radix]) { - fprintf(stderr, "mp_radix_size: result for base %d was %d instead of %d\n", - radix, size, results[radix]); - goto LTM_ERR; - } - a.sign = MP_NEG; - if ((err = mp_radix_size(&a, radix, &size)) != MP_OKAY) { - goto LTM_ERR; - } - if (size != (results[radix] + 1)) { - fprintf(stderr, "mp_radix_size: result for base %d was %d instead of %d\n", - radix, size, results[radix]); - goto LTM_ERR; - } - a.sign = MP_ZPOS; - } - - mp_clear(&a); - return EXIT_SUCCESS; -LTM_ERR: - mp_clear(&a); - return EXIT_FAILURE; -} - static int unit_tests(int argc, char **argv) { static const struct { diff --git a/libtommath_VS2008.vcproj b/libtommath_VS2008.vcproj index 839eade65..85da85186 100644 --- a/libtommath_VS2008.vcproj +++ b/libtommath_VS2008.vcproj @@ -316,14 +316,6 @@ RelativePath="bn_mp_log_u32.c" > - - - - @@ -900,6 +892,10 @@ RelativePath="s_mp_log_d.c" > + + @@ -924,6 +920,10 @@ RelativePath="s_mp_prime_is_divisible.c" > + + diff --git a/makefile b/makefile index 5dd8c3ea0..53a444f3f 100644 --- a/makefile +++ b/makefile @@ -26,18 +26,17 @@ endif LCOV_ARGS=--directory . #START_INS -OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ -mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ -mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ -mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ -mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ -mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ -mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ -mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ -mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ -mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ -mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ -mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ +mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ +mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ +mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ +mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ +mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ +mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ +mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ +mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ +mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ +mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ @@ -47,10 +46,10 @@ mp_set_ll.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_set_ull.o mp_shrink.o mp_si mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o \ mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_balance_mul.o s_mp_exptmod.o \ s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod_fast.o s_mp_invmod_slow.o s_mp_karatsuba_mul.o \ -s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_montgomery_reduce_fast.o s_mp_mul_digs.o \ -s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o s_mp_prime_is_divisible.o \ -s_mp_rand_jenkins.o s_mp_rand_platform.o s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o \ -s_mp_toom_mul.o s_mp_toom_sqr.o +s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_log_power_of_two.o s_mp_montgomery_reduce_fast.o \ +s_mp_mul_digs.o s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o \ +s_mp_prime_is_divisible.o s_mp_radix_size_radix_10.o s_mp_rand_jenkins.o s_mp_rand_platform.o \ +s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o s_mp_toom_mul.o s_mp_toom_sqr.o #END_INS diff --git a/makefile.mingw b/makefile.mingw index 76001856e..e7297eb8a 100644 --- a/makefile.mingw +++ b/makefile.mingw @@ -29,18 +29,17 @@ LIBMAIN_I =libtommath.dll.a LIBMAIN_D =libtommath.dll #List of objects to compile (all goes to libtommath.a) -OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ -mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ -mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ -mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ -mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ -mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ -mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ -mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ -mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ -mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ -mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ -mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ +mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ +mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ +mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ +mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ +mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ +mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ +mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ +mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ +mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ +mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ @@ -50,10 +49,10 @@ mp_set_ll.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_set_ull.o mp_shrink.o mp_si mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o \ mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_balance_mul.o s_mp_exptmod.o \ s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod_fast.o s_mp_invmod_slow.o s_mp_karatsuba_mul.o \ -s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_montgomery_reduce_fast.o s_mp_mul_digs.o \ -s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o s_mp_prime_is_divisible.o \ -s_mp_rand_jenkins.o s_mp_rand_platform.o s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o \ -s_mp_toom_mul.o s_mp_toom_sqr.o +s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_log_power_of_two.o s_mp_montgomery_reduce_fast.o \ +s_mp_mul_digs.o s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o \ +s_mp_prime_is_divisible.o s_mp_radix_size_radix_10.o s_mp_rand_jenkins.o s_mp_rand_platform.o \ +s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o s_mp_toom_mul.o s_mp_toom_sqr.o HEADERS_PUB=tommath.h HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB) diff --git a/makefile.msvc b/makefile.msvc index 163c3d20b..6ae902678 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -21,18 +21,17 @@ LTM_LDFLAGS = advapi32.lib LIBMAIN_S =tommath.lib #List of objects to compile (all goes to tommath.lib) -OBJECTS=bn_mp_log_u32.obj bn_s_mp_log_power_of_two.obj bn_s_mp_radix_size_radix_10.obj mp_2expt.obj mp_abs.obj \ -mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj mp_clear_multi.obj mp_cmp.obj mp_cmp_d.obj \ -mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj mp_cutoffs.obj mp_decr.obj mp_div.obj \ -mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj mp_dr_reduce.obj mp_dr_setup.obj \ -mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj mp_fread.obj mp_from_sbin.obj \ -mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj mp_get_l.obj mp_get_ll.obj \ -mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj mp_incr.obj mp_init.obj \ -mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj mp_init_set.obj \ -mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj mp_init_ull.obj mp_invmod.obj mp_is_square.obj \ -mp_iseven.obj mp_isodd.obj mp_kronecker.obj mp_lcm.obj mp_log_u32.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj mp_mod_d.obj \ -mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \ -mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \ +OBJECTS=bn_mp_log_u32.obj mp_2expt.obj mp_abs.obj mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj \ +mp_clear_multi.obj mp_cmp.obj mp_cmp_d.obj mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj \ +mp_cutoffs.obj mp_decr.obj mp_div.obj mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj \ +mp_dr_reduce.obj mp_dr_setup.obj mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj \ +mp_fread.obj mp_from_sbin.obj mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj \ +mp_get_l.obj mp_get_ll.obj mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj \ +mp_incr.obj mp_init.obj mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj \ +mp_init_set.obj mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj mp_init_ull.obj mp_invmod.obj \ +mp_is_square.obj mp_iseven.obj mp_isodd.obj mp_kronecker.obj mp_lcm.obj mp_log_u32.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj \ +mp_mod_d.obj mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj \ +mp_mul_2.obj mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \ mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \ mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj mp_prime_tab.obj \ mp_radix_size.obj mp_radix_smap.obj mp_rand.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj mp_reduce_2k_l.obj \ @@ -42,10 +41,10 @@ mp_set_ll.obj mp_set_u32.obj mp_set_u64.obj mp_set_ul.obj mp_set_ull.obj mp_shri mp_sqrmod.obj mp_sqrt.obj mp_sqrtmod_prime.obj mp_sub.obj mp_sub_d.obj mp_submod.obj mp_to_radix.obj mp_to_sbin.obj \ mp_to_ubin.obj mp_ubin_size.obj mp_unpack.obj mp_xor.obj mp_zero.obj s_mp_add.obj s_mp_balance_mul.obj s_mp_exptmod.obj \ s_mp_exptmod_fast.obj s_mp_get_bit.obj s_mp_invmod_fast.obj s_mp_invmod_slow.obj s_mp_karatsuba_mul.obj \ -s_mp_karatsuba_sqr.obj s_mp_log.obj s_mp_log_d.obj s_mp_montgomery_reduce_fast.obj s_mp_mul_digs.obj \ -s_mp_mul_digs_fast.obj s_mp_mul_high_digs.obj s_mp_mul_high_digs_fast.obj s_mp_prime_is_divisible.obj \ -s_mp_rand_jenkins.obj s_mp_rand_platform.obj s_mp_reverse.obj s_mp_sqr.obj s_mp_sqr_fast.obj s_mp_sub.obj \ -s_mp_toom_mul.obj s_mp_toom_sqr.obj +s_mp_karatsuba_sqr.obj s_mp_log.obj s_mp_log_d.obj s_mp_log_power_of_two.obj s_mp_montgomery_reduce_fast.obj \ +s_mp_mul_digs.obj s_mp_mul_digs_fast.obj s_mp_mul_high_digs.obj s_mp_mul_high_digs_fast.obj \ +s_mp_prime_is_divisible.obj s_mp_radix_size_radix_10.obj s_mp_rand_jenkins.obj s_mp_rand_platform.obj \ +s_mp_reverse.obj s_mp_sqr.obj s_mp_sqr_fast.obj s_mp_sub.obj s_mp_toom_mul.obj s_mp_toom_sqr.obj HEADERS_PUB=tommath.h HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB) diff --git a/makefile.shared b/makefile.shared index 5b6823455..20d76b6ad 100644 --- a/makefile.shared +++ b/makefile.shared @@ -23,18 +23,17 @@ LTLINK = $(LIBTOOL) --mode=link --tag=CC $(CC) LCOV_ARGS=--directory .libs --directory . #START_INS -OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ -mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ -mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ -mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ -mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ -mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ -mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ -mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ -mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ -mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ -mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ -mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ +mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ +mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ +mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ +mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ +mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ +mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ +mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ +mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ +mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ +mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ @@ -44,10 +43,10 @@ mp_set_ll.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_set_ull.o mp_shrink.o mp_si mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o \ mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_balance_mul.o s_mp_exptmod.o \ s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod_fast.o s_mp_invmod_slow.o s_mp_karatsuba_mul.o \ -s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_montgomery_reduce_fast.o s_mp_mul_digs.o \ -s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o s_mp_prime_is_divisible.o \ -s_mp_rand_jenkins.o s_mp_rand_platform.o s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o \ -s_mp_toom_mul.o s_mp_toom_sqr.o +s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_log_power_of_two.o s_mp_montgomery_reduce_fast.o \ +s_mp_mul_digs.o s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o \ +s_mp_prime_is_divisible.o s_mp_radix_size_radix_10.o s_mp_rand_jenkins.o s_mp_rand_platform.o \ +s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o s_mp_toom_mul.o s_mp_toom_sqr.o #END_INS diff --git a/makefile.unix b/makefile.unix index 3d40ece2c..e8e11123e 100644 --- a/makefile.unix +++ b/makefile.unix @@ -30,18 +30,17 @@ LTM_LDFLAGS = $(LDFLAGS) #Library to be created (this makefile builds only static library) LIBMAIN_S = libtommath.a -OBJECTS=bn_mp_log_u32.o bn_s_mp_log_power_of_two.o bn_s_mp_radix_size_radix_10.o mp_2expt.o mp_abs.o \ -mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o mp_cmp.o mp_cmp_d.o \ -mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o mp_decr.o mp_div.o \ -mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o mp_dr_setup.o \ -mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o mp_from_sbin.o \ -mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o mp_get_ll.o \ -mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o mp_init.o \ -mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ -mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ -mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ -mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ -mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ +mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ +mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ +mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ +mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ +mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ +mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ +mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ +mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ +mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ +mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ @@ -51,10 +50,10 @@ mp_set_ll.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_set_ull.o mp_shrink.o mp_si mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o \ mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_balance_mul.o s_mp_exptmod.o \ s_mp_exptmod_fast.o s_mp_get_bit.o s_mp_invmod_fast.o s_mp_invmod_slow.o s_mp_karatsuba_mul.o \ -s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_montgomery_reduce_fast.o s_mp_mul_digs.o \ -s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o s_mp_prime_is_divisible.o \ -s_mp_rand_jenkins.o s_mp_rand_platform.o s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o \ -s_mp_toom_mul.o s_mp_toom_sqr.o +s_mp_karatsuba_sqr.o s_mp_log.o s_mp_log_d.o s_mp_log_power_of_two.o s_mp_montgomery_reduce_fast.o \ +s_mp_mul_digs.o s_mp_mul_digs_fast.o s_mp_mul_high_digs.o s_mp_mul_high_digs_fast.o \ +s_mp_prime_is_divisible.o s_mp_radix_size_radix_10.o s_mp_rand_jenkins.o s_mp_rand_platform.o \ +s_mp_reverse.o s_mp_sqr.o s_mp_sqr_fast.o s_mp_sub.o s_mp_toom_mul.o s_mp_toom_sqr.o HEADERS_PUB=tommath.h HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB) diff --git a/bn_s_mp_log_power_of_two.c b/s_mp_log_power_of_two.c similarity index 91% rename from bn_s_mp_log_power_of_two.c rename to s_mp_log_power_of_two.c index 177804845..bc16db6a5 100644 --- a/bn_s_mp_log_power_of_two.c +++ b/s_mp_log_power_of_two.c @@ -1,8 +1,10 @@ #include "tommath_private.h" -#ifdef BN_S_MP_LOG_POWER_OF_TWO_C +#ifdef S_MP_LOG_POWER_OF_TWO_C /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ + + int s_mp_log_power_of_two(const mp_int *a, int p_of_2) { int x, bit_count; @@ -12,4 +14,6 @@ int s_mp_log_power_of_two(const mp_int *a, int p_of_2) bit_count = mp_count_bits(a) - 1; return (bit_count/x); } + + #endif diff --git a/bn_s_mp_radix_size_radix_10.c b/s_mp_radix_size_radix_10.c similarity index 65% rename from bn_s_mp_radix_size_radix_10.c rename to s_mp_radix_size_radix_10.c index 68aa46e1b..6ad827c5d 100644 --- a/bn_s_mp_radix_size_radix_10.c +++ b/s_mp_radix_size_radix_10.c @@ -1,12 +1,13 @@ #include "tommath_private.h" -#ifdef BN_S_MP_RADIX_SIZE_RADIX_10_C +#ifdef S_MP_RADIX_SIZE_RADIX_10_C /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ + #define LTM_RADIX_SIZE_SCALE 64 -#define LTM_RADIX_SIZE_CONST_SHIFT 16 -int s_mp_radix_size_radix_10(const mp_int *a, int *size) +#define LTM_RADIX_SIZE_CONST_SHIFT 32 +int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) { mp_err err; /* @@ -20,22 +21,15 @@ int s_mp_radix_size_radix_10(const mp_int *a, int *size) Which are more than 16 decimal digits, so with BINARY_64 (C's "double") a 'ceil(198096465/log_2(10))' would result wrongly in 59632978.0. */ - /* - TODO: This is safe for MP_8BIT, change to - const uint32_t inv_log_2_10[2] = {0x4d104d42U, 0x7de7fbccU} - or branch even further with - const uint64_t inv_log_2_10 = {0x4d104d427de7fbccULL}; - when MP_8BIT got the boot. - */ - const uint16_t inv_log_2_10[4] = {0x4d10u, 0x4d42u, 0x7de7u, 0xfbccu}; + /* const uint64_t inv_log_2_10 = {0x4d104d427de7fbccULL}; */ + const uint32_t inv_log_2_10[2] = {0x4d104d42UL, 0x7de7fbccUL}; mp_int bi_bit_count, bi_k, t; int i, bit_count; if ((err = mp_init_multi(&bi_bit_count, &bi_k, &t, NULL)) != MP_OKAY) { return err; } for (i = 0; i < (LTM_RADIX_SIZE_SCALE/LTM_RADIX_SIZE_CONST_SHIFT); i++) { - /* Safe for MP_8BIT. Change to mp_set_u32 and/or mp_set_u64 if MP_8BIT gets the boot. */ - mp_set_l(&t, (long)inv_log_2_10[i]); + mp_set_u32(&t, inv_log_2_10[i]); if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { goto LTM_E1; } @@ -51,10 +45,12 @@ int s_mp_radix_size_radix_10(const mp_int *a, int *size) if ((err = mp_div_2d(&bi_k, LTM_RADIX_SIZE_SCALE, &bi_k, NULL)) != MP_OKAY) { goto LTM_E1; } - *size = (int)mp_get_l(&bi_k); - *size += 2 + (a->sign == MP_NEG); + *size = (size_t)mp_get_ul(&bi_k); + *size += 2u + (size_t)(a->sign == MP_NEG); LTM_E1: mp_clear_multi(&bi_bit_count, &bi_k, &t, NULL); return err; } + + #endif diff --git a/tommath_class.h b/tommath_class.h index 7acdb721b..64e3a58eb 100644 --- a/tommath_class.h +++ b/tommath_class.h @@ -12,8 +12,6 @@ #define LTM1 #if defined(LTM_ALL) # define BN_MP_LOG_U32_C -# define BN_S_MP_LOG_POWER_OF_TWO_C -# define BN_S_MP_RADIX_SIZE_RADIX_10_C # define MP_2EXPT_C # define MP_ABS_C # define MP_ADD_C @@ -158,12 +156,14 @@ # define S_MP_KARATSUBA_SQR_C # define S_MP_LOG_C # define S_MP_LOG_D_C +# define S_MP_LOG_POWER_OF_TWO_C # define S_MP_MONTGOMERY_REDUCE_FAST_C # define S_MP_MUL_DIGS_C # define S_MP_MUL_DIGS_FAST_C # define S_MP_MUL_HIGH_DIGS_C # define S_MP_MUL_HIGH_DIGS_FAST_C # define S_MP_PRIME_IS_DIVISIBLE_C +# define S_MP_RADIX_SIZE_RADIX_10_C # define S_MP_RAND_JENKINS_C # define S_MP_RAND_PLATFORM_C # define S_MP_REVERSE_C @@ -188,22 +188,6 @@ # define S_MP_LOG_POWER_OF_TWO_C #endif -#if defined(BN_S_MP_LOG_POWER_OF_TWO_C) -# define MP_COUNT_BITS_C -#endif - -#if defined(BN_S_MP_RADIX_SIZE_RADIX_10_C) -# define MP_ADD_C -# define MP_CLEAR_MULTI_C -# define MP_COUNT_BITS_C -# define MP_DIV_2D_C -# define MP_GET_L_C -# define MP_INIT_MULTI_C -# define MP_MUL_2D_C -# define MP_MUL_C -# define MP_SET_L_C -#endif - #if defined(MP_2EXPT_C) # define MP_GROW_C # define MP_ZERO_C @@ -1164,6 +1148,10 @@ #if defined(S_MP_LOG_D_C) #endif +#if defined(S_MP_LOG_POWER_OF_TWO_C) +# define MP_COUNT_BITS_C +#endif + #if defined(S_MP_MONTGOMERY_REDUCE_FAST_C) # define MP_CLAMP_C # define MP_CMP_MAG_C @@ -1201,6 +1189,19 @@ # define MP_MOD_D_C #endif +#if defined(S_MP_RADIX_SIZE_RADIX_10_C) +# define MP_ADD_C +# define MP_CLEAR_MULTI_C +# define MP_COUNT_BITS_C +# define MP_DIV_2D_C +# define MP_GET_L_C +# define MP_INIT_MULTI_C +# define MP_MUL_2D_C +# define MP_MUL_C +# define MP_SET_L_C +# define MP_SET_U32_C +#endif + #if defined(S_MP_RAND_JENKINS_C) # define S_MP_RAND_JENKINS_INIT_C #endif diff --git a/tommath_private.h b/tommath_private.h index 7c9d2ea78..375b515c5 100644 --- a/tommath_private.h +++ b/tommath_private.h @@ -220,7 +220,7 @@ MP_PRIVATE void s_mp_rand_jenkins_init(uint64_t seed); /* Expects a power of two as the input "p_of_2" and 2 <= "p_of_2" <= 64*/ MP_PRIVATE int s_mp_log_power_of_two(const mp_int *a, int p_of_2) MP_WUR; /* Like mp_radix_size but for radix 10 only */ -MP_PRIVATE int s_mp_radix_size_radix_10(const mp_int *a, int *size) MP_WUR; +MP_PRIVATE int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) MP_WUR; #define MP_RMAP_REVERSE_SIZE 88 extern MP_PRIVATE const char s_mp_rmap[]; From 39cc86ed73757807b9a9fe599d52c12667c1c1bf Mon Sep 17 00:00:00 2001 From: czurnieden Date: Tue, 22 Oct 2019 23:21:31 +0200 Subject: [PATCH 6/8] added branch for MP_16BIT to s_mp_radix_size_radix_10 --- s_mp_radix_size_radix_10.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/s_mp_radix_size_radix_10.c b/s_mp_radix_size_radix_10.c index 6ad827c5d..8ff09ce1d 100644 --- a/s_mp_radix_size_radix_10.c +++ b/s_mp_radix_size_radix_10.c @@ -3,10 +3,7 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ - - #define LTM_RADIX_SIZE_SCALE 64 -#define LTM_RADIX_SIZE_CONST_SHIFT 32 int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) { mp_err err; @@ -21,13 +18,18 @@ int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) Which are more than 16 decimal digits, so with BINARY_64 (C's "double") a 'ceil(198096465/log_2(10))' would result wrongly in 59632978.0. */ - /* const uint64_t inv_log_2_10 = {0x4d104d427de7fbccULL}; */ - const uint32_t inv_log_2_10[2] = {0x4d104d42UL, 0x7de7fbccUL}; mp_int bi_bit_count, bi_k, t; - int i, bit_count; + int bit_count; + +#ifdef MP_16BIT +#define LTM_RADIX_SIZE_CONST_SHIFT 32 + const uint32_t inv_log_2_10[2] = {0x4d104d42UL, 0x7de7fbccUL}; + int i; +#endif if ((err = mp_init_multi(&bi_bit_count, &bi_k, &t, NULL)) != MP_OKAY) { return err; } +#ifdef MP_16BIT for (i = 0; i < (LTM_RADIX_SIZE_SCALE/LTM_RADIX_SIZE_CONST_SHIFT); i++) { mp_set_u32(&t, inv_log_2_10[i]); if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { @@ -37,6 +39,9 @@ int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) goto LTM_E1; } } +#else + mp_set_u64(&bi_k, 0x4d104d427de7fbccULL); +#endif bit_count = mp_count_bits(a) + 1; mp_set_l(&bi_bit_count, bit_count); if ((err = mp_mul(&bi_bit_count, &bi_k, &bi_k)) != MP_OKAY) { From 9bf64b3a3f86d9b82f9f19352ac78e1a7cbfdbfa Mon Sep 17 00:00:00 2001 From: czurnieden Date: Tue, 22 Oct 2019 23:33:44 +0200 Subject: [PATCH 7/8] unrolled loop --- s_mp_radix_size_radix_10.c | 22 +++++++++++++--------- tommath_class.h | 4 +--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/s_mp_radix_size_radix_10.c b/s_mp_radix_size_radix_10.c index 8ff09ce1d..93ba6973b 100644 --- a/s_mp_radix_size_radix_10.c +++ b/s_mp_radix_size_radix_10.c @@ -24,20 +24,24 @@ int s_mp_radix_size_radix_10(const mp_int *a, size_t *size) #ifdef MP_16BIT #define LTM_RADIX_SIZE_CONST_SHIFT 32 const uint32_t inv_log_2_10[2] = {0x4d104d42UL, 0x7de7fbccUL}; - int i; #endif if ((err = mp_init_multi(&bi_bit_count, &bi_k, &t, NULL)) != MP_OKAY) { return err; } #ifdef MP_16BIT - for (i = 0; i < (LTM_RADIX_SIZE_SCALE/LTM_RADIX_SIZE_CONST_SHIFT); i++) { - mp_set_u32(&t, inv_log_2_10[i]); - if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { - goto LTM_E1; - } - if ((err = mp_add(&bi_k, &t, &bi_k)) != MP_OKAY) { - goto LTM_E1; - } + mp_set_u32(&t, inv_log_2_10[0]); + if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + if ((err = mp_add(&bi_k, &t, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + mp_set_u32(&t, inv_log_2_10[1]); + if ((err = mp_mul_2d(&bi_k, LTM_RADIX_SIZE_CONST_SHIFT, &bi_k)) != MP_OKAY) { + goto LTM_E1; + } + if ((err = mp_add(&bi_k, &t, &bi_k)) != MP_OKAY) { + goto LTM_E1; } #else mp_set_u64(&bi_k, 0x4d104d427de7fbccULL); diff --git a/tommath_class.h b/tommath_class.h index 64e3a58eb..7fe2b29d8 100644 --- a/tommath_class.h +++ b/tommath_class.h @@ -1190,16 +1190,14 @@ #endif #if defined(S_MP_RADIX_SIZE_RADIX_10_C) -# define MP_ADD_C # define MP_CLEAR_MULTI_C # define MP_COUNT_BITS_C # define MP_DIV_2D_C # define MP_GET_L_C # define MP_INIT_MULTI_C -# define MP_MUL_2D_C # define MP_MUL_C # define MP_SET_L_C -# define MP_SET_U32_C +# define MP_SET_U64_C #endif #if defined(S_MP_RAND_JENKINS_C) From 04c133293f2e59cfc7fd6fd3b6f1e9d6213bf38e Mon Sep 17 00:00:00 2001 From: czurnieden Date: Tue, 22 Oct 2019 23:57:20 +0200 Subject: [PATCH 8/8] cleanup --- bn_mp_log_u32.c | 174 --------------------------------------- libtommath_VS2008.vcproj | 4 - makefile | 22 ++--- makefile.mingw | 22 ++--- makefile.msvc | 22 ++--- makefile.shared | 22 ++--- makefile.unix | 22 ++--- tommath.def | 1 - tommath_class.h | 15 ---- 9 files changed, 55 insertions(+), 249 deletions(-) delete mode 100644 bn_mp_log_u32.c diff --git a/bn_mp_log_u32.c b/bn_mp_log_u32.c deleted file mode 100644 index 85b50d554..000000000 --- a/bn_mp_log_u32.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "tommath_private.h" -#ifdef BN_MP_LOG_U32_C -/* LibTomMath, multiple-precision integer library -- Tom St Denis */ -/* SPDX-License-Identifier: Unlicense */ - -/* Compute log_{base}(a) */ -static mp_word s_pow(mp_word base, mp_word exponent) -{ - mp_word result = 1uLL; - while (exponent != 0u) { - if ((exponent & 1u) == 1u) { - result *= base; - } - exponent >>= 1; - base *= base; - } - - return result; -} - -static mp_digit s_digit_ilogb(mp_digit base, mp_digit n) -{ - mp_word bracket_low = 1uLL, bracket_mid, bracket_high, N; - mp_digit ret, high = 1uL, low = 0uL, mid; - - if (n < base) { - return 0uL; - } - if (n == base) { - return 1uL; - } - - bracket_high = (mp_word) base ; - N = (mp_word) n; - - while (bracket_high < N) { - low = high; - bracket_low = bracket_high; - high <<= 1; - bracket_high *= bracket_high; - } - - while (((mp_digit)(high - low)) > 1uL) { - mid = (low + high) >> 1; - bracket_mid = bracket_low * s_pow(base, (mp_word)(mid - low)); - - if (N < bracket_mid) { - high = mid ; - bracket_high = bracket_mid ; - } - if (N > bracket_mid) { - low = mid ; - bracket_low = bracket_mid ; - } - if (N == bracket_mid) { - return (mp_digit) mid; - } - } - - if (bracket_high == N) { - ret = high; - } else { - ret = low; - } - - return ret; -} - -/* TODO: output could be "int" because the output of mp_radix_size is int, too, - as is the output of mp_bitcount. - With the same problem: max size is INT_MAX * MP_DIGIT not INT_MAX only! -*/ -mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) -{ - mp_err err; - mp_ord cmp; - uint32_t high, low, mid; - mp_int bracket_low, bracket_high, bracket_mid, t, bi_base; - - err = MP_OKAY; - - if (a->sign == MP_NEG) { - return MP_VAL; - } - - if (MP_IS_ZERO(a)) { - return MP_VAL; - } - - if (base < 2u) { - return MP_VAL; - } - - if (a->used == 1) { - *c = (uint32_t)s_digit_ilogb(base, a->dp[0]); - return err; - } - - cmp = mp_cmp_d(a, base); - if ((cmp == MP_LT) || (cmp == MP_EQ)) { - *c = cmp == MP_EQ; - return err; - } - - if (!(base & (base - 1u))) { - *c = (uint32_t)s_mp_log_power_of_two(a, (int)base); - return MP_OKAY; - } - - if ((err = - mp_init_multi(&bracket_low, &bracket_high, - &bracket_mid, &t, &bi_base, NULL)) != MP_OKAY) { - return err; - } - - low = 0u; - mp_set(&bracket_low, 1uL); - high = 1u; - - mp_set(&bracket_high, base); - - /* - A kind of Giant-step/baby-step algorithm. - Idea shamelessly stolen from https://programmingpraxis.com/2010/05/07/integer-logarithms/2/ - The effect is asymptotic, hence needs benchmarks to test if the Giant-step should be skipped - for small n. - */ - while (mp_cmp(&bracket_high, a) == MP_LT) { - low = high; - if ((err = mp_copy(&bracket_high, &bracket_low)) != MP_OKAY) { - goto LBL_ERR; - } - high <<= 1; - if ((err = mp_sqr(&bracket_high, &bracket_high)) != MP_OKAY) { - goto LBL_ERR; - } - } - mp_set(&bi_base, base); - - while ((high - low) > 1u) { - mid = (high + low) >> 1; - - if ((err = mp_expt_u32(&bi_base, (uint32_t)(mid - low), &t)) != MP_OKAY) { - goto LBL_ERR; - } - if ((err = mp_mul(&bracket_low, &t, &bracket_mid)) != MP_OKAY) { - goto LBL_ERR; - } - cmp = mp_cmp(a, &bracket_mid); - if (cmp == MP_LT) { - high = mid; - mp_exch(&bracket_mid, &bracket_high); - } - if (cmp == MP_GT) { - low = mid; - mp_exch(&bracket_mid, &bracket_low); - } - if (cmp == MP_EQ) { - *c = mid; - goto LBL_END; - } - } - - *c = (mp_cmp(&bracket_high, a) == MP_EQ) ? high : low; - -LBL_END: -LBL_ERR: - mp_clear_multi(&bracket_low, &bracket_high, &bracket_mid, - &t, &bi_base, NULL); - return err; -} - - -#endif diff --git a/libtommath_VS2008.vcproj b/libtommath_VS2008.vcproj index 85da85186..0e49d6f3e 100644 --- a/libtommath_VS2008.vcproj +++ b/libtommath_VS2008.vcproj @@ -312,10 +312,6 @@ - - diff --git a/makefile b/makefile index 53a444f3f..da5092783 100644 --- a/makefile +++ b/makefile @@ -26,17 +26,17 @@ endif LCOV_ARGS=--directory . #START_INS -OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ -mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ -mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ -mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ -mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ -mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ -mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ -mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ -mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ -mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ -mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ +mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ +mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ +mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ +mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ +mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ +mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ +mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ +mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ +mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ diff --git a/makefile.mingw b/makefile.mingw index e7297eb8a..5d8e99147 100644 --- a/makefile.mingw +++ b/makefile.mingw @@ -29,17 +29,17 @@ LIBMAIN_I =libtommath.dll.a LIBMAIN_D =libtommath.dll #List of objects to compile (all goes to libtommath.a) -OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ -mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ -mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ -mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ -mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ -mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ -mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ -mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ -mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ -mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ -mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ +mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ +mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ +mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ +mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ +mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ +mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ +mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ +mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ +mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ diff --git a/makefile.msvc b/makefile.msvc index 6ae902678..071432de5 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -21,17 +21,17 @@ LTM_LDFLAGS = advapi32.lib LIBMAIN_S =tommath.lib #List of objects to compile (all goes to tommath.lib) -OBJECTS=bn_mp_log_u32.obj mp_2expt.obj mp_abs.obj mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj \ -mp_clear_multi.obj mp_cmp.obj mp_cmp_d.obj mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj \ -mp_cutoffs.obj mp_decr.obj mp_div.obj mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj \ -mp_dr_reduce.obj mp_dr_setup.obj mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj \ -mp_fread.obj mp_from_sbin.obj mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj \ -mp_get_l.obj mp_get_ll.obj mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj \ -mp_incr.obj mp_init.obj mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj \ -mp_init_set.obj mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj mp_init_ull.obj mp_invmod.obj \ -mp_is_square.obj mp_iseven.obj mp_isodd.obj mp_kronecker.obj mp_lcm.obj mp_log_u32.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj \ -mp_mod_d.obj mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj \ -mp_mul_2.obj mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \ +OBJECTS=mp_2expt.obj mp_abs.obj mp_add.obj mp_add_d.obj mp_addmod.obj mp_and.obj mp_clamp.obj mp_clear.obj mp_clear_multi.obj \ +mp_cmp.obj mp_cmp_d.obj mp_cmp_mag.obj mp_cnt_lsb.obj mp_complement.obj mp_copy.obj mp_count_bits.obj mp_cutoffs.obj \ +mp_decr.obj mp_div.obj mp_div_2.obj mp_div_2d.obj mp_div_3.obj mp_div_d.obj mp_dr_is_modulus.obj mp_dr_reduce.obj \ +mp_dr_setup.obj mp_error_to_string.obj mp_exch.obj mp_expt_u32.obj mp_exptmod.obj mp_exteuclid.obj mp_fread.obj \ +mp_from_sbin.obj mp_from_ubin.obj mp_fwrite.obj mp_gcd.obj mp_get_double.obj mp_get_i32.obj mp_get_i64.obj mp_get_l.obj \ +mp_get_ll.obj mp_get_mag_u32.obj mp_get_mag_u64.obj mp_get_mag_ul.obj mp_get_mag_ull.obj mp_grow.obj mp_incr.obj \ +mp_init.obj mp_init_copy.obj mp_init_i32.obj mp_init_i64.obj mp_init_l.obj mp_init_ll.obj mp_init_multi.obj mp_init_set.obj \ +mp_init_size.obj mp_init_u32.obj mp_init_u64.obj mp_init_ul.obj mp_init_ull.obj mp_invmod.obj mp_is_square.obj \ +mp_iseven.obj mp_isodd.obj mp_kronecker.obj mp_lcm.obj mp_log_u32.obj mp_lshd.obj mp_mod.obj mp_mod_2d.obj mp_mod_d.obj \ +mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \ +mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \ mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \ mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj mp_prime_tab.obj \ mp_radix_size.obj mp_radix_smap.obj mp_rand.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj mp_reduce_2k_l.obj \ diff --git a/makefile.shared b/makefile.shared index 20d76b6ad..6993e18ab 100644 --- a/makefile.shared +++ b/makefile.shared @@ -23,17 +23,17 @@ LTLINK = $(LIBTOOL) --mode=link --tag=CC $(CC) LCOV_ARGS=--directory .libs --directory . #START_INS -OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ -mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ -mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ -mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ -mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ -mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ -mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ -mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ -mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ -mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ -mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ +mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ +mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ +mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ +mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ +mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ +mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ +mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ +mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ +mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ diff --git a/makefile.unix b/makefile.unix index e8e11123e..1e9cc36f6 100644 --- a/makefile.unix +++ b/makefile.unix @@ -30,17 +30,17 @@ LTM_LDFLAGS = $(LDFLAGS) #Library to be created (this makefile builds only static library) LIBMAIN_S = libtommath.a -OBJECTS=bn_mp_log_u32.o mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o \ -mp_clear_multi.o mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o \ -mp_cutoffs.o mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o \ -mp_dr_reduce.o mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o \ -mp_fread.o mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o \ -mp_get_l.o mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o \ -mp_incr.o mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o \ -mp_init_set.o mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o \ -mp_is_square.o mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o \ -mp_mod_d.o mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o \ -mp_mul_2.o mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ +OBJECTS=mp_2expt.o mp_abs.o mp_add.o mp_add_d.o mp_addmod.o mp_and.o mp_clamp.o mp_clear.o mp_clear_multi.o \ +mp_cmp.o mp_cmp_d.o mp_cmp_mag.o mp_cnt_lsb.o mp_complement.o mp_copy.o mp_count_bits.o mp_cutoffs.o \ +mp_decr.o mp_div.o mp_div_2.o mp_div_2d.o mp_div_3.o mp_div_d.o mp_dr_is_modulus.o mp_dr_reduce.o \ +mp_dr_setup.o mp_error_to_string.o mp_exch.o mp_expt_u32.o mp_exptmod.o mp_exteuclid.o mp_fread.o \ +mp_from_sbin.o mp_from_ubin.o mp_fwrite.o mp_gcd.o mp_get_double.o mp_get_i32.o mp_get_i64.o mp_get_l.o \ +mp_get_ll.o mp_get_mag_u32.o mp_get_mag_u64.o mp_get_mag_ul.o mp_get_mag_ull.o mp_grow.o mp_incr.o \ +mp_init.o mp_init_copy.o mp_init_i32.o mp_init_i64.o mp_init_l.o mp_init_ll.o mp_init_multi.o mp_init_set.o \ +mp_init_size.o mp_init_u32.o mp_init_u64.o mp_init_ul.o mp_init_ull.o mp_invmod.o mp_is_square.o \ +mp_iseven.o mp_isodd.o mp_kronecker.o mp_lcm.o mp_log_u32.o mp_lshd.o mp_mod.o mp_mod_2d.o mp_mod_d.o \ +mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \ +mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \ mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \ mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_prime_tab.o \ mp_radix_size.o mp_radix_smap.o mp_rand.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \ diff --git a/tommath.def b/tommath.def index dc04b1e77..7c241bc75 100644 --- a/tommath.def +++ b/tommath.def @@ -73,7 +73,6 @@ EXPORTS mp_kronecker mp_lcm mp_log_u32 - mp_log_u32 mp_lshd mp_mod mp_mod_2d diff --git a/tommath_class.h b/tommath_class.h index 7fe2b29d8..43adad174 100644 --- a/tommath_class.h +++ b/tommath_class.h @@ -11,7 +11,6 @@ #endif #define LTM1 #if defined(LTM_ALL) -# define BN_MP_LOG_U32_C # define MP_2EXPT_C # define MP_ABS_C # define MP_ADD_C @@ -174,20 +173,6 @@ # define S_MP_TOOM_SQR_C #endif #endif -#if defined(BN_MP_LOG_U32_C) -# define MP_CLEAR_MULTI_C -# define MP_CMP_C -# define MP_CMP_D_C -# define MP_COPY_C -# define MP_EXCH_C -# define MP_EXPT_U32_C -# define MP_INIT_MULTI_C -# define MP_MUL_C -# define MP_SET_C -# define MP_SQR_C -# define S_MP_LOG_POWER_OF_TWO_C -#endif - #if defined(MP_2EXPT_C) # define MP_GROW_C # define MP_ZERO_C