From d010f7c3480b092d396c73d872da43257192a475 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Tue, 5 Nov 2019 16:37:52 +0000 Subject: More WIP: All makefile builds appear to work fine, makefile.vc build still to be done. --- generic/tclExecute.c | 2 +- generic/tclLink.c | 2 +- generic/tclStubInit.c | 132 +++- generic/tclTomMath.decls | 26 +- generic/tclTomMath.h | 1093 +--------------------------------- generic/tclTomMathDecls.h | 204 +++---- generic/tommath.h | 1 - libtommath/bn_mp_fread.c | 4 +- libtommath/bn_mp_radix_smap.c | 5 +- libtommath/bn_mp_read_radix.c | 4 +- libtommath/bn_mp_set_double.c | 4 +- libtommath/bn_mp_to_radix.c | 2 +- libtommath/bn_s_mp_rand_jenkins.c | 4 +- libtommath/tommath.h | 10 +- libtommath/tommath_private.h | 85 ++- macosx/Tcl.xcode/project.pbxproj | 8 - macosx/Tcl.xcodeproj/project.pbxproj | 8 - tools/fix_tommath_h.tcl | 103 ---- unix/Makefile.in | 19 +- unix/configure | 104 ++++ unix/configure.ac | 19 + unix/tclConfig.h.in | 3 - win/Makefile.in | 47 +- win/configure | 24 +- win/configure.ac | 12 +- win/makefile.vc | 15 - 26 files changed, 489 insertions(+), 1451 deletions(-) delete mode 100644 generic/tommath.h delete mode 100755 tools/fix_tommath_h.tcl diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 8d6bf9c..a2e9401 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -8479,7 +8479,7 @@ ExecuteExtendedBinaryMathOp( } Tcl_TakeBignumFromObj(NULL, valuePtr, &big1); mp_init(&bigResult); - mp_expt_u32(&big1, (uint32_t)w2, &bigResult); + mp_expt_u32(&big1, (unsigned int)w2, &bigResult); mp_clear(&big1); BIG_RESULT(&bigResult); } diff --git a/generic/tclLink.c b/generic/tclLink.c index 6b7b997..8fbe540 100644 --- a/generic/tclLink.c +++ b/generic/tclLink.c @@ -16,7 +16,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include /* diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c index f2ff34d..405f92b 100644 --- a/generic/tclStubInit.c +++ b/generic/tclStubInit.c @@ -11,6 +11,7 @@ #include "tclInt.h" #include "tommath_private.h" +#include "tclTomMath.h" #ifdef __CYGWIN__ # include @@ -64,12 +65,69 @@ #undef Tcl_UtfToUniCharDString #undef Tcl_UtfToUniChar -#undef TclBN_mp_tc_and -#undef TclBN_mp_tc_or -#undef TclBN_mp_tc_xor -#define TclBN_mp_tc_and TclBN_mp_and -#define TclBN_mp_tc_or TclBN_mp_or -#define TclBN_mp_tc_xor TclBN_mp_xor +#define TclBN_mp_add mp_add +#define TclBN_mp_and mp_and +#define TclBN_mp_clamp mp_clamp +#define TclBN_mp_clear mp_clear +#define TclBN_mp_clear_multi mp_clear_multi +#define TclBN_mp_cmp mp_cmp +#define TclBN_mp_cmp_mag mp_cmp_mag +#define TclBN_mp_cnt_lsb mp_cnt_lsb +#define TclBN_mp_copy mp_copy +#define TclBN_mp_count_bits mp_count_bits +#define TclBN_mp_div mp_div +#define TclBN_mp_div_2 mp_div_2 +#define TclBN_mp_div_2d mp_div_2d +#define TclBN_mp_exch mp_exch +#define TclBN_mp_get_mag_u64 mp_get_mag_u64 +#define TclBN_mp_get_mag_ul mp_get_mag_ul +#define TclBN_mp_grow mp_grow +#define TclBN_mp_init mp_init +#define TclBN_mp_init_copy mp_init_copy +#define TclBN_mp_init_multi mp_init_multi +#define TclBN_mp_init_size mp_init_size +#define TclBN_mp_init_ul mp_init_ul +#define TclBN_mp_lshd mp_lshd +#define TclBN_mp_mod mp_mod +#define TclBN_mp_mod_2d mp_mod_2d +#define TclBN_mp_mul mp_mul +#define TclBN_mp_mul_2 mp_mul_2 +#define TclBN_mp_mul_2d mp_mul_2d +#define TclBN_mp_neg mp_neg +#define TclBN_mp_or mp_or +#define TclBN_mp_radix_size mp_radix_size +#define TclBN_mp_read_radix mp_read_radix +#define TclBN_mp_rshd mp_rshd +#define TclBN_mp_set_u64 mp_set_u64 +#define TclBN_mp_shrink mp_shrink +#define TclBN_mp_sqr mp_sqr +#define TclBN_mp_sqrt mp_sqrt +#define TclBN_mp_sub mp_sub +#define TclBN_mp_signed_rsh mp_signed_rsh +#define TclBN_mp_tc_and mp_and +#define TclBN_mp_tc_div_2d mp_signed_rsh +#define TclBN_mp_tc_or mp_or +#define TclBN_mp_tc_xor mp_xor +#define TclBN_mp_toradix_n mp_toradix_n +#define TclBN_mp_to_radix mp_to_radix +#define TclBN_mp_to_ubin mp_to_ubin +#define TclBN_mp_ubin_size mp_ubin_size +#define TclBN_mp_xor mp_xor +#define TclBN_mp_zero mp_zero +#define TclBN_s_mp_add s_mp_add +#define TclBN_s_mp_balance_mul mp_balance_mul +#define TclBN_mp_get_bit s_mp_get_bit +#define TclBN_mp_karatsuba_mul s_mp_karatsuba_mul +#define TclBN_mp_karatsuba_sqr s_mp_karatsuba_sqr +#define TclBN_s_mp_mul_digs s_mp_mul_digs +#define TclBN_s_mp_mul_digs_fast s_mp_mul_digs_fast +#define TclBN_s_mp_reverse s_mp_reverse +#define TclBN_s_mp_sqr s_mp_sqr +#define TclBN_s_mp_sqr_fast s_mp_sqr_fast +#define TclBN_s_mp_sub s_mp_sub +#define TclBN_mp_toom_mul s_mp_toom_mul +#define TclBN_mp_toom_sqr s_mp_toom_sqr + /* See bug 510001: TclSockMinimumBuffers needs plat imp */ #if defined(_WIN64) || defined(TCL_NO_DEPRECATED) || TCL_MAJOR_VERSION > 8 @@ -97,22 +155,33 @@ static mp_err TclBN_mp_set_long(mp_int *a, unsigned long i) #define TclBN_mp_set_ul (void (*)(mp_int *a, unsigned long i))TclBN_mp_set_long mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_expt_u32(a, b, c); + return mp_expt_u32(a, b, c); } - mp_err TclBN_mp_add_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_add_d(a, b, c); + return mp_add_d(a, b, c); } mp_err TclBN_mp_cmp_d(const mp_int *a, unsigned int b) { - return TclBN_s_mp_cmp_d(a, b); + return mp_cmp_d(a, b); } mp_err TclBN_mp_sub_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_sub_d(a, b, c); + return mp_sub_d(a, b, c); } - mp_err TclBN_mp_div_d(const mp_int *a, unsigned int b, mp_int *c, unsigned int *d) { mp_digit d2; - mp_err result = TclBN_s_mp_div_d(a, b, c, (d ? &d2 : NULL)); + mp_err result = mp_div_d(a, b, c, (d ? &d2 : NULL)); + if (d) { + *d = d2; + } + return result; +} +mp_err TclBN_mp_div_ld(const mp_int *a, uint64_t b, mp_int *c, uint64_t *d) { + mp_err result; + mp_digit d2; + + if ((b | (mp_digit)-1) != (mp_digit)-1) { + return MP_VAL; + } + result = mp_div_d(a, b, c, (d ? &d2 : NULL)); if (d) { *d = d2; } @@ -120,20 +189,28 @@ mp_err TclBN_mp_div_d(const mp_int *a, unsigned int b, mp_int *c, unsigned int * } mp_err TclBN_mp_div_3(const mp_int *a, mp_int *c, unsigned int *d) { mp_digit d2; - mp_err result = TclBN_s_mp_div_3(a, c, &d2); + mp_err result = mp_div_3(a, c, (d ? &d2 : NULL)); + if (d) { + *d = d2; + } + return result; +} +mp_err TclBN_mp_div_l3(const mp_int *a, mp_int *c, uint64_t *d) { + mp_digit d2; + mp_err result = mp_div_3(a, c, (d ? &d2 : NULL)); if (d) { *d = d2; } return result; } mp_err TclBN_mp_init_set(mp_int *a, unsigned int b) { - return TclBN_s_mp_init_set(a, b); + return mp_init_set(a, b); } mp_err TclBN_mp_mul_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_mul_d(a, b, c); + return mp_mul_d(a, b, c); } void TclBN_mp_set(mp_int *a, unsigned int b) { - TclBN_s_mp_set(a, b); + mp_set(a, b); } @@ -142,6 +219,7 @@ void TclBN_mp_set(mp_int *a, unsigned int b) { # define TclBN_mp_expt_d_ex 0 # define TclBN_mp_to_unsigned_bin 0 # define TclBN_mp_to_unsigned_bin_n 0 +# undef TclBN_mp_toradix_n # define TclBN_mp_toradix_n 0 # define TclSetStartupScriptPath 0 # define TclGetStartupScriptPath 0 @@ -180,12 +258,12 @@ int TclBN_mp_expt_d_ex(const mp_int *a, unsigned int b, mp_int *c, int fast) return mp_expt_u32(a, b, c); } -mp_err mp_to_unsigned_bin(const mp_int *a, unsigned char *b) +mp_err TclBN_mp_to_unsigned_bin(const mp_int *a, unsigned char *b) { return mp_to_ubin(a, b, INT_MAX, NULL); } -mp_err mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) +mp_err TclBN_mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) { size_t n = mp_ubin_size(a); if (*outlen < (unsigned long)n) { @@ -195,7 +273,7 @@ mp_err mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *ou return mp_to_ubin(a, b, n, NULL); } -void bn_reverse(unsigned char *s, int len) +void TclBN_reverse(unsigned char *s, int len) { if (len > 0) { s_mp_reverse(s, (size_t)len); @@ -518,15 +596,25 @@ static int uniCharNcasecmp(const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsig # undef Tcl_StringMatch # define Tcl_StringMatch 0 # define TclBN_reverse 0 +# undef TclBN_s_mp_mul_digs_fast # define TclBN_s_mp_mul_digs_fast 0 +# undef TclBN_s_mp_sqr_fast # define TclBN_s_mp_sqr_fast 0 +# undef TclBN_mp_karatsuba_mul # define TclBN_mp_karatsuba_mul 0 +# undef TclBN_mp_karatsuba_sqr # define TclBN_mp_karatsuba_sqr 0 +# undef TclBN_mp_toom_mul # define TclBN_mp_toom_mul 0 +# undef TclBN_mp_toom_sqr # define TclBN_mp_toom_sqr 0 +# undef TclBN_s_mp_add # define TclBN_s_mp_add 0 +# undef TclBN_s_mp_mul_digs # define TclBN_s_mp_mul_digs 0 +# undef TclBN_s_mp_sqr # define TclBN_s_mp_sqr 0 +# undef TclBN_s_mp_sub # define TclBN_s_mp_sub 0 #else /* TCL_NO_DEPRECATED */ # define Tcl_SeekOld seekOld @@ -1047,9 +1135,9 @@ const TclTomMathStubs tclTomMathStubs = { TclBN_mp_expt_d_ex, /* 67 */ TclBN_mp_set_u64, /* 68 */ TclBN_mp_get_mag_u64, /* 69 */ - 0, /* 70 */ + TclBN_mp_div_l3, /* 70 */ TclBN_mp_get_mag_ul, /* 71 */ - 0, /* 72 */ + TclBN_mp_div_ld, /* 72 */ TclBN_mp_tc_and, /* 73 */ TclBN_mp_tc_or, /* 74 */ TclBN_mp_tc_xor, /* 75 */ diff --git a/generic/tclTomMath.decls b/generic/tclTomMath.decls index dc299ef..fc04a8b 100644 --- a/generic/tclTomMath.decls +++ b/generic/tclTomMath.decls @@ -33,7 +33,7 @@ declare 2 { mp_err MP_WUR TclBN_mp_add(const mp_int *a, const mp_int *b, mp_int *c) } declare 3 { - mp_err MP_WUR TclBN_mp_add_d(const mp_int *a, uint32_t b, mp_int *c) + mp_err MP_WUR TclBN_mp_add_d(const mp_int *a, unsigned int b, mp_int *c) } declare 4 { mp_err MP_WUR TclBN_mp_and(const mp_int *a, const mp_int *b, mp_int *c) @@ -51,7 +51,7 @@ declare 8 { mp_ord MP_WUR TclBN_mp_cmp(const mp_int *a, const mp_int *b) } declare 9 { - mp_ord MP_WUR TclBN_mp_cmp_d(const mp_int *a, uint32_t b) + mp_ord MP_WUR TclBN_mp_cmp_d(const mp_int *a, unsigned int b) } declare 10 { mp_ord MP_WUR TclBN_mp_cmp_mag(const mp_int *a, const mp_int *b) @@ -66,7 +66,7 @@ declare 13 { mp_err MP_WUR TclBN_mp_div(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) } declare 14 { - mp_err MP_WUR TclBN_mp_div_d(const mp_int *a, uint32_t b, mp_int *q, uint32_t *r) + mp_err MP_WUR TclBN_mp_div_d(const mp_int *a, unsigned int b, mp_int *q, unsigned int *r) } declare 15 { mp_err MP_WUR TclBN_mp_div_2(const mp_int *a, mp_int *q) @@ -75,13 +75,13 @@ declare 16 { mp_err MP_WUR TclBN_mp_div_2d(const mp_int *a, int b, mp_int *q, mp_int *r) } declare 17 { - mp_err MP_WUR TclBN_mp_div_3(const mp_int *a, mp_int *q, uint32_t *r) + mp_err MP_WUR TclBN_mp_div_3(const mp_int *a, mp_int *q, unsigned int *r) } declare 18 { void TclBN_mp_exch(mp_int *a, mp_int *b) } declare 19 { - mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) + mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) } declare 20 { mp_err MP_WUR TclBN_mp_grow(mp_int *a, int size) @@ -96,7 +96,7 @@ declare 23 { mp_err MP_WUR TclBN_mp_init_multi(mp_int *a, ...) } declare 24 { - mp_err MP_WUR TclBN_mp_init_set(mp_int *a, uint32_t b) + mp_err MP_WUR TclBN_mp_init_set(mp_int *a, unsigned int b) } declare 25 { mp_err MP_WUR TclBN_mp_init_size(mp_int *a, int size) @@ -114,7 +114,7 @@ declare 29 { mp_err MP_WUR TclBN_mp_mul(const mp_int *a, const mp_int *b, mp_int *p) } declare 30 { - mp_err MP_WUR TclBN_mp_mul_d(const mp_int *a, uint32_t b, mp_int *p) + mp_err MP_WUR TclBN_mp_mul_d(const mp_int *a, unsigned int b, mp_int *p) } declare 31 { mp_err MP_WUR TclBN_mp_mul_2(const mp_int *a, mp_int *p) @@ -141,7 +141,7 @@ declare 38 { mp_err MP_WUR TclBN_mp_shrink(mp_int *a) } declare 39 { - void TclBN_mp_set(mp_int *a, uint32_t b) + void TclBN_mp_set(mp_int *a, unsigned int b) } declare 40 { mp_err MP_WUR TclBN_mp_sqr(const mp_int *a, mp_int *b) @@ -153,7 +153,7 @@ declare 42 { mp_err MP_WUR TclBN_mp_sub(const mp_int *a, const mp_int *b, mp_int *c) } declare 43 { - mp_err MP_WUR TclBN_mp_sub_d(const mp_int *a, uint32_t b, mp_int *c) + mp_err MP_WUR TclBN_mp_sub_d(const mp_int *a, unsigned int b, mp_int *c) } declare 44 {deprecated {Use mp_to_ubin}} { mp_err TclBN_mp_to_unsigned_bin(const mp_int *a, unsigned char *b) @@ -235,7 +235,7 @@ declare 66 {deprecated {Use mp_init() + mp_set_u64()}} { # Added in libtommath 1.0 declare 67 {deprecated {Use mp_expt_u32}} { - mp_err TclBN_mp_expt_d_ex(const mp_int *a, uint32_t b, mp_int *c, int fast) + mp_err TclBN_mp_expt_d_ex(const mp_int *a, unsigned int b, mp_int *c, int fast) } # Added in libtommath 1.0.1 declare 68 { @@ -244,9 +244,15 @@ declare 68 { declare 69 { uint64_t MP_WUR TclBN_mp_get_mag_u64(const mp_int *a) } +declare 70 { + mp_err MP_WUR TclBN_mp_div_l3(const mp_int *a, mp_int *q, uint64_t *r) +} declare 71 { unsigned long MP_WUR TclBN_mp_get_mag_ul(const mp_int *a) } +declare 72 { + mp_err MP_WUR TclBN_mp_div_ld(const mp_int *a, uint64_t b, mp_int *q, uint64_t *r) +} # Added in libtommath 1.1.0 declare 73 { diff --git a/generic/tclTomMath.h b/generic/tclTomMath.h index 557eff1..8cc5cc2 100644 --- a/generic/tclTomMath.h +++ b/generic/tclTomMath.h @@ -1,1090 +1,19 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis */ -/* SPDX-License-Identifier: Unlicense */ +#ifndef BN_TCL_H_ +#define BN_TCL_H_ -#ifndef BN_H_ -#define BN_H_ - -#ifndef MP_NO_STDINT +#ifdef MP_NO_STDINT +#ifdef HAVE_STDINT_H # include -#endif -#include -#include - -#ifndef MODULE_SCOPE -#define MODULE_SCOPE extern -#endif - -#ifdef LTM_NO_FILE -# warning LTM_NO_FILE has been deprecated, use MP_NO_FILE. -# define MP_NO_FILE -#endif - -#ifndef MP_NO_FILE -# include -#endif - -#ifdef MP_8BIT -# ifdef _MSC_VER -# pragma message("8-bit (MP_8BIT) support is deprecated and will be dropped completely in the next version.") -# else -# warning "8-bit (MP_8BIT) support is deprecated and will be dropped completely in the next version." -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* MS Visual C++ doesn't have a 128bit type for words, so fall back to 32bit MPI's (where words are 64bit) */ -#if (defined(_WIN32) || defined(__LLP64__) || defined(__e2k__) || defined(__LCC__)) && !defined(MP_32BIT) && !defined(MP_64BIT) -# define MP_32BIT -#endif - -/* detect 64-bit mode if possible */ -#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) || \ - defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \ - defined(__s390x__) || defined(__arch64__) || defined(__aarch64__) || \ - defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || \ - defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \ - defined(__LP64__) || defined(_LP64) || defined(__64BIT__) -# if !(defined(MP_64BIT) || defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT)) -# if defined(__GNUC__) && !defined(__hppa) -/* we support 128bit integers only via: __attribute__((mode(TI))) */ -# define MP_64BIT -# else -/* otherwise we fall back to MP_32BIT even on 64bit platforms */ -# define MP_32BIT -# endif -# endif -#endif - -#ifdef MP_DIGIT_BIT -# error Defining MP_DIGIT_BIT is disallowed, use MP_8/16/31/32/64BIT -#endif - -/* some default configurations. - * - * A "mp_digit" must be able to hold 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] - */ - -#ifdef MP_8BIT -typedef unsigned char mp_digit; -# define MP_DIGIT_BIT 7 -#elif defined(MP_16BIT) -typedef unsigned short mp_digit; -# define MP_DIGIT_BIT 15 -#elif defined(MP_64BIT) -/* for GCC only on supported platforms */ -typedef unsigned long long mp_digit; -# define MP_DIGIT_BIT 60 #else -typedef unsigned int mp_digit; -# ifdef MP_31BIT -/* - * This is an extension that uses 31-bit digits. - * Please be aware that not all functions support this size, especially s_mp_mul_digs_fast - * will be reduced to work on small numbers only: - * Up to 8 limbs, 248 bits instead of up to 512 limbs, 15872 bits with MP_28BIT. - */ -# define MP_DIGIT_BIT 31 -# else -/* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ -# define MP_DIGIT_BIT 28 -# define MP_28BIT -# endif -#endif - -/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ -#ifndef MP_DIGIT_BIT -# define MP_DIGIT_BIT (((CHAR_BIT * MP_SIZEOF_MP_DIGIT) - 1)) /* bits per digit */ -#endif - -#define MP_MASK ((((mp_digit)1)<<((mp_digit)MP_DIGIT_BIT))-((mp_digit)1)) -#define MP_DIGIT_MAX MP_MASK - -/* Primality generation flags */ -#define MP_PRIME_BBS 0x0001 /* BBS style prime */ -#define MP_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ -#define MP_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ - -#ifdef MP_USE_ENUMS -typedef enum { - MP_ZPOS = 0, /* positive */ - MP_NEG = 1 /* negative */ -} mp_sign; -typedef enum { - MP_LT = -1, /* less than */ - MP_EQ = 0, /* equal */ - MP_GT = 1 /* greater than */ -} mp_ord; -typedef enum { - MP_NO = 0, - MP_YES = 1 -} mp_bool; -typedef enum { - MP_OKAY = 0, /* no error */ - MP_ERR = -1, /* unknown error */ - MP_MEM = -2, /* out of mem */ - MP_VAL = -3, /* invalid input */ - MP_ITER = -4, /* maximum iterations reached */ - MP_BUF = -5 /* buffer overflow, supplied buffer too small */ -} mp_err; -typedef enum { - MP_LSB_FIRST = -1, - MP_MSB_FIRST = 1 -} mp_order; -typedef enum { - MP_LITTLE_ENDIAN = -1, - MP_NATIVE_ENDIAN = 0, - MP_BIG_ENDIAN = 1 -} mp_endian; -#else -typedef int mp_sign; -#define MP_ZPOS 0 /* positive integer */ -#define MP_NEG 1 /* negative */ -typedef int mp_ord; -#define MP_LT -1 /* less than */ -#define MP_EQ 0 /* equal to */ -#define MP_GT 1 /* greater than */ -typedef int mp_bool; -#define MP_YES 1 -#define MP_NO 0 -typedef int mp_err; -#define MP_OKAY 0 /* no error */ -#define MP_ERR -1 /* unknown error */ -#define MP_MEM -2 /* out of mem */ -#define MP_VAL -3 /* invalid input */ -#define MP_RANGE (MP_DEPRECATED_PRAGMA("MP_RANGE has been deprecated in favor of MP_VAL") MP_VAL) -#define MP_ITER -4 /* maximum iterations reached */ -#define MP_BUF -5 /* buffer overflow, supplied buffer too small */ -typedef int mp_order; -#define MP_LSB_FIRST -1 -#define MP_MSB_FIRST 1 -typedef int mp_endian; -#define MP_LITTLE_ENDIAN -1 -#define MP_NATIVE_ENDIAN 0 -#define MP_BIG_ENDIAN 1 -#endif - -/* tunable cutoffs */ - -#ifndef MP_FIXED_CUTOFFS -extern int -KARATSUBA_MUL_CUTOFF, -KARATSUBA_SQR_CUTOFF, -TOOM_MUL_CUTOFF, -TOOM_SQR_CUTOFF; -#endif - -/* define this to use lower memory usage routines (exptmods mostly) */ -/* #define MP_LOW_MEM */ - -/* default precision */ -#ifndef MP_PREC -# ifndef MP_LOW_MEM -# define MP_PREC 32 /* default digits of precision */ -# elif defined(MP_8BIT) -# define MP_PREC 16 /* default digits of precision */ -# else -# define MP_PREC 8 /* default digits of precision */ -# endif -#endif - -#if defined(__GNUC__) && __GNUC__ >= 4 -# define MP_NULL_TERMINATED __attribute__((sentinel)) -#else -# define MP_NULL_TERMINATED -#endif - -/* - * MP_WUR - warn unused result - * --------------------------- - * - * The result of functions annotated with MP_WUR must be - * checked and cannot be ignored. - * - * Most functions in libtommath return an error code. - * This error code must be checked in order to prevent crashes or invalid - * results. - * - * If you still want to avoid the error checks for quick and dirty programs - * without robustness guarantees, you can `#define MP_WUR` before including - * tommath.h, disabling the warnings. - */ -#ifndef MP_WUR -# if defined(__GNUC__) && __GNUC__ >= 4 -# define MP_WUR __attribute__((warn_unused_result)) -# else -# define MP_WUR -# endif -#endif - -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 405) -# define MP_DEPRECATED(x) __attribute__((deprecated("replaced by " #x))) -# define PRIVATE_MP_DEPRECATED_PRAGMA(s) _Pragma(#s) -# define MP_DEPRECATED_PRAGMA(s) PRIVATE_MP_DEPRECATED_PRAGMA(GCC warning s) -#elif defined(_MSC_VER) && _MSC_VER >= 1500 -# define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x)) -# define MP_DEPRECATED_PRAGMA(s) __pragma(message(s)) -#else -# define MP_DEPRECATED(s) -# define MP_DEPRECATED_PRAGMA(s) -#endif - -#define DIGIT_BIT (MP_DEPRECATED_PRAGMA("DIGIT_BIT macro is deprecated, MP_DIGIT_BIT instead") MP_DIGIT_BIT) -#define USED(m) (MP_DEPRECATED_PRAGMA("USED macro is deprecated, use z->used instead") (m)->used) -#define DIGIT(m, k) (MP_DEPRECATED_PRAGMA("DIGIT macro is deprecated, use z->dp instead") (m)->dp[(k)]) -#define SIGN(m) (MP_DEPRECATED_PRAGMA("SIGN macro is deprecated, use z->sign instead") (m)->sign) - -/* the infamous mp_int structure */ -#ifndef MP_INT_DECLARED -#define MP_INT_DECLARED -typedef struct mp_int mp_int; -#endif -struct mp_int { - int used, alloc; - mp_sign sign; - mp_digit *dp; -}; - -/* error code to char* string */ -/* -const char *mp_error_to_string(mp_err code) MP_WUR; -*/ - -/* ---> init and deinit bignum functions <--- */ -/* init a bignum */ -/* -mp_err mp_init(mp_int *a) MP_WUR; -*/ - -/* free a bignum */ -/* -void mp_clear(mp_int *a); -*/ - -/* init a null terminated series of arguments */ -/* -mp_err mp_init_multi(mp_int *mp, ...) MP_NULL_TERMINATED MP_WUR; -*/ - -/* clear a null terminated series of arguments */ -/* -void mp_clear_multi(mp_int *mp, ...) MP_NULL_TERMINATED; -*/ - -/* exchange two ints */ -/* -void mp_exch(mp_int *a, mp_int *b); -*/ - -/* shrink ram required for a bignum */ -/* -mp_err mp_shrink(mp_int *a) MP_WUR; -*/ - -/* grow an int to a given size */ -/* -mp_err mp_grow(mp_int *a, int size) MP_WUR; -*/ - -/* init to a given number of digits */ -/* -mp_err mp_init_size(mp_int *a, int size) MP_WUR; -*/ - -/* ---> Basic Manipulations <--- */ -#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) -#define mp_isodd(a) (((a)->used != 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) -#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) -#define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO) - -/* set to zero */ -/* -void mp_zero(mp_int *a); -*/ - -/* get and set doubles */ -/* -double mp_get_double(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_set_double(mp_int *a, double b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (int32_t) */ -#ifndef MP_NO_STDINT -/* -int32_t mp_get_i32(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_i32(mp_int *a, int32_t b); -*/ -/* -mp_err mp_init_i32(mp_int *a, int32_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint32_t) */ -#define mp_get_u32(a) ((uint32_t)mp_get_i32(a)) -/* -void mp_set_u32(mp_int *a, uint32_t b); -*/ -/* -mp_err mp_init_u32(mp_int *a, uint32_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (int64_t) */ -/* -int64_t mp_get_i64(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_i64(mp_int *a, int64_t b); -*/ -/* -mp_err mp_init_i64(mp_int *a, int64_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint64_t) */ -#define mp_get_u64(a) ((uint64_t)mp_get_i64(a)) -/* -void mp_set_u64(mp_int *a, uint64_t b); -*/ -/* -mp_err mp_init_u64(mp_int *a, uint64_t b) MP_WUR; -*/ - -/* get magnitude */ -/* -uint32_t mp_get_mag_u32(const mp_int *a) MP_WUR; -*/ -/* -uint64_t mp_get_mag_u64(const mp_int *a) MP_WUR; -*/ +# include "../compat/stdint.h" #endif -/* -unsigned long mp_get_mag_ul(const mp_int *a) MP_WUR; -*/ -/* -Tcl_WideUInt mp_get_mag_ull(const mp_int *a) MP_WUR; -*/ - -/* get integer, set integer (long) */ -/* -long mp_get_l(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_l(mp_int *a, long b); -*/ -/* -mp_err mp_init_l(mp_int *a, long b) MP_WUR; -*/ - -/* get integer, set integer (unsigned long) */ -#define mp_get_ul(a) ((unsigned long)mp_get_l(a)) -/* -void mp_set_ul(mp_int *a, unsigned long b); -*/ -/* -mp_err mp_init_ul(mp_int *a, unsigned long b) MP_WUR; -*/ - -/* get integer, set integer (Tcl_WideInt) */ -/* -Tcl_WideInt mp_get_ll(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_ll(mp_int *a, Tcl_WideInt b); -*/ -/* -mp_err mp_init_ll(mp_int *a, Tcl_WideInt b) MP_WUR; -*/ - -/* get integer, set integer (Tcl_WideUInt) */ -#define mp_get_ull(a) ((Tcl_WideUInt)mp_get_ll(a)) -/* -void mp_set_ull(mp_int *a, Tcl_WideUInt b); -*/ -/* -mp_err mp_init_ull(mp_int *a, Tcl_WideUInt b) MP_WUR; -*/ - -/* set to single unsigned digit, up to MP_DIGIT_MAX */ -/* -void mp_set(mp_int *a, mp_digit b); -*/ -/* -mp_err mp_init_set(mp_int *a, mp_digit b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (deprecated) */ -/* -MP_DEPRECATED(mp_get_mag_u32/mp_get_u32) unsigned long mp_get_int(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_get_mag_ul/mp_get_ul) unsigned long mp_get_long(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_get_mag_ull/mp_get_ull) Tcl_WideUInt mp_get_long_long(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_set_ul) mp_err mp_set_int(mp_int *a, unsigned long b); -*/ -/* -MP_DEPRECATED(mp_set_ul) mp_err mp_set_long(mp_int *a, unsigned long b); -*/ -/* -MP_DEPRECATED(mp_set_ull) mp_err mp_set_long_long(mp_int *a, Tcl_WideUInt b); -*/ -/* -MP_DEPRECATED(mp_init_ul) mp_err mp_init_set_int(mp_int *a, unsigned long b) MP_WUR; -*/ - -/* copy, b = a */ -/* -mp_err mp_copy(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* inits and copies, a = b */ -/* -mp_err mp_init_copy(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* trim unused digits */ -/* -void mp_clamp(mp_int *a); -*/ - - -/* export binary data */ -/* -MP_DEPRECATED(mp_pack) mp_err mp_export(void *rop, size_t *countp, int order, size_t size, - int endian, size_t nails, const mp_int *op) MP_WUR; -*/ - -/* import binary data */ -/* -MP_DEPRECATED(mp_unpack) mp_err mp_import(mp_int *rop, size_t count, int order, - size_t size, int endian, size_t nails, - const void *op) MP_WUR; -*/ - -/* unpack binary data */ -/* -mp_err mp_unpack(mp_int *rop, size_t count, mp_order order, size_t size, mp_endian endian, - size_t nails, const void *op) MP_WUR; -*/ - -/* pack binary data */ -/* -size_t mp_pack_count(const mp_int *a, size_t nails, size_t size) MP_WUR; -*/ -/* -mp_err mp_pack(void *rop, size_t maxcount, size_t *written, mp_order order, size_t size, - mp_endian endian, size_t nails, const mp_int *op) MP_WUR; -*/ - -/* ---> digit manipulation <--- */ - -/* right shift by "b" digits */ -/* -void mp_rshd(mp_int *a, int b); -*/ - -/* left shift by "b" digits */ -/* -mp_err mp_lshd(mp_int *a, int b) MP_WUR; -*/ - -/* c = a / 2**b, implemented as c = a >> b */ -/* -mp_err mp_div_2d(const mp_int *a, int b, mp_int *c, mp_int *d) MP_WUR; -*/ - -/* b = a/2 */ -/* -mp_err mp_div_2(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* a/3 => 3c + d == a */ -/* -mp_err mp_div_3(const mp_int *a, mp_int *c, mp_digit *d) MP_WUR; -*/ - -/* c = a * 2**b, implemented as c = a << b */ -/* -mp_err mp_mul_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* b = a*2 */ -/* -mp_err mp_mul_2(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* c = a mod 2**b */ -/* -mp_err mp_mod_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* computes a = 2**b */ -/* -mp_err mp_2expt(mp_int *a, int b) MP_WUR; -*/ - -/* Counts the number of lsbs which are zero before the first zero bit */ -/* -int mp_cnt_lsb(const mp_int *a) MP_WUR; -*/ - -/* I Love Earth! */ - -/* makes a pseudo-random mp_int of a given size */ -/* -mp_err mp_rand(mp_int *a, int digits) MP_WUR; -*/ -/* makes a pseudo-random small int of a given size */ -/* -MP_DEPRECATED(mp_rand) mp_err mp_rand_digit(mp_digit *r) MP_WUR; -*/ -/* use custom random data source instead of source provided the platform */ -/* -void mp_rand_source(mp_err(*source)(void *out, size_t size)); -*/ - -#ifdef MP_PRNG_ENABLE_LTM_RNG -# warning MP_PRNG_ENABLE_LTM_RNG has been deprecated, use mp_rand_source instead. -/* A last resort to provide random data on systems without any of the other - * implemented ways to gather entropy. - * It is compatible with `rng_get_bytes()` from libtomcrypt so you could - * provide that one and then set `ltm_rng = rng_get_bytes;` */ -extern unsigned long (*ltm_rng)(unsigned char *out, unsigned long outlen, void (*callback)(void)); -extern void (*ltm_rng_callback)(void); #endif - -/* ---> binary operations <--- */ - -/* Checks the bit at position b and returns MP_YES - * if the bit is 1, MP_NO if it is 0 and MP_VAL - * in case of error - */ -/* -MP_DEPRECATED(s_mp_get_bit) int mp_get_bit(const mp_int *a, int b) MP_WUR; -*/ - -/* c = a XOR b (two complement) */ -/* -MP_DEPRECATED(mp_xor) mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a OR b (two complement) */ -/* -MP_DEPRECATED(mp_or) mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a AND b (two complement) */ -/* -MP_DEPRECATED(mp_and) mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* b = ~a (bitwise not, two complement) */ -/* -mp_err mp_complement(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* right shift with sign extension */ -/* -MP_DEPRECATED(mp_signed_rsh) mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_signed_rsh(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* ---> Basic arithmetic <--- */ - -/* b = -a */ -/* -mp_err mp_neg(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* b = |a| */ -/* -mp_err mp_abs(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* compare a to b */ -/* -mp_ord mp_cmp(const mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* compare |a| to |b| */ -/* -mp_ord mp_cmp_mag(const mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* c = a + b */ -/* -mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a - b */ -/* -mp_err mp_sub(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a * b */ -/* -mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* b = a*a */ -/* -mp_err mp_sqr(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* a/b => cb + d == a */ -/* -mp_err mp_div(const mp_int *a, const mp_int *b, mp_int *c, mp_int *d) MP_WUR; -*/ - -/* c = a mod b, 0 <= c < b */ -/* -mp_err mp_mod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* Increment "a" by one like "a++". Changes input! */ -/* -mp_err mp_incr(mp_int *a) MP_WUR; -*/ - -/* Decrement "a" by one like "a--". Changes input! */ -/* -mp_err mp_decr(mp_int *a) MP_WUR; -*/ - -/* ---> single digit functions <--- */ - -/* compare against a single digit */ -/* -mp_ord mp_cmp_d(const mp_int *a, mp_digit b) MP_WUR; -*/ - -/* c = a + b */ -/* -mp_err mp_add_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* c = a - b */ -/* -mp_err mp_sub_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* c = a * b */ -/* -mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* a/b => cb + d == a */ -/* -mp_err mp_div_d(const mp_int *a, mp_digit b, mp_int *c, mp_digit *d) MP_WUR; -*/ - -/* c = a mod b, 0 <= c < b */ -/* -mp_err mp_mod_d(const mp_int *a, mp_digit b, mp_digit *c) MP_WUR; -*/ - -/* ---> number theory <--- */ - -/* d = a + b (mod c) */ -/* -mp_err mp_addmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* d = a - b (mod c) */ -/* -mp_err mp_submod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* d = a * b (mod c) */ -/* -mp_err mp_mulmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* c = a * a (mod b) */ -/* -mp_err mp_sqrmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = 1/a (mod b) */ -/* -mp_err mp_invmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = (a, b) */ -/* -mp_err mp_gcd(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* produces value such that U1*a + U2*b = U3 */ -/* -mp_err mp_exteuclid(const mp_int *a, const mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) MP_WUR; -*/ - -/* c = [a, b] or (a*b)/(a, b) */ -/* -mp_err mp_lcm(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* finds one of the b'th root of a, such that |c|**b <= |a| - * - * returns error if a < 0 and b is even - */ -/* -mp_err mp_root_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_root_u32) mp_err mp_n_root(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_root_u32) mp_err mp_n_root_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; -*/ - -/* special sqrt algo */ -/* -mp_err mp_sqrt(const mp_int *arg, mp_int *ret) MP_WUR; -*/ - -/* special sqrt (mod prime) */ -/* -mp_err mp_sqrtmod_prime(const mp_int *n, const mp_int *prime, mp_int *ret) MP_WUR; -*/ - -/* is number a square? */ -/* -mp_err mp_is_square(const mp_int *arg, mp_bool *ret) MP_WUR; -*/ - -/* computes the jacobi c = (a | n) (or Legendre if b is prime) */ -/* -MP_DEPRECATED(mp_kronecker) mp_err mp_jacobi(const mp_int *a, const mp_int *n, int *c) MP_WUR; -*/ - -/* computes the Kronecker symbol c = (a | p) (like jacobi() but with {a,p} in Z */ -/* -mp_err mp_kronecker(const mp_int *a, const mp_int *p, int *c) MP_WUR; -*/ - -/* used to setup the Barrett reduction for a given modulus b */ -/* -mp_err mp_reduce_setup(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* Barrett Reduction, computes a (mod b) with a precomputed value c - * - * Assumes that 0 < x <= m*m, note if 0 > x > -(m*m) then you can merely - * compute the reduction as -1 * mp_reduce(mp_abs(x)) [pseudo code]. - */ -/* -mp_err mp_reduce(mp_int *x, const mp_int *m, const mp_int *mu) MP_WUR; -*/ - -/* setups the montgomery reduction */ -/* -mp_err mp_montgomery_setup(const mp_int *n, mp_digit *rho) MP_WUR; -*/ - -/* computes a = B**n mod b without division or multiplication useful for - * normalizing numbers in a Montgomery system. - */ -/* -mp_err mp_montgomery_calc_normalization(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* computes x/R == x (mod N) via Montgomery Reduction */ -/* -mp_err mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho) MP_WUR; -*/ - -/* returns 1 if a is a valid DR modulus */ -/* -mp_bool mp_dr_is_modulus(const mp_int *a) MP_WUR; -*/ - -/* sets the value of "d" required for mp_dr_reduce */ -/* -void mp_dr_setup(const mp_int *a, mp_digit *d); -*/ - -/* reduces a modulo n using the Diminished Radix method */ -/* -mp_err mp_dr_reduce(mp_int *x, const mp_int *n, mp_digit k) MP_WUR; -*/ - -/* returns true if a can be reduced with mp_reduce_2k */ -/* -mp_bool mp_reduce_is_2k(const mp_int *a) MP_WUR; -*/ - -/* determines k value for 2k reduction */ -/* -mp_err mp_reduce_2k_setup(const mp_int *a, mp_digit *d) MP_WUR; -*/ - -/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ -/* -mp_err mp_reduce_2k(mp_int *a, const mp_int *n, mp_digit d) MP_WUR; -*/ - -/* returns true if a can be reduced with mp_reduce_2k_l */ -/* -mp_bool mp_reduce_is_2k_l(const mp_int *a) MP_WUR; -*/ - -/* determines k value for 2k reduction */ -/* -mp_err mp_reduce_2k_setup_l(const mp_int *a, mp_int *d) MP_WUR; -*/ - -/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ -/* -mp_err mp_reduce_2k_l(mp_int *a, const mp_int *n, const mp_int *d) MP_WUR; -*/ - -/* Y = G**X (mod P) */ -/* -mp_err mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y) MP_WUR; -*/ - -/* ---> Primes <--- */ - -/* number of primes */ -#ifdef MP_8BIT -# define PRIVATE_MP_PRIME_TAB_SIZE 31 -#else -# define PRIVATE_MP_PRIME_TAB_SIZE 256 -#endif -#define PRIME_SIZE (MP_DEPRECATED_PRAGMA("PRIME_SIZE has been made internal") 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 - */ -/* -mp_err mp_prime_fermat(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; -*/ - -/* performs one Miller-Rabin test of "a" using base "b". - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_miller_rabin(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; -*/ - -/* This gives [for a given bit size] the number of trials required - * such that Miller-Rabin gives a prob of failure lower than 2^-96 - */ -/* -int mp_prime_rabin_miller_trials(int size) MP_WUR; -*/ - -/* performs one strong Lucas-Selfridge test of "a". - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_strong_lucas_selfridge(const mp_int *a, mp_bool *result) MP_WUR; -*/ - -/* performs one Frobenius test of "a" as described by Paul Underwood. - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_frobenius_underwood(const mp_int *N, mp_bool *result) MP_WUR; -*/ - -/* performs t random rounds of Miller-Rabin on "a" additional to - * bases 2 and 3. Also performs an initial sieve of trial - * division. Determines if "a" is prime with probability - * of error no more than (1/4)**t. - * Both a strong Lucas-Selfridge to complete the BPSW test - * and a separate Frobenius test are available at compile time. - * With t<0 a deterministic test is run for primes up to - * 318665857834031151167461. With t<13 (abs(t)-13) additional - * tests with sequential small primes are run starting at 43. - * Is Fips 186.4 compliant if called with t as computed by - * mp_prime_rabin_miller_trials(); - * - * Sets result to 1 if probably prime, 0 otherwise - */ -/* -mp_err mp_prime_is_prime(const mp_int *a, int t, mp_bool *result) MP_WUR; -*/ - -/* finds the next prime after the number "a" using "t" trials - * of Miller-Rabin. - * - * bbs_style = 1 means the prime must be congruent to 3 mod 4 - */ -/* -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: - * - * MP_PRIME_BBS - make prime congruent to 3 mod 4 - * MP_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies MP_PRIME_BBS) - * MP_PRIME_2MSB_ON - make the 2nd highest bit one - * - * 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 - * - */ -/* -mp_err mp_prime_rand(mp_int *a, int t, int size, int flags) MP_WUR; -*/ - -/* Integer logarithm to integer base */ -/* -mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) MP_WUR; -*/ - -/* c = a**b */ -/* -mp_err mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; -*/ - -/* ---> radix conversion <--- */ -/* -int mp_count_bits(const mp_int *a) MP_WUR; -*/ - - -/* -MP_DEPRECATED(mp_ubin_size) int mp_unsigned_bin_size(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_from_ubin) mp_err mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin(const mp_int *a, unsigned char *b) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; -*/ - -/* -MP_DEPRECATED(mp_sbin_size) int mp_signed_bin_size(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_from_sbin) mp_err mp_read_signed_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin(const mp_int *a, unsigned char *b) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; -*/ - -/* -size_t mp_ubin_size(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_from_ubin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; -*/ -/* -mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; -*/ - -/* -size_t mp_sbin_size(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_from_sbin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; -*/ -/* -mp_err mp_to_sbin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; -*/ - -/* -mp_err mp_read_radix(mp_int *a, const char *str, int radix) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_radix) mp_err mp_toradix(const mp_int *a, char *str, int radix) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_radix) mp_err mp_toradix_n(const mp_int *a, char *str, int radix, int maxlen) MP_WUR; -*/ -/* -mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, int radix) MP_WUR; -*/ -/* -mp_err mp_radix_size(const mp_int *a, int radix, int *size) MP_WUR; -*/ - -#ifndef MP_NO_FILE -/* -mp_err mp_fread(mp_int *a, int radix, FILE *stream) MP_WUR; -*/ -/* -mp_err mp_fwrite(const mp_int *a, int radix, FILE *stream) MP_WUR; -*/ -#endif - -#define mp_read_raw(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_signed_bin") mp_read_signed_bin((mp), (str), (len))) -#define mp_raw_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_signed_bin_size") mp_signed_bin_size(mp)) -#define mp_toraw(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_signed_bin") mp_to_signed_bin((mp), (str))) -#define mp_read_mag(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_unsigned_bin") mp_read_unsigned_bin((mp), (str), (len)) -#define mp_mag_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_unsigned_bin_size") mp_unsigned_bin_size(mp)) -#define mp_tomag(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_unsigned_bin") mp_to_unsigned_bin((mp), (str))) - -#define mp_tobinary(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_binary") mp_toradix((M), (S), 2)) -#define mp_tooctal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_octal") mp_toradix((M), (S), 8)) -#define mp_todecimal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_decimal") mp_toradix((M), (S), 10)) -#define mp_tohex(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_hex") mp_toradix((M), (S), 16)) - -#define mp_to_binary(M, S, N) mp_to_radix((M), (S), (N), NULL, 2) -#define mp_to_octal(M, S, N) mp_to_radix((M), (S), (N), NULL, 8) -#define mp_to_decimal(M, S, N) mp_to_radix((M), (S), (N), NULL, 10) -#define mp_to_hex(M, S, N) mp_to_radix((M), (S), (N), NULL, 16) - -#ifdef __cplusplus -} -#endif - +#include #include "tclTomMathDecls.h" +#undef mp_iseven +#undef mp_isodd +#define mp_iseven(a) (!mp_isodd(a)) +#define mp_isodd(a) (((a)->used != 0 && (((a)->dp[0] & 1) != 0)) ? MP_YES : MP_NO) + #endif diff --git a/generic/tclTomMathDecls.h b/generic/tclTomMathDecls.h index a30f9a8..ae2e7ea 100644 --- a/generic/tclTomMathDecls.h +++ b/generic/tclTomMathDecls.h @@ -16,9 +16,7 @@ #define _TCLTOMMATHDECLS #include "tcl.h" -#ifndef BN_H_ #include "tclTomMath.h" -#endif /* * Define the version of the Stubs table that's exported for tommath @@ -42,6 +40,10 @@ /* MODULE_SCOPE void TclBNFree( void* ); */ #define TclBNFree(x) (ckfree((char*)(x))) +#undef MP_MALLOC +#undef MP_CALLOC +#undef MP_REALLOC +#undef MP_FREE #define MP_MALLOC(size) TclBNAlloc(size) #define MP_CALLOC(nmemb, size) TclBNCalloc(nmemb, size) #define MP_REALLOC(mem, oldsize, newsize) TclBNRealloc(mem, newsize) @@ -63,81 +65,13 @@ MODULE_SCOPE mp_err TclBN_s_mp_expt_u32(const mp_int *a, unsigned int b, mp_int /* Rename the global symbols in libtommath to avoid linkage conflicts */ #define bn_reverse TclBN_reverse -#define mp_add TclBN_mp_add -#define mp_and TclBN_mp_and -#define mp_clamp TclBN_mp_clamp -#define mp_clear TclBN_mp_clear -#define mp_clear_multi TclBN_mp_clear_multi -#define mp_cmp TclBN_mp_cmp -#define mp_cmp_mag TclBN_mp_cmp_mag -#define mp_cnt_lsb TclBN_mp_cnt_lsb -#define mp_copy TclBN_mp_copy -#define mp_count_bits TclBN_mp_count_bits -#define mp_div TclBN_mp_div -#define mp_div_2 TclBN_mp_div_2 -#define mp_div_2d TclBN_mp_div_2d -#define mp_exch TclBN_mp_exch -#define mp_expt_d TclBN_mp_expt_u32 -#define mp_expt_d_ex TclBN_mp_expt_d_ex -#define mp_get_bit TclBN_mp_get_bit -#define mp_get_mag_u64 TclBN_mp_get_mag_u64 -#define mp_get_mag_ul TclBN_mp_get_mag_ul -#define mp_get_mag_ull(a) ((unsigned long long)TclBN_mp_get_mag_u64(a)) -#define mp_grow TclBN_mp_grow -#define mp_init TclBN_mp_init -#define mp_init_copy TclBN_mp_init_copy -#define mp_init_multi TclBN_mp_init_multi -#define mp_init_set_int(a,i) (MP_DEPRECATED_PRAGMA("replaced by mp_init_ul") TclBN_mp_init_ul(a,(unsigned int)(i))) -#define mp_init_size TclBN_mp_init_size -#define mp_init_ul TclBN_mp_init_ul -#define mp_lshd TclBN_mp_lshd -#define mp_mod TclBN_mp_mod -#define mp_mod_2d TclBN_mp_mod_2d -#define mp_mul TclBN_mp_mul -#define mp_mul_2 TclBN_mp_mul_2 -#define mp_mul_2d TclBN_mp_mul_2d -#define mp_neg TclBN_mp_neg -#define mp_or TclBN_mp_or -#define mp_radix_size TclBN_mp_radix_size -#define mp_read_radix TclBN_mp_read_radix -#define mp_rshd TclBN_mp_rshd +#define mp_get_mag_ull(a) ((unsigned long long)mp_get_mag_u64(a)) +#define mp_init_set_int(a,i) (MP_DEPRECATED_PRAGMA("replaced by mp_init_ul") mp_init_ul(a,(unsigned int)(i))) #define mp_set_int(a,b) (MP_DEPRECATED_PRAGMA("replaced by mp_set_ul") (TclBN_mp_set_ul((a),((unsigned int)(b))),MP_OKAY)) #define mp_set_long(a,b) (MP_DEPRECATED_PRAGMA("replaced by mp_set_ul") (TclBN_mp_set_ul((a),(b)),MP_OKAY)) #define mp_set_long_long(a,b) (MP_DEPRECATED_PRAGMA("replaced by mp_set_u64") (TclBN_mp_set_u64((a),(b)),MP_OKAY)) -#define mp_set_ul TclBN_mp_set_ul #define mp_set_ull(a,b) TclBN_mp_set_u64(a,(uint64_t)(b)) -#define mp_set_u64 TclBN_mp_set_u64 -#define mp_shrink TclBN_mp_shrink -#define mp_sqr TclBN_mp_sqr -#define mp_sqrt TclBN_mp_sqrt -#define mp_sub TclBN_mp_sub -#define mp_signed_rsh TclBN_mp_signed_rsh -#define mp_tc_and TclBN_mp_and -#define mp_tc_div_2d TclBN_mp_signed_rsh -#define mp_tc_or TclBN_mp_or -#define mp_tc_xor TclBN_mp_xor -#define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin -#define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n -#define mp_toradix_n TclBN_mp_toradix_n -#define mp_to_radix TclBN_mp_to_radix -#define mp_to_ubin TclBN_mp_to_ubin -#define mp_ubin_size TclBN_mp_ubin_size #define mp_unsigned_bin_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_ubin_size") (int)TclBN_mp_ubin_size(mp)) -#define mp_xor TclBN_mp_xor -#define mp_zero TclBN_mp_zero -#define s_mp_add TclBN_s_mp_add -#define s_mp_balance_mul TclBN_mp_balance_mul -#define s_mp_get_bit TclBN_mp_get_bit -#define s_mp_karatsuba_mul TclBN_mp_karatsuba_mul -#define s_mp_karatsuba_sqr TclBN_mp_karatsuba_sqr -#define s_mp_mul_digs TclBN_s_mp_mul_digs -#define s_mp_mul_digs_fast TclBN_s_mp_mul_digs_fast -#define s_mp_reverse TclBN_s_mp_reverse -#define s_mp_sqr TclBN_s_mp_sqr -#define s_mp_sqr_fast TclBN_s_mp_sqr_fast -#define s_mp_sub TclBN_s_mp_sub -#define s_mp_toom_mul TclBN_mp_toom_mul -#define s_mp_toom_sqr TclBN_mp_toom_sqr #undef TCL_STORAGE_CLASS #ifdef BUILD_tcl @@ -174,7 +108,7 @@ EXTERN int TclBN_revision(void) MP_WUR; EXTERN mp_err TclBN_mp_add(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 3 */ -EXTERN mp_err TclBN_mp_add_d(const mp_int *a, uint32_t b, +EXTERN mp_err TclBN_mp_add_d(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 4 */ EXTERN mp_err TclBN_mp_and(const mp_int *a, const mp_int *b, @@ -188,7 +122,7 @@ EXTERN void TclBN_mp_clear_multi(mp_int *a, ...); /* 8 */ EXTERN mp_ord TclBN_mp_cmp(const mp_int *a, const mp_int *b) MP_WUR; /* 9 */ -EXTERN mp_ord TclBN_mp_cmp_d(const mp_int *a, uint32_t b) MP_WUR; +EXTERN mp_ord TclBN_mp_cmp_d(const mp_int *a, unsigned int b) MP_WUR; /* 10 */ EXTERN mp_ord TclBN_mp_cmp_mag(const mp_int *a, const mp_int *b) MP_WUR; /* 11 */ @@ -199,8 +133,8 @@ EXTERN int TclBN_mp_count_bits(const mp_int *a) MP_WUR; EXTERN mp_err TclBN_mp_div(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) MP_WUR; /* 14 */ -EXTERN mp_err TclBN_mp_div_d(const mp_int *a, uint32_t b, - mp_int *q, uint32_t *r) MP_WUR; +EXTERN mp_err TclBN_mp_div_d(const mp_int *a, unsigned int b, + mp_int *q, unsigned int *r) MP_WUR; /* 15 */ EXTERN mp_err TclBN_mp_div_2(const mp_int *a, mp_int *q) MP_WUR; /* 16 */ @@ -208,11 +142,11 @@ EXTERN mp_err TclBN_mp_div_2d(const mp_int *a, int b, mp_int *q, mp_int *r) MP_WUR; /* 17 */ EXTERN mp_err TclBN_mp_div_3(const mp_int *a, mp_int *q, - uint32_t *r) MP_WUR; + unsigned int *r) MP_WUR; /* 18 */ EXTERN void TclBN_mp_exch(mp_int *a, mp_int *b); /* 19 */ -EXTERN mp_err TclBN_mp_expt_u32(const mp_int *a, uint32_t b, +EXTERN mp_err TclBN_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 20 */ EXTERN mp_err TclBN_mp_grow(mp_int *a, int size) MP_WUR; @@ -223,7 +157,7 @@ EXTERN mp_err TclBN_mp_init_copy(mp_int *a, const mp_int *b) MP_WUR; /* 23 */ EXTERN mp_err TclBN_mp_init_multi(mp_int *a, ...) MP_WUR; /* 24 */ -EXTERN mp_err TclBN_mp_init_set(mp_int *a, uint32_t b) MP_WUR; +EXTERN mp_err TclBN_mp_init_set(mp_int *a, unsigned int b) MP_WUR; /* 25 */ EXTERN mp_err TclBN_mp_init_size(mp_int *a, int size) MP_WUR; /* 26 */ @@ -237,7 +171,7 @@ EXTERN mp_err TclBN_mp_mod_2d(const mp_int *a, int b, mp_int *r) MP_WUR; EXTERN mp_err TclBN_mp_mul(const mp_int *a, const mp_int *b, mp_int *p) MP_WUR; /* 30 */ -EXTERN mp_err TclBN_mp_mul_d(const mp_int *a, uint32_t b, +EXTERN mp_err TclBN_mp_mul_d(const mp_int *a, unsigned int b, mp_int *p) MP_WUR; /* 31 */ EXTERN mp_err TclBN_mp_mul_2(const mp_int *a, mp_int *p) MP_WUR; @@ -259,7 +193,7 @@ EXTERN void TclBN_mp_rshd(mp_int *a, int shift); /* 38 */ EXTERN mp_err TclBN_mp_shrink(mp_int *a) MP_WUR; /* 39 */ -EXTERN void TclBN_mp_set(mp_int *a, uint32_t b); +EXTERN void TclBN_mp_set(mp_int *a, unsigned int b); /* 40 */ EXTERN mp_err TclBN_mp_sqr(const mp_int *a, mp_int *b) MP_WUR; /* 41 */ @@ -268,7 +202,7 @@ EXTERN mp_err TclBN_mp_sqrt(const mp_int *a, mp_int *b) MP_WUR; EXTERN mp_err TclBN_mp_sub(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 43 */ -EXTERN mp_err TclBN_mp_sub_d(const mp_int *a, uint32_t b, +EXTERN mp_err TclBN_mp_sub_d(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 44 */ TCL_DEPRECATED("Use mp_to_ubin") @@ -347,16 +281,20 @@ void TclBNInitBignumFromWideUInt(mp_int *bignum, Tcl_WideUInt initVal); /* 67 */ TCL_DEPRECATED("Use mp_expt_u32") -mp_err TclBN_mp_expt_d_ex(const mp_int *a, uint32_t b, +mp_err TclBN_mp_expt_d_ex(const mp_int *a, unsigned int b, mp_int *c, int fast); /* 68 */ EXTERN void TclBN_mp_set_u64(mp_int *a, uint64_t i); /* 69 */ EXTERN uint64_t TclBN_mp_get_mag_u64(const mp_int *a) MP_WUR; -/* Slot 70 is reserved */ +/* 70 */ +EXTERN mp_err TclBN_mp_div_l3(const mp_int *a, mp_int *q, + uint64_t *r) MP_WUR; /* 71 */ EXTERN unsigned long TclBN_mp_get_mag_ul(const mp_int *a) MP_WUR; -/* Slot 72 is reserved */ +/* 72 */ +EXTERN mp_err TclBN_mp_div_ld(const mp_int *a, uint64_t b, + mp_int *q, uint64_t *r) MP_WUR; /* 73 */ EXTERN mp_err TclBN_mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; @@ -387,34 +325,34 @@ typedef struct TclTomMathStubs { int (*tclBN_epoch) (void) MP_WUR; /* 0 */ int (*tclBN_revision) (void) MP_WUR; /* 1 */ mp_err (*tclBN_mp_add) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 2 */ - mp_err (*tclBN_mp_add_d) (const mp_int *a, uint32_t b, mp_int *c) MP_WUR; /* 3 */ + mp_err (*tclBN_mp_add_d) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 3 */ mp_err (*tclBN_mp_and) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 4 */ void (*tclBN_mp_clamp) (mp_int *a); /* 5 */ void (*tclBN_mp_clear) (mp_int *a); /* 6 */ void (*tclBN_mp_clear_multi) (mp_int *a, ...); /* 7 */ mp_ord (*tclBN_mp_cmp) (const mp_int *a, const mp_int *b) MP_WUR; /* 8 */ - mp_ord (*tclBN_mp_cmp_d) (const mp_int *a, uint32_t b) MP_WUR; /* 9 */ + mp_ord (*tclBN_mp_cmp_d) (const mp_int *a, unsigned int b) MP_WUR; /* 9 */ mp_ord (*tclBN_mp_cmp_mag) (const mp_int *a, const mp_int *b) MP_WUR; /* 10 */ mp_err (*tclBN_mp_copy) (const mp_int *a, mp_int *b) MP_WUR; /* 11 */ int (*tclBN_mp_count_bits) (const mp_int *a) MP_WUR; /* 12 */ mp_err (*tclBN_mp_div) (const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) MP_WUR; /* 13 */ - mp_err (*tclBN_mp_div_d) (const mp_int *a, uint32_t b, mp_int *q, uint32_t *r) MP_WUR; /* 14 */ + mp_err (*tclBN_mp_div_d) (const mp_int *a, unsigned int b, mp_int *q, unsigned int *r) MP_WUR; /* 14 */ mp_err (*tclBN_mp_div_2) (const mp_int *a, mp_int *q) MP_WUR; /* 15 */ mp_err (*tclBN_mp_div_2d) (const mp_int *a, int b, mp_int *q, mp_int *r) MP_WUR; /* 16 */ - mp_err (*tclBN_mp_div_3) (const mp_int *a, mp_int *q, uint32_t *r) MP_WUR; /* 17 */ + mp_err (*tclBN_mp_div_3) (const mp_int *a, mp_int *q, unsigned int *r) MP_WUR; /* 17 */ void (*tclBN_mp_exch) (mp_int *a, mp_int *b); /* 18 */ - mp_err (*tclBN_mp_expt_u32) (const mp_int *a, uint32_t b, mp_int *c) MP_WUR; /* 19 */ + mp_err (*tclBN_mp_expt_u32) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 19 */ mp_err (*tclBN_mp_grow) (mp_int *a, int size) MP_WUR; /* 20 */ mp_err (*tclBN_mp_init) (mp_int *a) MP_WUR; /* 21 */ mp_err (*tclBN_mp_init_copy) (mp_int *a, const mp_int *b) MP_WUR; /* 22 */ mp_err (*tclBN_mp_init_multi) (mp_int *a, ...) MP_WUR; /* 23 */ - mp_err (*tclBN_mp_init_set) (mp_int *a, uint32_t b) MP_WUR; /* 24 */ + mp_err (*tclBN_mp_init_set) (mp_int *a, unsigned int b) MP_WUR; /* 24 */ mp_err (*tclBN_mp_init_size) (mp_int *a, int size) MP_WUR; /* 25 */ mp_err (*tclBN_mp_lshd) (mp_int *a, int shift) MP_WUR; /* 26 */ mp_err (*tclBN_mp_mod) (const mp_int *a, const mp_int *b, mp_int *r) MP_WUR; /* 27 */ mp_err (*tclBN_mp_mod_2d) (const mp_int *a, int b, mp_int *r) MP_WUR; /* 28 */ mp_err (*tclBN_mp_mul) (const mp_int *a, const mp_int *b, mp_int *p) MP_WUR; /* 29 */ - mp_err (*tclBN_mp_mul_d) (const mp_int *a, uint32_t b, mp_int *p) MP_WUR; /* 30 */ + mp_err (*tclBN_mp_mul_d) (const mp_int *a, unsigned int b, mp_int *p) MP_WUR; /* 30 */ mp_err (*tclBN_mp_mul_2) (const mp_int *a, mp_int *p) MP_WUR; /* 31 */ mp_err (*tclBN_mp_mul_2d) (const mp_int *a, int d, mp_int *p) MP_WUR; /* 32 */ mp_err (*tclBN_mp_neg) (const mp_int *a, mp_int *b) MP_WUR; /* 33 */ @@ -423,11 +361,11 @@ typedef struct TclTomMathStubs { mp_err (*tclBN_mp_read_radix) (mp_int *a, const char *str, int radix) MP_WUR; /* 36 */ void (*tclBN_mp_rshd) (mp_int *a, int shift); /* 37 */ mp_err (*tclBN_mp_shrink) (mp_int *a) MP_WUR; /* 38 */ - void (*tclBN_mp_set) (mp_int *a, uint32_t b); /* 39 */ + void (*tclBN_mp_set) (mp_int *a, unsigned int b); /* 39 */ mp_err (*tclBN_mp_sqr) (const mp_int *a, mp_int *b) MP_WUR; /* 40 */ mp_err (*tclBN_mp_sqrt) (const mp_int *a, mp_int *b) MP_WUR; /* 41 */ mp_err (*tclBN_mp_sub) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 42 */ - mp_err (*tclBN_mp_sub_d) (const mp_int *a, uint32_t b, mp_int *c) MP_WUR; /* 43 */ + mp_err (*tclBN_mp_sub_d) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 43 */ TCL_DEPRECATED_API("Use mp_to_ubin") mp_err (*tclBN_mp_to_unsigned_bin) (const mp_int *a, unsigned char *b); /* 44 */ TCL_DEPRECATED_API("Use mp_to_ubin") mp_err (*tclBN_mp_to_unsigned_bin_n) (const mp_int *a, unsigned char *b, unsigned long *outlen); /* 45 */ TCL_DEPRECATED_API("Use mp_to_radix") mp_err (*tclBN_mp_toradix_n) (const mp_int *a, char *str, int radix, int maxlen); /* 46 */ @@ -451,12 +389,12 @@ typedef struct TclTomMathStubs { TCL_DEPRECATED_API("Use mp_init() + mp_set_l()") void (*tclBNInitBignumFromLong) (mp_int *bignum, long initVal); /* 64 */ TCL_DEPRECATED_API("Use mp_init() + mp_set_i64()") void (*tclBNInitBignumFromWideInt) (mp_int *bignum, Tcl_WideInt initVal); /* 65 */ TCL_DEPRECATED_API("Use mp_init() + mp_set_u64()") void (*tclBNInitBignumFromWideUInt) (mp_int *bignum, Tcl_WideUInt initVal); /* 66 */ - TCL_DEPRECATED_API("Use mp_expt_u32") mp_err (*tclBN_mp_expt_d_ex) (const mp_int *a, uint32_t b, mp_int *c, int fast); /* 67 */ + TCL_DEPRECATED_API("Use mp_expt_u32") mp_err (*tclBN_mp_expt_d_ex) (const mp_int *a, unsigned int b, mp_int *c, int fast); /* 67 */ void (*tclBN_mp_set_u64) (mp_int *a, uint64_t i); /* 68 */ uint64_t (*tclBN_mp_get_mag_u64) (const mp_int *a) MP_WUR; /* 69 */ - void (*reserved70)(void); + mp_err (*tclBN_mp_div_l3) (const mp_int *a, mp_int *q, uint64_t *r) MP_WUR; /* 70 */ unsigned long (*tclBN_mp_get_mag_ul) (const mp_int *a) MP_WUR; /* 71 */ - void (*reserved72)(void); + mp_err (*tclBN_mp_div_ld) (const mp_int *a, uint64_t b, mp_int *q, uint64_t *r) MP_WUR; /* 72 */ mp_err (*tclBN_mp_tc_and) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 73 */ mp_err (*tclBN_mp_tc_or) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 74 */ mp_err (*tclBN_mp_tc_xor) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 75 */ @@ -619,10 +557,12 @@ extern const TclTomMathStubs *tclTomMathStubsPtr; (tclTomMathStubsPtr->tclBN_mp_set_u64) /* 68 */ #define TclBN_mp_get_mag_u64 \ (tclTomMathStubsPtr->tclBN_mp_get_mag_u64) /* 69 */ -/* Slot 70 is reserved */ +#define TclBN_mp_div_l3 \ + (tclTomMathStubsPtr->tclBN_mp_div_l3) /* 70 */ #define TclBN_mp_get_mag_ul \ (tclTomMathStubsPtr->tclBN_mp_get_mag_ul) /* 71 */ -/* Slot 72 is reserved */ +#define TclBN_mp_div_ld \ + (tclTomMathStubsPtr->tclBN_mp_div_ld) /* 72 */ #define TclBN_mp_tc_and \ (tclTomMathStubsPtr->tclBN_mp_tc_and) /* 73 */ #define TclBN_mp_tc_or \ @@ -646,24 +586,68 @@ extern const TclTomMathStubs *tclTomMathStubsPtr; #if defined(USE_TCL_STUBS) #define mp_add_d TclBN_mp_add_d #define mp_cmp_d TclBN_mp_cmp_d +#ifdef MP_64BIT +#define mp_div_d TclBN_mp_div_ld +#define mp_div_3 TclBN_mp_div_l3 +#else #define mp_div_d TclBN_mp_div_d #define mp_div_3 TclBN_mp_div_3 +#endif #define mp_sub_d TclBN_mp_sub_d #define mp_init_set TclBN_mp_init_set #define mp_mul_d TclBN_mp_mul_d #define mp_set TclBN_mp_set #define mp_expt_u32 TclBN_mp_expt_u32 -#else -#define mp_add_d TclBN_s_mp_add_d -#define mp_cmp_d TclBN_s_mp_cmp_d -#define mp_div_d TclBN_s_mp_div_d -#define mp_div_3 TclBN_s_mp_div_3 -#define mp_sub_d TclBN_s_mp_sub_d -#define mp_init_set TclBN_s_mp_init_set -#define mp_mul_d TclBN_s_mp_mul_d -#define mp_set TclBN_s_mp_set -#define mp_expt_u32 TclBN_s_mp_expt_u32 -#endif /* !BUILD_tcl */ +#define mp_add TclBN_mp_add +#define mp_and TclBN_mp_and +#define mp_clamp TclBN_mp_clamp +#define mp_clear TclBN_mp_clear +#define mp_clear_multi TclBN_mp_clear_multi +#define mp_cmp TclBN_mp_cmp +#define mp_cmp_mag TclBN_mp_cmp_mag +#define mp_cnt_lsb TclBN_mp_cnt_lsb +#define mp_copy TclBN_mp_copy +#define mp_count_bits TclBN_mp_count_bits +#define mp_div TclBN_mp_div +#define mp_div_2 TclBN_mp_div_2 +#define mp_div_2d TclBN_mp_div_2d +#define mp_exch TclBN_mp_exch +#define mp_expt_d TclBN_mp_expt_d +#define mp_expt_d_ex TclBN_mp_expt_d_ex +#define mp_get_mag_u64 TclBN_mp_get_mag_u64 +#define mp_get_mag_ul TclBN_mp_get_mag_ul +#define mp_grow TclBN_mp_grow +#define mp_init TclBN_mp_init +#define mp_init_copy TclBN_mp_init_copy +#define mp_init_multi TclBN_mp_init_multi +#define mp_init_size TclBN_mp_init_size +#define mp_init_ul TclBN_mp_init_ul +#define mp_lshd TclBN_mp_lshd +#define mp_mod TclBN_mp_mod +#define mp_mod_2d TclBN_mp_mod_2d +#define mp_mul TclBN_mp_mul +#define mp_mul_2 TclBN_mp_mul_2 +#define mp_mul_2d TclBN_mp_mul_2d +#define mp_neg TclBN_mp_neg +#define mp_or TclBN_mp_or +#define mp_radix_size TclBN_mp_radix_size +#define mp_read_radix TclBN_mp_read_radix +#define mp_rshd TclBN_mp_rshd +#define mp_set_u64 TclBN_mp_set_u64 +#define mp_shrink TclBN_mp_shrink +#define mp_sqr TclBN_mp_sqr +#define mp_sqrt TclBN_mp_sqrt +#define mp_sub TclBN_mp_sub +#define mp_signed_rsh TclBN_mp_signed_rsh +#define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin +#define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n +#define mp_toradix_n TclBN_mp_toradix_n +#define mp_to_radix TclBN_mp_to_radix +#define mp_to_ubin TclBN_mp_to_ubin +#define mp_ubin_size TclBN_mp_ubin_size +#define mp_xor TclBN_mp_xor +#define mp_zero TclBN_mp_zero +#endif /* USE_TCL_STUBS */ #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT diff --git a/generic/tommath.h b/generic/tommath.h deleted file mode 100644 index 028a84d..0000000 --- a/generic/tommath.h +++ /dev/null @@ -1 +0,0 @@ -#include "tclTomMathInt.h" diff --git a/libtommath/bn_mp_fread.c b/libtommath/bn_mp_fread.c index 1e5ecf7..52ea773 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_RMAP_REVERSE_SIZE < pos) { + if (mp_s_rmap_reverse_sz < pos) { break; } - y = (int)s_mp_rmap_reverse[pos]; + y = (int)mp_s_rmap_reverse[pos]; if ((y == 0xff) || (y >= radix)) { break; diff --git a/libtommath/bn_mp_radix_smap.c b/libtommath/bn_mp_radix_smap.c index 5147c74..eb4765a 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 s_mp_rmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; -const unsigned char s_mp_rmap_reverse[] = { +const char *const mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; +const unsigned char mp_s_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,4 +18,5 @@ const unsigned char s_mp_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 456a387..de18e06 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_RMAP_REVERSE_SIZE < pos) { + if (mp_s_rmap_reverse_sz < pos) { break; } - y = (int)s_mp_rmap_reverse[pos]; + y = (int)mp_s_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_set_double.c b/libtommath/bn_mp_set_double.c index a42fc70..8d76f8c 100644 --- a/libtommath/bn_mp_set_double.c +++ b/libtommath/bn_mp_set_double.c @@ -16,7 +16,7 @@ mp_err mp_set_double(mp_int *a, double b) cast.dbl = b; exp = (int)((unsigned)(cast.bits >> 52) & 0x7FFu); - frac = (cast.bits & ((1uLL << 52) - 1uLL)) | (1uLL << 52); + frac = (cast.bits & ((UINT64_C(1) << 52) - UINT64_C(1))) | (UINT64_C(1) << 52); if (exp == 0x7FF) { /* +-inf, NaN */ return MP_VAL; @@ -30,7 +30,7 @@ mp_err mp_set_double(mp_int *a, double b) return err; } - if (((cast.bits >> 63) != 0uLL) && !MP_IS_ZERO(a)) { + if (((cast.bits >> 63) != 0u) && !MP_IS_ZERO(a)) { a->sign = MP_NEG; } diff --git a/libtommath/bn_mp_to_radix.c b/libtommath/bn_mp_to_radix.c index 18cb504..7fa86ca 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++ = s_mp_rmap[d]; + *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points diff --git a/libtommath/bn_s_mp_rand_jenkins.c b/libtommath/bn_s_mp_rand_jenkins.c index da0771c..c64afac 100644 --- a/libtommath/bn_s_mp_rand_jenkins.c +++ b/libtommath/bn_s_mp_rand_jenkins.c @@ -27,10 +27,10 @@ static uint64_t s_rand_jenkins_val(void) void s_mp_rand_jenkins_init(uint64_t seed) { - uint64_t i; + int i; jenkins_x.a = 0xf1ea5eedULL; jenkins_x.b = jenkins_x.c = jenkins_x.d = seed; - for (i = 0uLL; i < 20uLL; ++i) { + for (i = 0; i < 20; ++i) { (void)s_rand_jenkins_val(); } } diff --git a/libtommath/tommath.h b/libtommath/tommath.h index 41d07fd..7bb89e5 100644 --- a/libtommath/tommath.h +++ b/libtommath/tommath.h @@ -202,7 +202,7 @@ TOOM_SQR_CUTOFF; #endif /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ -#define PRIVATE_MP_WARRAY (int)(1uLL << (((CHAR_BIT * sizeof(private_mp_word)) - (2 * MP_DIGIT_BIT)) + 1)) +#define PRIVATE_MP_WARRAY (int)(1 << (((CHAR_BIT * (int)sizeof(private_mp_word)) - (2 * MP_DIGIT_BIT)) + 1)) #define MP_WARRAY (MP_DEPRECATED_PRAGMA("MP_WARRAY is an internal macro") PRIVATE_MP_WARRAY) #if defined(__GNUC__) && __GNUC__ >= 4 @@ -252,11 +252,15 @@ TOOM_SQR_CUTOFF; #define SIGN(m) (MP_DEPRECATED_PRAGMA("SIGN macro is deprecated, use z->sign instead") (m)->sign) /* the infamous mp_int structure */ -typedef struct { +#ifndef MP_INT_DECLARED +#define MP_INT_DECLARED +typedef struct mp_int mp_int; +#endif +struct mp_int { int used, alloc; mp_sign sign; 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); diff --git a/libtommath/tommath_private.h b/libtommath/tommath_private.h index 2e3250c..d06bab5 100644 --- a/libtommath/tommath_private.h +++ b/libtommath/tommath_private.h @@ -1,10 +1,17 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -#ifndef TOMMATH_PRIVATE_H_ -#define TOMMATH_PRIVATE_H_ +#ifndef TOMMATH_PRIV_H_ +#define TOMMATH_PRIV_H_ -#include +#ifdef MP_NO_STDINT +#ifdef HAVE_STDINT_H +# include +#else +# include "../compat/stdint.h" +#endif +#endif +#include "tommath.h" #include "tommath_class.h" #include @@ -118,6 +125,11 @@ 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 */ @@ -145,6 +157,10 @@ extern void MP_FREE(void *mem, size_t size); #define MP__STRINGIZE(x) ""#x"" #define MP_HAS(x) (sizeof(MP_STRINGIZE(BN_##x##_C)) == 1u) +/* TODO: Remove private_mp_word as soon as deprecated mp_word is removed from tommath. */ +#undef mp_word +typedef private_mp_word mp_word; + #define MP_MIN(x, y) (((x) < (y)) ? (x) : (y)) #define MP_MAX(x, y) (((x) > (y)) ? (x) : (y)) @@ -159,31 +175,18 @@ 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))) -#define PRIVATE_MP_WARRAY (1 << ((MP_SIZEOF_BITS(mp_word) - (2 * MP_DIGIT_BIT)) + 1)) +/* TODO: Remove PRIVATE_MP_WARRAY as soon as deprecated MP_WARRAY is removed from tommath.h */ +#undef MP_WARRAY +#define MP_WARRAY PRIVATE_MP_WARRAY -#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 +/* 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 #endif /* Minimum number of available digits in mp_int, MP_PREC >= MP_MIN_PREC */ -#define MP_MIN_PREC ((((int)MP_SIZEOF_BITS(Tcl_WideInt) + MP_DIGIT_BIT) - 1) / MP_DIGIT_BIT) +#define MP_MIN_PREC ((((int)MP_SIZEOF_BITS(uintmax_t) + MP_DIGIT_BIT) - 1) / MP_DIGIT_BIT) MP_STATIC_ASSERT(prec_geq_min_prec, MP_PREC >= MP_MIN_PREC) @@ -211,21 +214,39 @@ 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; -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 mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_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); /* TODO: jenkins prng is not thread safe as of now */ MP_PRIVATE mp_err s_mp_rand_jenkins(void *p, size_t n) MP_WUR; -#ifndef MP_NO_STDINT MP_PRIVATE void s_mp_rand_jenkins_init(uint64_t seed); -#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[]; +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 */ +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); #define MP_GET_ENDIANNESS(x) \ do{\ diff --git a/macosx/Tcl.xcode/project.pbxproj b/macosx/Tcl.xcode/project.pbxproj index 6681ec5..a83d100 100644 --- a/macosx/Tcl.xcode/project.pbxproj +++ b/macosx/Tcl.xcode/project.pbxproj @@ -140,7 +140,6 @@ F96D494708F272C3004A47F5 /* bn_mp_toom_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42C908F272B3004A47F5 /* bn_mp_toom_sqr.c */; }; F96D494908F272C3004A47F5 /* bn_mp_to_radix.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CB08F272B3004A47F5 /* bn_mp_to_radix.c */; }; F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */; }; - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D008F272B3004A47F5 /* bn_reverse.c */; }; F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */; }; F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */; }; F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */; }; @@ -535,7 +534,6 @@ F96D3F3408F272A7004A47F5 /* tclUtf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtf.c; sourceTree = ""; }; F96D3F3508F272A7004A47F5 /* tclUtil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtil.c; sourceTree = ""; }; F96D3F3608F272A7004A47F5 /* tclVar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclVar.c; sourceTree = ""; }; - F96D3F3708F272A7004A47F5 /* tommath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tommath.h; sourceTree = ""; }; F96D3F3908F272A8004A47F5 /* auto.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = auto.tcl; sourceTree = ""; }; F96D3F3A08F272A8004A47F5 /* clock.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = clock.tcl; sourceTree = ""; }; F96D3F3C08F272A8004A47F5 /* pkgIndex.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = pkgIndex.tcl; sourceTree = ""; }; @@ -612,7 +610,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_ubin_size.c; sourceTree = ""; }; F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_xor.c; sourceTree = ""; }; F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_zero.c; sourceTree = ""; }; - F96D42D008F272B3004A47F5 /* bn_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_reverse.c; sourceTree = ""; }; F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_add.c; sourceTree = ""; }; F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_mul_digs.c; sourceTree = ""; }; F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_sqr.c; sourceTree = ""; }; @@ -767,7 +764,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = checkLibraryDoc.tcl; sourceTree = ""; }; F96D43D208F272B8004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = ""; }; F96D43D308F272B8004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = ""; }; - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = fix_tommath_h.tcl; sourceTree = ""; }; F96D442508F272B8004A47F5 /* genStubs.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = genStubs.tcl; sourceTree = ""; }; F96D442708F272B8004A47F5 /* index.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = index.tcl; sourceTree = ""; }; F96D442808F272B8004A47F5 /* installData.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = installData.tcl; sourceTree = ""; }; @@ -1323,7 +1319,6 @@ F96D3F3508F272A7004A47F5 /* tclUtil.c */, F96D3F3608F272A7004A47F5 /* tclVar.c */, F96437C90EF0D4B2003F468E /* tclZlib.c */, - F96D3F3708F272A7004A47F5 /* tommath.h */, ); path = generic; sourceTree = ""; @@ -1472,7 +1467,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */, F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */, F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */, - F96D42D008F272B3004A47F5 /* bn_reverse.c */, F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */, F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */, F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */, @@ -1661,7 +1655,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */, F96D43D208F272B8004A47F5 /* configure */, F96D43D308F272B8004A47F5 /* configure.ac */, - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */, F96D442508F272B8004A47F5 /* genStubs.tcl */, F96D442708F272B8004A47F5 /* index.tcl */, F96D442808F272B8004A47F5 /* installData.tcl */, @@ -2102,7 +2095,6 @@ F9E61D32090A48FA002B3151 /* bn_mp_ubin_size.c in Sources */, F9E61D2D090A48BB002B3151 /* bn_mp_xor.c in Sources */, F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */, - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */, F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */, F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */, F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */, diff --git a/macosx/Tcl.xcodeproj/project.pbxproj b/macosx/Tcl.xcodeproj/project.pbxproj index 6d90515..b1c3a39 100644 --- a/macosx/Tcl.xcodeproj/project.pbxproj +++ b/macosx/Tcl.xcodeproj/project.pbxproj @@ -140,7 +140,6 @@ F96D494708F272C3004A47F5 /* bn_mp_toom_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42C908F272B3004A47F5 /* bn_mp_toom_sqr.c */; }; F96D494908F272C3004A47F5 /* bn_mp_to_radix.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CB08F272B3004A47F5 /* bn_mp_to_radix.c */; }; F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */; }; - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D008F272B3004A47F5 /* bn_reverse.c */; }; F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */; }; F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */; }; F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */; }; @@ -534,7 +533,6 @@ F96D3F3408F272A7004A47F5 /* tclUtf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtf.c; sourceTree = ""; }; F96D3F3508F272A7004A47F5 /* tclUtil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtil.c; sourceTree = ""; }; F96D3F3608F272A7004A47F5 /* tclVar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclVar.c; sourceTree = ""; }; - F96D3F3708F272A7004A47F5 /* tommath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tommath.h; sourceTree = ""; }; F96D3F3908F272A8004A47F5 /* auto.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = auto.tcl; sourceTree = ""; }; F96D3F3A08F272A8004A47F5 /* clock.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = clock.tcl; sourceTree = ""; }; F96D3F3C08F272A8004A47F5 /* pkgIndex.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = pkgIndex.tcl; sourceTree = ""; }; @@ -612,7 +610,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_ubin_size.c; sourceTree = ""; }; F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_xor.c; sourceTree = ""; }; F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_zero.c; sourceTree = ""; }; - F96D42D008F272B3004A47F5 /* bn_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_reverse.c; sourceTree = ""; }; F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_add.c; sourceTree = ""; }; F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_mul_digs.c; sourceTree = ""; }; F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_sqr.c; sourceTree = ""; }; @@ -767,7 +764,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = checkLibraryDoc.tcl; sourceTree = ""; }; F96D43D208F272B8004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = ""; }; F96D43D308F272B8004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = ""; }; - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = fix_tommath_h.tcl; sourceTree = ""; }; F96D442508F272B8004A47F5 /* genStubs.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = genStubs.tcl; sourceTree = ""; }; F96D442708F272B8004A47F5 /* index.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = index.tcl; sourceTree = ""; }; F96D442808F272B8004A47F5 /* installData.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = installData.tcl; sourceTree = ""; }; @@ -1323,7 +1319,6 @@ F96D3F3508F272A7004A47F5 /* tclUtil.c */, F96D3F3608F272A7004A47F5 /* tclVar.c */, F96437C90EF0D4B2003F468E /* tclZlib.c */, - F96D3F3708F272A7004A47F5 /* tommath.h */, ); path = generic; sourceTree = ""; @@ -1472,7 +1467,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */, F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */, F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */, - F96D42D008F272B3004A47F5 /* bn_reverse.c */, F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */, F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */, F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */, @@ -1661,7 +1655,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */, F96D43D208F272B8004A47F5 /* configure */, F96D43D308F272B8004A47F5 /* configure.ac */, - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */, F96D442508F272B8004A47F5 /* genStubs.tcl */, F96D442708F272B8004A47F5 /* index.tcl */, F96D442808F272B8004A47F5 /* installData.tcl */, @@ -2102,7 +2095,6 @@ F9E61D32090A48FA002B3151 /* bn_mp_ubin_size.c in Sources */, F9E61D2D090A48BB002B3151 /* bn_mp_xor.c in Sources */, F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */, - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */, F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */, F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */, F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */, diff --git a/tools/fix_tommath_h.tcl b/tools/fix_tommath_h.tcl deleted file mode 100755 index cee29fa..0000000 --- a/tools/fix_tommath_h.tcl +++ /dev/null @@ -1,103 +0,0 @@ -# fixtommath.tcl -- -# -# Changes to 'tommath.h' to make it conform with Tcl's linking -# conventions. -# -# Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -#---------------------------------------------------------------------- - -set f [open [lindex $argv 0] r] -set data [read $f] -close $f - -set eat_endif 0 -set eat_semi 0 -set def_count 0 -foreach line [split $data \n] { - if {!$eat_semi && !$eat_endif} { - switch -regexp -- $line { - {#define BN_H_} { - puts $line - puts {} - puts "\#include \"tclTomMathDecls.h\"" - puts "\#ifndef MODULE_SCOPE" - puts "\#define MODULE_SCOPE extern" - puts "\#endif" - } - {typedef\s+unsigned long\s+mp_digit;} { - # change the second 'typedef unsigned long mp - incr def_count - puts "\#ifndef MP_DIGIT_DECLARED" - if {$def_count == 2} { - puts [string map {long int} $line] - } else { - puts $line - } - puts "\#define MP_DIGIT_DECLARED" - puts "\#endif" - } - {typedef.*mp_digit;} { - puts "\#ifndef MP_DIGIT_DECLARED" - puts $line - puts "\#define MP_DIGIT_DECLARED" - puts "\#endif" - } - {typedef.*mp_word;} { - puts "\#ifndef MP_WORD_DECLARED" - puts $line - puts "\#define MP_WORD_DECLARED" - puts "\#endif" - } - {typedef struct} { - puts "\#ifndef MP_INT_DECLARED" - puts "\#define MP_INT_DECLARED" - puts "typedef struct mp_int mp_int;" - puts "\#endif" - puts "struct mp_int \{" - } - \}\ mp_int\; { - puts "\};" - } - {^(char|int|void)} { - puts "/*" - puts $line - set eat_semi 1 - set after_semi "*/" - } - {^extern (int|const)} { - puts "\#if defined(BUILD_tcl) || !defined(_WIN32)" - puts [regsub {^extern} $line "MODULE_SCOPE"] - set eat_semi 1 - set after_semi "\#endif" - } - {define heap macros} { - puts $line - puts "\#if 0 /* these are macros in tclTomMathDecls.h */" - set eat_endif 1 - } - {#include} { - # remove all includes - } - default { - puts $line - } - } - } else { - puts $line - } - if {$eat_semi} { - if {[regexp {; *$} $line]} { - puts $after_semi - set eat_semi 0 - } - } - if {$eat_endif} { - if {[regexp {^\#endif} $line]} { - puts "\#endif" - set eat_endif 0 - } - } -} diff --git a/unix/Makefile.in b/unix/Makefile.in index 0bdc40a..7c46c34 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -229,7 +229,6 @@ SRC_DIR = @srcdir@ TOP_DIR = @TCL_SRC_DIR@ BUILD_DIR = @builddir@ GENERIC_DIR = $(TOP_DIR)/generic -TOMMATH_DIR = $(TOP_DIR)/libtommath COMPAT_DIR = $(TOP_DIR)/compat TOOL_DIR = $(TOP_DIR)/tools UNIX_DIR = $(TOP_DIR)/unix @@ -242,6 +241,8 @@ TCL_BUILDTIME_LIBRARY = @TCL_SRC_DIR@/library ZLIB_DIR = ${COMPAT_DIR}/zlib ZLIB_INCLUDE = @ZLIB_INCLUDE@ +TOMMATH_DIR = $(TOP_DIR)/libtommath +TOMMATH_INCLUDE = @TOMMATH_INCLUDE@ CC = @CC@ OBJEXT = @OBJEXT@ @@ -369,7 +370,7 @@ ZLIB_OBJS = Zadler32.o Zcompress.o Zcrc32.o Zdeflate.o Zinfback.o \ TCL_OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} ${COMPAT_OBJS} \ ${OO_OBJS} @DL_OBJS@ @PLAT_OBJS@ -OBJS = ${TCL_OBJS} ${TOMMATH_OBJS} @DTRACE_OBJ@ @ZLIB_OBJS@ +OBJS = ${TCL_OBJS} @DTRACE_OBJ@ @ZLIB_OBJS@ @TOMMATH_OBJS@ TCL_DECLS = \ $(GENERIC_DIR)/tcl.decls \ @@ -712,8 +713,8 @@ ZLIB_SRCS = \ # won't compile on the current machine, and they will cause problems for # things like "make depend". -SRCS = $(GENERIC_SRCS) $(TOMMATH_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) \ - $(OO_SRCS) $(STUB_SRCS) @PLAT_SRCS@ @ZLIB_SRCS@ +SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) \ + $(OO_SRCS) $(STUB_SRCS) @PLAT_SRCS@ @ZLIB_SRCS@ @TOMMATH_SRCS@ ### # Tip 430 - ZipFS Modifications @@ -1208,7 +1209,7 @@ TCLREHDRS = $(GENERIC_DIR)/tclRegexp.h COMPILEHDR = $(GENERIC_DIR)/tclCompile.h FSHDR = $(GENERIC_DIR)/tclFileSystem.h IOHDR = $(GENERIC_DIR)/tclIO.h -MATHHDRS = $(GENERIC_DIR)/tommath.h $(GENERIC_DIR)/tclTomMath.h +MATHHDRS = $(GENERIC_DIR)/tclTomMath.h $(GENERIC_DIR)/tclTomMathDecls.h PARSEHDR = $(GENERIC_DIR)/tclParse.h NREHDR = $(GENERIC_DIR)/tclInt.h TRIMHDR = $(GENERIC_DIR)/tclStringTrim.h @@ -2090,14 +2091,6 @@ gendate: # $(GENERIC_DIR)/tclDate.c # rm y.tab.c -# The following target generates the file generic/tclTomMath.h. It needs to be -# run (and the results checked) after updating to a new release of libtommath. - -gentommath_h: - $(NATIVE_TCLSH) "$(TOOL_DIR)/fix_tommath_h.tcl" \ - "$(TOMMATH_DIR)/tommath.h" \ - > "$(GENERIC_DIR)/tclTomMath.h" - # # Target to regenerate header files and stub files from the *.decls tables. # diff --git a/unix/configure b/unix/configure index 9fb8ddc..42f45a1 100755 --- a/unix/configure +++ b/unix/configure @@ -705,6 +705,9 @@ TCL_LIBS LIBOBJS AR RANLIB +TOMMATH_INCLUDE +TOMMATH_SRCS +TOMMATH_OBJS ZLIB_INCLUDE ZLIB_SRCS ZLIB_OBJS @@ -4652,6 +4655,107 @@ fi $as_echo "#define HAVE_ZLIB 1" >>confdefs.h +#------------------------------------------------------------------------ +# Add stuff for libtommath + +libtommath_ok=yes +ac_fn_c_check_header_mongrel "$LINENO" "tommath.h" "ac_cv_header_tommath_h" "$ac_includes_default" +if test "x$ac_cv_header_tommath_h" = xyes; then : + + ac_fn_c_check_type "$LINENO" "mp_int" "ac_cv_type_mp_int" "#include +" +if test "x$ac_cv_type_mp_int" = xyes; then : + +else + libtommath_ok=no +fi + +else + + libtommath_ok=no +fi + + +if test $libtommath_ok = yes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing mp_log_u32" >&5 +$as_echo_n "checking for library containing mp_log_u32... " >&6; } +if ${ac_cv_search_mp_log_u32+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mp_log_u32 (); +int +main () +{ +return mp_log_u32 (); + ; + return 0; +} +_ACEOF +for ac_lib in '' tommath; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_mp_log_u32=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_mp_log_u32+:} false; then : + break +fi +done +if ${ac_cv_search_mp_log_u32+:} false; then : + +else + ac_cv_search_mp_log_u32=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_mp_log_u32" >&5 +$as_echo "$ac_cv_search_mp_log_u32" >&6; } +ac_res=$ac_cv_search_mp_log_u32 +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + + libtommath_ok=no + +fi + +fi +if test $libtommath_ok = yes; then : + + +$as_echo "#define TCL_WITH_EXTERNAL_TOMMATH 1" >>confdefs.h + + +else + + TOMMATH_OBJS=\${TOMMATH_OBJS} + + TOMMATH_SRCS=\${TOMMATH_SRCS} + + TOMMATH_INCLUDE=-I\${TOMMATH_DIR} + + +fi + #-------------------------------------------------------------------- # The statements below define a collection of compile flags. This # macro depends on the value of SHARED_BUILD, and should be called diff --git a/unix/configure.ac b/unix/configure.ac index 6614f5a..c0d08b4 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -167,6 +167,25 @@ AS_IF([test $zlib_ok = no], [ ]) AC_DEFINE(HAVE_ZLIB, 1, [Is there an installed zlib?]) +#------------------------------------------------------------------------ +# Add stuff for libtommath + +libtommath_ok=yes +AC_CHECK_HEADER([tommath.h],[ + AC_CHECK_TYPE([mp_int],[],[libtommath_ok=no],[#include ])],[ + libtommath_ok=no]) +AS_IF([test $libtommath_ok = yes], [ + AC_SEARCH_LIBS([mp_log_u32],[tommath],[],[ + libtommath_ok=no + ])]) +AS_IF([test $libtommath_ok = yes], [ + AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) +], [ + AC_SUBST(TOMMATH_OBJS,[\${TOMMATH_OBJS}]) + AC_SUBST(TOMMATH_SRCS,[\${TOMMATH_SRCS}]) + AC_SUBST(TOMMATH_INCLUDE,[-I\${TOMMATH_DIR}]) +]) + #-------------------------------------------------------------------- # The statements below define a collection of compile flags. This # macro depends on the value of SHARED_BUILD, and should be called diff --git a/unix/tclConfig.h.in b/unix/tclConfig.h.in index 042f798..4857287 100644 --- a/unix/tclConfig.h.in +++ b/unix/tclConfig.h.in @@ -310,9 +310,6 @@ /* No Compiler support for module scope symbols */ #undef MODULE_SCOPE -/* Default libtommath precision. */ -#undef MP_PREC - /* Is no debugging enabled? */ #undef NDEBUG diff --git a/win/Makefile.in b/win/Makefile.in index c16f250..5d0fcbf 100644 --- a/win/Makefile.in +++ b/win/Makefile.in @@ -99,11 +99,12 @@ SRC_DIR = @srcdir@ ROOT_DIR = @srcdir@/.. TOP_DIR = $(shell cd @srcdir@/..; pwd -W 2>/dev/null || pwd -P) GENERIC_DIR = $(TOP_DIR)/generic -TOMMATH_DIR = $(TOP_DIR)/libtommath WIN_DIR = $(TOP_DIR)/win COMPAT_DIR = $(TOP_DIR)/compat PKGS_DIR = $(TOP_DIR)/pkgs ZLIB_DIR = $(COMPAT_DIR)/zlib +MINIZIP_DIR = $(ZLIB_DIR)/contrib/minizip +TOMMATH_DIR = $(TOP_DIR)/libtommath # Converts a POSIX path to a Windows native path. CYGPATH = @CYGPATH@ @@ -114,15 +115,12 @@ includedir_native = $(shell $(CYGPATH) '$(includedir)') mandir_native = $(shell $(CYGPATH) '$(mandir)') TCL_LIBRARY_NATIVE = $(shell $(CYGPATH) '$(TCL_LIBRARY)') GENERIC_DIR_NATIVE = $(shell $(CYGPATH) '$(GENERIC_DIR)') -TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') WIN_DIR_NATIVE = $(shell $(CYGPATH) '$(WIN_DIR)') ROOT_DIR_NATIVE = $(shell $(CYGPATH) '$(ROOT_DIR)') ROOT_DIR_WIN_NATIVE = $(shell cd '$(ROOT_DIR)' ; pwd -W 2>/dev/null || pwd -P) ZLIB_DIR_NATIVE = $(shell $(CYGPATH) '$(ZLIB_DIR)') -#GENERIC_DIR_NATIVE = $(GENERIC_DIR) -#TOMMATH_DIR_NATIVE = $(TOMMATH_DIR) -#WIN_DIR_NATIVE = $(WIN_DIR) -#ROOT_DIR_NATIVE = $(ROOT_DIR) +MINIZIP_DIR_NATIVE = $(shell $(CYGPATH) '$(MINIZIP_DIR)') +TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') # Fully qualify library path so that `make test` # does not depend on the current directory. @@ -160,8 +158,9 @@ TEST_LOAD_PRMS = lappend ::auto_path {$(ROOT_DIR_WIN_NATIVE)/tests};\ TEST_LOAD_FACILITIES = package ifneeded Tcltest ${VERSION}@TCL_PATCH_LEVEL@ [list load [file normalize ${TEST_DLL_FILE}] Tcltest];\ $(TEST_LOAD_PRMS) ZLIB_DLL_FILE = zlib1.dll +TOMMATH_DLL_FILE = libtommath.dll -SHARED_LIBRARIES = $(TCL_DLL_FILE) @ZLIB_DLL_FILE@ +SHARED_LIBRARIES = $(TCL_DLL_FILE) @ZLIB_DLL_FILE@ @TOMMATH_DLL_FILE@ STATIC_LIBRARIES = $(TCL_LIB_FILE) TCLSH = tclsh$(VER)${EXESUFFIX} @@ -181,7 +180,7 @@ TCL_EXE = @TCL_EXE@ # Setting the VPATH variable to a list of paths will cause the Makefile to # look into these paths when resolving .c to .obj dependencies. -VPATH = $(GENERIC_DIR):$(TOMMATH_DIR):$(WIN_DIR):$(COMPAT_DIR):$(ZLIB_DIR) +VPATH = $(GENERIC_DIR):$(WIN_DIR):$(COMPAT_DIR):$(ZLIB_DIR):$(TOMMATH_DIR) AR = @AR@ RANLIB = @RANLIB@ @@ -202,7 +201,7 @@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_SUFFIX = @SHLIB_SUFFIX@ -LIBS = @LIBS@ $(shell $(CYGPATH) '@ZLIB_LIBS@') +LIBS = @LIBS@ $(shell $(CYGPATH) '@ZLIB_LIBS@') $(shell $(CYGPATH) '@TOMMATH_LIBS@') RMDIR = rm -rf MKDIR = mkdir -p @@ -251,15 +250,15 @@ MINIZIP_OBJS = \ ZIP_INSTALL_OBJS = @ZIP_INSTALL_OBJS@ CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \ --I"${ZLIB_DIR_NATIVE}" -I"${GENERIC_DIR_NATIVE}" \ --DMP_PREC=4 -I"${TOMMATH_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \ +-I"${GENERIC_DIR_NATIVE}" -I"${TOMMATH_DIR_NATIVE}" \ +-DMP_PREC=4 -I"${ZLIB_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \ ${AC_FLAGS} ${COMPILE_DEBUG_FLAGS} ${NO_DEPRECATED_FLAGS} CC_OBJNAME = @CC_OBJNAME@ CC_EXENAME = @CC_EXENAME@ STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ --I"${GENERIC_DIR_NATIVE}" -DMP_PREC=4 -I"${TOMMATH_DIR_NATIVE}" \ +-I"${GENERIC_DIR_NATIVE}" -I"${TOMMATH_DIR_NATIVE}" \ -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ ${COMPILE_DEBUG_FLAGS} @@ -472,7 +471,7 @@ ZLIB_OBJS = \ uncompr.$(OBJEXT) \ zutil.$(OBJEXT) -TCL_OBJS = ${GENERIC_OBJS} $(TOMMATH_OBJS) ${WIN_OBJS} @ZLIB_OBJS@ +TCL_OBJS = ${GENERIC_OBJS} ${WIN_OBJS} @ZLIB_OBJS@ @TOMMATH_OBJS@ TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n] @@ -565,7 +564,7 @@ ${TCL_STUB_LIB_FILE}: ${STUB_OBJS} @MAKE_STUB_LIB@ ${STUB_OBJS} @POST_MAKE_LIB@ -${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES) @ZLIB_DLL_FILE@ ${TCL_ZIP_FILE} +${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES) @ZLIB_DLL_FILE@ @TOMMATH_DLL_FILE@ ${TCL_ZIP_FILE} @$(RM) ${TCL_DLL_FILE} $(TCL_LIB_FILE) @MAKE_DLL@ ${TCL_OBJS} tcl.$(RES) $(SHLIB_LD_LIBS) $(COPY) tclsh.exe.manifest ${TCL_DLL_FILE}.manifest @@ -608,6 +607,14 @@ ${ZLIB_DLL_FILE}: ${TCL_STUB_LIB_FILE} $(COPY) $(ZLIB_DIR)/win32/${ZLIB_DLL_FILE} ${ZLIB_DLL_FILE}; \ fi; +# use pre-built libtommath.dll +${TOMMATH_DLL_FILE}: ${TCL_STUB_LIB_FILE} + @if test "@TOMMATH_LIBS@set" != "${TOMMATH_DIR_NATIVE}/win32/tommath.libset" ; then \ + $(COPY) $(TOMMATH_DIR)/win64/${TOMMATH_DLL_FILE} ${TOMMATH_DLL_FILE}; \ + else \ + $(COPY) $(TOMMATH_DIR)/win32/${TOMMATH_DLL_FILE} ${TOMMATH_DLL_FILE}; \ + fi; + # Add the object extension to the implicit rules. By default .obj is not # automatically added. @@ -646,7 +653,7 @@ tclZipfs.${OBJEXT}: $(GENERIC_DIR)/tclZipfs.c -DCFG_RUNTIME_ZIPFILE="\"$(TCL_ZIP_FILE)\"" \ -DCFG_RUNTIME_LIBDIR="\"$(bindir_native)\"" \ -DCFG_RUNTIME_SCRDIR="\"$(TCL_LIBRARY_NATIVE)\"" \ - $(ZLIB_INCLUDE) -I$(ZLIB_DIR)/contrib/minizip @DEPARG@ $(CC_OBJNAME) + $(ZLIB_INCLUDE) -I$(MINIZIP_DIR_NATIVE) @DEPARG@ $(CC_OBJNAME) # TIP #59, embedding of configuration information into the binary library. @@ -763,14 +770,6 @@ gendate: --no-lines \ $(GENERIC_DIR)/tclGetDate.y -# The following target generates the file generic/tclTomMath.h. It needs to be -# run (and the results checked) after updating to a new release of libtommath. - -gentommath_h: - $(TCL_EXE) "$(ROOT_DIR_NATIVE)/tools/fix_tommath_h.tcl" \ - "$(TOMMATH_DIR_NATIVE)/tommath.h" \ - > "$(GENERIC_DIR_NATIVE)/tclTomMath.h" - INSTALL_BASE_TARGETS = install-binaries $(INSTALL_LIBRARIES) $(INSTALL_MSGS) $(INSTALL_TZDATA) INSTALL_DOC_TARGETS = install-doc INSTALL_PACKAGE_TARGETS = install-packages @@ -799,7 +798,7 @@ install-binaries: binaries else true; \ fi; \ done; - @for i in $(TCL_DLL_FILE) $(ZLIB_DLL_FILE) $(TCLSH); \ + @for i in $(TCL_DLL_FILE) $(ZLIB_DLL_FILE) $(TOMMATH_DLL_FILE) $(TCLSH); \ do \ if [ -f $$i ]; then \ echo "Installing $$i to $(BIN_INSTALL_DIR)/"; \ diff --git a/win/configure b/win/configure index 4398996..46b416e 100755 --- a/win/configure +++ b/win/configure @@ -710,8 +710,11 @@ ZIP_PROG TCLSH_PROG EXEEXT_FOR_BUILD CC_FOR_BUILD +TOMMATH_OBJS ZLIB_OBJS +TOMMATH_LIBS ZLIB_LIBS +TOMMATH_DLL_FILE ZLIB_DLL_FILE CFLAGS_WARNING CFLAGS_OPTIMIZE @@ -4678,8 +4681,9 @@ case ${host_alias} in esac #------------------------------------------------------------------------ -# Add stuff for zlib; note that this is mostly done in the makefile now -# as we just assume that the platform hasn't got a usable z.lib +# Add stuff for zlib/libtommath; note that this is mostly done in the +# makefile now as we just assume that the platform hasn't got usable +# z.lib/tommath.lib #------------------------------------------------------------------------ if test "${enable_shared+set}" = "set"; then : @@ -4696,17 +4700,29 @@ if test "$tcl_ok" = "yes"; then : ZLIB_DLL_FILE=\${ZLIB_DLL_FILE} + TOMMATH_DLL_FILE=\${TOMMATH_DLL_FILE} + + +$as_echo "#define TCL_WITH_EXTERNAL_TOMMATH 1" >>confdefs.h + if test "$do64bit" != "no"; then : + +$as_echo "#define MP_64BIT 1" >>confdefs.h + if test "$GCC" == "yes"; then : ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64/libz.dll.a + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a + else ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64/zdll.lib + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64/tommath.lib + fi @@ -4714,6 +4730,8 @@ else ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win32/zdll.lib + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win32/tommath.lib + fi @@ -4721,6 +4739,8 @@ else ZLIB_OBJS=\${ZLIB_OBJS} + TOMMATH_OBJS=\${TOMMATH_OBJS} + fi diff --git a/win/configure.ac b/win/configure.ac index 82d713a..aceea8e 100644 --- a/win/configure.ac +++ b/win/configure.ac @@ -124,8 +124,9 @@ case ${host_alias} in esac #------------------------------------------------------------------------ -# Add stuff for zlib; note that this is mostly done in the makefile now -# as we just assume that the platform hasn't got a usable z.lib +# Add stuff for zlib/libtommath; note that this is mostly done in the +# makefile now as we just assume that the platform hasn't got usable +# z.lib/tommath.lib #------------------------------------------------------------------------ AS_IF([test "${enable_shared+set}" = "set"], [ @@ -136,17 +137,24 @@ AS_IF([test "${enable_shared+set}" = "set"], [ ]) AS_IF([test "$tcl_ok" = "yes"], [ AC_SUBST(ZLIB_DLL_FILE,[\${ZLIB_DLL_FILE}]) + AC_SUBST(TOMMATH_DLL_FILE,[\${TOMMATH_DLL_FILE}]) + AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) AS_IF([test "$do64bit" != "no"], [ + AC_DEFINE(MP_64BIT, 1, [Using libtommath.dll in 64-bit mode]) AS_IF([test "$GCC" == "yes"],[ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/libz.dll.a]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a]) ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/zdll.lib]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/tommath.lib]) ]) ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win32/zdll.lib]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win32/tommath.lib]) ]) ], [ AC_SUBST(ZLIB_OBJS,[\${ZLIB_OBJS}]) + AC_SUBST(TOMMATH_OBJS,[\${TOMMATH_OBJS}]) ]) AC_DEFINE(HAVE_ZLIB, 1, [Is there an installed zlib?]) diff --git a/win/makefile.vc b/win/makefile.vc index 31800c4..2d98f3d 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -566,21 +566,6 @@ genstubs: !endif -#---------------------------------------------------------------------- -# The following target generates the file generic/tclTomMath.h. -# It needs to be run (and the results checked) after updating -# to a new release of libtommath. -#---------------------------------------------------------------------- - -gentommath_h: -!if !exist($(TCLSH)) - @echo Build tclsh first! -!else - $(TCLSH) "$(TOOLSDIR:\=/)/fix_tommath_h.tcl" \ - "$(TOMMATHDIR:\=/)/tommath.h" \ - > "$(GENERICDIR)\tclTomMath.h" -!endif - #--------------------------------------------------------------------- # Build the Windows HTML help file. #--------------------------------------------------------------------- -- cgit v0.12