From 4c1d3f08388dbb3f5dcc2e4b50a469ee4f405052 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Wed, 2 Jul 2003 15:39:39 +0000 Subject: [PATCH] added libtommath-0.22 --- bn.pdf | Bin 233095 -> 232773 bytes bn.tex | 2 +- bn_fast_mp_invmod.c | 8 +- bn_mp_cnt_lsb.c | 40 + bn_mp_div_2d.c | 7 +- bn_mp_div_3.c | 128 +-- bn_mp_exptmod_fast.c | 27 +- bn_mp_fread.c | 61 ++ bn_mp_fwrite.c | 47 ++ bn_mp_gcd.c | 118 ++- bn_mp_invmod.c | 45 +- bn_mp_jacobi.c | 56 +- bn_mp_mul_2d.c | 23 +- bn_mp_prime_fermat.c | 6 +- bn_mp_prime_is_divisible.c | 9 +- bn_mp_prime_miller_rabin.c | 18 +- bn_mp_radix_size.c | 54 ++ bn_mp_radix_smap.c | 18 + bn_mp_read_radix.c | 77 ++ bn_mp_toradix.c | 70 ++ bn_radix.c | 224 ------ bn_s_mp_exptmod.c | 446 ++++++----- booker.pl | 4 +- changes.txt | 11 + demo/demo.c | 15 +- etc/2kprime.1 | 4 +- makefile | 14 +- makefile.bcc | 74 +- makefile.msvc | 6 +- mtest/mtest.c | 2 +- pics/expt_state.sxd | Bin 0 -> 6869 bytes pics/makefile | 30 + pics/sliding_window.sxd | Bin 0 -> 6787 bytes poster.pdf | Bin 37651 -> 40790 bytes pre_gen/mpi.c | 1514 ++++++++++++++++++++---------------- test.c | 46 ++ tommath.h | 9 +- 37 files changed, 1812 insertions(+), 1401 deletions(-) create mode 100644 bn_mp_cnt_lsb.c create mode 100644 bn_mp_fread.c create mode 100644 bn_mp_fwrite.c create mode 100644 bn_mp_radix_size.c create mode 100644 bn_mp_radix_smap.c create mode 100644 bn_mp_read_radix.c create mode 100644 bn_mp_toradix.c delete mode 100644 bn_radix.c create mode 100644 pics/expt_state.sxd create mode 100644 pics/makefile create mode 100644 pics/sliding_window.sxd create mode 100644 test.c diff --git a/bn.pdf b/bn.pdf index 1a361efbd92667a96b7c2180407aae0fc3411b88..a0020996c9115e990ce0a832c808b79de031ab1a 100644 GIT binary patch delta 100863 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 PK?njOHa1BGDWd-eDv8l8 delta 100258 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�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 + +/* Counts the number of lsbs which are zero before the first zero bit */ +int mp_cnt_lsb(mp_int *a) +{ + int x; + mp_digit q; + + if (mp_iszero(a) == 1) { + return 0; + } + + /* scan lower digits until non-zero */ + for (x = 0; x < a->used && a->dp[x] == 0; x++); + q = a->dp[x]; + x *= DIGIT_BIT; + + /* now scan this digit until a 1 is found */ + while ((q & 1) == 0) { + q >>= 1; + x += 1; + } + + return x; +} + diff --git a/bn_mp_div_2d.c b/bn_mp_div_2d.c index 18bf904..9bc1fd6 100644 --- a/bn_mp_div_2d.c +++ b/bn_mp_div_2d.c @@ -58,11 +58,14 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) /* shift any bit count < DIGIT_BIT */ D = (mp_digit) (b % DIGIT_BIT); if (D != 0) { - register mp_digit *tmpc, mask; + register mp_digit *tmpc, mask, shift; /* mask */ mask = (((mp_digit)1) << D) - 1; + /* shift for lsb */ + shift = DIGIT_BIT - D; + /* alias */ tmpc = c->dp + (c->used - 1); @@ -73,7 +76,7 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) rr = *tmpc & mask; /* shift the current word and mix in the carry bits from the previous word */ - *tmpc = (*tmpc >> D) | (r << (DIGIT_BIT - D)); + *tmpc = (*tmpc >> D) | (r << shift); --tmpc; /* set the carry to the carry bits of the current word found above */ diff --git a/bn_mp_div_3.c b/bn_mp_div_3.c index 524531e..d82f29f 100644 --- a/bn_mp_div_3.c +++ b/bn_mp_div_3.c @@ -1,64 +1,64 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* divide by three (based on routine from MPI and the GMP manual) */ -int -mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) -{ - mp_int q; - mp_word w, t; - mp_digit b; - int res, ix; - - /* b = 2**DIGIT_BIT / 3 */ - b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); - - if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { - return res; - } - - q.used = a->used; - q.sign = a->sign; - w = 0; - for (ix = a->used - 1; ix >= 0; ix--) { - w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); - - if (w >= 3) { - t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); - w -= (t << ((mp_word)1)) + t; - while (w >= 3) { - t += 1; - w -= 3; - } - } else { - t = 0; - } - q.dp[ix] = (mp_digit)t; - } - - if (d != NULL) { - *d = (mp_digit)w; - } - - if (c != NULL) { - mp_clamp(&q); - mp_exch(&q, c); - } - mp_clear(&q); - - return res; -} - +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* divide by three (based on routine from MPI and the GMP manual) */ +int +mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) +{ + mp_int q; + mp_word w, t; + mp_digit b; + int res, ix; + + /* b = 2**DIGIT_BIT / 3 */ + b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); + + if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { + return res; + } + + q.used = a->used; + q.sign = a->sign; + w = 0; + for (ix = a->used - 1; ix >= 0; ix--) { + w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); + + if (w >= 3) { + t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); + w -= (t << ((mp_word)1)) + t; + while (w >= 3) { + t += 1; + w -= 3; + } + } else { + t = 0; + } + q.dp[ix] = (mp_digit)t; + } + + if (d != NULL) { + *d = (mp_digit)w; + } + + if (c != NULL) { + mp_clamp(&q); + mp_exch(&q, c); + } + mp_clear(&q); + + return res; +} + diff --git a/bn_mp_exptmod_fast.c b/bn_mp_exptmod_fast.c index 54de53d..567d614 100644 --- a/bn_mp_exptmod_fast.c +++ b/bn_mp_exptmod_fast.c @@ -21,10 +21,17 @@ * * Uses Montgomery or Diminished Radix reduction [whichever appropriate] */ + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { - mp_int M[256], res; + mp_int M[TAB_SIZE], res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; @@ -58,17 +65,24 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) } #endif + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } - /* init G array */ - for (x = 0; x < (1 << winsize); x++) { - if ((err = mp_init (&M[x])) != MP_OKAY) { - for (y = 0; y < x; y++) { + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } + mp_clear(&M[1]); return err; } } + /* determine and setup reduction code */ if (redmode == 0) { /* now setup montgomery */ @@ -257,7 +271,8 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) err = MP_OKAY; __RES:mp_clear (&res); __M: - for (x = 0; x < (1 << winsize); x++) { + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; diff --git a/bn_mp_fread.c b/bn_mp_fread.c new file mode 100644 index 0000000..004b0f1 --- /dev/null +++ b/bn_mp_fread.c @@ -0,0 +1,61 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read a bigint from a file stream in ASCII */ +int mp_fread(mp_int *a, int radix, FILE *stream) +{ + int err, ch, neg, y; + + /* clear a */ + mp_zero(a); + + /* if first digit is - then set negative */ + ch = fgetc(stream); + if (ch == '-') { + neg = MP_NEG; + ch = fgetc(stream); + } else { + neg = MP_ZPOS; + } + + for (;;) { + /* find y in the radix map */ + for (y = 0; y < radix; y++) { + if (mp_s_rmap[y] == ch) { + break; + } + } + if (y == radix) { + break; + } + + /* shift up and add */ + if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { + return err; + } + if ((err = mp_add_d(a, y, a)) != MP_OKAY) { + return err; + } + + ch = fgetc(stream); + } + if (mp_cmp_d(a, 0) != MP_EQ) { + a->sign = neg; + } + + return MP_OKAY; +} + diff --git a/bn_mp_fwrite.c b/bn_mp_fwrite.c new file mode 100644 index 0000000..93d51fd --- /dev/null +++ b/bn_mp_fwrite.c @@ -0,0 +1,47 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int mp_fwrite(mp_int *a, int radix, FILE *stream) +{ + char *buf; + int err, len, x; + + len = mp_radix_size(a, radix); + if (len == 0) { + return MP_VAL; + } + + buf = malloc(len); + if (buf == NULL) { + return MP_MEM; + } + + if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { + free(buf); + return err; + } + + for (x = 0; x < len; x++) { + if (fputc(buf[x], stream) == EOF) { + free(buf); + return MP_VAL; + } + } + + free(buf); + return MP_OKAY; +} + diff --git a/bn_mp_gcd.c b/bn_mp_gcd.c index 1c930c7..ff6ba70 100644 --- a/bn_mp_gcd.c +++ b/bn_mp_gcd.c @@ -14,13 +14,12 @@ */ #include -/* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] - */ +/* Greatest Common Divisor using the binary method */ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) { - mp_int u, v, t; - int k, res, neg; + mp_int u, v; + int k, u_lsb, v_lsb, res; /* either zero than gcd is the largest */ if (mp_iszero (a) == 1 && mp_iszero (b) == 0) { @@ -34,9 +33,6 @@ mp_gcd (mp_int * a, mp_int * b, mp_int * c) return MP_OKAY; } - /* if both are negative they share (-1) as a common divisor */ - neg = (a->sign == b->sign) ? a->sign : MP_ZPOS; - if ((res = mp_init_copy (&u, a)) != MP_OKAY) { return res; } @@ -48,71 +44,55 @@ mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* must be positive for the remainder of the algorithm */ u.sign = v.sign = MP_ZPOS; - if ((res = mp_init (&t)) != MP_OKAY) { + /* B1. Find the common power of two for u and v */ + u_lsb = mp_cnt_lsb(&u); + v_lsb = mp_cnt_lsb(&v); + k = MIN(u_lsb, v_lsb); + + if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { + goto __V; + } + + if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { + goto __V; + } + + /* divide any remaining factors of two out */ + if (u_lsb != k) { + if ((res = mp_div_2d(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { + goto __V; + } + } + + if (v_lsb != k) { + if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { + goto __V; + } + } + + while (mp_iszero(&v) == 0) { + /* make sure v is the largest */ + if (mp_cmp_mag(&u, &v) == MP_GT) { + mp_exch(&u, &v); + } + + /* subtract smallest from largest */ + if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { + goto __V; + } + + /* Divide out all factors of two */ + if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { + goto __V; + } + } + + /* multiply by 2**k which we divided out at the beginning */ + if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { goto __V; } - - /* B1. Find power of two */ - k = 0; - while (mp_iseven(&u) == 1 && mp_iseven(&v) == 1) { - ++k; - if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __T; - } - if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __T; - } - } - - /* B2. Initialize */ - if (mp_isodd(&u) == 1) { - /* t = -v */ - if ((res = mp_copy (&v, &t)) != MP_OKAY) { - goto __T; - } - t.sign = MP_NEG; - } else { - /* t = u */ - if ((res = mp_copy (&u, &t)) != MP_OKAY) { - goto __T; - } - } - - do { - /* B3 (and B4). Halve t, if even */ - while (t.used != 0 && mp_iseven(&t) == 1) { - if ((res = mp_div_2 (&t, &t)) != MP_OKAY) { - goto __T; - } - } - - /* B5. if t>0 then u=t otherwise v=-t */ - if (t.used != 0 && t.sign != MP_NEG) { - if ((res = mp_copy (&t, &u)) != MP_OKAY) { - goto __T; - } - } else { - if ((res = mp_copy (&t, &v)) != MP_OKAY) { - goto __T; - } - v.sign = (v.sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; - } - - /* B6. t = u - v, if t != 0 loop otherwise terminate */ - if ((res = mp_sub (&u, &v, &t)) != MP_OKAY) { - goto __T; - } - } while (mp_iszero(&t) == 0); - - /* multiply by 2^k which we divided out at the beginning */ - if ((res = mp_mul_2d (&u, k, &u)) != MP_OKAY) { - goto __T; - } - - mp_exch (&u, c); - c->sign = neg; + c->sign = MP_ZPOS; res = MP_OKAY; -__T:mp_clear (&t); __V:mp_clear (&u); __U:mp_clear (&v); return res; diff --git a/bn_mp_invmod.c b/bn_mp_invmod.c index 36ce092..2dd7a0c 100644 --- a/bn_mp_invmod.c +++ b/bn_mp_invmod.c @@ -14,6 +14,7 @@ */ #include +/* hac 14.61, pp608 */ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) { @@ -21,17 +22,18 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) int res; /* b cannot be negative */ - if (b->sign == MP_NEG) { + if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } /* if the modulus is odd we can use a faster routine instead */ - if (mp_iseven (b) == 0) { + if (mp_isodd (b) == 1) { return fast_mp_invmod (a, b, c); } /* init temps */ - if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { + if ((res = mp_init_multi(&x, &y, &u, &v, + &A, &B, &C, &D, NULL)) != MP_OKAY) { return res; } @@ -43,10 +45,6 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) goto __ERR; } - if ((res = mp_abs (&x, &x)) != MP_OKAY) { - goto __ERR; - } - /* 2. [modified] if x,y are both even then return an error! */ if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { res = MP_VAL; @@ -63,7 +61,6 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) mp_set (&A, 1); mp_set (&D, 1); - top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { @@ -72,13 +69,13 @@ top: goto __ERR; } /* 4.2 if A or B is odd then */ - if (mp_iseven (&A) == 0 || mp_iseven (&B) == 0) { + if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { /* A = (A+y)/2, B = (B-x)/2 */ if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { - goto __ERR; + goto __ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto __ERR; } } /* A = A/2, B = B/2 */ @@ -90,21 +87,20 @@ top: } } - /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto __ERR; } - /* 5.2 if C,D are even then */ - if (mp_iseven (&C) == 0 || mp_iseven (&D) == 0) { + /* 5.2 if C or D is odd then */ + if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { /* C = (C+y)/2, D = (D-x)/2 */ if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { - goto __ERR; + goto __ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto __ERR; } } /* C = C/2, D = D/2 */ @@ -157,10 +153,23 @@ top: goto __ERR; } - /* a is now the inverse */ + /* if its too low */ + while (mp_cmp_d(&C, 0) == MP_LT) { + if ((res = mp_add(&C, b, &C)) != MP_OKAY) { + goto __ERR; + } + } + + /* too big */ + while (mp_cmp_mag(&C, b) != MP_LT) { + if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { + goto __ERR; + } + } + + /* C is now the inverse */ mp_exch (&C, c); res = MP_OKAY; - __ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } diff --git a/bn_mp_jacobi.c b/bn_mp_jacobi.c index 1a7573d..eb0c47b 100644 --- a/bn_mp_jacobi.c +++ b/bn_mp_jacobi.c @@ -18,10 +18,10 @@ * HAC pp. 73 Algorithm 2.149 */ int -mp_jacobi (mp_int * a, mp_int * n, int *c) +mp_jacobi (mp_int * a, mp_int * p, int *c) { - mp_int a1, n1, e; - int s, r, res; + mp_int a1, p1; + int k, s, r, res; mp_digit residue; /* step 1. if a == 0, return 0 */ @@ -37,39 +37,30 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) } /* default */ - s = 0; + k = s = 0; - /* step 3. write a = a1 * 2^e */ + /* step 3. write a = a1 * 2**k */ if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { return res; } - if ((res = mp_init (&n1)) != MP_OKAY) { + if ((res = mp_init (&p1)) != MP_OKAY) { goto __A1; } - if ((res = mp_init (&e)) != MP_OKAY) { - goto __N1; - } - while (mp_iseven (&a1) == 1) { - if ((res = mp_add_d (&e, 1, &e)) != MP_OKAY) { - goto __E; - } - + k = k + 1; if ((res = mp_div_2 (&a1, &a1)) != MP_OKAY) { - goto __E; + goto __P1; } } /* step 4. if e is even set s=1 */ - if (mp_iseven (&e) == 1) { + if ((k & 1) == 0) { s = 1; } else { - /* else set s=1 if n = 1/7 (mod 8) or s=-1 if n = 3/5 (mod 8) */ - if ((res = mp_mod_d (n, 8, &residue)) != MP_OKAY) { - goto __E; - } + /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ + residue = p->dp[0] & 7; if (residue == 1 || residue == 7) { s = 1; @@ -78,17 +69,9 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) } } - /* step 5. if n == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ - if ((res = mp_mod_d (n, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - if ((res = mp_mod_d (&a1, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - s = -s; - } + /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ + if ( ((p->dp[0] & 3) == 3) && ((a1.dp[0] & 3) == 3)) { + s = -s; } /* if a1 == 1 we're done */ @@ -96,19 +79,18 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) *c = s; } else { /* n1 = n mod a1 */ - if ((res = mp_mod (n, &a1, &n1)) != MP_OKAY) { - goto __E; + if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { + goto __P1; } - if ((res = mp_jacobi (&n1, &a1, &r)) != MP_OKAY) { - goto __E; + if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { + goto __P1; } *c = s * r; } /* done */ res = MP_OKAY; -__E:mp_clear (&e); -__N1:mp_clear (&n1); +__P1:mp_clear (&p1); __A1:mp_clear (&a1); return res; } diff --git a/bn_mp_mul_2d.c b/bn_mp_mul_2d.c index ded3a3c..450f619 100644 --- a/bn_mp_mul_2d.c +++ b/bn_mp_mul_2d.c @@ -14,12 +14,6 @@ */ #include -/* NOTE: This routine requires updating. For instance the c->used = c->alloc bit - is wrong. We should just shift c->used digits then set the carry as c->dp[c->used] = carry - - To be fixed for LTM 0.18 - */ - /* shift left by a certain bit count */ int mp_mul_2d (mp_int * a, int b, mp_int * c) @@ -34,8 +28,8 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) } } - if (c->alloc < (int)(c->used + b/DIGIT_BIT + 2)) { - if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 2)) != MP_OKAY) { + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } } @@ -46,17 +40,19 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) return res; } } - c->used = c->alloc; /* shift any bit count < DIGIT_BIT */ d = (mp_digit) (b % DIGIT_BIT); if (d != 0) { - register mp_digit *tmpc, mask, r, rr; + register mp_digit *tmpc, shift, mask, r, rr; register int x; /* bitmask for carries */ mask = (((mp_digit)1) << d) - 1; + /* shift for msbs */ + shift = DIGIT_BIT - d; + /* alias */ tmpc = c->dp; @@ -64,7 +60,7 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) r = 0; for (x = 0; x < c->used; x++) { /* get the higher bits of the current word */ - rr = (*tmpc >> (DIGIT_BIT - d)) & mask; + rr = (*tmpc >> shift) & mask; /* shift the current word and OR in the carry */ *tmpc = ((*tmpc << d) | r) & MP_MASK; @@ -73,6 +69,11 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) /* set the carry to the carry bits of the current word */ r = rr; } + + /* set final carry */ + if (r != 0) { + c->dp[c->used++] = r; + } } mp_clamp (c); return MP_OKAY; diff --git a/bn_mp_prime_fermat.c b/bn_mp_prime_fermat.c index b218077..202f45a 100644 --- a/bn_mp_prime_fermat.c +++ b/bn_mp_prime_fermat.c @@ -16,9 +16,9 @@ /* performs one Fermat test. * - * If "a" were prime then b^a == b (mod a) since the order of + * If "a" were prime then b**a == b (mod a) since the order of * the multiplicative sub-group would be phi(a) = a-1. That means - * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). + * it would be the same as b**(a mod (a-1)) == b**1 == b (mod a). * * Sets result to 1 if the congruence holds, or zero otherwise. */ @@ -36,7 +36,7 @@ mp_prime_fermat (mp_int * a, mp_int * b, int *result) return err; } - /* compute t = b^a mod a */ + /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { goto __T; } diff --git a/bn_mp_prime_is_divisible.c b/bn_mp_prime_is_divisible.c index 5b81104..fcad869 100644 --- a/bn_mp_prime_is_divisible.c +++ b/bn_mp_prime_is_divisible.c @@ -14,7 +14,8 @@ */ #include -/* determines if an integers is divisible by one of the first 256 primes or not +/* determines if an integers is divisible by one + * of the first PRIME_SIZE primes or not * * sets result to 0 if not, 1 if yes */ @@ -28,12 +29,6 @@ mp_prime_is_divisible (mp_int * a, int *result) *result = 0; for (ix = 0; ix < PRIME_SIZE; ix++) { - /* is it equal to the prime? */ - if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { - *result = 1; - return MP_OKAY; - } - /* what is a mod __prime_tab[ix] */ if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { return err; diff --git a/bn_mp_prime_miller_rabin.c b/bn_mp_prime_miller_rabin.c index 422a5eb..4a96674 100644 --- a/bn_mp_prime_miller_rabin.c +++ b/bn_mp_prime_miller_rabin.c @@ -38,19 +38,17 @@ mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) goto __N1; } - /* set 2^s * r = n1 */ + /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { goto __N1; } - s = 0; - while (mp_iseven (&r) == 1) { - ++s; - if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { - goto __R; - } + + s = mp_cnt_lsb(&r); + if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { + goto __R; } - /* compute y = b^r mod a */ + /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { goto __R; } @@ -64,12 +62,12 @@ mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* while j <= s-1 and y != n1 */ while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { - goto __Y; + goto __Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { - goto __Y; + goto __Y; } ++j; diff --git a/bn_mp_radix_size.c b/bn_mp_radix_size.c new file mode 100644 index 0000000..992743c --- /dev/null +++ b/bn_mp_radix_size.c @@ -0,0 +1,54 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* returns size of ASCII reprensentation */ +int +mp_radix_size (mp_int * a, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + + /* special case for binary */ + if (radix == 2) { + return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; + } + + if (radix < 2 || radix > 64) { + return 0; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return 0; + } + + digs = 0; + if (t.sign == MP_NEG) { + ++digs; + t.sign = MP_ZPOS; + } + + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return 0; + } + ++digs; + } + mp_clear (&t); + return digs + 1; +} + diff --git a/bn_mp_radix_smap.c b/bn_mp_radix_smap.c new file mode 100644 index 0000000..45d02aa --- /dev/null +++ b/bn_mp_radix_smap.c @@ -0,0 +1,18 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* chars used in radix conversions */ +const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; diff --git a/bn_mp_read_radix.c b/bn_mp_read_radix.c new file mode 100644 index 0000000..e32823f --- /dev/null +++ b/bn_mp_read_radix.c @@ -0,0 +1,77 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read a string [ASCII] in a given radix */ +int +mp_read_radix (mp_int * a, char *str, int radix) +{ + int y, res, neg; + char ch; + + /* make sure the radix is ok */ + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* if the leading digit is a + * minus set the sign to negative. + */ + if (*str == '-') { + ++str; + neg = MP_NEG; + } else { + neg = MP_ZPOS; + } + + /* set the integer to the default of zero */ + mp_zero (a); + + /* process each digit of the string */ + while (*str) { + /* if the radix < 36 the conversion is case insensitive + * this allows numbers like 1AB and 1ab to represent the same value + * [e.g. in hex] + */ + ch = (char) ((radix < 36) ? toupper (*str) : *str); + for (y = 0; y < 64; y++) { + if (ch == mp_s_rmap[y]) { + break; + } + } + + /* if the char was found in the map + * and is less than the given radix add it + * to the number, otherwise exit the loop. + */ + if (y < radix) { + if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + return res; + } + if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + return res; + } + } else { + break; + } + ++str; + } + + /* set the sign only if a != 0 */ + if (mp_iszero(a) != 1) { + a->sign = neg; + } + return MP_OKAY; +} diff --git a/bn_mp_toradix.c b/bn_mp_toradix.c new file mode 100644 index 0000000..52097b1 --- /dev/null +++ b/bn_mp_toradix.c @@ -0,0 +1,70 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* stores a bignum as a ASCII string in a given radix (2..64) */ +int +mp_toradix (mp_int * a, char *str, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + ++_s; + *str++ = '-'; + t.sign = MP_ZPOS; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number] + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str++ = '\0'; + + + mp_clear (&t); + return MP_OKAY; +} + diff --git a/bn_radix.c b/bn_radix.c deleted file mode 100644 index 42419cd..0000000 --- a/bn_radix.c +++ /dev/null @@ -1,224 +0,0 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* chars used in radix conversions */ -static const char *s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; - -/* read a string [ASCII] in a given radix */ -int -mp_read_radix (mp_int * a, char *str, int radix) -{ - int y, res, neg; - char ch; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - if (*str == '-') { - ++str; - neg = MP_NEG; - } else { - neg = MP_ZPOS; - } - - mp_zero (a); - while (*str) { - ch = (char) ((radix < 36) ? toupper (*str) : *str); - for (y = 0; y < 64; y++) { - if (ch == s_rmap[y]) { - break; - } - } - - if (y < radix) { - if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { - return res; - } - if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { - return res; - } - } else { - break; - } - ++str; - } - if (mp_iszero(a) != 1) { - a->sign = neg; - } - return MP_OKAY; -} - -/* stores a bignum as a ASCII string in a given radix (2..64) */ -int -mp_toradix (mp_int * a, char *str, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - char *_s = str; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - /* quick out if its zero */ - if (mp_iszero(a) == 1) { - *str++ = '0'; - *str = '\0'; - return MP_OKAY; - } - - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - - if (t.sign == MP_NEG) { - ++_s; - *str++ = '-'; - t.sign = MP_ZPOS; - } - - digs = 0; - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return res; - } - *str++ = s_rmap[d]; - ++digs; - } - bn_reverse ((unsigned char *)_s, digs); - *str++ = '\0'; - mp_clear (&t); - return MP_OKAY; -} - -/* returns size of ASCII reprensentation */ -int -mp_radix_size (mp_int * a, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - - /* special case for binary */ - if (radix == 2) { - return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; - } - - if (radix < 2 || radix > 64) { - return 0; - } - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return 0; - } - - digs = 0; - if (t.sign == MP_NEG) { - ++digs; - t.sign = MP_ZPOS; - } - - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return 0; - } - ++digs; - } - mp_clear (&t); - return digs + 1; -} - -/* read a bigint from a file stream in ASCII */ -int mp_fread(mp_int *a, int radix, FILE *stream) -{ - int err, ch, neg, y; - - /* clear a */ - mp_zero(a); - - /* if first digit is - then set negative */ - ch = fgetc(stream); - if (ch == '-') { - neg = MP_NEG; - ch = fgetc(stream); - } else { - neg = MP_ZPOS; - } - - for (;;) { - /* find y in the radix map */ - for (y = 0; y < radix; y++) { - if (s_rmap[y] == ch) { - break; - } - } - if (y == radix) { - break; - } - - /* shift up and add */ - if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { - return err; - } - if ((err = mp_add_d(a, y, a)) != MP_OKAY) { - return err; - } - - ch = fgetc(stream); - } - if (mp_cmp_d(a, 0) != MP_EQ) { - a->sign = neg; - } - - return MP_OKAY; -} - -int mp_fwrite(mp_int *a, int radix, FILE *stream) -{ - char *buf; - int err, len, x; - - len = mp_radix_size(a, radix); - if (len == 0) { - return MP_VAL; - } - - buf = malloc(len); - if (buf == NULL) { - return MP_MEM; - } - - if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { - free(buf); - return err; - } - - for (x = 0; x < len; x++) { - if (fputc(buf[x], stream) == EOF) { - free(buf); - return MP_VAL; - } - } - - free(buf); - return MP_OKAY; -} - diff --git a/bn_s_mp_exptmod.c b/bn_s_mp_exptmod.c index fcd0e01..931d49f 100644 --- a/bn_s_mp_exptmod.c +++ b/bn_s_mp_exptmod.c @@ -1,216 +1,230 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -int -s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) -{ - mp_int M[256], res, mu; - mp_digit buf; - int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; - - /* find window size */ - x = mp_count_bits (X); - if (x <= 7) { - winsize = 2; - } else if (x <= 36) { - winsize = 3; - } else if (x <= 140) { - winsize = 4; - } else if (x <= 450) { - winsize = 5; - } else if (x <= 1303) { - winsize = 6; - } else if (x <= 3529) { - winsize = 7; - } else { - winsize = 8; - } - -#ifdef MP_LOW_MEM - if (winsize > 5) { - winsize = 5; - } -#endif - - /* init M array */ - for (x = 0; x < (1 << winsize); x++) { - if ((err = mp_init_size (&M[x], 1)) != MP_OKAY) { - for (y = 0; y < x; y++) { - mp_clear (&M[y]); - } - return err; - } - } - - /* create mu, used for Barrett reduction */ - if ((err = mp_init (&mu)) != MP_OKAY) { - goto __M; - } - if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { - goto __MU; - } - - /* create M table - * - * The M table contains powers of the base, - * e.g. M[x] = G**x mod P - * - * The first half of the table is not - * computed though accept for M[0] and M[1] - */ - if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { - goto __MU; - } - - /* compute the value at M[1<<(winsize-1)] by squaring - * M[1] (winsize-1) times - */ - if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; - } - - for (x = 0; x < (winsize - 1); x++) { - if ((err = mp_sqr (&M[1 << (winsize - 1)], - &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { - goto __MU; - } - } - - /* create upper table */ - for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { - if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { - goto __MU; - } - } - - /* setup result */ - if ((err = mp_init (&res)) != MP_OKAY) { - goto __MU; - } - mp_set (&res, 1); - - /* set initial mode and bit cnt */ - mode = 0; - bitcnt = 1; - buf = 0; - digidx = X->used - 1; - bitcpy = 0; - bitbuf = 0; - - for (;;) { - /* grab next digit as required */ - if (--bitcnt == 0) { - if (digidx == -1) { - break; - } - buf = X->dp[digidx--]; - bitcnt = (int) DIGIT_BIT; - } - - /* grab the next msb from the exponent */ - y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; - buf <<= (mp_digit)1; - - /* if the bit is zero and mode == 0 then we ignore it - * These represent the leading zero bits before the first 1 bit - * in the exponent. Technically this opt is not required but it - * does lower the # of trivial squaring/reductions used - */ - if (mode == 0 && y == 0) - continue; - - /* if the bit is zero and mode == 1 then we square */ - if (mode == 1 && y == 0) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - continue; - } - - /* else we add it to the window */ - bitbuf |= (y << (winsize - ++bitcpy)); - mode = 2; - - if (bitcpy == winsize) { - /* ok window is filled so square as required and multiply */ - /* square first */ - for (x = 0; x < winsize; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - } - - /* then multiply */ - if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __MU; - } - - /* empty window and reset */ - bitcpy = 0; - bitbuf = 0; - mode = 1; - } - } - - /* if bits remain then square/multiply */ - if (mode == 2 && bitcpy > 0) { - /* square then multiply if the bit is set */ - for (x = 0; x < bitcpy; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - - bitbuf <<= 1; - if ((bitbuf & (1 << winsize)) != 0) { - /* then multiply */ - if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - } - } - } - - mp_exch (&res, Y); - err = MP_OKAY; -__RES:mp_clear (&res); -__MU:mp_clear (&mu); -__M: - for (x = 0; x < (1 << winsize); x++) { - mp_clear (&M[x]); - } - return err; -} +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +int +s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + mp_int M[TAB_SIZE], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto __M; + } + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto __MU; + } + + /* create M table + * + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P + * + * The first half of the table is not + * computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto __MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto __MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + if (digidx == -1) { + break; + } + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) + continue; + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __MU; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +__RES:mp_clear (&res); +__MU:mp_clear (&mu); +__M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} diff --git a/booker.pl b/booker.pl index 5bc6645..4f4231f 100644 --- a/booker.pl +++ b/booker.pl @@ -75,7 +75,7 @@ while () { $line = 0; $tmp = $m[1]; $tmp =~ s/_/"\\_"/ge; - print OUT "\\index{$tmp}\n\\vspace{+3mm}\\begin{small}\n\\hspace{-5.1mm}{\\bf File}: $tmp\n\\vspace{-3mm}\n\\begin{alltt}\n"; + print OUT "\\vspace{+3mm}\\begin{small}\n\\hspace{-5.1mm}{\\bf File}: $tmp\n\\vspace{-3mm}\n\\begin{alltt}\n"; $wroteline += 5; if ($skipheader == 1) { @@ -248,7 +248,7 @@ while () { chomp($_); @m = split(",", $_); print OUT "\\begin{center}\n\\begin{figure}[here]\n\\includegraphics{pics/$m[1]$graph}\n"; - print OUT "\\caption{$m[2]}\n\\end{figure}\n\\end{center}\n"; + print OUT "\\caption{$m[2]}\n\\label{pic:$m[1]}\n\\end{figure}\n\\end{center}\n"; $wroteline += 4; } else { print OUT $_; diff --git a/changes.txt b/changes.txt index fefe6fe..2dc77c8 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,14 @@ +July 2nd, 2003 +v0.22 -- Fixed up mp_invmod so the result is properly in range now [was always congruent to the inverse...] + -- Fixed up s_mp_exptmod and mp_exptmod_fast so the lower half of the pre-computed table isn't allocated + which makes the algorithm use half as much ram. + -- Fixed the install script not to make the book :-) [which isn't included anyways] + -- added mp_cnt_lsb() which counts how many of the lsbs are zero + -- optimized mp_gcd() to use the new mp_cnt_lsb() to replace multiple divisions by two by a single division. + -- applied similar optimization to mp_prime_miller_rabin(). + -- Fixed a bug in both mp_invmod() and fast_mp_invmod() which tested for odd + via "mp_iseven() == 0" which is not valid [since zero is not even either]. + June 19th, 2003 v0.21 -- Fixed bug in mp_mul_d which would not handle sign correctly [would not always forward it] -- Removed the #line lines from gen.pl [was in violation of ISO C] diff --git a/demo/demo.c b/demo/demo.c index 5f4736b..a60d112 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -64,6 +64,19 @@ int main(void) mp_init(&f); srand(time(NULL)); + +#if 0 + /* test mp_cnt_lsb */ + mp_set(&a, 1); + for (ix = 0; ix < 128; ix++) { + if (mp_cnt_lsb(&a) != ix) { + printf("Failed at %d\n", ix); + return 0; + } + mp_mul_2(&a, &a); + } +#endif + /* test mp_reduce_2k */ #if 0 for (cnt = 3; cnt <= 4096; ++cnt) { @@ -325,8 +338,6 @@ int main(void) /* force KARA and TOOM to enable despite cutoffs */ KARATSUBA_SQR_CUTOFF = KARATSUBA_MUL_CUTOFF = 110; TOOM_SQR_CUTOFF = TOOM_MUL_CUTOFF = 150; - - for (;;) { /* randomly clear and re-init one variable, this has the affect of triming the alloc space */ diff --git a/etc/2kprime.1 b/etc/2kprime.1 index eb12565..c41ded1 100644 --- a/etc/2kprime.1 +++ b/etc/2kprime.1 @@ -1,2 +1,2 @@ -256-bits (k = 36113) = 115792089237316195423570985008687907853269984665640564039457584007913129603823 -512-bits (k = 38117) = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006045979 +256-bits (k = 36113) = 115792089237316195423570985008687907853269984665640564039457584007913129603823 +512-bits (k = 38117) = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006045979 diff --git a/makefile b/makefile index 8fce574..ddfb64c 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ CFLAGS += -I./ -Wall -W -Wshadow -O3 -fomit-frame-pointer -funroll-loops -VERSION=0.21 +VERSION=0.22 default: libtommath.a @@ -29,25 +29,25 @@ bn_mp_mulmod.o bn_mp_sqrmod.o bn_mp_gcd.o bn_mp_lcm.o bn_fast_mp_invmod.o bn_mp_ bn_mp_reduce.o bn_mp_montgomery_setup.o bn_fast_mp_montgomery_reduce.o bn_mp_montgomery_reduce.o \ bn_mp_exptmod_fast.o bn_mp_exptmod.o bn_mp_2expt.o bn_mp_n_root.o bn_mp_jacobi.o bn_reverse.o \ bn_mp_count_bits.o bn_mp_read_unsigned_bin.o bn_mp_read_signed_bin.o bn_mp_to_unsigned_bin.o \ -bn_mp_to_signed_bin.o bn_mp_unsigned_bin_size.o bn_mp_signed_bin_size.o bn_radix.o \ +bn_mp_to_signed_bin.o bn_mp_unsigned_bin_size.o bn_mp_signed_bin_size.o \ bn_mp_xor.o bn_mp_and.o bn_mp_or.o bn_mp_rand.o bn_mp_montgomery_calc_normalization.o \ bn_mp_prime_is_divisible.o bn_prime_tab.o bn_mp_prime_fermat.o bn_mp_prime_miller_rabin.o \ bn_mp_prime_is_prime.o bn_mp_prime_next_prime.o bn_mp_dr_reduce.o bn_mp_multi.o \ bn_mp_dr_is_modulus.o bn_mp_dr_setup.o bn_mp_reduce_setup.o \ bn_mp_toom_mul.o bn_mp_toom_sqr.o bn_mp_div_3.o bn_s_mp_exptmod.o \ -bn_mp_reduce_2k.o bn_mp_reduce_is_2k.o bn_mp_reduce_2k_setup.o +bn_mp_reduce_2k.o bn_mp_reduce_is_2k.o bn_mp_reduce_2k_setup.o \ +bn_mp_radix_smap.o bn_mp_read_radix.o bn_mp_toradix.o bn_mp_radix_size.o \ +bn_mp_fread.o bn_mp_fwrite.o bn_mp_cnt_lsb.o libtommath.a: $(OBJECTS) $(AR) $(ARFLAGS) libtommath.a $(OBJECTS) ranlib libtommath.a -install: libtommath.a docs +install: libtommath.a install -d -g root -o root $(DESTDIR)$(LIBPATH) install -d -g root -o root $(DESTDIR)$(INCPATH) - install -d -g root -o root $(DESTDIR)$(DATAPATH) install -g root -o root $(LIBNAME) $(DESTDIR)$(LIBPATH) install -g root -o root $(HEADERS) $(DESTDIR)$(INCPATH) - install -g root -o root bn.pdf $(DESTDIR)$(DATAPATH) test: libtommath.a demo/demo.o $(CC) demo/demo.o libtommath.a -o test @@ -103,6 +103,6 @@ clean: zipup: clean manual poster perl gen.pl ; mv mpi.c pre_gen/ ; \ cd .. ; rm -rf ltm* libtommath-$(VERSION) ; mkdir libtommath-$(VERSION) ; \ - cp -R ./libtommath/* ./libtommath-$(VERSION)/ ; cp tdcal.pdf ./libtommath-$(VERSION)/ ; cd ./libtommath-$(VERSION) ; rm -f tommath.src tommath.tex tommath.out ; cd pics ; rm -f * ; cd .. ; cd .. ; ls ; \ + cp -R ./libtommath/* ./libtommath-$(VERSION)/ ; cp tdcal.pdf ./libtommath-$(VERSION)/ ; cd ./libtommath-$(VERSION) ; rm -f tommath.src tommath.tex tommath.out ; cd pics ; rm -f *.tif *.ps *.pdf ; cd .. ; cd .. ; ls ; \ tar -c libtommath-$(VERSION)/* > ltm-$(VERSION).tar ; \ bzip2 -9vv ltm-$(VERSION).tar ; zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/* diff --git a/makefile.bcc b/makefile.bcc index bc029fc..b227e8d 100644 --- a/makefile.bcc +++ b/makefile.bcc @@ -1,37 +1,39 @@ -# -# Borland C++Builder Makefile (makefile.bcc) -# - - -LIB = tlib -CC = bcc32 -CFLAGS = -c -O2 -I. - -OBJECTS=bncore.obj bn_mp_init.obj bn_mp_clear.obj bn_mp_exch.obj bn_mp_grow.obj bn_mp_shrink.obj \ -bn_mp_clamp.obj bn_mp_zero.obj bn_mp_set.obj bn_mp_set_int.obj bn_mp_init_size.obj bn_mp_copy.obj \ -bn_mp_init_copy.obj bn_mp_abs.obj bn_mp_neg.obj bn_mp_cmp_mag.obj bn_mp_cmp.obj bn_mp_cmp_d.obj \ -bn_mp_rshd.obj bn_mp_lshd.obj bn_mp_mod_2d.obj bn_mp_div_2d.obj bn_mp_mul_2d.obj bn_mp_div_2.obj \ -bn_mp_mul_2.obj bn_s_mp_add.obj bn_s_mp_sub.obj bn_fast_s_mp_mul_digs.obj bn_s_mp_mul_digs.obj \ -bn_fast_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs.obj bn_fast_s_mp_sqr.obj bn_s_mp_sqr.obj \ -bn_mp_add.obj bn_mp_sub.obj bn_mp_karatsuba_mul.obj bn_mp_mul.obj bn_mp_karatsuba_sqr.obj \ -bn_mp_sqr.obj bn_mp_div.obj bn_mp_mod.obj bn_mp_add_d.obj bn_mp_sub_d.obj bn_mp_mul_d.obj \ -bn_mp_div_d.obj bn_mp_mod_d.obj bn_mp_expt_d.obj bn_mp_addmod.obj bn_mp_submod.obj \ -bn_mp_mulmod.obj bn_mp_sqrmod.obj bn_mp_gcd.obj bn_mp_lcm.obj bn_fast_mp_invmod.obj bn_mp_invmod.obj \ -bn_mp_reduce.obj bn_mp_montgomery_setup.obj bn_fast_mp_montgomery_reduce.obj bn_mp_montgomery_reduce.obj \ -bn_mp_exptmod_fast.obj bn_mp_exptmod.obj bn_mp_2expt.obj bn_mp_n_root.obj bn_mp_jacobi.obj bn_reverse.obj \ -bn_mp_count_bits.obj bn_mp_read_unsigned_bin.obj bn_mp_read_signed_bin.obj bn_mp_to_unsigned_bin.obj \ -bn_mp_to_signed_bin.obj bn_mp_unsigned_bin_size.obj bn_mp_signed_bin_size.obj bn_radix.obj \ -bn_mp_xor.obj bn_mp_and.obj bn_mp_or.obj bn_mp_rand.obj bn_mp_montgomery_calc_normalization.obj \ -bn_mp_prime_is_divisible.obj bn_prime_tab.obj bn_mp_prime_fermat.obj bn_mp_prime_miller_rabin.obj \ -bn_mp_prime_is_prime.obj bn_mp_prime_next_prime.obj bn_mp_dr_reduce.obj bn_mp_multi.obj \ -bn_mp_dr_is_modulus.obj bn_mp_dr_setup.obj bn_mp_reduce_setup.obj \ -bn_mp_toom_mul.obj bn_mp_toom_sqr.obj bn_mp_div_3.obj bn_s_mp_exptmod.obj \ -bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj - -TARGET = libtommath.lib - -$(TARGET): $(OBJECTS) - -.c.obj: - $(CC) $(CFLAGS) $< +# +# Borland C++Builder Makefile (makefile.bcc) +# + + +LIB = tlib +CC = bcc32 +CFLAGS = -c -O2 -I. + +OBJECTS=bncore.obj bn_mp_init.obj bn_mp_clear.obj bn_mp_exch.obj bn_mp_grow.obj bn_mp_shrink.obj \ +bn_mp_clamp.obj bn_mp_zero.obj bn_mp_set.obj bn_mp_set_int.obj bn_mp_init_size.obj bn_mp_copy.obj \ +bn_mp_init_copy.obj bn_mp_abs.obj bn_mp_neg.obj bn_mp_cmp_mag.obj bn_mp_cmp.obj bn_mp_cmp_d.obj \ +bn_mp_rshd.obj bn_mp_lshd.obj bn_mp_mod_2d.obj bn_mp_div_2d.obj bn_mp_mul_2d.obj bn_mp_div_2.obj \ +bn_mp_mul_2.obj bn_s_mp_add.obj bn_s_mp_sub.obj bn_fast_s_mp_mul_digs.obj bn_s_mp_mul_digs.obj \ +bn_fast_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs.obj bn_fast_s_mp_sqr.obj bn_s_mp_sqr.obj \ +bn_mp_add.obj bn_mp_sub.obj bn_mp_karatsuba_mul.obj bn_mp_mul.obj bn_mp_karatsuba_sqr.obj \ +bn_mp_sqr.obj bn_mp_div.obj bn_mp_mod.obj bn_mp_add_d.obj bn_mp_sub_d.obj bn_mp_mul_d.obj \ +bn_mp_div_d.obj bn_mp_mod_d.obj bn_mp_expt_d.obj bn_mp_addmod.obj bn_mp_submod.obj \ +bn_mp_mulmod.obj bn_mp_sqrmod.obj bn_mp_gcd.obj bn_mp_lcm.obj bn_fast_mp_invmod.obj bn_mp_invmod.obj \ +bn_mp_reduce.obj bn_mp_montgomery_setup.obj bn_fast_mp_montgomery_reduce.obj bn_mp_montgomery_reduce.obj \ +bn_mp_exptmod_fast.obj bn_mp_exptmod.obj bn_mp_2expt.obj bn_mp_n_root.obj bn_mp_jacobi.obj bn_reverse.obj \ +bn_mp_count_bits.obj bn_mp_read_unsigned_bin.obj bn_mp_read_signed_bin.obj bn_mp_to_unsigned_bin.obj \ +bn_mp_to_signed_bin.obj bn_mp_unsigned_bin_size.obj bn_mp_signed_bin_size.obj \ +bn_mp_xor.obj bn_mp_and.obj bn_mp_or.obj bn_mp_rand.obj bn_mp_montgomery_calc_normalization.obj \ +bn_mp_prime_is_divisible.obj bn_prime_tab.obj bn_mp_prime_fermat.obj bn_mp_prime_miller_rabin.obj \ +bn_mp_prime_is_prime.obj bn_mp_prime_next_prime.obj bn_mp_dr_reduce.obj bn_mp_multi.obj \ +bn_mp_dr_is_modulus.obj bn_mp_dr_setup.obj bn_mp_reduce_setup.obj \ +bn_mp_toom_mul.obj bn_mp_toom_sqr.obj bn_mp_div_3.obj bn_s_mp_exptmod.obj \ +bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj \ +bn_mp_radix_smap.obj bn_mp_read_radix.obj bn_mp_toradix.obj bn_mp_radix_size.obj \ +bn_mp_fread.obj bn_mp_fwrite.obj bn_mp_cnt_lsb.obj + +TARGET = libtommath.lib + +$(TARGET): $(OBJECTS) + +.c.obj: + $(CC) $(CFLAGS) $< $(LIB) $(TARGET) -+$@ \ No newline at end of file diff --git a/makefile.msvc b/makefile.msvc index 652c135..619e2f0 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -19,13 +19,15 @@ bn_mp_mulmod.obj bn_mp_sqrmod.obj bn_mp_gcd.obj bn_mp_lcm.obj bn_fast_mp_invmod. bn_mp_reduce.obj bn_mp_montgomery_setup.obj bn_fast_mp_montgomery_reduce.obj bn_mp_montgomery_reduce.obj \ bn_mp_exptmod_fast.obj bn_mp_exptmod.obj bn_mp_2expt.obj bn_mp_n_root.obj bn_mp_jacobi.obj bn_reverse.obj \ bn_mp_count_bits.obj bn_mp_read_unsigned_bin.obj bn_mp_read_signed_bin.obj bn_mp_to_unsigned_bin.obj \ -bn_mp_to_signed_bin.obj bn_mp_unsigned_bin_size.obj bn_mp_signed_bin_size.obj bn_radix.obj \ +bn_mp_to_signed_bin.obj bn_mp_unsigned_bin_size.obj bn_mp_signed_bin_size.obj \ bn_mp_xor.obj bn_mp_and.obj bn_mp_or.obj bn_mp_rand.obj bn_mp_montgomery_calc_normalization.obj \ bn_mp_prime_is_divisible.obj bn_prime_tab.obj bn_mp_prime_fermat.obj bn_mp_prime_miller_rabin.obj \ bn_mp_prime_is_prime.obj bn_mp_prime_next_prime.obj bn_mp_dr_reduce.obj bn_mp_multi.obj \ bn_mp_dr_is_modulus.obj bn_mp_dr_setup.obj bn_mp_reduce_setup.obj \ bn_mp_toom_mul.obj bn_mp_toom_sqr.obj bn_mp_div_3.obj bn_s_mp_exptmod.obj \ -bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj +bn_mp_reduce_2k.obj bn_mp_reduce_is_2k.obj bn_mp_reduce_2k_setup.obj \ +bn_mp_radix_smap.obj bn_mp_read_radix.obj bn_mp_toradix.obj bn_mp_radix_size.obj \ +bn_mp_fread.obj bn_mp_fwrite.obj bn_mp_cnt_lsb.obj diff --git a/mtest/mtest.c b/mtest/mtest.c index 5abc1a4..2c111c5 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -107,7 +107,7 @@ int main(void) sleep(1); t1 = clock(); } - + n = fgetc(rng) % 13; if (n == 0) { diff --git a/pics/expt_state.sxd b/pics/expt_state.sxd new file mode 100644 index 0000000000000000000000000000000000000000..6518404d5fa6eca01b4457a813f85cda074c0915 GIT binary patch literal 6869 zcma)B1yqzx7p4V4O3I}Xq-2*aVUaEgDWzj~ffd*#mM(Q^5D+P)m5^rX5~Ptv1f)wq zQUNKcAN12N&iDW4pZC0T-kEvsow?7bDU<_dco+)aJNwR& zVrr%k#>O2)!*IwdY7;yuA!O5M7QH6czoz2REPO>(>gv;iFq}wV%788B8-AW1Ac^^; zB<3Rj`jc;abHzvQIEFXnn9cE9X9}E>Rl%V`2Yi$MhbNmY#K}Ux^9M=jOw2r z`{dMfqBis~Qp%RcA6NR7)ki(bQX%8ap$VQ(>e;DswDCa;R4blkoA-xj;hr~3rH-_y z&HNV!Pd~Xt`AY6uu%vitOUh>(FpfFJM)7x^9ePytOPlWdB}?cX_yBI4JY5D_jY;}_ z%38ToaM>)8UiyB8+-Z@Hw0BYjR_Z{4N9g+`yVF}awb5sc-gXw&(JUDLoAs`A8+qJW zt;SY&SNvR6jf;V~2?cU8d>f(4hUo1}-2UM`XYGEKSIVfzpyB*stajt!YvGP+sOzWQ8)bK%66q#vXkZl$U8d%Ym+>NC(#YZM68F(gMTRp@X?myE-AbNc;~B+2yQZlfKx;VH=4E0eH`2{+gF+iaco~5A3?-^r z?yd0`MeyXSTJrMZXH$fVfH*M0oiOSeNcwbDIcc;f!-fEZy<`;7Qpo^glUQl8j(KXxMqvv6;J0OF6bURfy zoo+!eP2i#CZXoy8fYnTBS!_*@!(plv-U{&v#j~mdajWf-o9k2gTzA490YX!(m`(CI zP6lcou^9!5z5t)-vAH9w(?l{=`)86@&yM!f8ambR(k%H7>W%wVTZdd;Khj_cIuz;{ zq#X;XuAp#o=@8!XIiL)B1G46^!(`80zvFuyNm{1wjgvopcLvwQ7hu9}M~gq2czLvj zt9nVe`h~p-m5Cj|si0JQmSCPNW zcs-}7gV>Khtl5?YKH8{W{qtPsFcAhqZ8fgkwl zN<1ZHsXUDp9z**}cUr!vN+#mGHXS8mom`1s+iow$P=mFIN)ohbDC2ENc5S{9_5v#T z*)pU$Lbl6oi0WPEdouXtQj2te#uX3I2g1WpeKF1dp;}7lMUC|E& zkL=hbz5@(G3GxJ9eTu|=Gbbw2yq+EjR$_}F4HbU^TVf9#FtJO7W#8?u;aCegVWWJc zSfIKpX~O@*;LqdwImPIPj_- zBa}*I!K1h}yj}0XxO{mhXZrP=%x@G(2{Q;tI0Q1ZTT9hs4V}rkp4GW-*w!E$rfHT} z=vSi{Z=Zpder`7+z-Fw}S%40ZuE>s3JQTduiMG(@OXQhW8ZP&3WFQ&^lz|f&74LS? zwrwh}biG*kHryKL&;gInoJG*Ta>|ZjsEp!C+FgPNg*;$&6V<|mi$88+(&dD_6eL}% z1YRFP@V=@MTUx7lB^EHqFir!&ZGIgpw!^>k%vAo`(KJ>rwO?qddEm2|hZ2>RJwT?u zn~f<7a3XCN><@cPkdT+D(*xi4Wmz)2UQC%BxGswj3g2S(j$Pe``U?GbCaLFRDx8^>GM4-q-X%P~TQY+kr{;~B#1Cf`*;e?&kk>ebp4+-(r<$$*2SgG)7f@{sz|OozdCZ^<7(A&vglX0HnIXmmk)y6jfm0BbbOnM#zwX- zX&J6L75ooF?2aDNjI8Z?l`yGx&)JKXok_}6%;?f&;B;%K%;y_;=MHB((eUxFDLod? zYvZsK4{W<_azmw~GtUx3Fxq_s%JY3RuyOh_W^-0OTrm0iS)^m6j|0h5qY8!Pw_x0? zaRk^8P>vc2{$KDhUU%wnFnnO%0UG zkOCx9;ne(=xSfc~>^7M+Ku0Apjp49^>g7W@`05-jZhzmSBt<@+(thSB?TZHbag7X;{H$V18>HD|>FUW~K}0|}P6lJxY;nV!Uu&)C)% z&#h)SUAy|Z@uT=HWT0_`-6fMmVL4#AMml}m%OgXs1!0Y7+m_Z2y`{*&W@uo!VN4rS zKa{LwBt12Wo1%=GP$i-ezlBiJpo>+)+}>ReQ#Uqno!DW z`0(iZX;(9Tk2<9>E2#%lt4^naCqk8#wh~I*CGkXU%laGdJ2fF-X(6G8;-bKdY{y1w zQOREB+A{9vS}Iz8T2(w4vyK3ye4&X zaX;<>4BOvxPrLUDAX#^K%M*~2_p)zaeZ%J)DU%v)T1m%ffIRyLp=4{xycHpi_|8FFJ-R1$W(YA=$+AQJ|`Hh*EI8` z#b!72c1$#gAUhR3W6s2@R(`b}e;3KjG_O>AP4ki7UeF1*x@Cpa5jx*H(0nlohlmJq zRF_`8ydXZXz^$9Y*`3raFR<7UG4x>MyMjVbi*nM(FF8 z_(v|yyf!jXiUjQoX3*OfOkl3hkwaFl0TWTz>r5Fu)yEu7CQ(o$80RXte1CN9jCiI- zzfrR4oGD+V?5tI4RDhE?Bh~vT zxK_g6MV4A$=3QH!qwZb%ZR&j%wNirz?Z#c^ndOOo%tYlGie5Aw0Se1H@wp$rtHHp? zq-V}LjP#QOAD&E|jYNEAokV(};~gy+ri<=|@~a8C71x+Aj`@;JsyEzYdMy^2&sd)D zO0thT!jwWk??P^A**Pe;f7NR)Vd{#tzWu;(j zC&MejBB@17`56t3Op4|Ut8~+;ut%htb|jQt;_?CR!4`GV$I$%ZrL<~8D<8YKo6+tS zP+|13erQd44=ow_rVry=ghro91`Dl@gk=aKP-RlCduEud`1Wm~72mRk)*}wl)wsy= zsSoHdsPKA8=dD=VsrOye-{kQ*+znc5D}kJ=YtKucQrp4f4D;y?#->`G$6*m-a&R&K zD$iq?3#Sx@PHUS_%8w(5pK|wygd!oX4(D4$ zz6(Vx+WK;LROMON_&^{nM;Jou2L_0AwgG_@^b}ZrmKFXGVL9&v1X9#wV`2NL3 z(2wy5NJvP4ezg9ALLt9#j;_x3KTuEz2xbqvu+Ie~02BcI!d@8r8~tyixB&bDJ37N$ z&NWz~elYt#hW=L|+b@FuHYLBwxzG=my2vGMUb{yXIt^a6!gxbDFbLW0~< zpnrg+So!#Lb>u~b1+%TOw>+Ep1?67=lk<_eb0Bs-HH)pm5ar!sLT^Le4`zuz_*jlS{WgsT-PuwGeR49GxNqed zq0=~WCV5gfSV2%FZOppA--+e~Z_N{0HMFoSzXa)e$(JqO5379zpW<$vDliWmxIF|w z2MIPJKebTFX2RW+^*=~hv@JIn$(V)%Gh5f8(>~de5^1Tn01By3&vUZZYDF9G?O;c- zHb2WbRgKY$nJPf;9vs~7Hlj7np%RoO^2iPmqcd|eA=x8rP;R1c$s4Z^uhpLAjg!&v z5t#YDQtwS#j~0*6fpHx|NZ2xhF5x}nq|Q}@nC&;pkvx&J)g~l><^chR_B;TJr3bz? z?*5H#d4)J9lpe&>J96K~x0*&~M?04n*uEJ#RMl3A9OElARcn7=ot~R+pZ}s@QHw4i zW6o&o!GAX2*40kf{jyAhJt%Ym6#7n_IzD|wx9)ZPP^*MuLyNQT&88?qBG$JLPM88n z5a^jqJkZ(!QOZy?dv%KmNj7dwj7qdG_6#nzJuZNy=Tk51i9IU`hYm_vCcPs`Pb&6x zp@e!=h;+Fd(0K4$bD}BMdT{hLOB`#;La_>ytyi+LvtcPTUH2JpDNr;&Y+)j@c|LA5 zk1eKCD_2!syaux=>*9cfZtvPYdM>^bzlDvyD-W${3rPl^tTxHwr~@{5vpKios#C~AP`(k`tne;7EY;nYX|$gEyiR;aB0B~wJtqB z>58|{VsB^QF}1na65F*{h4{??sk+ z4Y_>|&WzwiT~Ihy*R0V>enm^n-Zsf;(7JJkSlgZn??DqnH479ys{V!=^#Z4Gw9-t} z+5C26##$jp2!oV#!sDI|=+f=gz_p6WVr{!=tS6W%j*zirs&ZbME4jI=4!2LX1`4Xt zbJqrt>_kSt4kw=fqyYtb9F)pc7D<3=sogE2kp@O7Gp)kJApflP2X}Jj>^oT;ut>q+ zSbhrHXAGHc{Pp&Qxo1*pwlf@NHa2X<>Hv&r-zLv$ z?tGmbz$Tb;J5%`s+g&3bt^7$`*6CntHAC=sZlkYiN{0`h$S8svGkv}?wX)K()z*t& zK8hRi@~x;-{Y-cWZq>5J_-@p3=rmTd?Dy?nb}~!~(>)b=EnfxIyTpaV+qTKzimr_$ z!VMUbbA;p3A0Z=WM*184RdASzO0>pEWoz_nu_lj_Pb7i#_&&i@^mjh$fZCa&V8hZ3 z@o_2|ayM8_j2jR6ajtq?y{7mwf#LnMD2#nRIYF1~-9S=E0!f-Edv#~MOBd^+hHm@Q zm+sIvur4|REBdbCAuQFWGP^y^vi@Of+}u|5I5fKAt-OnqQbD|iQJn>BkxJ2FEUY+z zaQk-vJFQlLoca)kUis-wt>@1bWe8a3yJcJ4+Drrh?;oF(mJnQDQh+yg5DtWv8V|X0 z5C_L0qqUaN)Q{tkm22@4hRzfwoePTtUw7#RDZe$?dX=rFG2^3m^4|=)x)4~m_wSKi zcUtdj`F!lL^l@mQk>6(4%e=A9>G53$kR#_kv}J{Z&t64F1bo!4rQ`{2iy?^vptmmL zAT{E9&|s07TQTKC3CYkmB#@cmNFZQ&7(A9iF^ZuTeao}Hi0Tq4A;))1vX4?H<|eg&TYcC|o#?o>1s^de@D5?<&iq6uKKKSvT z{-usUC=v8o>y&%r?EBpsk$HtTqba=>6r3!bBPs9qqMI7L!p$t-c&VlBSQ+~!+!|EN zr{AtmCVe@H1W#Atu(dWn<$IwtO67inEl}*dB{7Uo@3fDPlbv%P^Z2285^L;kf*paf zb(O;U?vOiPd z`BeRRZ1zj;qW$0Y3V+JYU-@(A@Js5~ME`XOTtp9lCIZU8#}faP{HyU7OXSaFO!r?F YjJ7)dxd~WU_~#EhHWpUWwTse!03-Pj!~g&Q literal 0 HcmV?d00001 diff --git a/pics/makefile b/pics/makefile new file mode 100644 index 0000000..07bbca9 --- /dev/null +++ b/pics/makefile @@ -0,0 +1,30 @@ +# makes the images... yeah + +default: pses + + +sliding_window.ps: sliding_window.tif + tiff2ps -c -e sliding_window.tif > sliding_window.ps + +expt_state.ps: expt_state.tif + tiff2ps -c -e expt_state.tif > expt_state.ps + +primality.ps: primality.tif + tiff2ps -c -e primality.tif > primality.ps + +sliding_window.pdf: sliding_window.ps + epstopdf sliding_window.ps + +expt_state.pdf: expt_state.ps + epstopdf expt_state.ps + +primality.pdf: primality.ps + epstopdf primality.ps + + +pses: sliding_window.ps expt_state.ps primality.ps +pdfes: sliding_window.pdf expt_state.pdf primality.pdf + +clean: + rm -rf *.ps *.pdf .xvpics + \ No newline at end of file diff --git a/pics/sliding_window.sxd b/pics/sliding_window.sxd new file mode 100644 index 0000000000000000000000000000000000000000..91e7c0d9f43b612ff0a59d86a71c8928fbd695f3 GIT binary patch literal 6787 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 literal 0 HcmV?d00001 diff --git a/poster.pdf b/poster.pdf index 0fd33d4f1b7c4990c7ddd1abd2d850db2538435f..a37d2db402fbf3fbf5a474436d6e118c11070f6e 100644 GIT binary patch delta 21587 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 + +/* Counts the number of lsbs which are zero before the first zero bit */ +int mp_cnt_lsb(mp_int *a) +{ + int x; + mp_digit q; + + if (mp_iszero(a) == 1) { + return 0; + } + + /* scan lower digits until non-zero */ + for (x = 0; x < a->used && a->dp[x] == 0; x++); + q = a->dp[x]; + x *= DIGIT_BIT; + + /* now scan this digit until a 1 is found */ + while ((q & 1) == 0) { + q >>= 1; + x += 1; + } + + return x; +} + + +/* End: bn_mp_cnt_lsb.c */ + /* Start: bn_mp_copy.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -1560,11 +1604,14 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) /* shift any bit count < DIGIT_BIT */ D = (mp_digit) (b % DIGIT_BIT); if (D != 0) { - register mp_digit *tmpc, mask; + register mp_digit *tmpc, mask, shift; /* mask */ mask = (((mp_digit)1) << D) - 1; + /* shift for lsb */ + shift = DIGIT_BIT - D; + /* alias */ tmpc = c->dp + (c->used - 1); @@ -1575,7 +1622,7 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) rr = *tmpc & mask; /* shift the current word and mix in the carry bits from the previous word */ - *tmpc = (*tmpc >> D) | (r << (DIGIT_BIT - D)); + *tmpc = (*tmpc >> D) | (r << shift); --tmpc; /* set the carry to the carry bits of the current word found above */ @@ -1593,70 +1640,70 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) /* End: bn_mp_div_2d.c */ /* Start: bn_mp_div_3.c */ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* divide by three (based on routine from MPI and the GMP manual) */ -int -mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) -{ - mp_int q; - mp_word w, t; - mp_digit b; - int res, ix; - - /* b = 2**DIGIT_BIT / 3 */ - b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); - - if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { - return res; - } - - q.used = a->used; - q.sign = a->sign; - w = 0; - for (ix = a->used - 1; ix >= 0; ix--) { - w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); - - if (w >= 3) { - t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); - w -= (t << ((mp_word)1)) + t; - while (w >= 3) { - t += 1; - w -= 3; - } - } else { - t = 0; - } - q.dp[ix] = (mp_digit)t; - } - - if (d != NULL) { - *d = (mp_digit)w; - } - - if (c != NULL) { - mp_clamp(&q); - mp_exch(&q, c); - } - mp_clear(&q); - - return res; -} - +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* divide by three (based on routine from MPI and the GMP manual) */ +int +mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) +{ + mp_int q; + mp_word w, t; + mp_digit b; + int res, ix; + + /* b = 2**DIGIT_BIT / 3 */ + b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); + + if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { + return res; + } + + q.used = a->used; + q.sign = a->sign; + w = 0; + for (ix = a->used - 1; ix >= 0; ix--) { + w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); + + if (w >= 3) { + t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); + w -= (t << ((mp_word)1)) + t; + while (w >= 3) { + t += 1; + w -= 3; + } + } else { + t = 0; + } + q.dp[ix] = (mp_digit)t; + } + + if (d != NULL) { + *d = (mp_digit)w; + } + + if (c != NULL) { + mp_clamp(&q); + mp_exch(&q, c); + } + mp_clear(&q); + + return res; +} + /* End: bn_mp_div_3.c */ @@ -2078,10 +2125,17 @@ mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) * * Uses Montgomery or Diminished Radix reduction [whichever appropriate] */ + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { - mp_int M[256], res; + mp_int M[TAB_SIZE], res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; @@ -2115,17 +2169,24 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) } #endif + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } - /* init G array */ - for (x = 0; x < (1 << winsize); x++) { - if ((err = mp_init (&M[x])) != MP_OKAY) { - for (y = 0; y < x; y++) { + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } + mp_clear(&M[1]); return err; } } + /* determine and setup reduction code */ if (redmode == 0) { /* now setup montgomery */ @@ -2314,7 +2375,8 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) err = MP_OKAY; __RES:mp_clear (&res); __M: - for (x = 0; x < (1 << winsize); x++) { + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; @@ -2322,6 +2384,122 @@ __M: /* End: bn_mp_exptmod_fast.c */ +/* Start: bn_mp_fread.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read a bigint from a file stream in ASCII */ +int mp_fread(mp_int *a, int radix, FILE *stream) +{ + int err, ch, neg, y; + + /* clear a */ + mp_zero(a); + + /* if first digit is - then set negative */ + ch = fgetc(stream); + if (ch == '-') { + neg = MP_NEG; + ch = fgetc(stream); + } else { + neg = MP_ZPOS; + } + + for (;;) { + /* find y in the radix map */ + for (y = 0; y < radix; y++) { + if (mp_s_rmap[y] == ch) { + break; + } + } + if (y == radix) { + break; + } + + /* shift up and add */ + if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { + return err; + } + if ((err = mp_add_d(a, y, a)) != MP_OKAY) { + return err; + } + + ch = fgetc(stream); + } + if (mp_cmp_d(a, 0) != MP_EQ) { + a->sign = neg; + } + + return MP_OKAY; +} + + +/* End: bn_mp_fread.c */ + +/* Start: bn_mp_fwrite.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int mp_fwrite(mp_int *a, int radix, FILE *stream) +{ + char *buf; + int err, len, x; + + len = mp_radix_size(a, radix); + if (len == 0) { + return MP_VAL; + } + + buf = malloc(len); + if (buf == NULL) { + return MP_MEM; + } + + if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { + free(buf); + return err; + } + + for (x = 0; x < len; x++) { + if (fputc(buf[x], stream) == EOF) { + free(buf); + return MP_VAL; + } + } + + free(buf); + return MP_OKAY; +} + + +/* End: bn_mp_fwrite.c */ + /* Start: bn_mp_gcd.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -2339,13 +2517,12 @@ __M: */ #include -/* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] - */ +/* Greatest Common Divisor using the binary method */ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) { - mp_int u, v, t; - int k, res, neg; + mp_int u, v; + int k, u_lsb, v_lsb, res; /* either zero than gcd is the largest */ if (mp_iszero (a) == 1 && mp_iszero (b) == 0) { @@ -2359,9 +2536,6 @@ mp_gcd (mp_int * a, mp_int * b, mp_int * c) return MP_OKAY; } - /* if both are negative they share (-1) as a common divisor */ - neg = (a->sign == b->sign) ? a->sign : MP_ZPOS; - if ((res = mp_init_copy (&u, a)) != MP_OKAY) { return res; } @@ -2373,71 +2547,55 @@ mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* must be positive for the remainder of the algorithm */ u.sign = v.sign = MP_ZPOS; - if ((res = mp_init (&t)) != MP_OKAY) { + /* B1. Find the common power of two for u and v */ + u_lsb = mp_cnt_lsb(&u); + v_lsb = mp_cnt_lsb(&v); + k = MIN(u_lsb, v_lsb); + + if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { + goto __V; + } + + if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { + goto __V; + } + + /* divide any remaining factors of two out */ + if (u_lsb != k) { + if ((res = mp_div_2d(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { + goto __V; + } + } + + if (v_lsb != k) { + if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { + goto __V; + } + } + + while (mp_iszero(&v) == 0) { + /* make sure v is the largest */ + if (mp_cmp_mag(&u, &v) == MP_GT) { + mp_exch(&u, &v); + } + + /* subtract smallest from largest */ + if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { + goto __V; + } + + /* Divide out all factors of two */ + if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { + goto __V; + } + } + + /* multiply by 2**k which we divided out at the beginning */ + if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { goto __V; } - - /* B1. Find power of two */ - k = 0; - while (mp_iseven(&u) == 1 && mp_iseven(&v) == 1) { - ++k; - if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __T; - } - if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __T; - } - } - - /* B2. Initialize */ - if (mp_isodd(&u) == 1) { - /* t = -v */ - if ((res = mp_copy (&v, &t)) != MP_OKAY) { - goto __T; - } - t.sign = MP_NEG; - } else { - /* t = u */ - if ((res = mp_copy (&u, &t)) != MP_OKAY) { - goto __T; - } - } - - do { - /* B3 (and B4). Halve t, if even */ - while (t.used != 0 && mp_iseven(&t) == 1) { - if ((res = mp_div_2 (&t, &t)) != MP_OKAY) { - goto __T; - } - } - - /* B5. if t>0 then u=t otherwise v=-t */ - if (t.used != 0 && t.sign != MP_NEG) { - if ((res = mp_copy (&t, &u)) != MP_OKAY) { - goto __T; - } - } else { - if ((res = mp_copy (&t, &v)) != MP_OKAY) { - goto __T; - } - v.sign = (v.sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; - } - - /* B6. t = u - v, if t != 0 loop otherwise terminate */ - if ((res = mp_sub (&u, &v, &t)) != MP_OKAY) { - goto __T; - } - } while (mp_iszero(&t) == 0); - - /* multiply by 2^k which we divided out at the beginning */ - if ((res = mp_mul_2d (&u, k, &u)) != MP_OKAY) { - goto __T; - } - - mp_exch (&u, c); - c->sign = neg; + c->sign = MP_ZPOS; res = MP_OKAY; -__T:mp_clear (&t); __V:mp_clear (&u); __U:mp_clear (&v); return res; @@ -2615,6 +2773,7 @@ mp_init_size (mp_int * a, int size) */ #include +/* hac 14.61, pp608 */ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) { @@ -2622,17 +2781,18 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) int res; /* b cannot be negative */ - if (b->sign == MP_NEG) { + if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } /* if the modulus is odd we can use a faster routine instead */ - if (mp_iseven (b) == 0) { + if (mp_isodd (b) == 1) { return fast_mp_invmod (a, b, c); } /* init temps */ - if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { + if ((res = mp_init_multi(&x, &y, &u, &v, + &A, &B, &C, &D, NULL)) != MP_OKAY) { return res; } @@ -2644,10 +2804,6 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) goto __ERR; } - if ((res = mp_abs (&x, &x)) != MP_OKAY) { - goto __ERR; - } - /* 2. [modified] if x,y are both even then return an error! */ if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { res = MP_VAL; @@ -2664,7 +2820,6 @@ mp_invmod (mp_int * a, mp_int * b, mp_int * c) mp_set (&A, 1); mp_set (&D, 1); - top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { @@ -2673,13 +2828,13 @@ top: goto __ERR; } /* 4.2 if A or B is odd then */ - if (mp_iseven (&A) == 0 || mp_iseven (&B) == 0) { + if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { /* A = (A+y)/2, B = (B-x)/2 */ if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { - goto __ERR; + goto __ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto __ERR; } } /* A = A/2, B = B/2 */ @@ -2691,21 +2846,20 @@ top: } } - /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto __ERR; } - /* 5.2 if C,D are even then */ - if (mp_iseven (&C) == 0 || mp_iseven (&D) == 0) { + /* 5.2 if C or D is odd then */ + if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { /* C = (C+y)/2, D = (D-x)/2 */ if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { - goto __ERR; + goto __ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto __ERR; } } /* C = C/2, D = D/2 */ @@ -2758,10 +2912,23 @@ top: goto __ERR; } - /* a is now the inverse */ + /* if its too low */ + while (mp_cmp_d(&C, 0) == MP_LT) { + if ((res = mp_add(&C, b, &C)) != MP_OKAY) { + goto __ERR; + } + } + + /* too big */ + while (mp_cmp_mag(&C, b) != MP_LT) { + if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { + goto __ERR; + } + } + + /* C is now the inverse */ mp_exch (&C, c); res = MP_OKAY; - __ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } @@ -2789,10 +2956,10 @@ __ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); * HAC pp. 73 Algorithm 2.149 */ int -mp_jacobi (mp_int * a, mp_int * n, int *c) +mp_jacobi (mp_int * a, mp_int * p, int *c) { - mp_int a1, n1, e; - int s, r, res; + mp_int a1, p1; + int k, s, r, res; mp_digit residue; /* step 1. if a == 0, return 0 */ @@ -2808,39 +2975,30 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) } /* default */ - s = 0; + k = s = 0; - /* step 3. write a = a1 * 2^e */ + /* step 3. write a = a1 * 2**k */ if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { return res; } - if ((res = mp_init (&n1)) != MP_OKAY) { + if ((res = mp_init (&p1)) != MP_OKAY) { goto __A1; } - if ((res = mp_init (&e)) != MP_OKAY) { - goto __N1; - } - while (mp_iseven (&a1) == 1) { - if ((res = mp_add_d (&e, 1, &e)) != MP_OKAY) { - goto __E; - } - + k = k + 1; if ((res = mp_div_2 (&a1, &a1)) != MP_OKAY) { - goto __E; + goto __P1; } } /* step 4. if e is even set s=1 */ - if (mp_iseven (&e) == 1) { + if ((k & 1) == 0) { s = 1; } else { - /* else set s=1 if n = 1/7 (mod 8) or s=-1 if n = 3/5 (mod 8) */ - if ((res = mp_mod_d (n, 8, &residue)) != MP_OKAY) { - goto __E; - } + /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ + residue = p->dp[0] & 7; if (residue == 1 || residue == 7) { s = 1; @@ -2849,17 +3007,9 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) } } - /* step 5. if n == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ - if ((res = mp_mod_d (n, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - if ((res = mp_mod_d (&a1, 4, &residue)) != MP_OKAY) { - goto __E; - } - if (residue == 3) { - s = -s; - } + /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ + if ( ((p->dp[0] & 3) == 3) && ((a1.dp[0] & 3) == 3)) { + s = -s; } /* if a1 == 1 we're done */ @@ -2867,19 +3017,18 @@ mp_jacobi (mp_int * a, mp_int * n, int *c) *c = s; } else { /* n1 = n mod a1 */ - if ((res = mp_mod (n, &a1, &n1)) != MP_OKAY) { - goto __E; + if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { + goto __P1; } - if ((res = mp_jacobi (&n1, &a1, &r)) != MP_OKAY) { - goto __E; + if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { + goto __P1; } *c = s * r; } /* done */ res = MP_OKAY; -__E:mp_clear (&e); -__N1:mp_clear (&n1); +__P1:mp_clear (&p1); __A1:mp_clear (&a1); return res; } @@ -3770,12 +3919,6 @@ mp_mul_2 (mp_int * a, mp_int * b) */ #include -/* NOTE: This routine requires updating. For instance the c->used = c->alloc bit - is wrong. We should just shift c->used digits then set the carry as c->dp[c->used] = carry - - To be fixed for LTM 0.18 - */ - /* shift left by a certain bit count */ int mp_mul_2d (mp_int * a, int b, mp_int * c) @@ -3790,8 +3933,8 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) } } - if (c->alloc < (int)(c->used + b/DIGIT_BIT + 2)) { - if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 2)) != MP_OKAY) { + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } } @@ -3802,17 +3945,19 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) return res; } } - c->used = c->alloc; /* shift any bit count < DIGIT_BIT */ d = (mp_digit) (b % DIGIT_BIT); if (d != 0) { - register mp_digit *tmpc, mask, r, rr; + register mp_digit *tmpc, shift, mask, r, rr; register int x; /* bitmask for carries */ mask = (((mp_digit)1) << d) - 1; + /* shift for msbs */ + shift = DIGIT_BIT - d; + /* alias */ tmpc = c->dp; @@ -3820,7 +3965,7 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) r = 0; for (x = 0; x < c->used; x++) { /* get the higher bits of the current word */ - rr = (*tmpc >> (DIGIT_BIT - d)) & mask; + rr = (*tmpc >> shift) & mask; /* shift the current word and OR in the carry */ *tmpc = ((*tmpc << d) | r) & MP_MASK; @@ -3829,6 +3974,11 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) /* set the carry to the carry bits of the current word */ r = rr; } + + /* set final carry */ + if (r != 0) { + c->dp[c->used++] = r; + } } mp_clamp (c); return MP_OKAY; @@ -4250,9 +4400,9 @@ mp_or (mp_int * a, mp_int * b, mp_int * c) /* performs one Fermat test. * - * If "a" were prime then b^a == b (mod a) since the order of + * If "a" were prime then b**a == b (mod a) since the order of * the multiplicative sub-group would be phi(a) = a-1. That means - * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). + * it would be the same as b**(a mod (a-1)) == b**1 == b (mod a). * * Sets result to 1 if the congruence holds, or zero otherwise. */ @@ -4270,7 +4420,7 @@ mp_prime_fermat (mp_int * a, mp_int * b, int *result) return err; } - /* compute t = b^a mod a */ + /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { goto __T; } @@ -4304,7 +4454,8 @@ __T:mp_clear (&t); */ #include -/* determines if an integers is divisible by one of the first 256 primes or not +/* determines if an integers is divisible by one + * of the first PRIME_SIZE primes or not * * sets result to 0 if not, 1 if yes */ @@ -4318,12 +4469,6 @@ mp_prime_is_divisible (mp_int * a, int *result) *result = 0; for (ix = 0; ix < PRIME_SIZE; ix++) { - /* is it equal to the prime? */ - if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { - *result = 1; - return MP_OKAY; - } - /* what is a mod __prime_tab[ix] */ if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { return err; @@ -4462,19 +4607,17 @@ mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) goto __N1; } - /* set 2^s * r = n1 */ + /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { goto __N1; } - s = 0; - while (mp_iseven (&r) == 1) { - ++s; - if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { - goto __R; - } + + s = mp_cnt_lsb(&r); + if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { + goto __R; } - /* compute y = b^r mod a */ + /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { goto __R; } @@ -4488,12 +4631,12 @@ mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* while j <= s-1 and y != n1 */ while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { - goto __Y; + goto __Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { - goto __Y; + goto __Y; } ++j; @@ -4573,6 +4716,86 @@ int mp_prime_next_prime(mp_int *a, int t) /* End: bn_mp_prime_next_prime.c */ +/* Start: bn_mp_radix_size.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* returns size of ASCII reprensentation */ +int +mp_radix_size (mp_int * a, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + + /* special case for binary */ + if (radix == 2) { + return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; + } + + if (radix < 2 || radix > 64) { + return 0; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return 0; + } + + digs = 0; + if (t.sign == MP_NEG) { + ++digs; + t.sign = MP_ZPOS; + } + + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return 0; + } + ++digs; + } + mp_clear (&t); + return digs + 1; +} + + +/* End: bn_mp_radix_size.c */ + +/* Start: bn_mp_radix_smap.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* chars used in radix conversions */ +const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + +/* End: bn_mp_radix_smap.c */ + /* Start: bn_mp_rand.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -4626,6 +4849,87 @@ mp_rand (mp_int * a, int digits) /* End: bn_mp_rand.c */ +/* Start: bn_mp_read_radix.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read a string [ASCII] in a given radix */ +int +mp_read_radix (mp_int * a, char *str, int radix) +{ + int y, res, neg; + char ch; + + /* make sure the radix is ok */ + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* if the leading digit is a + * minus set the sign to negative. + */ + if (*str == '-') { + ++str; + neg = MP_NEG; + } else { + neg = MP_ZPOS; + } + + /* set the integer to the default of zero */ + mp_zero (a); + + /* process each digit of the string */ + while (*str) { + /* if the radix < 36 the conversion is case insensitive + * this allows numbers like 1AB and 1ab to represent the same value + * [e.g. in hex] + */ + ch = (char) ((radix < 36) ? toupper (*str) : *str); + for (y = 0; y < 64; y++) { + if (ch == mp_s_rmap[y]) { + break; + } + } + + /* if the char was found in the map + * and is less than the given radix add it + * to the number, otherwise exit the loop. + */ + if (y < radix) { + if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + return res; + } + if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + return res; + } + } else { + break; + } + ++str; + } + + /* set the sign only if a != 0 */ + if (mp_iszero(a) != 1) { + a->sign = neg; + } + return MP_OKAY; +} + +/* End: bn_mp_read_radix.c */ + /* Start: bn_mp_read_signed_bin.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -5970,6 +6274,80 @@ ERR: /* End: bn_mp_toom_sqr.c */ +/* Start: bn_mp_toradix.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* stores a bignum as a ASCII string in a given radix (2..64) */ +int +mp_toradix (mp_int * a, char *str, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + ++_s; + *str++ = '-'; + t.sign = MP_ZPOS; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number] + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str++ = '\0'; + + + mp_clear (&t); + return MP_OKAY; +} + + +/* End: bn_mp_toradix.c */ + /* Start: bn_mp_unsigned_bin_size.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -6133,234 +6511,6 @@ const mp_digit __prime_tab[] = { /* End: bn_prime_tab.c */ -/* Start: bn_radix.c */ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -/* chars used in radix conversions */ -static const char *s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; - -/* read a string [ASCII] in a given radix */ -int -mp_read_radix (mp_int * a, char *str, int radix) -{ - int y, res, neg; - char ch; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - if (*str == '-') { - ++str; - neg = MP_NEG; - } else { - neg = MP_ZPOS; - } - - mp_zero (a); - while (*str) { - ch = (char) ((radix < 36) ? toupper (*str) : *str); - for (y = 0; y < 64; y++) { - if (ch == s_rmap[y]) { - break; - } - } - - if (y < radix) { - if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { - return res; - } - if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { - return res; - } - } else { - break; - } - ++str; - } - if (mp_iszero(a) != 1) { - a->sign = neg; - } - return MP_OKAY; -} - -/* stores a bignum as a ASCII string in a given radix (2..64) */ -int -mp_toradix (mp_int * a, char *str, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - char *_s = str; - - if (radix < 2 || radix > 64) { - return MP_VAL; - } - - /* quick out if its zero */ - if (mp_iszero(a) == 1) { - *str++ = '0'; - *str = '\0'; - return MP_OKAY; - } - - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return res; - } - - if (t.sign == MP_NEG) { - ++_s; - *str++ = '-'; - t.sign = MP_ZPOS; - } - - digs = 0; - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return res; - } - *str++ = s_rmap[d]; - ++digs; - } - bn_reverse ((unsigned char *)_s, digs); - *str++ = '\0'; - mp_clear (&t); - return MP_OKAY; -} - -/* returns size of ASCII reprensentation */ -int -mp_radix_size (mp_int * a, int radix) -{ - int res, digs; - mp_int t; - mp_digit d; - - /* special case for binary */ - if (radix == 2) { - return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; - } - - if (radix < 2 || radix > 64) { - return 0; - } - - if ((res = mp_init_copy (&t, a)) != MP_OKAY) { - return 0; - } - - digs = 0; - if (t.sign == MP_NEG) { - ++digs; - t.sign = MP_ZPOS; - } - - while (mp_iszero (&t) == 0) { - if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { - mp_clear (&t); - return 0; - } - ++digs; - } - mp_clear (&t); - return digs + 1; -} - -/* read a bigint from a file stream in ASCII */ -int mp_fread(mp_int *a, int radix, FILE *stream) -{ - int err, ch, neg, y; - - /* clear a */ - mp_zero(a); - - /* if first digit is - then set negative */ - ch = fgetc(stream); - if (ch == '-') { - neg = MP_NEG; - ch = fgetc(stream); - } else { - neg = MP_ZPOS; - } - - for (;;) { - /* find y in the radix map */ - for (y = 0; y < radix; y++) { - if (s_rmap[y] == ch) { - break; - } - } - if (y == radix) { - break; - } - - /* shift up and add */ - if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { - return err; - } - if ((err = mp_add_d(a, y, a)) != MP_OKAY) { - return err; - } - - ch = fgetc(stream); - } - if (mp_cmp_d(a, 0) != MP_EQ) { - a->sign = neg; - } - - return MP_OKAY; -} - -int mp_fwrite(mp_int *a, int radix, FILE *stream) -{ - char *buf; - int err, len, x; - - len = mp_radix_size(a, radix); - if (len == 0) { - return MP_VAL; - } - - buf = malloc(len); - if (buf == NULL) { - return MP_MEM; - } - - if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { - free(buf); - return err; - } - - for (x = 0; x < len; x++) { - if (fputc(buf[x], stream) == EOF) { - free(buf); - return MP_VAL; - } - } - - free(buf); - return MP_OKAY; -} - - -/* End: bn_radix.c */ - /* Start: bn_reverse.c */ /* LibTomMath, multiple-precision integer library -- Tom St Denis * @@ -6506,222 +6656,236 @@ s_mp_add (mp_int * a, mp_int * b, mp_int * c) /* End: bn_s_mp_add.c */ /* Start: bn_s_mp_exptmod.c */ -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is library that provides for multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library is designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org - */ -#include - -int -s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) -{ - mp_int M[256], res, mu; - mp_digit buf; - int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; - - /* find window size */ - x = mp_count_bits (X); - if (x <= 7) { - winsize = 2; - } else if (x <= 36) { - winsize = 3; - } else if (x <= 140) { - winsize = 4; - } else if (x <= 450) { - winsize = 5; - } else if (x <= 1303) { - winsize = 6; - } else if (x <= 3529) { - winsize = 7; - } else { - winsize = 8; - } - -#ifdef MP_LOW_MEM - if (winsize > 5) { - winsize = 5; - } -#endif - - /* init M array */ - for (x = 0; x < (1 << winsize); x++) { - if ((err = mp_init_size (&M[x], 1)) != MP_OKAY) { - for (y = 0; y < x; y++) { - mp_clear (&M[y]); - } - return err; - } - } - - /* create mu, used for Barrett reduction */ - if ((err = mp_init (&mu)) != MP_OKAY) { - goto __M; - } - if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { - goto __MU; - } - - /* create M table - * - * The M table contains powers of the base, - * e.g. M[x] = G**x mod P - * - * The first half of the table is not - * computed though accept for M[0] and M[1] - */ - if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { - goto __MU; - } - - /* compute the value at M[1<<(winsize-1)] by squaring - * M[1] (winsize-1) times - */ - if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; - } - - for (x = 0; x < (winsize - 1); x++) { - if ((err = mp_sqr (&M[1 << (winsize - 1)], - &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { - goto __MU; - } - } - - /* create upper table */ - for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { - if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { - goto __MU; - } - } - - /* setup result */ - if ((err = mp_init (&res)) != MP_OKAY) { - goto __MU; - } - mp_set (&res, 1); - - /* set initial mode and bit cnt */ - mode = 0; - bitcnt = 1; - buf = 0; - digidx = X->used - 1; - bitcpy = 0; - bitbuf = 0; - - for (;;) { - /* grab next digit as required */ - if (--bitcnt == 0) { - if (digidx == -1) { - break; - } - buf = X->dp[digidx--]; - bitcnt = (int) DIGIT_BIT; - } - - /* grab the next msb from the exponent */ - y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; - buf <<= (mp_digit)1; - - /* if the bit is zero and mode == 0 then we ignore it - * These represent the leading zero bits before the first 1 bit - * in the exponent. Technically this opt is not required but it - * does lower the # of trivial squaring/reductions used - */ - if (mode == 0 && y == 0) - continue; - - /* if the bit is zero and mode == 1 then we square */ - if (mode == 1 && y == 0) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - continue; - } - - /* else we add it to the window */ - bitbuf |= (y << (winsize - ++bitcpy)); - mode = 2; - - if (bitcpy == winsize) { - /* ok window is filled so square as required and multiply */ - /* square first */ - for (x = 0; x < winsize; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - } - - /* then multiply */ - if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __MU; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __MU; - } - - /* empty window and reset */ - bitcpy = 0; - bitbuf = 0; - mode = 1; - } - } - - /* if bits remain then square/multiply */ - if (mode == 2 && bitcpy > 0) { - /* square then multiply if the bit is set */ - for (x = 0; x < bitcpy; x++) { - if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - - bitbuf <<= 1; - if ((bitbuf & (1 << winsize)) != 0) { - /* then multiply */ - if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; - } - if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; - } - } - } - } - - mp_exch (&res, Y); - err = MP_OKAY; -__RES:mp_clear (&res); -__MU:mp_clear (&mu); -__M: - for (x = 0; x < (1 << winsize); x++) { - mp_clear (&M[x]); - } - return err; -} +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +int +s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + mp_int M[TAB_SIZE], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto __M; + } + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto __MU; + } + + /* create M table + * + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P + * + * The first half of the table is not + * computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto __MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto __MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + if (digidx == -1) { + break; + } + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) + continue; + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __MU; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +__RES:mp_clear (&res); +__MU:mp_clear (&mu); +__M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} /* End: bn_s_mp_exptmod.c */ diff --git a/test.c b/test.c new file mode 100644 index 0000000..37f7e9c --- /dev/null +++ b/test.c @@ -0,0 +1,46 @@ +#include +int main(int argc, char ** argv) { + + const unsigned int a = 65537; + char b[] = +"272621192922230283305477639564135351471136149273956463844361347729298759183125368038593484043149128512765280523210111782526587388894777249539002925324108547349408624093466297893486263619517809026841716115227596170065100354451708345238523975900663359145770823068375223714001310312030819080370340176730626251422070"; + char radix[1000]; + mp_int vala, valb, valc; + + if (mp_init(&vala) != MP_OKAY) { + fprintf(stderr, "failed to init vala\n"); + exit(1); + } + + if (mp_init(&valb) != MP_OKAY) { + fprintf(stderr, "failed to init valb\n"); + exit(1); + } + + if (mp_init(&valc) != MP_OKAY) { + fprintf(stderr, "failed to init valc\n"); + exit(1); + } + if (mp_set_int(&vala, 65537) != MP_OKAY) { + fprintf(stderr, "failed to set vala to 65537\n"); + exit(1); + } + + if (mp_read_radix(&valb, b, 10) != MP_OKAY) { + fprintf(stderr, "failed to set valb to %s\n", b); + exit(1); + } + + if (mp_invmod(&vala, &valb, &valc) != MP_OKAY) { + fprintf(stderr, "mp_invmod failed\n"); + exit(1); + } + + if (mp_toradix(&valc, radix, 10) != MP_OKAY) { + fprintf(stderr, "failed to convert value to radix 10\n"); + exit(1); + } + + fprintf(stderr, "a = %d\nb = %s\nc = %s\n", a, b, radix); + return 0; +} \ No newline at end of file diff --git a/tommath.h b/tommath.h index 8e43f6c..fe50906 100644 --- a/tommath.h +++ b/tommath.h @@ -120,7 +120,7 @@ extern int KARATSUBA_MUL_CUTOFF, TOOM_SQR_CUTOFF; /* various build options */ -#define MP_PREC 64 /* default digits of precision (must be power of two) */ +#define MP_PREC 64 /* default digits of precision (must be power of two) */ /* define this to use lower memory usage routines (exptmods mostly) */ /* #define MP_LOW_MEM */ @@ -166,7 +166,7 @@ int mp_init_size(mp_int *a, int size); /* ---> Basic Manipulations <--- */ #define mp_iszero(a) (((a)->used == 0) ? 1 : 0) -#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? 1 : 0) +#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? 1 : 0) #define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? 1 : 0) /* set to zero */ @@ -213,6 +213,9 @@ int mp_mod_2d(mp_int *a, int b, mp_int *c); /* computes a = 2**b */ int mp_2expt(mp_int *a, int b); +/* Counts the number of lsbs which are zero before the first zero bit */ +int mp_cnt_lsb(mp_int *a); + /* makes a pseudo-random int of a given size */ int mp_rand(mp_int *a, int digits); @@ -451,6 +454,8 @@ int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); void bn_reverse(unsigned char *s, int len); +extern const char *mp_s_rmap; + #ifdef __cplusplus } #endif