diff options
Diffstat (limited to 'libtommath')
-rw-r--r-- | libtommath/bn_deprecated.c | 2 | ||||
-rw-r--r-- | libtommath/bn_mp_fread.c | 4 | ||||
-rw-r--r-- | libtommath/bn_mp_mul.c | 4 | ||||
-rw-r--r-- | libtommath/bn_mp_prime_rand.c | 2 | ||||
-rw-r--r-- | libtommath/bn_mp_radix_smap.c | 5 | ||||
-rw-r--r-- | libtommath/bn_mp_read_radix.c | 4 | ||||
-rw-r--r-- | libtommath/bn_mp_to_radix.c | 2 | ||||
-rw-r--r-- | libtommath/bn_prime_tab.c | 16 | ||||
-rw-r--r-- | libtommath/tommath.h | 33 | ||||
-rw-r--r-- | libtommath/tommath_private.h | 69 |
10 files changed, 42 insertions, 99 deletions
diff --git a/libtommath/bn_deprecated.c b/libtommath/bn_deprecated.c index 456f8a2..873414e 100644 --- a/libtommath/bn_deprecated.c +++ b/libtommath/bn_deprecated.c @@ -25,7 +25,7 @@ mp_err mp_jacobi(const mp_int *a, const mp_int *n, int *c) } #endif #ifdef BN_MP_PRIME_RANDOM_EX_C -mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat) +mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat) { return s_mp_prime_random_ex(a, t, size, flags, cb, dat); } diff --git a/libtommath/bn_mp_fread.c b/libtommath/bn_mp_fread.c index 52ea773..1e5ecf7 100644 --- a/libtommath/bn_mp_fread.c +++ b/libtommath/bn_mp_fread.c @@ -30,11 +30,11 @@ mp_err mp_fread(mp_int *a, int radix, FILE *stream) do { int y; unsigned pos = (unsigned)(ch - (int)'('); - if (mp_s_rmap_reverse_sz < pos) { + if (MP_RMAP_REVERSE_SIZE < pos) { break; } - y = (int)mp_s_rmap_reverse[pos]; + y = (int)s_mp_rmap_reverse[pos]; if ((y == 0xff) || (y >= radix)) { break; diff --git a/libtommath/bn_mp_mul.c b/libtommath/bn_mp_mul.c index c5e0438..c76b97d 100644 --- a/libtommath/bn_mp_mul.c +++ b/libtommath/bn_mp_mul.c @@ -17,7 +17,7 @@ mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) * The bigger one needs to be at least about one MP_KARATSUBA_MUL_CUTOFF bigger * to make some sense, but it depends on architecture, OS, position of the * stars... so YMMV. - * Using it to cut the input into slices small enough for fast_s_mp_mul_digs + * Using it to cut the input into slices small enough for s_mp_mul_digs_fast * was actually slower on the author's machine, but YMMV. */ (min_len >= MP_KARATSUBA_MUL_CUTOFF) && @@ -35,7 +35,7 @@ mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) /* can we use the fast multiplier? * * The fast multiplier can be used if the output will - * have less than MP_WARRAY digits and the number of + * have less than PRIVATE_MP_WARRAY digits and the number of * digits won't affect carry propagation */ (digs < PRIVATE_MP_WARRAY) && diff --git a/libtommath/bn_mp_prime_rand.c b/libtommath/bn_mp_prime_rand.c index 4530e9a..af19d76c 100644 --- a/libtommath/bn_mp_prime_rand.c +++ b/libtommath/bn_mp_prime_rand.c @@ -18,7 +18,7 @@ */ /* This is possibly the mother of all prime generation functions, muahahahahaha! */ -mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat) +mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat) { unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; int bsize, maskOR_msb_offset; diff --git a/libtommath/bn_mp_radix_smap.c b/libtommath/bn_mp_radix_smap.c index eb4765a..5147c74 100644 --- a/libtommath/bn_mp_radix_smap.c +++ b/libtommath/bn_mp_radix_smap.c @@ -4,8 +4,8 @@ /* SPDX-License-Identifier: Unlicense */ /* chars used in radix conversions */ -const char *const mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; -const unsigned char mp_s_rmap_reverse[] = { +const char s_mp_rmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; +const unsigned char s_mp_rmap_reverse[] = { 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, /* ()*+,-./ */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 01234567 */ 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 89:;<=>? */ @@ -18,5 +18,4 @@ const unsigned char mp_s_rmap_reverse[] = { 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, /* pqrstuvw */ 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, /* xyz{|}~. */ }; -const size_t mp_s_rmap_reverse_sz = sizeof(mp_s_rmap_reverse); #endif diff --git a/libtommath/bn_mp_read_radix.c b/libtommath/bn_mp_read_radix.c index de18e06..456a387 100644 --- a/libtommath/bn_mp_read_radix.c +++ b/libtommath/bn_mp_read_radix.c @@ -43,10 +43,10 @@ mp_err mp_read_radix(mp_int *a, const char *str, int radix) */ ch = (radix <= 36) ? (char)MP_TOUPPER((int)*str) : *str; pos = (unsigned)(ch - '('); - if (mp_s_rmap_reverse_sz < pos) { + if (MP_RMAP_REVERSE_SIZE < pos) { break; } - y = (int)mp_s_rmap_reverse[pos]; + y = (int)s_mp_rmap_reverse[pos]; /* if the char was found in the map * and is less than the given radix add it diff --git a/libtommath/bn_mp_to_radix.c b/libtommath/bn_mp_to_radix.c index 7fa86ca..18cb504 100644 --- a/libtommath/bn_mp_to_radix.c +++ b/libtommath/bn_mp_to_radix.c @@ -60,7 +60,7 @@ mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, i if ((err = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) { goto LBL_ERR; } - *str++ = mp_s_rmap[d]; + *str++ = s_mp_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points diff --git a/libtommath/bn_prime_tab.c b/libtommath/bn_prime_tab.c index a6c07f8..6bd53fe 100644 --- a/libtommath/bn_prime_tab.c +++ b/libtommath/bn_prime_tab.c @@ -3,7 +3,7 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -const mp_digit ltm_prime_tab[] = { +const mp_digit s_mp_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, @@ -44,18 +44,4 @@ const mp_digit ltm_prime_tab[] = { #endif }; -#if defined(__GNUC__) && __GNUC__ >= 4 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -const mp_digit *s_mp_prime_tab = ltm_prime_tab; -#pragma GCC diagnostic pop -#elif defined(_MSC_VER) && _MSC_VER >= 1500 -#pragma warning(push) -#pragma warning(disable: 4996) -const mp_digit *s_mp_prime_tab = ltm_prime_tab; -#pragma warning(pop) -#else -const mp_digit *s_mp_prime_tab = ltm_prime_tab; -#endif - #endif diff --git a/libtommath/tommath.h b/libtommath/tommath.h index 63f8190..82330c3 100644 --- a/libtommath/tommath.h +++ b/libtommath/tommath.h @@ -61,7 +61,6 @@ extern "C" { /* some default configurations. * * A "mp_digit" must be able to hold MP_DIGIT_BIT + 1 bits - * A "mp_word" must be able to hold 2*MP_DIGIT_BIT + 1 bits * * At the very least a mp_digit must be able to hold 7 bits * [any size beyond that is ok provided it doesn't overflow the data type] @@ -69,22 +68,16 @@ extern "C" { #ifdef MP_8BIT typedef unsigned char mp_digit; -typedef unsigned short mp_word; # define MP_DIGIT_BIT 7 #elif defined(MP_16BIT) typedef unsigned short mp_digit; -typedef unsigned int mp_word; # define MP_DIGIT_BIT 15 #elif defined(MP_64BIT) /* for GCC only on supported platforms */ typedef Tcl_WideUInt mp_digit; -#if defined(__GNUC__) -typedef unsigned long mp_word __attribute__((mode(TI))); -#endif # define MP_DIGIT_BIT 60 #else typedef unsigned int mp_digit; -typedef Tcl_WideUInt mp_word; # ifdef MP_31BIT /* * This is an extension that uses 31-bit digits. @@ -191,9 +184,6 @@ TOOM_SQR_CUTOFF; # define MP_PREC (MP_DEPRECATED_PRAGMA("MP_PREC is an internal macro") PRIVATE_MP_PREC) #endif -/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ -#define PRIVATE_MP_WARRAY (int)(1 << (((CHAR_BIT * (int)sizeof(mp_word)) - (2 * MP_DIGIT_BIT)) + 1)) - #if defined(__GNUC__) && __GNUC__ >= 4 # define MP_NULL_TERMINATED __attribute__((sentinel)) #else @@ -247,10 +237,6 @@ typedef struct { mp_digit *dp; } mp_int; -/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ -typedef int private_mp_prime_callback(unsigned char *dst, int len, void *dat); -typedef private_mp_prime_callback MP_DEPRECATED(mp_rand_source) ltm_prime_callback; - /* error code to char* string */ const char *mp_error_to_string(mp_err code) MP_WUR; @@ -627,12 +613,6 @@ mp_err mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y) #endif #define PRIME_SIZE (MP_DEPRECATED_PRAGMA("PRIME_SIZE has been made internal") PRIVATE_MP_PRIME_TAB_SIZE) -/* table of first PRIME_SIZE primes */ -MP_DEPRECATED(internal) extern const mp_digit ltm_prime_tab[PRIVATE_MP_PRIME_TAB_SIZE]; - -/* result=1 if a is divisible by one of the first PRIME_SIZE primes */ -MP_DEPRECATED(mp_prime_is_prime) mp_err mp_prime_is_divisible(const mp_int *a, mp_bool *result) MP_WUR; - /* performs one Fermat test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ @@ -681,17 +661,6 @@ mp_err mp_prime_is_prime(const mp_int *a, int t, mp_bool *result) MP_WUR; */ mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; -/* makes a truly random prime of a given size (bytes), - * call with bbs = 1 if you want it to be congruent to 3 mod 4 - * - * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can - * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself - * so it can be NULL - * - * The prime generated will be larger than 2^(8*size). - */ -#define mp_prime_random(a, t, size, bbs, cb, dat) (MP_DEPRECATED_PRAGMA("mp_prime_random has been deprecated, use mp_prime_rand instead") mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?MP_PRIME_BBS:0, cb, dat)) - /* makes a truly random prime of a given size (bits), * * Flags are as follows: @@ -705,8 +674,6 @@ mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; * so it can be NULL * */ -MP_DEPRECATED(mp_prime_rand) mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, - private_mp_prime_callback cb, void *dat) MP_WUR; mp_err mp_prime_rand(mp_int *a, int t, int size, int flags) MP_WUR; /* Integer logarithm to integer base */ diff --git a/libtommath/tommath_private.h b/libtommath/tommath_private.h index 29607d4..61d382d 100644 --- a/libtommath/tommath_private.h +++ b/libtommath/tommath_private.h @@ -1,11 +1,12 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -#ifndef TOMMATH_PRIV_H_ -#define TOMMATH_PRIV_H_ +#ifndef TOMMATH_PRIVATE_H_ +#define TOMMATH_PRIVATE_H_ #include <tommath.h> #include "tommath_class.h" +#include <limits.h> /* * Private symbols @@ -117,11 +118,6 @@ do { \ # define MP_KARATSUBA_SQR_CUTOFF MP_DEFAULT_KARATSUBA_SQR_CUTOFF # define MP_TOOM_MUL_CUTOFF MP_DEFAULT_TOOM_MUL_CUTOFF # define MP_TOOM_SQR_CUTOFF MP_DEFAULT_TOOM_SQR_CUTOFF -#else -# define MP_KARATSUBA_MUL_CUTOFF KARATSUBA_MUL_CUTOFF -# define MP_KARATSUBA_SQR_CUTOFF KARATSUBA_SQR_CUTOFF -# define MP_TOOM_MUL_CUTOFF TOOM_MUL_CUTOFF -# define MP_TOOM_SQR_CUTOFF TOOM_SQR_CUTOFF #endif /* define heap macros */ @@ -163,10 +159,27 @@ extern void MP_FREE(void *mem, size_t size); #define MP_SIZEOF_BITS(type) ((size_t)CHAR_BIT * sizeof(type)) #define MP_MAXFAST (int)(1uL << (MP_SIZEOF_BITS(mp_word) - (2u * (size_t)MP_DIGIT_BIT))) -/* TODO: Remove PRIVATE_MP_PREC as soon as deprecated MP_PREC is removed from tommath.h */ -#ifdef PRIVATE_MP_PREC -# undef MP_PREC -# define MP_PREC PRIVATE_MP_PREC +#define PRIVATE_MP_WARRAY (1 << ((MP_SIZEOF_BITS(mp_word) - (2 * MP_DIGIT_BIT)) + 1)) + +#if defined(MP_16BIT) +typedef unsigned int mp_word; +#elif defined(MP_64BIT) && defined(__GNUC__) +typedef unsigned long mp_word __attribute__((mode(TI))); +#elif defined(_WIN32) +typedef unsigned __int64 mp_word; +#else +typedef unsigned long long mp_word; +#endif + +MP_STATIC_ASSERT(correct_word_size, sizeof(mp_word) == 2 * sizeof(mp_digit)) + +/* default precision */ +#ifndef MP_PREC +# ifndef MP_LOW_MEM +# define MP_PREC 32 /* default digits of precision */ +# else +# define MP_PREC 8 /* default digits of precision */ +# endif #endif /* Minimum number of available digits in mp_int, MP_PREC >= MP_MIN_PREC */ @@ -198,7 +211,8 @@ MP_PRIVATE mp_err s_mp_montgomery_reduce_fast(mp_int *x, const mp_int *n, mp_dig MP_PRIVATE mp_err s_mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode) MP_WUR; MP_PRIVATE mp_err s_mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode) MP_WUR; MP_PRIVATE mp_err s_mp_rand_platform(void *p, size_t n) MP_WUR; -MP_PRIVATE mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat); +typedef int mp_prime_callback(unsigned char *dst, int len, void *dat); +MP_PRIVATE mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat); MP_PRIVATE void s_mp_reverse(unsigned char *s, size_t len); MP_PRIVATE mp_err s_mp_prime_is_divisible(const mp_int *a, mp_bool *result); @@ -208,33 +222,10 @@ 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); #endif -extern MP_PRIVATE const char *const mp_s_rmap; -extern MP_PRIVATE const unsigned char mp_s_rmap_reverse[]; -extern MP_PRIVATE const size_t mp_s_rmap_reverse_sz; -extern MP_PRIVATE const mp_digit *s_mp_prime_tab; - -/* deprecated functions */ -#if 0 -MP_DEPRECATED(s_mp_invmod_fast) mp_err fast_mp_invmod(const mp_int *a, const mp_int *b, mp_int *c); -MP_DEPRECATED(s_mp_montgomery_reduce_fast) mp_err fast_mp_montgomery_reduce(mp_int *x, const mp_int *n, - mp_digit rho); -MP_DEPRECATED(s_mp_mul_digs_fast) mp_err fast_s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, - int digs); -MP_DEPRECATED(s_mp_mul_high_digs_fast) mp_err fast_s_mp_mul_high_digs(const mp_int *a, const mp_int *b, - mp_int *c, - int digs); -MP_DEPRECATED(s_mp_sqr_fast) mp_err fast_s_mp_sqr(const mp_int *a, mp_int *b); -MP_DEPRECATED(s_mp_balance_mul) mp_err mp_balance_mul(const mp_int *a, const mp_int *b, mp_int *c); -MP_DEPRECATED(s_mp_exptmod_fast) mp_err mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, - mp_int *Y, - int redmode); -MP_DEPRECATED(s_mp_invmod_slow) mp_err mp_invmod_slow(const mp_int *a, const mp_int *b, mp_int *c); -MP_DEPRECATED(s_mp_karatsuba_mul) mp_err mp_karatsuba_mul(const mp_int *a, const mp_int *b, mp_int *c); -MP_DEPRECATED(s_mp_karatsuba_sqr) mp_err mp_karatsuba_sqr(const mp_int *a, mp_int *b); -MP_DEPRECATED(s_mp_toom_mul) mp_err mp_toom_mul(const mp_int *a, const mp_int *b, mp_int *c); -MP_DEPRECATED(s_mp_toom_sqr) mp_err mp_toom_sqr(const mp_int *a, mp_int *b); -MP_DEPRECATED(s_mp_reverse) void bn_reverse(unsigned char *s, int len); -#endif +#define MP_RMAP_REVERSE_SIZE 88 +extern MP_PRIVATE const char s_mp_rmap[]; +extern MP_PRIVATE const unsigned char s_mp_rmap_reverse[]; +extern MP_PRIVATE const mp_digit s_mp_prime_tab[]; #define MP_GET_ENDIANNESS(x) \ do{\ |