From f89172c3af832d7225e2a733f4cbbba943a82153 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Fri, 28 Feb 2003 16:03:48 +0000 Subject: [PATCH] added libtommath-0.03 --- bn.c | 468 ++++++++++++++++++++++++++++++++++++++------------ bn.h | 24 ++- bn.pdf | Bin 135995 -> 136281 bytes bn.tex | 57 +++--- changes.txt | 12 ++ demo.c | 92 ++++++++-- makefile | 2 +- mtest/mtest.c | 17 +- 8 files changed, 516 insertions(+), 156 deletions(-) diff --git a/bn.c b/bn.c index c0af1b7..6c4c646 100644 --- a/bn.c +++ b/bn.c @@ -113,11 +113,13 @@ int mp_set_int(mp_int *a, unsigned long b) if ((res = mp_grow(a, 32/DIGIT_BIT + 1)) != MP_OKAY) { return res; } + mp_zero(a); /* set four bits at a time, simplest solution to the what if DIGIT_BIT==7 case */ for (x = 0; x < 8; x++) { mp_mul_2d(a, 4, a); a->dp[0] |= (b>>28)&15; b <<= 4; + a->used += 32/DIGIT_BIT + 1; } mp_clamp(a); return MP_OKAY; @@ -140,8 +142,9 @@ int mp_copy(mp_int *a, mp_int *b) int res, n; /* if dst == src do nothing */ - if (a->dp == b->dp) + if (a == b || a->dp == b->dp) { return MP_OKAY; + } /* grow dest */ if ((res = mp_grow(b, a->used)) != MP_OKAY) { @@ -338,15 +341,22 @@ int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d) { mp_digit D, r, rr; int x, res; + mp_int t; + + if ((res = mp_init(&t)) != MP_OKAY) { + return res; + } if (d != NULL) { - if ((res = mp_mod_2d(a, b, d)) != MP_OKAY) { + if ((res = mp_mod_2d(a, b, &t)) != MP_OKAY) { + mp_clear(&t); return res; } } /* copy */ if ((res = mp_copy(a, c)) != MP_OKAY) { + mp_clear(&t); return res; } @@ -364,6 +374,12 @@ int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d) } } mp_clamp(c); + if (d != NULL) { + res = mp_copy(&t, d); + } else { + res = MP_OKAY; + } + mp_clear(&t); return MP_OKAY; } @@ -392,7 +408,7 @@ int mp_mul_2d(mp_int *a, int b, mp_int *c) d = (mp_digit)(b % DIGIT_BIT); if (d != 0) { r = 0; - for (x = 0; x < a->used; x++) { + for (x = 0; x < c->used; x++) { rr = (c->dp[x] >> (DIGIT_BIT - d)) & ((mp_digit)((1U<dp[x] = ((c->dp[x] << d) | r) & MP_MASK; r = rr; @@ -405,13 +421,49 @@ int mp_mul_2d(mp_int *a, int b, mp_int *c) /* b = a/2 */ int mp_div_2(mp_int *a, mp_int *b) { - return mp_div_2d(a, 1, b, NULL); + mp_digit r, rr; + int x, res; + + /* copy */ + if ((res = mp_copy(a, b)) != MP_OKAY) { + return res; + } + + r = 0; + for (x = b->used - 1; x >= 0; x--) { + rr = b->dp[x] & 1; + b->dp[x] = (b->dp[x] >> 1) | (r << (DIGIT_BIT-1)); + r = rr; + } + mp_clamp(b); + return MP_OKAY; } /* b = a*2 */ int mp_mul_2(mp_int *a, mp_int *b) { - return mp_mul_2d(a, 1, b); + mp_digit r, rr; + int x, res; + + /* copy */ + if ((res = mp_copy(a, b)) != MP_OKAY) { + return res; + } + + if ((res = mp_grow(b, b->used + 1)) != MP_OKAY) { + return res; + } + b->used = b->alloc; + + /* shift any bit count < DIGIT_BIT */ + r = 0; + for (x = 0; x < b->used; x++) { + rr = (b->dp[x] >> (DIGIT_BIT - 1)) & 1; + b->dp[x] = ((b->dp[x] << 1) | r) & MP_MASK; + r = rr; + } + mp_clamp(b); + return MP_OKAY; } /* low level addition */ @@ -526,8 +578,6 @@ static int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs) mp_word W[512], *_W; mp_digit tmpx, *tmpt, *tmpy; -// printf("\nHOLA\n"); - if ((res = mp_init_size(&t, digs)) != MP_OKAY) { return res; } @@ -624,7 +674,7 @@ static int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) pa = a->used; pb = b->used; - memset(W, 0, (pa + pb + 1) * sizeof(mp_word)); + memset(&W[digs], 0, (pa + pb + 1 - digs) * sizeof(mp_word)); for (ix = 0; ix < pa; ix++) { tmpx = a->dp[ix]; tmpt = &(t.dp[digs]); @@ -636,7 +686,7 @@ static int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) } /* now convert the array W downto what we need */ - for (ix = 1; ix < (pa+pb+1); ix++) { + for (ix = digs+1; ix < (pa+pb+1); ix++) { W[ix] = W[ix] + (W[ix-1] >> ((mp_word)DIGIT_BIT)); t.dp[ix-1] = W[ix-1] & ((mp_word)MP_MASK); } @@ -665,7 +715,7 @@ static int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs) mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ - if ((digs < 512) && digs < (1<<( (CHAR_BIT*sizeof(mp_word)) - (2*DIGIT_BIT)))) { + if (((a->used + b->used + 1) < 512) && MAX(a->used, b->used) < (1<<( (CHAR_BIT*sizeof(mp_word)) - (2*DIGIT_BIT)))) { return fast_s_mp_mul_high_digs(a,b,c,digs); } @@ -959,13 +1009,14 @@ ERR : /* high level multiplication (handles sign) */ int mp_mul(mp_int *a, mp_int *b, mp_int *c) { - int res; + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; if (MIN(a->used, b->used) > KARATSUBA_MUL_CUTOFF) { res = mp_karatsuba_mul(a, b, c); } else { res = s_mp_mul(a, b, c); } - c->sign = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + c->sign = neg; return res; } @@ -1047,13 +1098,17 @@ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d) mp_int q, x, y, t1, t2; int res, n, t, i, norm, neg; + /* is divisor zero ? */ + if (mp_iszero(b) == 1) { + return MP_VAL; + } + /* if a < b then q=0, r = a */ if (mp_cmp_mag(a, b) == MP_LT) { if (d != NULL) { - res = mp_copy(a, d); - d->sign = a->sign; + res = mp_copy(a, d); } else { - res = MP_OKAY; + res = MP_OKAY; } if (c != NULL) { mp_zero(c); @@ -1182,6 +1237,8 @@ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d) } /* now q is the quotient and x is the remainder [which we have to normalize] */ + /* get sign before writing to c */ + x.sign = a->sign; if (c != NULL) { mp_clamp(&q); mp_copy(&q, c); @@ -1189,7 +1246,6 @@ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d) } if (d != NULL) { - x.sign = a->sign; mp_div_2d(&x, norm, &x, NULL); mp_clamp(&x); mp_copy(&x, d); @@ -1205,6 +1261,31 @@ __Q: mp_clear(&q); return res; } +/* c = a mod b, 0 <= c < b */ +int mp_mod(mp_int *a, mp_int *b, mp_int *c) +{ + mp_int t; + int res; + + if ((res = mp_init(&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div(a, b, NULL, &t)) != MP_OKAY) { + mp_clear(&t); + return res; + } + + if (t.sign == MP_NEG) { + res = mp_add(b, &t, c); + } else { + res = mp_copy(&t, c); + } + + mp_clear(&t); + return res; +} + /* single digit addition */ int mp_add_d(mp_int *a, mp_digit b, mp_int *c) { @@ -1259,6 +1340,7 @@ int mp_mul_d(mp_int *a, mp_digit b, mp_int *c) } t.dp[ix] = u; + t.sign = a->sign; mp_clamp(&t); if ((res = mp_copy(&t, c)) != MP_OKAY) { mp_clear(&t); @@ -1295,50 +1377,144 @@ int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d) return res; } +int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c) +{ + mp_int t, t2; + int res; + + if ((res = mp_init(&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_init(&t2)) != MP_OKAY) { + mp_clear(&t); + return res; + } + + mp_set(&t, b); + mp_div(a, &t, NULL, &t2); + + if (t2.sign == MP_NEG) { + if ((res = mp_add_d(&t2, b, &t2)) != MP_OKAY) { + mp_clear(&t); + mp_clear(&t2); + return res; + } + } + *c = t2.dp[0]; + mp_clear(&t); + mp_clear(&t2); + return MP_OKAY; +} + +int mp_expt_d(mp_int *a, mp_digit b, mp_int *c) +{ + int res, x; + mp_int g; + + if ((res = mp_init_copy(&g, a)) != MP_OKAY) { + return res; + } + + /* set initial result */ + mp_set(c, 1); + + for (x = 0; x < (int)DIGIT_BIT; x++) { + if ((res = mp_sqr(c, c)) != MP_OKAY) { + mp_clear(&g); + return res; + } + + if (b & (mp_digit)(1<<(DIGIT_BIT-1))) { + if ((res = mp_mul(c, &g, c)) != MP_OKAY) { + mp_clear(&g); + return res; + } + } + + b <<= 1; + } + + mp_clear(&g); + return MP_OKAY; +} + /* simple modular functions */ /* d = a + b (mod c) */ int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d) { int res; + mp_int t; - if ((res = mp_add(a, b, d)) != MP_OKAY) { + if ((res = mp_init(&t)) != MP_OKAY) { return res; } - return mp_mod(d, c, d); + + if ((res = mp_add(a, b, &t)) != MP_OKAY) { + mp_clear(&t); + return res; + } + res = mp_mod(&t, c, d); + mp_clear(&t); + return res; } /* d = a - b (mod c) */ int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d) { int res; + mp_int t; - if ((res = mp_sub(a, b, d)) != MP_OKAY) { + if ((res = mp_init(&t)) != MP_OKAY) { return res; } - return mp_mod(d, c, d); + + if ((res = mp_sub(a, b, &t)) != MP_OKAY) { + mp_clear(&t); + return res; + } + res = mp_mod(&t, c, d); + mp_clear(&t); + return res; } /* d = a * b (mod c) */ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d) { int res; + mp_int t; - if ((res = mp_mul(a, b, d)) != MP_OKAY) { + if ((res = mp_init(&t)) != MP_OKAY) { return res; } - return mp_mod(d, c, d); + + if ((res = mp_mul(a, b, &t)) != MP_OKAY) { + mp_clear(&t); + return res; + } + res = mp_mod(&t, c, d); + mp_clear(&t); + return res; } /* c = a * a (mod b) */ int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c) { int res; + mp_int t; - if ((res = mp_sqr(a, c)) != MP_OKAY) { + if ((res = mp_init(&t)) != MP_OKAY) { return res; } - return mp_mod(c, b, c); + + if ((res = mp_sqr(a, &t)) != MP_OKAY) { + mp_clear(&t); + return res; + } + res = mp_mod(&t, b, c); + mp_clear(&t); + return res; } /* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] @@ -1462,107 +1638,184 @@ int mp_lcm(mp_int *a, mp_int *b, mp_int *c) return res; } -/* computes the modular inverse via extended euclidean algorithm, that is c = 1/a mod b */ +/* computes the modular inverse via binary extended euclidean algorithm, that is c = 1/a mod b */ int mp_invmod(mp_int *a, mp_int *b, mp_int *c) { - int res; - mp_int t1, t2, t3, u1, u2, u3, v1, v2, v3, q; + mp_int x, y, u, v, A, B, C, D; + int res, neg; - if ((res = mp_init(&t1)) != MP_OKAY) { - return res; + if ((res = mp_init(&x)) != MP_OKAY) { + goto __ERR; } - if ((res = mp_init(&t2)) != MP_OKAY) { - goto __T1; + if ((res = mp_init(&y)) != MP_OKAY) { + goto __X; } - if ((res = mp_init(&t3)) != MP_OKAY) { - goto __T2; - } - - if ((res = mp_init(&u1)) != MP_OKAY) { - goto __T3; + if ((res = mp_init(&u)) != MP_OKAY) { + goto __Y; } - if ((res = mp_init(&u2)) != MP_OKAY) { - goto __U1; + if ((res = mp_init(&v)) != MP_OKAY) { + goto __U; } - if ((res = mp_init(&u3)) != MP_OKAY) { - goto __U2; + if ((res = mp_init(&A)) != MP_OKAY) { + goto __V; } - if ((res = mp_init(&v1)) != MP_OKAY) { - goto __U3; - } - - if ((res = mp_init(&v2)) != MP_OKAY) { - goto __V1; - } - - if ((res = mp_init(&v3)) != MP_OKAY) { - goto __V2; + if ((res = mp_init(&B)) != MP_OKAY) { + goto __A; } - if ((res = mp_init(&q)) != MP_OKAY) { - goto __V3; - } - - /* (u1, u2, u3) = (1, 0, a) */ - mp_set(&u1, 1); - if ((res = mp_copy(a, &u3)) != MP_OKAY) { - goto __Q; + if ((res = mp_init(&C)) != MP_OKAY) { + goto __B; } - /* (v1, v2, v3) = (0, 1, b) */ - mp_set(&u2, 1); - if ((res = mp_copy(b, &v3)) != MP_OKAY) { - goto __Q; + if ((res = mp_init(&D)) != MP_OKAY) { + goto __C; } - while (mp_iszero(&v3) == 0) { - if ((res = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { - goto __Q; - } - - /* (t1, t2, t3) = (u1, u2, u3) - q*(v1, v2, v3) */ - if ((res = mp_mul(&q, &v1, &t1)) != MP_OKAY) { goto __Q; } - if ((res = mp_sub(&u1, &t1, &t1)) != MP_OKAY) { goto __Q; } - if ((res = mp_mul(&q, &v2, &t2)) != MP_OKAY) { goto __Q; } - if ((res = mp_sub(&u2, &t2, &t2)) != MP_OKAY) { goto __Q; } - if ((res = mp_mul(&q, &v3, &t3)) != MP_OKAY) { goto __Q; } - if ((res = mp_sub(&u3, &t3, &t3)) != MP_OKAY) { goto __Q; } - - /* u = v */ - if ((res = mp_copy(&v1, &u1)) != MP_OKAY) { goto __Q; } - if ((res = mp_copy(&v2, &u2)) != MP_OKAY) { goto __Q; } - if ((res = mp_copy(&v3, &u3)) != MP_OKAY) { goto __Q; } - - /* v = t */ - if ((res = mp_copy(&t1, &v1)) != MP_OKAY) { goto __Q; } - if ((res = mp_copy(&t2, &v2)) != MP_OKAY) { goto __Q; } - if ((res = mp_copy(&t3, &v3)) != MP_OKAY) { goto __Q; } - } - - /* if u3 != 1, then there is no inverse */ - if (mp_cmp_d(&u3, 1) != MP_EQ) { + /* x = a, y = b */ + if ((res = mp_copy(a, &x)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy(b, &y)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_abs(&x, &x)) != MP_OKAY) { + goto __D; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven(&x) == 1 && mp_iseven(&y) == 1) { res = MP_VAL; - goto __Q; + goto __D; } - - /* u1 is the inverse */ - res = mp_copy(&u1, c); -__Q : mp_clear(&q); -__V3: mp_clear(&v3); -__V2: mp_clear(&v1); -__V1: mp_clear(&v1); -__U3: mp_clear(&u3); -__U2: mp_clear(&u2); -__U1: mp_clear(&u1); -__T3: mp_clear(&t3); -__T2: mp_clear(&t2); -__T1: mp_clear(&t1); - return res; + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy(&x, &u)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy(&y, &v)) != MP_OKAY) { + goto __D; + } + mp_set(&A, 1); + mp_set(&D, 1); + + +top: + /* 4. while u is even do */ + while (mp_iseven(&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2(&u, &u)) != MP_OKAY) { + goto __D; + } + /* 4.2 if A or B is odd then */ + if (mp_iseven(&A) == 0 || mp_iseven(&B) == 0) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add(&A, &y, &A)) != MP_OKAY) { + goto __D; + } + if ((res = mp_sub(&B, &x, &B)) != MP_OKAY) { + goto __D; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2(&A, &A)) != MP_OKAY) { + goto __D; + } + if ((res = mp_div_2(&B, &B)) != MP_OKAY) { + goto __D; + } + } + + + /* 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 __D; + } + /* 5.2 if C,D are even then */ + if (mp_iseven(&C) == 0 || mp_iseven(&D) == 0) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add(&C, &y, &C)) != MP_OKAY) { + goto __D; + } + if ((res = mp_sub(&D, &x, &D)) != MP_OKAY) { + goto __D; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2(&C, &C)) != MP_OKAY) { + goto __D; + } + if ((res = mp_div_2(&D, &D)) != MP_OKAY) { + goto __D; + } + } + + /* 6. if u >= v then */ + if (mp_cmp(&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub(&u, &v, &u)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub(&A, &C, &A)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub(&B, &D, &B)) != MP_OKAY) { + goto __D; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub(&v, &u, &v)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub(&C, &A, &C)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub(&D, &B, &D)) != MP_OKAY) { + goto __D; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero(&u) == 0) goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d(&v, 1) != MP_EQ) { + res = MP_VAL; + goto __D; + } + + /* a is now the inverse */ + neg = a->sign; + if (C.sign == MP_NEG) { + res = mp_add(b, &C, c); + } else { + res = mp_copy(&C, c); + } + c->sign = neg; + +__D: mp_clear(&D); +__C: mp_clear(&C); +__B: mp_clear(&B); +__A: mp_clear(&A); +__V: mp_clear(&v); +__U: mp_clear(&u); +__Y: mp_clear(&y); +__X: mp_clear(&x); +__ERR: + return res; } /* pre-calculate the value required for Barrett reduction @@ -1838,7 +2091,7 @@ int mp_count_bits(mp_int *a) q = a->dp[a->used - 1]; while (q) { ++r; - q >>= 1UL; + q >>= ((mp_digit)1); } return r; } @@ -1846,13 +2099,14 @@ int mp_count_bits(mp_int *a) /* reads a unsigned char array, assumes the msb is stored first [big endian] */ int mp_read_unsigned_bin(mp_int *a, unsigned char *b, int c) { - int res; + int res, n; mp_zero(a); - a->used = (c/DIGIT_BIT) + ((c % DIGIT_BIT) != 0 ? 1: 0); + n = (c/DIGIT_BIT) + ((c % DIGIT_BIT) != 0 ? 1: 0); if ((res = mp_grow(a, a->used)) != MP_OKAY) { return res; } + a->used = n; while (c-- > 0) { if ((res = mp_mul_2d(a, 8, a)) != MP_OKAY) { return res; diff --git a/bn.h b/bn.h index 496f42d..54c8e7a 100644 --- a/bn.h +++ b/bn.h @@ -46,7 +46,9 @@ #define DIGIT_BIT ((CHAR_BIT * sizeof(mp_digit) - 1)) /* bits per digit */ #endif -#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) +#define MP_DIGIT_BIT DIGIT_BIT +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) +#define MP_DIGIT_MAX MP_MASK /* equalities */ #define MP_LT -1 /* less than */ @@ -57,8 +59,9 @@ #define MP_NEG 1 /* negative */ #define MP_OKAY 0 /* ok result */ -#define MP_MEM 1 /* out of mem */ -#define MP_VAL 2 /* invalid input */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ +#define MP_RANGE MP_VAL #define KARATSUBA_MUL_CUTOFF 80 /* Min. number of digits before Karatsuba multiplication is used. */ #define KARATSUBA_SQR_CUTOFF 80 /* Min. number of digits before Karatsuba squaring is used. */ @@ -68,6 +71,10 @@ typedef struct { mp_digit *dp; } mp_int; +#define USED(m) ((m)->used) +#define DIGIT(m,k) ((m)->dp[k]) +#define SIGN(m) ((m)->sign) + /* ---> init and deinit bignum functions <--- */ /* init a bignum */ @@ -155,8 +162,8 @@ int mp_sqr(mp_int *a, mp_int *b); /* a/b => cb + d == a */ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); -/* c == a mod b */ -#define mp_mod(a, b, c) mp_div(a, b, NULL, c) +/* c = a mod b, 0 <= c < b */ +int mp_mod(mp_int *a, mp_int *b, mp_int *c); /* ---> single digit functions <--- */ @@ -175,8 +182,11 @@ int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); /* a/b => cb + d == a */ int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); -/* c = a mod b */ -#define mp_mod_d(a,b,c) mp_div_d(a, b, NULL, c) +/* c = a^b */ +int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a mod b, 0 <= c < b */ +int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); /* ---> number theory <--- */ diff --git a/bn.pdf b/bn.pdf index 43b9c7dce4cddd3c6f0f7b6d415b34fb56d41498..8f8f58da6d8ab201c36d8d94db017081e1f2f084 100644 GIT binary patch delta 44887 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 cb + d == a */ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); -/* c == a mod b */ -#define mp_mod(a, b, c) mp_div(a, b, NULL, c) +/* c = a mod b, 0 <= c < b */ +int mp_mod(mp_int *a, mp_int *b, mp_int *c); \end{verbatim} The \textbf{mp\_cmp} will compare two integers. It will return \textbf{MP\_LT} if the first parameter is less than @@ -251,8 +260,8 @@ int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); /* a/b => cb + d == a */ int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); -/* c = a mod b */ -#define mp_mod_d(a,b,c) mp_div_d(a, b, NULL, c) +/* c = a mod b, 0 <= c < b */ +int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); \end{verbatim} Note that care should be taken for the value of the digit passed. By default, any 28-bit integer is a valid digit that can @@ -328,27 +337,27 @@ average. The following results were observed. \begin{tabular}{c|c|c|c} \hline \textbf{Operation} & \textbf{Size (bits)} & \textbf{Time with MPI (cycles)} & \textbf{Time with LibTomMath (cycles)} \\ \hline -Multiply & 128 & 1,394 & 893 \\ -Multiply & 256 & 2,559 & 1,744 \\ -Multiply & 512 & 7,919 & 4,484 \\ -Multiply & 1024 & 28,460 & 9,326, \\ -Multiply & 2048 & 109,637 & 30,140 \\ -Multiply & 4096 & 467,226 & 122,290 \\ +Multiply & 128 & 1,426 & 928 \\ +Multiply & 256 & 2,551 & 1,787 \\ +Multiply & 512 & 7,913 & 3,458 \\ +Multiply & 1024 & 28,496 & 9,271 \\ +Multiply & 2048 & 109,897 & 29,917 \\ +Multiply & 4096 & 469,970 & 123,934 \\ \hline -Square & 128 & 1,288 & 1,172 \\ -Square & 256 & 1,705 & 2,162 \\ -Square & 512 & 5,365 & 3,723 \\ -Square & 1024 & 18,836 & 9,063 \\ -Square & 2048 & 72,334 & 27,489 \\ -Square & 4096 & 306,252 & 110,372 \\ +Square & 128 & 1,319 & 1,230 \\ +Square & 256 & 1,776 & 2,131 \\ +Square & 512 & 5,399 & 3,694 \\ +Square & 1024 & 18,991 & 9,172 \\ +Square & 2048 & 72,126 & 27,352 \\ +Square & 4096 & 306,269 & 110,607 \\ \hline -Exptmod & 512 & 30,497,732 & 6,898,504 \\ -Exptmod & 768 & 98,943,020 & 15,510,779 \\ -Exptmod & 1024 & 221,123,749 & 27,962,904 \\ -Exptmod & 2048 & 1,694,796,907 & 146,631,975 \\ -Exptmod & 2560 & 3,262,360,107 & 305,530,060 \\ -Exptmod & 3072 & 5,647,243,373 & 472,572,762 \\ -Exptmod & 4096 & 13,345,194,048 & 984,415,240 +Exptmod & 512 & 32,021,586 & 6,880,075 \\ +Exptmod & 768 & 97,595,492 & 15,202,614 \\ +Exptmod & 1024 & 223,302,532 & 28,081,865 \\ +Exptmod & 2048 & 1,682,223,369 & 146,545,454 \\ +Exptmod & 2560 & 3,268,615,571 & 310,970,112 \\ +Exptmod & 3072 & 5,597,240,141 & 480,703,712 \\ +Exptmod & 4096 & 13,347,270,891 & 985,918,868 \end{tabular} \end{center} diff --git a/changes.txt b/changes.txt index fb6c798..ca7f537 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,15 @@ +Dec 27th, 2002 +v0.03 -- Sped up s_mp_mul_high_digs by not computing the carries of the lower digits + -- Fixed a bug where mp_set_int wouldn't zero the value first and set the used member. + -- fixed a bug in s_mp_mul_high_digs where the limit placed on the result digits was not calculated properly + -- fixed bugs in add/sub/mul/sqr_mod functions where if the modulus and dest were the same it wouldn't work + -- fixed a bug in mp_mod and mp_mod_d concerning negative inputs + -- mp_mul_d didn't preserve sign + -- Many many many many fixes + -- Works in LibTomCrypt now :-) + -- Added iterations to the timing demos... more accurate. + -- Tom needs a job. + Dec 26th, 2002 v0.02 -- Fixed a few "slips" in the manual. This is "LibTomMath" afterall :-) -- Added mp_cmp_mag, mp_neg, mp_abs and mp_radix_size that were missing. diff --git a/demo.c b/demo.c index 7916091..cebec83 100644 --- a/demo.c +++ b/demo.c @@ -21,22 +21,37 @@ void reset(void) { _tt = clock(); } unsigned long long rdtsc(void) { return clock() - _tt; } #endif -static void draw(mp_int *a) +void draw(mp_int *a) { char buf[4096]; - int x; printf("a->used == %d\na->alloc == %d\na->sign == %d\n", a->used, a->alloc, a->sign); mp_toradix(a, buf, 10); printf("num == %s\n", buf); printf("\n"); } +unsigned long lfsr = 0xAAAAAAAAUL; + +int lbit(void) +{ + if (lfsr & 0x80000000UL) { + lfsr = ((lfsr << 1) ^ 0x8000001BUL) & 0xFFFFFFFFUL; + return 1; + } else { + lfsr <<= 1; + return 0; + } +} + + + int main(void) { mp_int a, b, c, d, e, f; - unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n; + unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, inv_n; unsigned char cmd[4096], buf[4096]; int rr; + mp_digit tom; #ifdef TIMER int n; @@ -50,17 +65,21 @@ int main(void) mp_init(&e); mp_init(&f); + mp_read_radix(&a, "-2", 10); + mp_read_radix(&b, "2", 10); + mp_expt_d(&a, 3, &a); + draw(&a); #ifdef TIMER mp_read_radix(&a, "340282366920938463463374607431768211455", 10); while (a.used * DIGIT_BIT < 8192) { reset(); - for (rr = 0; rr < 10000; rr++) { + for (rr = 0; rr < 100000; rr++) { mp_mul(&a, &a, &b); } tt = rdtsc(); - printf("Multiplying %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)10000)); + printf("Multiplying %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)100000)); mp_copy(&b, &a); } @@ -68,11 +87,11 @@ int main(void) mp_read_radix(&a, "340282366920938463463374607431768211455", 10); while (a.used * DIGIT_BIT < 8192) { reset(); - for (rr = 0; rr < 10000; rr++) { + for (rr = 0; rr < 100000; rr++) { mp_sqr(&a, &b); } tt = rdtsc(); - printf("Squaring %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)10000)); + printf("Squaring %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)100000)); mp_copy(&b, &a); } @@ -87,19 +106,18 @@ int main(void) "1214855636816562637502584060163403830270705000634713483015101384881871978446801224798536155406895823305035467591632531067547890948695117172076954220727075688048751022421198712032848890056357845974246560748347918630050853933697792254955890439720297560693579400297062396904306270145886830719309296352765295712183040773146419022875165382778007040109957609739589875590885701126197906063620133954893216612678838507540777138437797705602453719559017633986486649523611975865005712371194067612263330335590526176087004421363598470302731349138773205901447704682181517904064735636518462452242791676541725292378925568296858010151852326316777511935037531017413910506921922450666933202278489024521263798482237150056835746454842662048692127173834433089016107854491097456725016327709663199738238442164843147132789153725513257167915555162094970853584447993125488607696008169807374736711297007473812256272245489405898470297178738029484459690836250560495461579533254473316340608217876781986188705928270735695752830825527963838355419762516246028680280988020401914551825487349990306976304093109384451438813251211051597392127491464898797406789175453067960072008590614886532333015881171367104445044718144312416815712216611576221546455968770801413440778423979", NULL }; - srand(time(NULL)); for (n = 0; primes[n]; n++) { mp_read_radix(&a, primes[n], 10); mp_zero(&b); for (rr = 0; rr < mp_count_bits(&a); rr++) { mp_mul_2d(&b, 1, &b); - b.dp[0] |= (rand()&1); + b.dp[0] |= lbit(); } mp_sub_d(&a, 1, &c); mp_mod(&b, &c, &b); mp_set(&c, 3); reset(); - for (rr = 0; rr < 20; rr++) { + for (rr = 0; rr < 35; rr++) { mp_exptmod(&c, &b, &a, &d); } tt = rdtsc(); @@ -112,15 +130,15 @@ int main(void) draw(&d); exit(0); } - printf("Exponentiating %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)20)); + printf("Exponentiating %d-bit took %llu cycles\n", mp_count_bits(&a), tt / ((unsigned long long)35)); } } #endif - expt_n = lcm_n = gcd_n = add_n = sub_n = mul_n = div_n = sqr_n = mul2d_n = div2d_n = 0; + inv_n = expt_n = lcm_n = gcd_n = add_n = sub_n = mul_n = div_n = sqr_n = mul2d_n = div2d_n = 0; for (;;) { - printf("add=%7lu sub=%7lu mul=%7lu div=%7lu sqr=%7lu mul2d=%7lu div2d=%7lu gcd=%7lu lcm=%7lu expt=%7lu\r", add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, expt_n); + printf("%7lu/%7lu/%7lu/%7lu/%7lu/%7lu/%7lu/%7lu/%7lu/%7lu/%7lu\r", add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, expt_n, inv_n); fgets(cmd, 4095, stdin); cmd[strlen(cmd)-1] = 0; printf("%s ]\r",cmd); @@ -161,6 +179,33 @@ int main(void) draw(&a);draw(&b);draw(&c);draw(&d); return 0; } + + /* test the sign/unsigned storage functions */ + + rr = mp_signed_bin_size(&c); + mp_to_signed_bin(&c, cmd); + memset(cmd+rr, rand()&255, sizeof(cmd)-rr); + mp_read_signed_bin(&d, cmd, rr); + if (mp_cmp(&c, &d) != MP_EQ) { + printf("mp_signed_bin failure!\n"); + draw(&c); + draw(&d); + return 0; + } + + + rr = mp_unsigned_bin_size(&c); + mp_to_unsigned_bin(&c, cmd); + memset(cmd+rr, rand()&255, sizeof(cmd)-rr); + mp_read_unsigned_bin(&d, cmd, rr); + if (mp_cmp_mag(&c, &d) != MP_EQ) { + printf("mp_unsigned_bin failure!\n"); + draw(&c); + draw(&d); + return 0; + } + + } else if (!strcmp(cmd, "sub")) { ++sub_n; fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 10); fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 10); @@ -210,7 +255,7 @@ draw(&a);draw(&b);draw(&c); mp_gcd(&a, &b, &d); d.sign = c.sign; if (mp_cmp(&c, &d) != MP_EQ) { - printf("gcd %lu failure!\n", sqr_n); + printf("gcd %lu failure!\n", gcd_n); draw(&a);draw(&b);draw(&c);draw(&d); return 0; } @@ -221,7 +266,7 @@ draw(&a);draw(&b);draw(&c);draw(&d); mp_lcm(&a, &b, &d); d.sign = c.sign; if (mp_cmp(&c, &d) != MP_EQ) { - printf("lcm %lu failure!\n", sqr_n); + printf("lcm %lu failure!\n", lcm_n); draw(&a);draw(&b);draw(&c);draw(&d); return 0; } @@ -232,11 +277,26 @@ draw(&a);draw(&b);draw(&c);draw(&d); fgets(buf, 4095, stdin); mp_read_radix(&d, buf, 10); mp_exptmod(&a, &b, &c, &e); if (mp_cmp(&d, &e) != MP_EQ) { - printf("expt %lu failure!\n", sqr_n); + printf("expt %lu failure!\n", expt_n); draw(&a);draw(&b);draw(&c);draw(&d); draw(&e); return 0; } + } else if (!strcmp(cmd, "invmod")) { ++inv_n; + fgets(buf, 4095, stdin); mp_read_radix(&a, buf, 10); + fgets(buf, 4095, stdin); mp_read_radix(&b, buf, 10); + fgets(buf, 4095, stdin); mp_read_radix(&c, buf, 10); + mp_invmod(&a, &b, &d); + mp_mulmod(&d,&a,&b,&e); + if (mp_cmp_d(&e, 1) != MP_EQ) { + printf("inv [wrong value from MPI?!] failure\n"); + draw(&a);draw(&b);draw(&c);draw(&d); + mp_gcd(&a, &b, &e); + draw(&e); + return 0; + } + } + } return 0; } diff --git a/makefile b/makefile index 369ff75..8ca82da 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ CC = gcc CFLAGS += -Wall -W -O3 -funroll-loops -VERSION=0.02 +VERSION=0.03 default: test diff --git a/mtest/mtest.c b/mtest/mtest.c index d9f919a..393065f 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -82,7 +82,7 @@ int main(void) rng = fopen("/dev/urandom", "rb"); for (;;) { - n = fgetc(rng) % 10; + n = fgetc(rng) % 11; if (n == 0) { /* add tests */ @@ -211,6 +211,21 @@ int main(void) printf("%s\n", buf); mp_todecimal(&d, buf); printf("%s\n", buf); + } else if (n == 10) { + /* invmod test */ + rand_num2(&a); + rand_num2(&b); + b.sign = MP_ZPOS; + mp_gcd(&a, &b, &c); + if (mp_cmp_d(&c, 1) != 0) continue; + mp_invmod(&a, &b, &c); + printf("invmod\n"); + mp_todecimal(&a, buf); + printf("%s\n", buf); + mp_todecimal(&b, buf); + printf("%s\n", buf); + mp_todecimal(&c, buf); + printf("%s\n", buf); } } fclose(rng);

$<_UK;l6sTXbtDN7(99mt;1R&N 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 delta 44628 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