From 4b7111d96e806561a648a7bf9de5a371d784070b Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Thu, 23 Dec 2004 02:40:37 +0000 Subject: [PATCH] added libtommath-0.33 --- TODO | 16 ++ bn.pdf | Bin 335593 -> 335112 bytes bn.tex | 2 +- bn_fast_mp_invmod.c | 34 +-- bn_fast_s_mp_mul_digs.c | 5 +- bn_fast_s_mp_mul_high_digs.c | 5 +- bn_fast_s_mp_sqr.c | 2 +- bn_mp_div.c | 56 ++--- bn_mp_dr_reduce.c | 2 +- bn_mp_exptmod.c | 2 +- bn_mp_exptmod_fast.c | 58 ++--- bn_mp_gcd.c | 20 +- bn_mp_invmod_slow.c | 50 ++--- bn_mp_jacobi.c | 12 +- bn_mp_lcm.c | 8 +- bn_mp_mod_2d.c | 2 +- bn_mp_n_root.c | 28 +-- bn_mp_prime_fermat.c | 4 +- bn_mp_prime_is_divisible.c | 4 +- bn_mp_prime_is_prime.c | 10 +- bn_mp_prime_miller_rabin.c | 22 +- bn_mp_prime_next_prime.c | 26 +-- bn_mp_prime_random_ex.c | 6 +- bn_prime_tab.c | 2 +- bn_s_mp_exptmod.c | 44 ++-- callgraph.txt | 25 +++ changes.txt | 9 + demo/demo.c | 6 +- demo/timing.c | 10 +- etc/mersenne.c | 18 +- etc/pprime.c | 54 ++--- etc/tune.c | 6 +- logs/add.log | 32 +-- logs/expt.log | 7 + logs/expt_2k.log | 6 + logs/expt_dr.log | 7 + logs/mult.log | 286 ++++++++++++------------- logs/sqr.log | 286 ++++++++++++------------- logs/sub.log | 32 +-- makefile | 27 ++- makefile.icc | 12 +- makefile.shared | 13 +- mtest/mtest.c | 4 +- poster.pdf | Bin 40822 -> 40821 bytes pre_gen/mpi.c | 402 ++++++++++++++++++----------------- tommath.h | 2 +- tommath.pdf | Bin 1158962 -> 1159120 bytes tommath.tex | 257 +++++++++++----------- tommath_class.h | 1 + 49 files changed, 1008 insertions(+), 914 deletions(-) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..deffba1 --- /dev/null +++ b/TODO @@ -0,0 +1,16 @@ +things for book in order of importance... + +- Fix up pseudo-code [only] for combas that are not consistent with source +- Start in chapter 3 [basics] and work up... + - re-write to prose [less abrupt] + - clean up pseudo code [spacing] + - more examples where appropriate and figures + +Goal: + - Get sync done by mid January [roughly 8-12 hours work] + - Finish ch3-6 by end of January [roughly 12-16 hours of work] + - Finish ch7-end by mid Feb [roughly 20-24 hours of work]. + +Goal isn't "first edition" but merely cleaner to read. + + diff --git a/bn.pdf b/bn.pdf index fbd5b2adc106eacf9ae64849d42aa15100c676c4..9b873e1b3fde8d1703a3045c6247cde6a5998800 100644 GIT binary patch delta 71023 zcmY(qQ;aTLumn1`ZEMdS+t_2My@`C&6NuNym|mctmzjU+zRZP&Eu|6Qxzy(QBE zn-8QRWB%O9d`-x6e8`7^i|K}mA#%;ed5Ko44cKCJH?1=ZQ}5sxkRtZClhBYx(0nx- zpl5OfldP%|1F6`$+|u4LRHlMzq3)%63J|HC$?Ec0LF{y412CSu1$y?fV7SmPH?gMR zpO+fFGy6_$H}GS@d?;htnI_+=JSEf#i->a|emMt#IQ0+rC{d|vU00Ji5KD@N#0V9e zE$&;>5uiOED!=4m9vZk+5nyQ9*K30cJ=9l}RFv&gl(QL?3)_=V*X-h8I|t;~de&po zOX0g`EJr$EQN9K@vZ=0k@~le?IWul5aRxt{2skD7*1mrgm4lZ&-C}-&=z=&724(?= zW&s1YW&wi`NC7jXBDaH30|3&fYIuZ3nfG&l5}@B6p#|q8y;dF2CiGKC6e+7TL!h({ z9bPqMYu%395?r(M1Q}KFJBk|^1d3+hsTkWhSvex|1{$#YOr$aTp&|lIf2JVTw_ItN zP2WymRvTV_Ja%VaANg+odm=RR7X>P4sgO#Xs$nBVX((ljF1Y9bpu_@k;h>DrAOR<9 z7-9kPzJo)?yap`b5K!g(BqK@f7-1k*vzGfNMm->f3lrT0kTU7GQi%ZY^Po6HnF0t2 z27%Fd7Bp+cJVUIyoz6m}s?gv#`hX;~eg=X0BA|!7cvIx`)wmE=djUphC5*>JRpcXB z5hWr?mUg%>j6X2|6KlT!2;r3ea5KUA@m>SV3ipa&116|MwH@3AW}5+F=9XTltZ{2( zBE$twn1?In3kZ<71Q(VV34fWT+4dm8y7uBAm$hg4%;b_zs5TmVc5`u*Q50NYcbl z`*Fo3n#hZf*zw24=E@yt<42Vro|*xs!P1%7AWwhR)r{l-R*a-MEdkof5d~@DXs3zG z+)6W=!wGmIjiN-OM!@}#LGXeie>h`6xgpF`0#t#j3k=eej=>yYkrLNo;P7JI3DLos zP^UFvy2}vz=G2KMN!Z0 ztRGH_f=`J7f8Tl%vDOne1R@!Q%!A1mc1Po(x!KgbHB|MwCYBfP3ameb)fUZvn_8}v zh6xv!RPl8iZNn8fm|We@hCcE8wLFDZ;-F`Uej?|5u)UsRF9NnG@tVaNU+o5Y7bZLO zwaO3orgq8WjWS{as$wf#5vJ8V-}WcA_y2wn2B$g$rpxke$xquf0oYftX^r0BkduQa ze?Is#+4k7k*VybI7r3TL5UX~*%*)!n2y=~MV3w0=-;Ky>j?JCiHBN=Xr8X(6Vc&n; zN5-;VUNkNup<~T<5`&Hw=3mBEW=!aJyP1fc5Vlq_9w9+NzEd)D`4Yf9Y<5q~uA{5C>)z-~Y*^ja}H_=m*yiN=J=bY6q zEzYt|tI?q{kxG2<+jC6^-Uq;+hv)kmzO}}w-)NhQjD0;?ZmkzvkJ;p}%vNkF7&JHL zhVy^}p^i)?Gg6s9~zL@Idv}_0B zj-oQ+)wCT=A2N#j$CZVXhk3%c)?~;|`p?^bp&62QGwSG3Y4elIDX*O5?9Qi;<5o-D zrzh5rgFOo~52D(bO9B?>pwHx)hu-s3iYjyqgId})hLbcPSX?_7wRn1;HMLzd3~oZe z$E>MVglsd|G_Cr#`G*>%PE5v-CsL)h6JUOpi_Ge+Gc9;^ut-N}^RN>W3&j*xfo^HJ z!|H1~y2b8W(|0YK~yNI^q%35(Ykcb<`

RY-d8~a-X8AD;BsMz=07!-(XjqD$ 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 a+(8?6OHq2N2s?%ck0bF&O77KG;rSmk=>vrT delta 71350 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 JE2}O?`#;vzQUU+~ diff --git a/bn.tex b/bn.tex index 74a4f01..962d6ea 100644 --- a/bn.tex +++ b/bn.tex @@ -49,7 +49,7 @@ \begin{document} \frontmatter \pagestyle{empty} -\title{LibTomMath User Manual \\ v0.32} +\title{LibTomMath User Manual \\ v0.33} \author{Tom St Denis \\ tomstdenis@iahu.ca} \maketitle This text, the library and the accompanying textbook are all hereby placed in the public domain. This book has been diff --git a/bn_fast_mp_invmod.c b/bn_fast_mp_invmod.c index 492a3f1..b5b9f10 100644 --- a/bn_fast_mp_invmod.c +++ b/bn_fast_mp_invmod.c @@ -39,20 +39,20 @@ fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) /* x == modulus, y == value to invert */ if ((res = mp_copy (b, &x)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* we need y = |a| */ if ((res = mp_abs (a, &y)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } mp_set (&D, 1); @@ -61,17 +61,17 @@ top: while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 4.2 if B is odd then */ if (mp_isodd (&B) == 1) { if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* B = B/2 */ if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -79,18 +79,18 @@ top: while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 5.2 if D is odd then */ if (mp_isodd (&D) == 1) { /* D = (D-x)/2 */ if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* D = D/2 */ if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -98,20 +98,20 @@ top: if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } else { /* v - v - u, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -125,21 +125,21 @@ top: /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; - goto __ERR; + goto LBL_ERR; } /* b is now the inverse */ neg = a->sign; while (D.sign == MP_NEG) { if ((res = mp_add (&D, b, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } mp_exch (&D, c); c->sign = neg; res = MP_OKAY; -__ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); return res; } #endif diff --git a/bn_fast_s_mp_mul_digs.c b/bn_fast_s_mp_mul_digs.c index 92b50bb..e1ff5f3 100644 --- a/bn_fast_s_mp_mul_digs.c +++ b/bn_fast_s_mp_mul_digs.c @@ -50,7 +50,7 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* clear the carry */ _W = 0; - for (ix = 0; ix <= pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty; int iy; mp_digit *tmpx, *tmpy; @@ -80,6 +80,9 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) _W = _W >> ((mp_word)DIGIT_BIT); } + /* store final carry */ + W[ix] = _W; + /* setup dest */ olduse = c->used; c->used = digs; diff --git a/bn_fast_s_mp_mul_high_digs.c b/bn_fast_s_mp_mul_high_digs.c index 9e0cf55..064a9dd 100644 --- a/bn_fast_s_mp_mul_high_digs.c +++ b/bn_fast_s_mp_mul_high_digs.c @@ -42,7 +42,7 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* number of output digits to produce */ pa = a->used + b->used; _W = 0; - for (ix = digs; ix <= pa; ix++) { + for (ix = digs; ix < pa; ix++) { int tx, ty, iy; mp_digit *tmpx, *tmpy; @@ -70,6 +70,9 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } + + /* store final carry */ + W[ix] = _W; /* setup dest */ olduse = c->used; diff --git a/bn_fast_s_mp_sqr.c b/bn_fast_s_mp_sqr.c index 9f6962d..d6014ab 100644 --- a/bn_fast_s_mp_sqr.c +++ b/bn_fast_s_mp_sqr.c @@ -60,7 +60,7 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* number of output digits to produce */ W1 = 0; - for (ix = 0; ix <= pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty, iy; mp_word _W; mp_digit *tmpy; diff --git a/bn_mp_div.c b/bn_mp_div.c index 39d921a..6b2b8f0 100644 --- a/bn_mp_div.c +++ b/bn_mp_div.c @@ -49,23 +49,23 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) mp_set(&tq, 1); n = mp_count_bits(a) - mp_count_bits(b); - if (((res = mp_copy(a, &ta)) != MP_OKAY) || - ((res = mp_copy(b, &tb)) != MP_OKAY) || + if (((res = mp_abs(a, &ta)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } while (n-- >= 0) { if (mp_cmp(&tb, &ta) != MP_GT) { if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } } if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } } @@ -74,13 +74,13 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); if (c != NULL) { mp_exch(c, &q); - c->sign = n2; + c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; } if (d != NULL) { mp_exch(d, &ta); - d->sign = n; + d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; } -__ERR: +LBL_ERR: mp_clear_multi(&ta, &tb, &tq, &q, NULL); return res; } @@ -129,19 +129,19 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) q.used = a->used + 2; if ((res = mp_init (&t1)) != MP_OKAY) { - goto __Q; + goto LBL_Q; } if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; + goto LBL_T1; } if ((res = mp_init_copy (&x, a)) != MP_OKAY) { - goto __T2; + goto LBL_T2; } if ((res = mp_init_copy (&y, b)) != MP_OKAY) { - goto __X; + goto LBL_X; } /* fix the sign */ @@ -153,10 +153,10 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) if (norm < (int)(DIGIT_BIT-1)) { norm = (DIGIT_BIT-1) - norm; if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } } else { norm = 0; @@ -168,13 +168,13 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ - goto __Y; + goto LBL_Y; } while (mp_cmp (&x, &y) != MP_LT) { ++(q.dp[n - t]); if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } } @@ -216,7 +216,7 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) t1.dp[1] = y.dp[t]; t1.used = 2; if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* find right hand */ @@ -228,27 +228,27 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ if (x.sign == MP_NEG) { if ((res = mp_copy (&y, &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; @@ -275,11 +275,11 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) res = MP_OKAY; -__Y:mp_clear (&y); -__X:mp_clear (&x); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); -__Q:mp_clear (&q); +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); +LBL_Q:mp_clear (&q); return res; } diff --git a/bn_mp_dr_reduce.c b/bn_mp_dr_reduce.c index 308b80a..9bb7ad7 100644 --- a/bn_mp_dr_reduce.c +++ b/bn_mp_dr_reduce.c @@ -20,7 +20,7 @@ * Based on algorithm from the paper * * "Generating Efficient Primes for Discrete Log Cryptosystems" - * Chae Hoon Lim, Pil Loong Lee, + * Chae Hoon Lim, Pil Joong Lee, * POSTECH Information Research Laboratories * * The modulus must be of a special format [see manual] diff --git a/bn_mp_exptmod.c b/bn_mp_exptmod.c index da88fec..7309170 100644 --- a/bn_mp_exptmod.c +++ b/bn_mp_exptmod.c @@ -61,7 +61,7 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) return err; #else /* no invmod */ - return MP_VAL + return MP_VAL; #endif } diff --git a/bn_mp_exptmod_fast.c b/bn_mp_exptmod_fast.c index 4351e60..255e9d9 100644 --- a/bn_mp_exptmod_fast.c +++ b/bn_mp_exptmod_fast.c @@ -88,11 +88,11 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) #ifdef BN_MP_MONTGOMERY_SETUP_C /* now setup montgomery */ if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { - goto __M; + goto LBL_M; } #else err = MP_VAL; - goto __M; + goto LBL_M; #endif /* automatically pick the comba one if available (saves quite a few calls/ifs) */ @@ -108,7 +108,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) redux = mp_montgomery_reduce; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } } else if (redmode == 1) { @@ -118,24 +118,24 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) redux = mp_dr_reduce; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } else { #if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) /* setup DR reduction for moduli of the form 2**k - b */ if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { - goto __M; + goto LBL_M; } redux = mp_reduce_2k; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { - goto __M; + goto LBL_M; } /* create M table @@ -149,45 +149,45 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* now we need R mod m */ if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } #else err = MP_VAL; - goto __RES; + goto LBL_RES; #endif /* now set M[1] to G * R mod m */ if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } else { mp_set(&res, 1); if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* 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 __RES; + goto LBL_RES; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* 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 __RES; + goto LBL_RES; } if ((err = redux (&M[x], P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } @@ -227,10 +227,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* 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; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } continue; } @@ -244,19 +244,19 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* empty window and reset */ @@ -271,10 +271,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* get next bit of the window */ @@ -282,10 +282,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } } @@ -299,15 +299,15 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) * of R. */ if ((err = redux(&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* swap res with Y */ mp_exch (&res, Y); err = MP_OKAY; -__RES:mp_clear (&res); -__M: +LBL_RES:mp_clear (&res); +LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); diff --git a/bn_mp_gcd.c b/bn_mp_gcd.c index 1cd21fc..6265df1 100644 --- a/bn_mp_gcd.c +++ b/bn_mp_gcd.c @@ -43,7 +43,7 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) } if ((res = mp_init_copy (&v, b)) != MP_OKAY) { - goto __U; + goto LBL_U; } /* must be positive for the remainder of the algorithm */ @@ -57,24 +57,24 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) if (k > 0) { /* divide the power of two out */ if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_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; + goto LBL_V; } } if (v_lsb != k) { if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } } @@ -87,23 +87,23 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* subtract smallest from largest */ if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { - goto __V; + goto LBL_V; } /* Divide out all factors of two */ if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } } /* multiply by 2**k which we divided out at the beginning */ if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { - goto __V; + goto LBL_V; } c->sign = MP_ZPOS; res = MP_OKAY; -__V:mp_clear (&u); -__U:mp_clear (&v); +LBL_V:mp_clear (&u); +LBL_U:mp_clear (&v); return res; } #endif diff --git a/bn_mp_invmod_slow.c b/bn_mp_invmod_slow.c index 8ecb009..c1884c0 100644 --- a/bn_mp_invmod_slow.c +++ b/bn_mp_invmod_slow.c @@ -34,24 +34,24 @@ int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) /* x = a, y = b */ if ((res = mp_copy (a, &x)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (b, &y)) != MP_OKAY) { - goto __ERR; + goto LBL_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; - goto __ERR; + goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } mp_set (&A, 1); mp_set (&D, 1); @@ -61,24 +61,24 @@ top: while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 4.2 if A or B is odd then */ 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 LBL_ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* A = A/2, B = B/2 */ if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -86,24 +86,24 @@ top: while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 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 LBL_ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* C = C/2, D = D/2 */ if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -111,28 +111,28 @@ top: 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 __ERR; + goto LBL_ERR; } if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } else { /* v - v - u, C = C - A, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -145,27 +145,27 @@ top: /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; - goto __ERR; + goto LBL_ERR; } /* if its too low */ while (mp_cmp_d(&C, 0) == MP_LT) { if ((res = mp_add(&C, b, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* too big */ while (mp_cmp_mag(&C, b) != MP_LT) { if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_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); +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } #endif diff --git a/bn_mp_jacobi.c b/bn_mp_jacobi.c index 1c69cfd..74cbbf3 100644 --- a/bn_mp_jacobi.c +++ b/bn_mp_jacobi.c @@ -50,13 +50,13 @@ int mp_jacobi (mp_int * a, mp_int * p, int *c) } if ((res = mp_init (&p1)) != MP_OKAY) { - goto __A1; + goto LBL_A1; } /* divide out larger power of two */ k = mp_cnt_lsb(&a1); if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } /* step 4. if e is even set s=1 */ @@ -84,18 +84,18 @@ int mp_jacobi (mp_int * a, mp_int * p, int *c) } else { /* n1 = n mod a1 */ if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } *c = s * r; } /* done */ res = MP_OKAY; -__P1:mp_clear (&p1); -__A1:mp_clear (&a1); +LBL_P1:mp_clear (&p1); +LBL_A1:mp_clear (&a1); return res; } #endif diff --git a/bn_mp_lcm.c b/bn_mp_lcm.c index 340d757..8e3a759 100644 --- a/bn_mp_lcm.c +++ b/bn_mp_lcm.c @@ -28,20 +28,20 @@ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) /* t1 = get the GCD of the two inputs */ if ((res = mp_gcd (a, b, &t1)) != MP_OKAY) { - goto __T; + goto LBL_T; } /* divide the smallest by the GCD */ if (mp_cmp_mag(a, b) == MP_LT) { /* store quotient in t2 such that t2 * b is the LCM */ if ((res = mp_div(a, &t1, &t2, NULL)) != MP_OKAY) { - goto __T; + goto LBL_T; } res = mp_mul(b, &t2, c); } else { /* store quotient in t2 such that t2 * a is the LCM */ if ((res = mp_div(b, &t1, &t2, NULL)) != MP_OKAY) { - goto __T; + goto LBL_T; } res = mp_mul(a, &t2, c); } @@ -49,7 +49,7 @@ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) /* fix the sign to positive */ c->sign = MP_ZPOS; -__T: +LBL_T: mp_clear_multi (&t1, &t2, NULL); return res; } diff --git a/bn_mp_mod_2d.c b/bn_mp_mod_2d.c index f81a0d4..589e4ba 100644 --- a/bn_mp_mod_2d.c +++ b/bn_mp_mod_2d.c @@ -28,7 +28,7 @@ mp_mod_2d (mp_int * a, int b, mp_int * c) } /* if the modulus is larger than the value than return */ - if (b > (int) (a->used * DIGIT_BIT)) { + if (b >= (int) (a->used * DIGIT_BIT)) { res = mp_copy (a, c); return res; } diff --git a/bn_mp_n_root.c b/bn_mp_n_root.c index 9489903..7b11aa2 100644 --- a/bn_mp_n_root.c +++ b/bn_mp_n_root.c @@ -40,11 +40,11 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) } if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; + goto LBL_T1; } if ((res = mp_init (&t3)) != MP_OKAY) { - goto __T2; + goto LBL_T2; } /* if a is negative fudge the sign but keep track */ @@ -57,52 +57,52 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) do { /* t1 = t2 */ if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t2 = t1 - ((t1**b - a) / (b * t1**(b-1))) */ /* t3 = t1**(b-1) */ if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* numerator */ /* t2 = t1**b */ if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t2 = t1**b - a */ if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* denominator */ /* t3 = t1**(b-1) * b */ if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t3 = (t1**b - a)/(b * t1**(b-1)) */ if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } } while (mp_cmp (&t1, &t2) != MP_EQ); /* result can be off by a few so check */ for (;;) { if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } } else { break; @@ -120,9 +120,9 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) res = MP_OKAY; -__T3:mp_clear (&t3); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); +LBL_T3:mp_clear (&t3); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); return res; } #endif diff --git a/bn_mp_prime_fermat.c b/bn_mp_prime_fermat.c index fe17aaa..fd74dbe 100644 --- a/bn_mp_prime_fermat.c +++ b/bn_mp_prime_fermat.c @@ -43,7 +43,7 @@ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { - goto __T; + goto LBL_T; } /* is it equal to b? */ @@ -52,7 +52,7 @@ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) } err = MP_OKAY; -__T:mp_clear (&t); +LBL_T:mp_clear (&t); return err; } #endif diff --git a/bn_mp_prime_is_divisible.c b/bn_mp_prime_is_divisible.c index 22ec1ae..f85fe7c 100644 --- a/bn_mp_prime_is_divisible.c +++ b/bn_mp_prime_is_divisible.c @@ -29,8 +29,8 @@ int mp_prime_is_divisible (mp_int * a, int *result) *result = MP_NO; for (ix = 0; ix < PRIME_SIZE; ix++) { - /* what is a mod __prime_tab[ix] */ - if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { + /* what is a mod LBL_prime_tab[ix] */ + if ((err = mp_mod_d (a, ltm_prime_tab[ix], &res)) != MP_OKAY) { return err; } diff --git a/bn_mp_prime_is_prime.c b/bn_mp_prime_is_prime.c index c2354d2..188053a 100644 --- a/bn_mp_prime_is_prime.c +++ b/bn_mp_prime_is_prime.c @@ -37,7 +37,7 @@ int mp_prime_is_prime (mp_int * a, int t, int *result) /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { - if (mp_cmp_d(a, __prime_tab[ix]) == MP_EQ) { + if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { *result = 1; return MP_OKAY; } @@ -60,20 +60,20 @@ int mp_prime_is_prime (mp_int * a, int t, int *result) for (ix = 0; ix < t; ix++) { /* set the prime */ - mp_set (&b, __prime_tab[ix]); + mp_set (&b, ltm_prime_tab[ix]); if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { - goto __B; + goto LBL_B; } if (res == MP_NO) { - goto __B; + goto LBL_B; } } /* passed the test */ *result = MP_YES; -__B:mp_clear (&b); +LBL_B:mp_clear (&b); return err; } #endif diff --git a/bn_mp_prime_miller_rabin.c b/bn_mp_prime_miller_rabin.c index 22dec2f..758a2c3 100644 --- a/bn_mp_prime_miller_rabin.c +++ b/bn_mp_prime_miller_rabin.c @@ -40,12 +40,12 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) return err; } if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { - goto __N1; + goto LBL_N1; } /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { - goto __N1; + goto LBL_N1; } /* count the number of least significant bits @@ -55,15 +55,15 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* now divide n - 1 by 2**s */ if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { - goto __R; + goto LBL_R; } /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { - goto __R; + goto LBL_R; } if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* if y != 1 and y != n1 do */ @@ -72,12 +72,12 @@ int 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 LBL_Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { - goto __Y; + goto LBL_Y; } ++j; @@ -85,15 +85,15 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* if y != n1 then composite */ if (mp_cmp (&y, &n1) != MP_EQ) { - goto __Y; + goto LBL_Y; } } /* probably prime now */ *result = MP_YES; -__Y:mp_clear (&y); -__R:mp_clear (&r); -__N1:mp_clear (&n1); +LBL_Y:mp_clear (&y); +LBL_R:mp_clear (&r); +LBL_N1:mp_clear (&n1); return err; } #endif diff --git a/bn_mp_prime_next_prime.c b/bn_mp_prime_next_prime.c index c478ce5..24f93c4 100644 --- a/bn_mp_prime_next_prime.c +++ b/bn_mp_prime_next_prime.c @@ -35,10 +35,10 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) a->sign = MP_ZPOS; /* simple algo if a is less than the largest prime in the table */ - if (mp_cmp_d(a, __prime_tab[PRIME_SIZE-1]) == MP_LT) { + if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { /* find which prime it is bigger than */ for (x = PRIME_SIZE - 2; x >= 0; x--) { - if (mp_cmp_d(a, __prime_tab[x]) != MP_LT) { + if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { if (bbs_style == 1) { /* ok we found a prime smaller or * equal [so the next is larger] @@ -46,17 +46,17 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) * however, the prime must be * congruent to 3 mod 4 */ - if ((__prime_tab[x + 1] & 3) != 3) { + if ((ltm_prime_tab[x + 1] & 3) != 3) { /* scan upwards for a prime congruent to 3 mod 4 */ for (y = x + 1; y < PRIME_SIZE; y++) { - if ((__prime_tab[y] & 3) == 3) { - mp_set(a, __prime_tab[y]); + if ((ltm_prime_tab[y] & 3) == 3) { + mp_set(a, ltm_prime_tab[y]); return MP_OKAY; } } } } else { - mp_set(a, __prime_tab[x + 1]); + mp_set(a, ltm_prime_tab[x + 1]); return MP_OKAY; } } @@ -94,7 +94,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* generate the restable */ for (x = 1; x < PRIME_SIZE; x++) { - if ((err = mp_mod_d(a, __prime_tab[x], res_tab + x)) != MP_OKAY) { + if ((err = mp_mod_d(a, ltm_prime_tab[x], res_tab + x)) != MP_OKAY) { return err; } } @@ -120,8 +120,8 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) res_tab[x] += kstep; /* subtract the modulus [instead of using division] */ - if (res_tab[x] >= __prime_tab[x]) { - res_tab[x] -= __prime_tab[x]; + if (res_tab[x] >= ltm_prime_tab[x]) { + res_tab[x] -= ltm_prime_tab[x]; } /* set flag if zero */ @@ -133,7 +133,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* add the step */ if ((err = mp_add_d(a, step, a)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* if didn't pass sieve and step == MAX then skip test */ @@ -143,9 +143,9 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* is this prime? */ for (x = 0; x < t; x++) { - mp_set(&b, __prime_tab[t]); + mp_set(&b, ltm_prime_tab[t]); if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if (res == MP_NO) { break; @@ -158,7 +158,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) } err = MP_OKAY; -__ERR: +LBL_ERR: mp_clear(&b); return err; } diff --git a/bn_mp_prime_random_ex.c b/bn_mp_prime_random_ex.c index 2c4f4f0..2010ebe 100644 --- a/bn_mp_prime_random_ex.c +++ b/bn_mp_prime_random_ex.c @@ -47,7 +47,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback } /* calc the byte size */ - bsize = (size>>3)+(size&7?1:0); + bsize = (size>>3) + ((size&7)?1:0); /* we need a buffer of bsize bytes */ tmp = OPT_CAST(unsigned char) XMALLOC(bsize); @@ -56,7 +56,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback } /* calc the maskAND value for the MSbyte*/ - maskAND = 0xFF >> (8 - (size & 7)); + maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); /* calc the maskOR_msb */ maskOR_msb = 0; @@ -65,7 +65,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback maskOR_msb |= 1 << ((size - 2) & 7); } else if (flags & LTM_PRIME_2MSB_OFF) { maskAND &= ~(1 << ((size - 2) & 7)); - } + } /* get the maskOR_lsb */ maskOR_lsb = 0; diff --git a/bn_prime_tab.c b/bn_prime_tab.c index 18ecc47..14306c2 100644 --- a/bn_prime_tab.c +++ b/bn_prime_tab.c @@ -14,7 +14,7 @@ * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org */ -const mp_digit __prime_tab[] = { +const mp_digit ltm_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, diff --git a/bn_s_mp_exptmod.c b/bn_s_mp_exptmod.c index 4f1032a..01a766f 100644 --- a/bn_s_mp_exptmod.c +++ b/bn_s_mp_exptmod.c @@ -70,10 +70,10 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* create mu, used for Barrett reduction */ if ((err = mp_init (&mu)) != MP_OKAY) { - goto __M; + goto LBL_M; } if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } /* create M table @@ -85,23 +85,23 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { - goto __MU; + goto LBL_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; + goto LBL_MU; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; + goto LBL_MU; } if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } @@ -110,16 +110,16 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) */ 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; + goto LBL_MU; } if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } mp_set (&res, 1); @@ -159,10 +159,10 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* 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; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } continue; } @@ -176,19 +176,19 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* empty window and reset */ @@ -203,20 +203,20 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } } @@ -224,9 +224,9 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) mp_exch (&res, Y); err = MP_OKAY; -__RES:mp_clear (&res); -__MU:mp_clear (&mu); -__M: +LBL_RES:mp_clear (&res); +LBL_MU:mp_clear (&mu); +LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); diff --git a/callgraph.txt b/callgraph.txt index 56d4f8b..4dc4cba 100644 --- a/callgraph.txt +++ b/callgraph.txt @@ -245,6 +245,7 @@ BN_MP_SQRT_C | | +--->BN_MP_INIT_MULTI_C | | | +--->BN_MP_CLEAR_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -298,6 +299,7 @@ BN_MP_SQRT_C | | +--->BN_MP_CLEAR_C | +--->BN_MP_SET_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -404,6 +406,7 @@ BN_MP_IS_SQUARE_C | | | +--->BN_MP_CLEAR_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -700,6 +703,7 @@ BN_MP_IS_SQUARE_C | | | +--->BN_MP_INIT_MULTI_C | | | | +--->BN_MP_CLEAR_C | | | +--->BN_MP_COUNT_BITS_C +| | | +--->BN_MP_ABS_C | | | +--->BN_MP_MUL_2D_C | | | | +--->BN_MP_GROW_C | | | | +--->BN_MP_LSHD_C @@ -753,6 +757,7 @@ BN_MP_IS_SQUARE_C | | | +--->BN_MP_CLEAR_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -2618,6 +2623,7 @@ BN_MP_SUBMOD_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -2838,6 +2844,7 @@ BN_MP_SQRMOD_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -3313,6 +3320,7 @@ BN_MP_N_ROOT_C | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_CLEAR_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -4322,6 +4330,7 @@ BN_MP_PRIME_RANDOM_EX_C | | | | | +--->BN_MP_ZERO_C | | | | | +--->BN_MP_INIT_MULTI_C | | | | | +--->BN_MP_COUNT_BITS_C +| | | | | +--->BN_MP_ABS_C | | | | | +--->BN_MP_MUL_2D_C | | | | | | +--->BN_MP_GROW_C | | | | | | +--->BN_MP_LSHD_C @@ -4548,6 +4557,7 @@ BN_MP_MOD_C | | +--->BN_MP_CLEAR_C | +--->BN_MP_SET_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -5600,6 +5610,7 @@ BN_MP_PRIME_IS_PRIME_C | | | | +--->BN_MP_ZERO_C | | | | +--->BN_MP_INIT_MULTI_C | | | | +--->BN_MP_COUNT_BITS_C +| | | | +--->BN_MP_ABS_C | | | | +--->BN_MP_MUL_2D_C | | | | | +--->BN_MP_GROW_C | | | | | +--->BN_MP_LSHD_C @@ -5809,6 +5820,7 @@ BN_MP_EXPTMOD_FAST_C | | | +--->BN_MP_ZERO_C | | | +--->BN_MP_INIT_MULTI_C | | | +--->BN_MP_SET_C +| | | +--->BN_MP_ABS_C | | | +--->BN_MP_MUL_2D_C | | | | +--->BN_MP_GROW_C | | | | +--->BN_MP_LSHD_C @@ -5865,6 +5877,7 @@ BN_MP_EXPTMOD_FAST_C | | | +--->BN_MP_GROW_C | | +--->BN_MP_ZERO_C | | +--->BN_MP_INIT_MULTI_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -6284,6 +6297,7 @@ BN_MP_MULMOD_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -7339,6 +7353,7 @@ BN_MP_PRIME_NEXT_PRIME_C | | | | +--->BN_MP_ZERO_C | | | | +--->BN_MP_INIT_MULTI_C | | | | +--->BN_MP_COUNT_BITS_C +| | | | +--->BN_MP_ABS_C | | | | +--->BN_MP_MUL_2D_C | | | | | +--->BN_MP_GROW_C | | | | | +--->BN_MP_LSHD_C @@ -7465,6 +7480,7 @@ BN_MP_LCM_C | +--->BN_MP_ZERO_C | +--->BN_MP_SET_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -7928,6 +7944,7 @@ BN_S_MP_EXPTMOD_C | | +--->BN_MP_ZERO_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -7974,6 +7991,7 @@ BN_S_MP_EXPTMOD_C | | +--->BN_MP_ZERO_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -8372,6 +8390,7 @@ BN_MP_DIV_C | +--->BN_MP_CLEAR_C +--->BN_MP_SET_C +--->BN_MP_COUNT_BITS_C ++--->BN_MP_ABS_C +--->BN_MP_MUL_2D_C | +--->BN_MP_GROW_C | +--->BN_MP_LSHD_C @@ -8465,6 +8484,7 @@ BN_MP_ADDMOD_C | | +--->BN_MP_INIT_MULTI_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -8551,6 +8571,7 @@ BN_MP_REDUCE_C | | | +--->BN_MP_CLEAR_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -8766,6 +8787,7 @@ BN_MP_JACOBI_C | | | +--->BN_MP_CLEAR_C | | +--->BN_MP_SET_C | | +--->BN_MP_COUNT_BITS_C +| | +--->BN_MP_ABS_C | | +--->BN_MP_MUL_2D_C | | | +--->BN_MP_GROW_C | | | +--->BN_MP_LSHD_C @@ -8912,6 +8934,7 @@ BN_MP_EXTEUCLID_C | +--->BN_MP_CMP_MAG_C | +--->BN_MP_ZERO_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -9078,6 +9101,7 @@ BN_MP_REDUCE_SETUP_C | | +--->BN_MP_CLEAR_C | +--->BN_MP_SET_C | +--->BN_MP_COUNT_BITS_C +| +--->BN_MP_ABS_C | +--->BN_MP_MUL_2D_C | | +--->BN_MP_GROW_C | | +--->BN_MP_LSHD_C @@ -10118,6 +10142,7 @@ BN_MP_PRIME_MILLER_RABIN_C | | | +--->BN_MP_INIT_MULTI_C | | | +--->BN_MP_SET_C | | | +--->BN_MP_COUNT_BITS_C +| | | +--->BN_MP_ABS_C | | | +--->BN_MP_MUL_2D_C | | | | +--->BN_MP_GROW_C | | | | +--->BN_MP_LSHD_C diff --git a/changes.txt b/changes.txt index 6a86209..0d1ec2e 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,12 @@ +December 23rd, 2004 +v0.33 -- Fixed "small" variant for mp_div() which would munge with negative dividends... + -- Fixed bug in mp_prime_random_ex() which would set the most significant byte to zero when + no special flags were set + -- Fixed overflow [minor] bug in fast_s_mp_sqr() + -- Made the makefiles easier to configure the group/user that ltm will install as + -- Fixed "final carry" bug in comba multipliers. (Volkan Ceylan) + -- Matt Johnston pointed out a missing semi-colon in mp_exptmod + October 29th, 2004 v0.32 -- Added "makefile.shared" for shared object support -- Added more to the build options/configs in the manual diff --git a/demo/demo.c b/demo/demo.c index 53eb3cf..62615cd 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -11,9 +11,9 @@ void ndraw(mp_int *a, char *name) { - char buf[4096]; + char buf[16000]; printf("%s: ", name); - mp_toradix(a, buf, 64); + mp_toradix(a, buf, 10); printf("%s\n", buf); } @@ -395,7 +395,7 @@ draw(&a);draw(&b);draw(&c);draw(&d); mp_div(&a, &b, &e, &f); if (mp_cmp(&c, &e) != MP_EQ || mp_cmp(&d, &f) != MP_EQ) { - printf("div %lu failure!\n", div_n); + printf("div %lu %d, %d, failure!\n", div_n, mp_cmp(&c, &e), mp_cmp(&d, &f)); draw(&a);draw(&b);draw(&c);draw(&d); draw(&e); draw(&f); return 0; } diff --git a/demo/timing.c b/demo/timing.c index 865c444..7b27d53 100644 --- a/demo/timing.c +++ b/demo/timing.c @@ -38,14 +38,13 @@ int lbit(void) } } -#if defined(__i386__) || defined(_M_IX86) || defined(_M_AMD64) /* RDTSC from Scott Duplichan */ static ulong64 TIMFUNC (void) { #if defined __GNUC__ - #ifdef __i386__ - ulong64 a; - __asm__ __volatile__ ("rdtsc ":"=A" (a)); + #if defined(__i386__) || defined(__x86_64__) + unsigned long long a; + __asm__ __volatile__ ("rdtsc\nmovl %%eax,%0\nmovl %%edx,4+%0\n"::"m"(a):"%eax","%edx"); return a; #else /* gcc-IA64 version */ unsigned long result; @@ -69,9 +68,6 @@ static ulong64 TIMFUNC (void) #error need rdtsc function for this build #endif } -#else -#define TIMFUNC clock -#endif #define DO(x) x; x; //#define DO4(x) DO2(x); DO2(x); diff --git a/etc/mersenne.c b/etc/mersenne.c index da6c111..1cd5b50 100644 --- a/etc/mersenne.c +++ b/etc/mersenne.c @@ -18,15 +18,15 @@ is_mersenne (long s, int *pp) } if ((res = mp_init (&u)) != MP_OKAY) { - goto __N; + goto LBL_N; } /* n = 2^s - 1 */ if ((res = mp_2expt(&n, s)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } if ((res = mp_sub_d (&n, 1, &n)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } /* set u=4 */ @@ -36,22 +36,22 @@ is_mersenne (long s, int *pp) for (k = 1; k <= s - 2; k++) { /* u = u^2 - 2 mod n */ if ((res = mp_sqr (&u, &u)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } if ((res = mp_sub_d (&u, 2, &u)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } /* make sure u is positive */ while (u.sign == MP_NEG) { if ((res = mp_add (&u, &n, &u)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } /* reduce */ if ((res = mp_reduce_2k (&u, &n, 1)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } @@ -62,8 +62,8 @@ is_mersenne (long s, int *pp) } res = MP_OKAY; -__MU:mp_clear (&u); -__N:mp_clear (&n); +LBL_MU:mp_clear (&u); +LBL_N:mp_clear (&n); return res; } diff --git a/etc/pprime.c b/etc/pprime.c index cccb748..26e0d84 100644 --- a/etc/pprime.c +++ b/etc/pprime.c @@ -189,7 +189,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) } if ((res = mp_init (&v)) != MP_OKAY) { - goto __C; + goto LBL_C; } /* product of first 50 primes */ @@ -197,34 +197,34 @@ pprime (int k, int li, mp_int * p, mp_int * q) mp_read_radix (&v, "19078266889580195013601891820992757757219839668357012055907516904309700014933909014729740190", 10)) != MP_OKAY) { - goto __V; + goto LBL_V; } if ((res = mp_init (&a)) != MP_OKAY) { - goto __V; + goto LBL_V; } /* set the prime */ mp_set (&a, prime_digit ()); if ((res = mp_init (&b)) != MP_OKAY) { - goto __A; + goto LBL_A; } if ((res = mp_init (&n)) != MP_OKAY) { - goto __B; + goto LBL_B; } if ((res = mp_init (&x)) != MP_OKAY) { - goto __N; + goto LBL_N; } if ((res = mp_init (&y)) != MP_OKAY) { - goto __X; + goto LBL_X; } if ((res = mp_init (&z)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* now loop making the single digit */ @@ -236,25 +236,25 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* now compute z = a * b * 2 */ if ((res = mp_mul (&a, &b, &z)) != MP_OKAY) { /* z = a * b */ - goto __Z; + goto LBL_Z; } if ((res = mp_copy (&z, &c)) != MP_OKAY) { /* c = a * b */ - goto __Z; + goto LBL_Z; } if ((res = mp_mul_2 (&z, &z)) != MP_OKAY) { /* z = 2 * a * b */ - goto __Z; + goto LBL_Z; } /* n = z + 1 */ if ((res = mp_add_d (&z, 1, &n)) != MP_OKAY) { /* n = z + 1 */ - goto __Z; + goto LBL_Z; } /* check (n, v) == 1 */ if ((res = mp_gcd (&n, &v, &y)) != MP_OKAY) { /* y = (n, v) */ - goto __Z; + goto LBL_Z; } if (mp_cmp_d (&y, 1) != MP_EQ) @@ -266,7 +266,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* compute x^a mod n */ if ((res = mp_exptmod (&x, &a, &n, &y)) != MP_OKAY) { /* y = x^a mod n */ - goto __Z; + goto LBL_Z; } /* if y == 1 loop */ @@ -275,7 +275,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* now x^2a mod n */ if ((res = mp_sqrmod (&y, &n, &y)) != MP_OKAY) { /* y = x^2a mod n */ - goto __Z; + goto LBL_Z; } if (mp_cmp_d (&y, 1) == MP_EQ) @@ -283,7 +283,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* compute x^b mod n */ if ((res = mp_exptmod (&x, &b, &n, &y)) != MP_OKAY) { /* y = x^b mod n */ - goto __Z; + goto LBL_Z; } /* if y == 1 loop */ @@ -292,7 +292,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* now x^2b mod n */ if ((res = mp_sqrmod (&y, &n, &y)) != MP_OKAY) { /* y = x^2b mod n */ - goto __Z; + goto LBL_Z; } if (mp_cmp_d (&y, 1) == MP_EQ) @@ -300,7 +300,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* compute x^c mod n == x^ab mod n */ if ((res = mp_exptmod (&x, &c, &n, &y)) != MP_OKAY) { /* y = x^ab mod n */ - goto __Z; + goto LBL_Z; } /* if y == 1 loop */ @@ -309,7 +309,7 @@ pprime (int k, int li, mp_int * p, mp_int * q) /* now compute (x^c mod n)^2 */ if ((res = mp_sqrmod (&y, &n, &y)) != MP_OKAY) { /* y = x^2ab mod n */ - goto __Z; + goto LBL_Z; } /* y should be 1 */ @@ -346,14 +346,14 @@ pprime (int k, int li, mp_int * p, mp_int * q) mp_exch (&n, p); res = MP_OKAY; -__Z:mp_clear (&z); -__Y:mp_clear (&y); -__X:mp_clear (&x); -__N:mp_clear (&n); -__B:mp_clear (&b); -__A:mp_clear (&a); -__V:mp_clear (&v); -__C:mp_clear (&c); +LBL_Z:mp_clear (&z); +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_N:mp_clear (&n); +LBL_B:mp_clear (&b); +LBL_A:mp_clear (&a); +LBL_V:mp_clear (&v); +LBL_C:mp_clear (&c); return res; } diff --git a/etc/tune.c b/etc/tune.c index bc101be..14aace2 100644 --- a/etc/tune.c +++ b/etc/tune.c @@ -14,9 +14,9 @@ #ifndef X86_TIMER /* generic ISO C timer */ -ulong64 __T; -void t_start(void) { __T = clock(); } -ulong64 t_read(void) { return clock() - __T; } +ulong64 LBL_T; +void t_start(void) { LBL_T = clock(); } +ulong64 t_read(void) { return clock() - LBL_T; } #else extern void t_start(void); diff --git a/logs/add.log b/logs/add.log index d44c4cd..fa11039 100644 --- a/logs/add.log +++ b/logs/add.log @@ -1,16 +1,16 @@ -224 222 -448 330 -672 436 -896 520 -1120 612 -1344 696 -1568 810 -1792 912 -2016 1006 -2240 1116 -2464 1152 -2688 1284 -2912 1348 -3136 1486 -3360 1580 -3584 1636 +480 88 +960 113 +1440 138 +1920 163 +2400 202 +2880 226 +3360 251 +3840 272 +4320 296 +4800 320 +5280 344 +5760 368 +6240 392 +6720 416 +7200 440 +7680 464 diff --git a/logs/expt.log b/logs/expt.log index e69de29..e65e927 100644 --- a/logs/expt.log +++ b/logs/expt.log @@ -0,0 +1,7 @@ +513 1499509 +769 3682671 +1025 8098887 +2049 49332743 +2561 89647783 +3073 149440713 +4097 326135364 diff --git a/logs/expt_2k.log b/logs/expt_2k.log index e69de29..d106280 100644 --- a/logs/expt_2k.log +++ b/logs/expt_2k.log @@ -0,0 +1,6 @@ +521 1423346 +607 1841305 +1279 8375656 +2203 34104708 +3217 83830729 +4253 167916804 diff --git a/logs/expt_dr.log b/logs/expt_dr.log index e69de29..6cfc874 100644 --- a/logs/expt_dr.log +++ b/logs/expt_dr.log @@ -0,0 +1,7 @@ +532 1803110 +784 3607375 +1036 6089790 +1540 14739797 +2072 33251589 +3080 82794331 +4116 165212734 diff --git a/logs/mult.log b/logs/mult.log index a2c9c18..864de46 100644 --- a/logs/mult.log +++ b/logs/mult.log @@ -1,143 +1,143 @@ -140 1272 -195 1428 -252 1996 -307 2586 -364 3464 -420 4420 -476 5260 -532 6430 -588 7692 -644 8704 -699 10226 -755 11670 -812 13190 -865 14834 -924 16738 -979 18362 -1036 20660 -1092 22776 -1148 24848 -1204 27168 -1260 29930 -1316 32258 -1370 35172 -1422 37534 -1482 40390 -1537 43990 -1589 46946 -1652 50438 -1703 52902 -1764 56646 -1820 59892 -1876 63248 -1932 66872 -1988 72596 -2042 74662 -2100 78512 -2156 82944 -2211 87444 -2268 92170 -2324 95534 -2380 100484 -2435 105024 -2491 109460 -2546 114154 -2603 118946 -2660 124110 -2716 129300 -2771 134274 -2828 139594 -2883 145234 -2939 150332 -2996 155750 -3048 161718 -3108 167492 -3162 173882 -3219 179766 -3276 185560 -3330 191826 -3388 197822 -3442 204176 -3500 210682 -3556 217236 -3612 223484 -3666 230714 -3724 237744 -3779 244080 -3835 250970 -3890 257914 -3947 265162 -4001 272128 -4060 279108 -4116 287606 -4171 294716 -4227 302806 -4284 310260 -4340 318564 -4395 326164 -4443 334034 -4508 342108 -4561 351810 -4618 358828 -4675 367332 -4732 376140 -4787 384172 -4841 393308 -4899 402036 -4955 411286 -5010 420290 -5067 429688 -5124 438810 -5180 448130 -5235 457264 -5290 467390 -5348 476586 -5404 486120 -5459 496512 -5516 506624 -5569 516346 -5628 526604 -5684 536544 -5740 546936 -5796 557284 -5852 568106 -5907 578824 -5963 589204 -6019 600176 -6076 610564 -6127 621972 -6188 633564 -6244 644730 -6300 655288 -6354 667402 -6412 678824 -6467 690594 -6522 702718 -6580 714148 -6636 725608 -6690 737834 -6747 750100 -6804 762202 -6860 774184 -6916 787298 -6971 798734 -7028 811162 -7083 824570 -7139 837738 -7196 2579488 -7245 2626714 -7308 2643582 -7364 2698746 -7416 2734106 -7476 2773372 -7530 2816738 -7588 2859204 -7643 2938596 -7698 2919716 -7754 2988542 -7812 3026520 -7867 3058304 -7924 3115790 -7977 3161450 -8035 3203138 -8092 3244056 +271 580 +390 861 +511 1177 +630 1598 +749 2115 +871 2670 +991 3276 +1111 3987 +1231 4722 +1351 5474 +1471 6281 +1589 7126 +1710 8114 +1831 8988 +1946 10038 +2071 10995 +2188 12286 +2310 13152 +2430 14480 +2549 15521 +2671 17171 +2790 18081 +2911 19754 +3031 20809 +3150 22849 +3269 23757 +3391 25772 +3508 26832 +3631 29304 +3750 30149 +3865 32581 +3988 33644 +4111 36565 +4231 37309 +4351 40152 +4471 41188 +4590 44658 +4710 45256 +4827 48538 +4951 49490 +5070 53472 +5190 53902 +5308 57619 +5431 58509 +5550 63044 +5664 63333 +5791 67542 +5911 68279 +6028 73477 +6150 73475 +6271 78189 +6390 78842 +6510 84691 +6631 84444 +6751 89721 +6871 90186 +6991 96665 +7111 96119 +7231 101937 +7350 102212 +7471 109439 +7591 108491 +7709 114965 +7829 115025 +7951 123002 +8071 121630 +8190 128725 +8311 128536 +8430 137298 +8550 135568 +8671 143265 +8791 142793 +8911 152432 +9030 150202 +9151 158616 +9271 157848 +9391 168374 +9511 165651 +9627 174775 +9750 173375 +9871 185067 +9985 181845 +10111 191708 +10229 190239 +10351 202585 +10467 198704 +10591 209193 +10711 207322 +10831 220842 +10950 215882 +11071 227761 +11191 225501 +11311 239669 +11430 234809 +11550 243511 +11671 255947 +11791 255243 +11906 267828 +12029 263437 +12149 276571 +12270 275579 +12390 288963 +12510 284001 +12631 298196 +12751 297018 +12869 310848 +12990 305369 +13111 319086 +13230 318940 +13349 333685 +13471 327495 +13588 343678 +13711 341817 +13831 357181 +13948 350440 +14071 367526 +14189 365330 +14311 381551 +14429 374149 +14549 392203 +14670 389764 +14791 406761 +14910 398652 +15026 417718 +15150 414733 +15269 432759 +15390 1037071 +15511 1053454 +15631 1069198 +15748 1086164 +15871 1112820 +15991 1129676 +16111 1145924 +16230 1163016 +16345 1179911 +16471 1197048 +16586 1214352 +16711 1232095 +16829 1249338 +16947 1266987 +17071 1284181 +17188 1302521 +17311 1320539 diff --git a/logs/sqr.log b/logs/sqr.log index 3e175ac..0898342 100644 --- a/logs/sqr.log +++ b/logs/sqr.log @@ -1,143 +1,143 @@ -139 806 -195 1212 -252 1604 -307 2260 -364 2892 -420 3308 -476 4152 -532 4814 -588 5754 -644 6684 -700 7226 -756 8324 -808 9092 -866 10068 -924 11204 -976 12918 -1036 13656 -1092 15248 -1148 15956 -1204 17270 -1260 19894 -1316 20516 -1370 21864 -1428 25554 -1483 26138 -1540 27086 -1596 29246 -1652 32210 -1707 32704 -1764 35142 -1820 39050 -1876 39256 -1931 41574 -1985 45070 -2044 46352 -2099 48114 -2155 51332 -2212 53268 -2267 55890 -2324 59054 -2380 60206 -2434 63540 -2491 66084 -2547 68590 -2604 74332 -2660 74784 -2715 77974 -2772 79924 -2826 82914 -2884 87210 -2929 89076 -2996 92480 -3052 96814 -3108 99990 -3162 102550 -3219 105396 -3276 109284 -3332 113752 -3387 116628 -3444 120782 -3500 122938 -3556 127940 -3612 303656 -3667 312212 -3724 324376 -3779 329204 -3833 340910 -3892 353850 -3943 362348 -4003 367780 -4056 380448 -4114 393616 -4172 404104 -4227 415148 -4284 409770 -4339 436648 -4394 442970 -4451 463096 -4507 472056 -4564 485780 -4616 496286 -4675 507612 -4732 519524 -4788 536768 -4843 542754 -4899 553090 -4956 571986 -5012 586340 -5068 599606 -5124 613670 -5179 624256 -5235 636266 -5292 655518 -5348 668142 -5403 677266 -5460 696040 -5516 712772 -5570 723942 -5628 739052 -5684 755350 -5739 769962 -5790 775258 -5851 790128 -5908 814536 -5962 827278 -6018 844510 -6076 851606 -6130 865748 -6188 894752 -6244 900474 -6300 928174 -6356 928440 -6410 957758 -6468 981134 -6524 994088 -6580 1011124 -6636 1027178 -6692 1045466 -6747 1056910 -6804 1083784 -6860 1104706 -6915 1116450 -6972 1137894 -7028 1154670 -7084 1158064 -7138 1188734 -7196 1214218 -7249 1226822 -7307 1247528 -7363 1255338 -7420 1291104 -7475 1297940 -7532 1324994 -7587 1340274 -7644 1342596 -7698 1381418 -7756 1382904 -7812 1432588 -7867 1443632 -7922 1465092 -7979 1496804 -8036 1520142 -8092 1539566 +271 552 +389 883 +510 1191 +629 1572 +750 1996 +863 2428 +991 2891 +1108 3539 +1231 4182 +1351 4980 +1471 5771 +1590 6551 +1711 7313 +1830 8240 +1951 9184 +2070 10087 +2191 11140 +2311 12111 +2431 13219 +2550 14247 +2669 15353 +2791 16446 +2911 17692 +3029 18848 +3151 20028 +3268 21282 +3391 22696 +3511 23971 +3631 25303 +3751 26675 +3871 28245 +3990 29736 +4111 31124 +4229 32714 +4347 34397 +4471 35877 +4587 37269 +4710 39011 +4831 40884 +4950 42501 +5070 44005 +5191 46026 +5310 48168 +5431 49801 +5551 51385 +5671 53604 +5787 55942 +5910 57757 +6031 59391 +6151 61754 +6271 64234 +6390 66110 +6511 67845 +6627 70474 +6751 73113 +6871 75064 +6990 76940 +7111 79681 +7230 82548 +7351 84597 +7471 86507 +7591 89497 +7711 225216 +7831 232192 +7951 239583 +8071 247302 +8191 255497 +8308 261587 +8431 271490 +8550 279492 +8671 286927 +8790 294680 +8910 302974 +9030 311300 +9150 318635 +9271 326740 +9390 335304 +9511 344297 +9630 352056 +9748 358652 +9870 369723 +9991 379119 +10111 386982 +10231 396075 +10349 404396 +10470 415375 +10590 424146 +10711 433390 +10829 442662 +10950 453238 +11071 462178 +11186 469811 +11311 482529 +11431 493214 +11550 503210 +11671 513486 +11791 524244 +11911 535277 +12031 544872 +12151 555695 +12271 566893 +12391 578385 +12510 588658 +12628 596914 +12751 611324 +12871 623437 +12991 633907 +13110 645605 +13231 657684 +13351 670037 +13471 680939 +13591 693047 +13710 705363 +13829 718178 +13949 727930 +14069 739641 +14190 754817 +14310 768192 +14431 779875 +14551 792655 +14667 802847 +14791 819806 +14911 831684 +15031 844936 +15151 858813 +15270 873037 +15387 882123 +15510 899117 +15631 913465 +15750 927989 +15870 940790 +15991 954948 +16110 969483 +16231 984544 +16350 997837 +16470 1012445 +16590 1027834 +16710 1043032 +16831 1056394 +16951 1071408 +17069 1097263 +17191 1113364 +17306 1123650 diff --git a/logs/sub.log b/logs/sub.log index cf2bcd6..a42d91e 100644 --- a/logs/sub.log +++ b/logs/sub.log @@ -1,16 +1,16 @@ -224 216 -448 324 -672 428 -896 532 -1120 648 -1344 766 -1568 862 -1792 928 -2016 1070 -2240 1128 -2464 1250 -2688 1344 -2912 1436 -3136 1542 -3360 1628 -3584 1696 +480 87 +960 114 +1440 139 +1920 159 +2400 204 +2880 228 +3360 250 +3840 273 +4320 300 +4800 321 +5280 348 +5760 370 +6240 393 +6720 420 +7200 444 +7680 466 diff --git a/makefile b/makefile index 4fe2256..164a0ab 100644 --- a/makefile +++ b/makefile @@ -1,10 +1,14 @@ #Makefile for GCC # #Tom St Denis + +#version of library +VERSION=0.33 + CFLAGS += -I./ -Wall -W -Wshadow -Wsign-compare #for speed -CFLAGS += -O3 -funroll-loops +CFLAGS += -O3 -funroll-all-loops #for size #CFLAGS += -Os @@ -15,13 +19,15 @@ CFLAGS += -fomit-frame-pointer #debug #CFLAGS += -g3 -VERSION=0.32 +#install as this user +USER=root +GROUP=root default: libtommath.a #default files to install LIBNAME=libtommath.a -HEADERS=tommath.h +HEADERS=tommath.h tommath_class.h tommath_superclass.h #LIBPATH-The directory for libtommath to be installed to. #INCPATH-The directory to install the header files for libtommath. @@ -61,7 +67,6 @@ libtommath.a: $(OBJECTS) $(AR) $(ARFLAGS) libtommath.a $(OBJECTS) ranlib libtommath.a - #make a profiled library (takes a while!!!) # # This will build the library with profile generation @@ -86,19 +91,19 @@ profiled_single: ranlib libtommath.a install: libtommath.a - install -d -g root -o root $(DESTDIR)$(LIBPATH) - install -d -g root -o root $(DESTDIR)$(INCPATH) - install -g root -o root $(LIBNAME) $(DESTDIR)$(LIBPATH) - install -g root -o root $(HEADERS) $(DESTDIR)$(INCPATH) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(LIBNAME) $(DESTDIR)$(LIBPATH) + install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) test: libtommath.a demo/demo.o - $(CC) demo/demo.o libtommath.a -o test + $(CC) $(CFLAGS) demo/demo.o libtommath.a -o test mtest: test - cd mtest ; $(CC) $(CFLAGS) mtest.c -o mtest -s + cd mtest ; $(CC) $(CFLAGS) mtest.c -o mtest timing: libtommath.a - $(CC) $(CFLAGS) -DTIMER demo/timing.c libtommath.a -o ltmtest -s + $(CC) $(CFLAGS) -DTIMER demo/timing.c libtommath.a -o ltmtest # makes the LTM book DVI file, requires tetex, perl and makeindex [part of tetex I think] docdvi: tommath.src diff --git a/makefile.icc b/makefile.icc index 09117b7..3775b20 100644 --- a/makefile.icc +++ b/makefile.icc @@ -21,6 +21,10 @@ CFLAGS += -I./ # Default to just generic max opts CFLAGS += -O3 -xN +#install as this user +USER=root +GROUP=root + default: libtommath.a #default files to install @@ -89,10 +93,10 @@ profiled_single: ranlib libtommath.a install: libtommath.a - install -d -g root -o root $(DESTDIR)$(LIBPATH) - install -d -g root -o root $(DESTDIR)$(INCPATH) - install -g root -o root $(LIBNAME) $(DESTDIR)$(LIBPATH) - install -g root -o root $(HEADERS) $(DESTDIR)$(INCPATH) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(LIBNAME) $(DESTDIR)$(LIBPATH) + install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) test: libtommath.a demo/demo.o $(CC) demo/demo.o libtommath.a -o test diff --git a/makefile.shared b/makefile.shared index 96bbf32..86a3786 100644 --- a/makefile.shared +++ b/makefile.shared @@ -1,10 +1,9 @@ #Makefile for GCC # #Tom St Denis -VERSION=0:32 +VERSION=0:33 CC = libtool --mode=compile gcc - CFLAGS += -I./ -Wall -W -Wshadow -Wsign-compare #for speed @@ -16,11 +15,15 @@ CFLAGS += -O3 -funroll-loops #x86 optimizations [should be valid for any GCC install though] CFLAGS += -fomit-frame-pointer +#install as this user +USER=root +GROUP=root + default: libtommath.la #default files to install LIBNAME=libtommath.la -HEADERS=tommath.h +HEADERS=tommath.h tommath_class.h tommath_superclass.h #LIBPATH-The directory for libtommath to be installed to. #INCPATH-The directory to install the header files for libtommath. @@ -60,8 +63,8 @@ libtommath.la: $(OBJECTS) libtool --mode=link gcc *.lo -o libtommath.la -rpath $(LIBPATH) -version-info $(VERSION) libtool --mode=link gcc *.o -o libtommath.a libtool --mode=install install -c libtommath.la $(LIBPATH)/libtommath.la - install -d -g root -o root $(DESTDIR)$(INCPATH) - install -g root -o root $(HEADERS) $(DESTDIR)$(INCPATH) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) test: libtommath.a demo/demo.o gcc $(CFLAGS) -c demo/demo.c -o demo/demo.o diff --git a/mtest/mtest.c b/mtest/mtest.c index ef0e093..d46f456 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -46,7 +46,7 @@ void rand_num(mp_int *a) int n, size; unsigned char buf[2048]; - size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % 1031; + size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % 101; buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); while (buf[1] == 0) buf[1] = fgetc(rng); @@ -58,7 +58,7 @@ void rand_num2(mp_int *a) int n, size; unsigned char buf[2048]; - size = 10 + ((fgetc(rng)<<8) + fgetc(rng)) % 97; + size = 10 + ((fgetc(rng)<<8) + fgetc(rng)) % 101; buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); while (buf[1] == 0) buf[1] = fgetc(rng); diff --git a/poster.pdf b/poster.pdf index 60999daef1a6991036d5a8836971cca7180f9aac..e0b4f848b5b9abc6be757142e05359ea1ab5251c 100644 GIT binary patch delta 14434 zcmZYlQ*@?X&@~Fjwr$(#*tTt}W8(@s=s3A!+eXJuI!VX2J9g5s{^x!7f3WxW)xjEb z%u%C`)~dM*kG&8Ny$}s+n6Um4FdcrKcFnt(ERaxeO}=U%4BS8%IW2W5IcZQTt}W94 z0~sZhH1xiK$OQ?SDe-EdXeX(ZliD(p@i=F0*zN@nGI6gTEmP7D#>ArNBC+P{QxAMp zr1<5iKu<(ez}7^{v{V=wEf#vVx-6DKzso}l3>HSFsqI)l*)Ke4bQ%MsHHhdqWawGy zf&LsMI!yyaLIZ^yD7*?bgs?D)VN+O(V}zeDClGL9e2!4Tovn?+6$D zN>@J zXB`ylU<*wM!^Uo4k0qAsKZcOeCX0YD{edV2L5K0=AT6%S-V42(Gz?A>jjm0yFb|Va z2-l)+IHGN7N)s=tbL)Kl_asXCcZR-dNF|>#P?Bh8DcVdi`XO+O1`(-1hD%c?MYG^2 zY#c*5zy^n2kAj}JLOU6D>p@P3v5%G~D9-2gv#_I;cH-bE?Vl#yWwJNYC;QN){`t^R zTvN#P-xn+Ir^su9N^54#Bj;_dI<7j>#(&{-t@O*q6Q@hJH?iHHs0Z`?x9=yfth&uF zK%JU}c$jxnx_w-0;Jt?S9jw0$|3out`Y+tx-jAl$K-h)1`adc^-FV+ixOovUD!I}$ zguhhhf7(+b7M1%M`}j6l&Aa^Y^D5hSX=4)Rk}I9|IYC~hn$x9I^^#lEfN^L z(nom(C+B=!dfphpb+RP$^QfMk^t->~zqN#y+^o{l`YBu^&n1s8r9_f8*W*!&PNJH1ss<7P&T?p*m*JUKu8A=4S)=?Ur1V;|pXQ%;io9yEEIL;S6Wh;$)xFm9*9=pV+i3Lk+kFcrJFGcdBx(>3CVR$G*4wQSXq zhuzpVc2B^}(s6-LC1AxX#hlvu*Bp)eb9sD8<|yArYZFjk-b|V%**xB1DNi=k@CfP+5RK4 zlW%k^D`aCUSnI!XS!rYa%d%N&rMT!pd$(geUZs@f|4nYkPfw|k`E@3|>2H+hTfExD zG&0RfN#RPW3hva-r(VpqXR}Em=fk_Tvv#}ai`X!Dk)+o4gz#g$7(yk@Tk^mueEsUn zSn`4QQ0||sh<~t5c|ZpVNyoRMD#{+BA;ks$N`aK3kprxP^RGpx`IB@=x9GmnpVNZ?*xj0O7!?U}H zv);o$dXw+{(8clMu*legxJat1yZ@kZ_Gj(BVK}p{H6fHrY_uXv3SuphcJwi`{g{eIE?} zyX}Jc%M4x5$i=)>6$c#~9|}rS+Dz0|iYJCbUo;GYBAlT>u@cKNB{TTpl=I*5WWDdv zrpU2>-&6OF|Bkz2+Z*(10~8+WW4~$#a-5<&gd8oBG|!+zCGOgHX$w!Sz~gmQ9Ka_WdIHX#!!ERwL;l??MQ+SQ%2kCD2^cQU9{Sb#>}O!OnQTYn*_RttSk76Ps~ zxl%JLy5d#%VsK^BP39#7OiU_xx&;y~UgD=@m3;KHWhfPas4934*e+D683O*u-zrK` zY()e#^KY()+LyM$6qpiCW7s~}t{z}m+x8C|`EH&g7|D(&zxpGlHI)kID*E%}lwQ2e z(V~Zk2LU49{u2IGP9nT&IuV>vGtJ)DEX|O>its1~3q0lE7s*4i-`>-)uV;Q=LR{92(uZ7D%T0RD@N;UkBudN$57=#*FY(ax$fAVicYv4jb>a%%**VpC0mQKQn{XTLBj+OaIwQgk(Amv9fo5Ds< zF@TMdMcND2?+Kl?6ZQcPs!fdrJDPJzE^a>LqNYL(%^X$UQP3Dz`NpS=OJ8Rba^oKg z%i7bq6U5Yllia=qj~=Egp`qT02a9b=iu#|F&*RlZZK~>}=TkkP>?>BnbM0-$T8=^q zxi>f3MRz3YO2EguS2V=a&>n$N*F7)S4j=$^WU^j81sdsMljOU#?{{s(Y80)s&fXLL z=q8OI8ao}*VRb;chpag~s6{6hvw3jll35}ww-JdYcNY9t8B0Lj zd+#Vx+F_U zd*(o%IjabJ5!dK&KJ!&dQW7H#UwH_$hHTwgpBk4qS8w~U*O0iDN^M0>@72bf@Ha1+ z=5KKr@jcNCm|lfuyo|10>i%2e5MKxd&SQdNA2DZBx=oL=sQvsS^y`Bwbe&k z9TDl)PGru+8OnBPV7Z%$elH~NQ9xn2j-HOUg^}s!(GUu^wMkRT;et7cz-B)*%@a1G zg;*j9cgmg_m-M19QQE=1*8Cb2%YqNE#NnG%@EEA*>Ezm_&HGF_90$(O`G)BapBi*% zO81bZ@~yKv`u8R&?Qi8IiTEwN{Th4Qzf+&<=n4(q`q6GKKXY5jgX?$1R?b}>ThK8g zJaks8RP{M*EtS8$T=}|@7XKZ30Uu_24+a#cqiE~P`Y~;P$hR3_F)i=VzD|t{r!)ES z4eU;~KC9J|9K_CwN5Ys=(04lOf1vY0njH3EJ+YK^a4!r`aPT9DLmaLNWW!3!%b<9g z=jSyU`nQSvphcnd#!5@QRxSHL=92J1@~kokk`Kc8brr?DVZ3zeXvc0HV1)Nq%0}h` zjj+-I22$%Q_X@E3kHi!=TX6yV*FN~1*4z4*8M2ELd3`}ASdyAP^n=cx^lijDjK7Ew zXD;P%N0CP-!e9hmr{CS1JzUi!#X&U*^DbA{72Y!}UTMp@EqE_9sp>9BW|l9RtsZ<> z9W^_T?puCmKzq~|?sGocZj2dRx&;PY0?j8hqDOY~3dofWfRU1slhalQJ+j#%{Xg(O z`BIYmpArqfIgC9I0_N=0%<1^3nU?Df2I_t;qz*(Q0KjN#Ny@6}gQ^AW{{OID7O$M zW+ELL6%zvjjEj4<*)AFrM4Wo0>7JWtVoeQzr@90Ui3NfPl{};xc3}-BtcdWs{Y^$h z)F^7q-P;#h5>h4m4F){CAlMJBhLY%KHF)?p$hbLGD57&_Bu!5*7=n+~Js7Ugt^sxu zmkc&AD2PEcRi;^#t6))Z$j z0Js-K#pc+c{(#fb&_n+)WkYiYyL#P~#W+EPpipIN$3?pe$7G_26}NDu7u{5R4|%jj z+O3a^o&b{~lf~T>CvSJ(HSDX!C=x}-g@cKAi`cOEY7G5!`dHEa;!yyTDzF8pFz(u< zFw)~6B)_KGr()g@Qb$@_-Xbks*8ogetaOAoNLS`Ppa4&G_!AWiHu~FpNU|vUFlp5J z!8`0e0r{8Mrm&bf3{UP;p-PT&9sYZA^z3w+|--#J(=# z9M&MV1KzNypsgA-k?&iveL+$}iQ>h)zb=y(=6VB$vwKE*n8pJK{JNNf+e|nPejvZE zns_e!6!gIPW08}hqT1~m*eD}=^nfPv#!oRNz?oQ0r>5{NyJ!=%81nA}`E0-5TZ&e# z<%J2aKU{EW1qh!%d2}qe;y*&)er}`i$kO2qYl#^y+4pp7ea5~{c(qB-*$!N+*JIwn zWoJ>7r|S>C)`NyAOn_&78~1V!z>`|PrmXI;0HXL&8h0OkFLe21?D+A=@$%&Pq3GWuz- zvw)d%{*$YV<^1~3@<4UN>=chK0q#Qyixp)dH*Zb)m3c?2hR0;ZY?5}S-|WQheEf=H z{*TI9h@oo8+t5@M}b zb4|OV)3Kp@P+NObMqv`~=GtB)^D43UF_QK2j3@c%{MHh*#Cv?d3UT^wHIwvjLeMUx zv{fm0-}~yYE4MiYvo?MmA^Jj)H%y*DPw_RM3V{6ypKglN0Zw8m#Hq90_+Cpa^BbO3 zz4mI!MQh*ec`~U6>Y}WkczrU+&%{DCVZs47|E^5X{%}$o%~bqiS%m9bu{fe7a2^g6 zz326-|EkY;dZ$2gqrZs89hmZf|4w#ruU3=O`LG#Q497J>s}fHgN4NEjX%ojj7WrPi zA86AciGYLIME=MuxZ1sQ#X;ofoDy+ckO|iBrUxfLmI!+2)bOpP)oA7TTZ=ZCWRk05 zNWf@fdzWD?X7KVm!HG7=me5v1aqX}dj_ zx2+r0H*3S*Xb8r(Umew3b!eDvC`$2V09LqGG5Hc?=$^?2jWL^(YaDOZSzf}ciL4E} zFMrjaz++!~6C8-{YAKjQ{;gP$mOD=_If9KsRl2&NK?-HAz?%Py&x4e(YniiSjnR!K zJ7uw-R|-vmF^n(GR$(PjSD?opdP2x;Yh8u#FA8uA7hpjDqn>s#3RTyvK(SiU(5W{;W_TQ z%s&HVI9c4dHMX=J;{Rt&R1q%Kd1KI1-X{amHXV%+SvKXtbp^R`Ugt0B?VR(+r(0l$c!Qyu$7p_s+7A6jQ`hR z^gX<7!wUTF?lu+cF9KG|+_8p`*>iz6S;{u<$dYyd=kE`~u)SfO)pXqVvk&swwc1mA zx$gtseg+X~o&q1L_FZ${Tm4*8oAH-03k zR-KV`qlWQ(GSl_$z!6OqmMe^JjL_LHCZ3*!VIF_dm8gg+yTD*qkUa&EU?6roBl#1q zT<&fCM?hOzD{lksc%aywE`z~-&0;mH($yd&b}PHL+o`O8{cG#!s?p>f7i57}*b#wY zNF=GV8dB*ps=Q0M)16fQ6ys4_3LV0FD*-!_)XM$UH@HKFZP zEw8vW{JL8w_5=uDAgSeemduCMs&e5IC)_?U4x!cM|Jyl0N2DcN8mKCw&NbOw^ z8;Ntv~FLN|W?$PB?N7zQgzk-?LGDy*SD#unDe^Fmfdfe8Xj z7I_ql8h2x#MzQOghGazzq{G!@qKUYA{vG;X)5L>zKzhrbeRU|I8Tcq_L^@8oh7W~bHpw1`5rY9`6O zeD$5|b#~&wKg10z2(t6&f%EOvh91k|9DFtiZ-w`i$Sw=fU$3WoB>7j|VMlCIf$`hM z;JSsQ04I5Z_x)Vw`<4kGztOo!ZMBP@G4BPF6_Pk_(kH`spxIwi5uKEa$daQa^m_&( z49jHi>pb6-he0{R%EI=81(+Q|1x*#Cgp)T}H3Eo@qt(0|)ryjVKubp8Zn;9!RIvAz zh~&}`M?*Y&$*-HDM*{*J{kGk{8M5W^j$myXc(yd!4vr69%y{(nOT`MK=qIAT=@{l7 zzVslKQJI7JH=5|!Fuk&T7!?k7MfiSgC!7tZ{?;<_*ko8-1)qXh)~iv)-%t>)T7MDP zAzEy6nXs(4>|r%7oTu41#+~use;a?JMqr&acYW_%#Kx4nX34{nCX}v57)i00$QU^g z(9mfh^J>=dyByDebvP*0mC^4X@DRPCD=N2-@|nb=D7dRO3)MIgKWJcb@mycNFm?vQ zllJb-2&KHA%GcGbAcavE$oWK?wh>}mB!8MO!pV0c!Y0*X7U|%gl&CdZ-t5daks00 zl@q~*^AH|ihR!~C*H0IV?b-VlFqBwbt!Z?I(nn^wwXT74-G&eCKDWBNC>0Z+d|5Yn z8?Q1`bc5d@V2b0^D9{zEceWZaIq=m1TuQ*Q)IMLgIXPG*%rpl!Eh!N;*95=j!Er6N z+RfZH{YlSUE!Ml&-e-Fb>s|&Sz|Q-{QOm&`+1m`8>?u z9me^jwqe$!RXJ+*m}MKac_wJ5>0)-Qh~bDtG>_>IQ{~A3r}<~4913WgBgRZb}##*!ci?friH{uyg_)gcX5%I!MivN^UH0IXsa> z@@6-49`z@ci-J^HkCFE0cyrw@`XaW;v)89Zq%jt@-pypKk`78O-)Ji0_j;+>iUJGs zX_m(%DgIe6IvU2IR1naiKi{=~4=aAG{pG52#I{m6$wPO!l*ssxQ6On4SC+jZzx*dO ztv!#&Cv^Lh=j@g3_rzM(9;YVSZs70)`-w9{K>Sr z`Uo_=;BL`~#eM4Oz76w~M=}iba@3JsxejWtzIxz;etCFCGY7iBSwnOmC@=YxYxw+p z7p17wC{bvu2n9gwIlf}ea+t)de$wbWAt`U!KNo)Zr0{7kUO-=KZNA5um#{>7jCU3H zAr0)}u<4E7AmbZ7RiV8U=Y8d?t~wg^;YShEMu0!t(za~KOqD`Dnh3+c0RO52=i&nl z*bes65!*d3%Z>O7&jWVW`vg$iI&yVda-Z;H5?B;i=YZ|8@=iV3%J6~%3#~EP)oUaF z6jAz?8svK96>c2W1zJN#5I!)UNr(rVbMZzyH%)Il3e@nchtB+nQi z9F6boc(xBO4|UHHWqPtqgmGPaWZ9WS;|}N8f_moPDm(EheZ!ONjOmYI?ja8qI?`{m zSjL)(@PV+aGlV2oDHUfX$Bfxz=Y%eSdm{@{MIv}fHf9XF->zpMY`R`U7sN$Xw>iPr!)%0S-87b#W#C_oe`goo~Ge+L*5X7S;JbW2aZ3LN=zo5$CbE_ z&Krk@TmDYyybkqmGx}@ls#mnHsahEZGR~d1&jXdjBOj>A$>AxU%gS9;^m(&>B-L&% z21+h^O0w1lQOqxk-tpP;I86>Xpj{Ib@9|I?XlVbf2z99xU%-y(E~=*ICc2LfPHS&g za8z5z>!aPmf`kSWT@2UyN0y#~>9X$6k;f!aE7{%bD9qpT_H{qKW6U$PND7qG?zDeu zdIAn-KPY(!dcp$SBQ5`+@K`zAQa6_QFLgMi5gUC7#-qAh%lOJ;9Blg|kifsWgU0%( zs47AYnNDB`xzHEih=tVD34QqPs3@&7Jc?_v4Xnun)L1`^HQF?MogzHnbUk$=Sn6oW zqvRD$sy9}2ZI&!-!bWXyK6XE+Dr;@|<^g%0Gz$8+-8(sPU)nUVZ5i%0iP6|&yp0xJ z2f3|6B0;Jxso0|@&cVH&P^l)|h>t7b!1I4=ojdWQf7e_WA2EL6W|e7ZjpiVo?(ifq z*dpSXB_|w3IaQmGSl`FuIPYaT*n1$IY^SN-1r^L+sf3+%u1PvRfawngk*p=?umL@O z^MrcREgvC#-_{+g#7-|(FLet;Pgm}#1EZ8r)}M5GF|`cc!?%c}wQ)bxBJ`NO>z05W z>eK}%UdBKJ)wd=#a8Zi;N)6z>D3Q5Wu5oJ3&Sxa+)i=iCYvI5~ACbNZrcHXjv+2C7 zj8bxzCmtb4;$q~g3ikskCPF&y5m0K&9Jex8$O%pB%Ea^>ffz z=pJ{MdyzFcb9XL%uZ1Cv8B#cifW^;YEa43OJNQ{oc~N`ATg50_i>OzOY*9H)LMmHY zB!aC&HOYjP$*pgmxMF+vZ$W{uf?3p^m zniL~gzbr}c2JwG579O);F{DIyn*+lXLz za;BbgU^bO|#J4)FWaC)4)n=RJ4`@u{$-%b?x7dGC`wo{+Gzc^`(2dFqi*P>B8-lC< zG;GomYllgTRo{p2aFFqwKgu@e6Q$moC7Mv7PjAT&c_N&A@ksF<1o9b`3C!Kx)K^!| zY+(?-Np-Eh1i6l51d>z=321$ypdob|^GKHX0FRV0Nj1$D24cN)cG!qKc~K?%fs#w& zv>7ZK0xs^tlV&*y&rJtO2Yycf?B7epIlnfGJCP{t&#DG!iyWP1Ti3M)peQ~NikxkF;=0n!xAEu+ zUmAvoO^$gwD)TaPn=*Rz_b~mQ|A48$nx1x#aLduS;_}P%J`MK!6A9P2ZL?0d@1UUX zYoamrXX>#|_V3>fq#0=kD%%0Y!wLtZJwce{H47>#ekODGgVe$-a`aMKr#W1BrZ4#< zq0Wa;h4KeQH709P6S=w2b@UZ-ba}mrRqcq9U~@0ab=KIrJT1X zVWu2S>yuR9F9~iX=a+|fv)&L}UQVefv)SdWO;e;{qZOqpWmoSa`}_q(L?d*EsNL*{ z;mayddCu(MLo^$TqvLZ9%VlRC_b%JXmy@yUb(aWCK%7+@QSUfEd1Y&QERo7-eHp=c zqBo;CWCeV_N%?XNz7{Ia3*u3F?@42rQ1M>O_h7uV24{2dydpTkn19lLU|z86$#L~L zl;?wIdUwlsDK*n;{@K+afT>Q1<7fxf*ejNnZ{a4rTW4&NAZ>kBS=35u?W!H4y`m#k z09!*GXfUORcSpuSUWX7zu|7ogS6;9A+f5<*Gk^R^zzB^O@#-#>>ruC)nWm^ixSK%S zYlGj%k}aL#dVFVZpS{3K)`6D#SH7-JxzhEl^ZOxsz+dly^3sPPD}A1Nfx1H|(Wju9 z;2DNz=B<(e{tx+)>}0(#C`IuhrIB1xQhIbtAc8y3i4~Lkz>*(zjAc9RSh9lC%4N*f zx?11G)bHTJ!G+;oQQNLwJj2(U1;5ffd>XZb_QjM9GM`9VS30L2xrNYSZoaYJfD6F_ zf{-jct-PKF8+Xt!Uy!*#uqu1}Y?8Q4z)xGJkLDG42Kxj;zGx9dbNA4YaN>TLl0be! z<3=geaD%7~f?>2J4DPceI`1~&Z^F=P7+gl z8=F!T*or1Au-{Zfal4V^kY0FxVDZEMZidjnX`@NOWfC+YV}DBa-;Vx7>qo~8Ee_vn zuqX5M1XH*vh6H-Q0TB35Z%O0PvE^X=z}TwlS$-)S5%Ujx1l4DJ4Rq6pVfC?LS+JO) zFjE=&$@;wvy-yMIkA+Q&6j{M&@{fiuzDl6lLKe#WZy!G$l|3D?4CDo!E>Yb3%<@6I z$l%&u!w=PYk!o!Zq@-ON#YftGFfC6d?)D>6e)8c^G$3SX9rGjz9E?N)Y2ahg)$&3F z#CH6|2|KwuxB7cn@x`S2L$75NZOp@i3LCcn>*{m-4B&K^#eYU= zFNuOx!7(4T>}GWa$K$;J{rc`fgBdE}s%;$%;27%2Na&oGpW(_E?~VP-|3W-E`mz)Z z@zrx_hszq;k@X)D)P_2b7; z$`tWGtGPU82@dDGJELT*Wv^j0zV3;~_ZO>?ZvVX7_oC6C*S;sdK9G&GuVnw1J%m`; zFU8Ug_`qVKdNt###f)m>www*!1Ea?PzRH}y5AAXlYdw-Sw{0}$aoih59O^UD4oI^R zt?qAgvK(Z*xw-W&-IZp@3Mq54^{3LWW!l4Bv;VFtm%Iva<~Y;up63&{CdeIwLpvx9A?h}?$;B4eh< zW64FYAAZTMwP{``(}`4BS^8wiG>~oSk44%b3bVFy<@LqiG_iRCml_EqYTp@a{fup4 zScE3_#w%JI=u&DAi(;oU;S}(LM^wdOV}*|9L`BziHGtvL1n?PisFq)C!`J6_J10A0 zJ(uHd){9I#3pfdf0shilbV`>1r9Qp>6YnETwtD`U@z%V&^qbg=BNM;$61l)hP@|G7 z2E7~fc&=V(&2!Ck5aZEWma7w^aDo@SPk||BTV2UB#@Uuyr?`mA_@_Zg0>RW&L+>qg zrgR?bPBe29SMG@wG8R>-QsxIm&T8`1m2Ku;g&0jzrbL2Xde*!zEA3Su76)!^t)M9*6GgpUC+mAO z2hV})tdGHTaP4O5{HJbh&=!Fk{rS;VV-7LP@5)7Ee<>YIzBpFE;3b#XaVRln7uifd z!<|822rdV_A1zp1ING-Mb9u}%tH3FP- zAxQ<*Os+j6rkpci(^TjYpZL9zRMwlWlQpcdqO!YI^g*&b|_}k zD#rXFW7ps#HVo4`b)a;mXDuRe%1MV>0FRflrcS@Km?vyy5y@ss@)b#lV_^!!Ajx4g zr$4^CI^%Zc98bu_(}*A!(^i{jF!lK{y)XZ7q0563tSsEa{ol~ zxZ^h60rwJ+BF$57tmyIf*V!cY{d!6w)Jc0&KZaDg2^>Px3Nj9NAV;YQpUnWfDVbi$ zEBrh7SMLCCgtv$wp1U=<>=7|Ro0#g){yzh)$Gi)esyh)+<&s`Ql1bGLKXVZ+#0Z9& z&KFgP#|9D13kTM-C%j%h27ba5{mGSXHXYiQ_ykfw#u2=uuBD%;RL5?AKLyz+VOq$m zig;P4?_XeCH2uf&FC(hTniD;LaHK;|CXJq%s>XZx^~BsVGhVTV>zgL*;nJH*>=w5*PNJnme_`{V8Bl!kIf71dT7wI>(c6y14`;v08zt`;M$HdNnp z`uV?X)}^ujNxU!q?H#m+zl!c+cXap=f2Za#PsTJ>t(W)WYSVJbeq1T4>*guyQvo|t3Np&AIl1)G1*B_zco*E?`XP}W z=HGrMttuwnL%-Ez#k0NkR7C3BCDPwv2-Ey-4 zy%dQ^o2696dS6WwSNuMaQRjQt1=5rbMl3YGt1Lygw7jP=%sWQ4u2esbWI@dM?`lW- z1TPeUe?6@f&OKL~J$mTqYg7Ce*tLEN>$W}f__Ie`f%_=v`3Db%W5O6Bn#(l%@-WtQ zOAn_oD3<^bn7cLVHYZu-jT;YSO&u!$@)u+2Pk7>u$S0fh|JM1Xa4c!>e1YARE2pF+ z+zLyr&l5MNonSO_ zS3)Hphap;T{wdsjO%?eZhnn-b6-U3|dBydRbt}=@QgaYSBv2Ssq_4XUbDZBk>>uNE zeZA!315UkW(X(lj;+800i72`5VMp$ZYkozjj2<3tU9OVJ#K5;L8{6Z3=1rmI{Th3) z1v?EFR{NgQSC8xUkW!5??oYJ>G=bl}zl2PeV;eEc?AWM~ah9?|jV0Z7k4-Rg%rqK@ zhAK2yIR#qZ=8wOZ^I$eV5&OgT*^+(uv0v1!WIxzLB@>z|tO>mNRLGn{Cp}?bO9-d) z)`_LJgw?>({>#I!6HBAeN<qFCtodVyt4*MfauoMtWm`-icvG<1cZz(> zw9N9-qgz8Hqs(=O=5;Urra8@JgB@6!mcjn_hH;2(_u|~Lu3+;3WnW@Egt(*|dM*At zKVf&9``iGQ|K**zVMx#~t{spzCalzu>1`#%E6(5SH|Mw_j+_q4#D9z8Z6O6XTZ<6K zg!a9LS6vsy#AO+4@A#kofT$8wM(OpyKzo(6$uXhOI%Q;{$q*@$4E}4v&_;WV#*on! z8v>Wl^%E$Cn7yb%XVgABk7}5T>ip_z`*hK}A_OVu`@SM%IN=}LF6W9x{@hoe_PSd6 zqUzB)Btp0DO22V_l`$~P=Cfs|6?@C=nV1-6{RQr$F0lv8W+aJvK%~2_!;qGrhP>7e zd@np@T<51NUJ0>ibrjw|X*i|aI2|zJ=0Zuurdcc@OEaka4|p{F78DbGLzI1^U|teb z*Liw=D|!(+!Zo^#vZV-D#$c7DWP8S}eQj&`{@jvkYFI*R;tIa@*%`McyFHZx^2z~0$s|nFSoeEEfLfXR^ zj6Q+7Sr0=%LVWY&pxPsz<#F-H*c#0C2^~mt@68ZzsI0*fC)hjVt!sraV2;xq8*V7F zDJg3E0=visNhsU2W6iL$6Bd^ao9Q!-e^yihfn=gNVd9x=!1xD0zbj$DtY>j^uJgxD z-O1;p_Mi4uw$*uX_2LcDL(D%&ydKkd0oke2xCwKB-GT`VP1TJP&*Gna={{Y;URUZN zSNij4ycCnYcMq&8S?a75{B=`F;W|^h%JdW}hkx%Rc{Ux5UmjSB7@3-%f^2_ruAehd zBd=G(H^RJ^Cb;acj8^%~A6AJTlL_J~(wXcMDw((pW#u^mei}EA#%2iyU z8Z$xw>1ey@!X=V``4Y_hjPhaf8^RyaIHyj-mhz>Rdc2e1wg4y4O2irE(X-4PjW+WX zS9Q^^N|CA~K%8-=943qOT9;}B(r&fDRmh3b5!!+NN zo9^L1pGH-tXZNEC`OpH7gB1$*Q!og5!pDq#RBC~JLsKMh+|Mk^9M;prQkv-B%cF2R zTaR!L)uzySmKAoGzpr?Of46;ZH_7qeFa0Atgb*iyq=3udfA@?z)@+n8VUq5@{unw( zUJMDlRj)Akl^`+;Ab(OKy+?gRic=;xvlT1&0@r?e%>fOh1tW^7iz$dp{_h^<|Mmh* z(^daJ9H}5-^K!a1BrM1O7#ABzBKrfJ7bKQL1Hr}zvdggm=LAjV&gC3ObAt|Zy|H=zPcLq6J`Rv;9ws;sC_GQ# xzjGiDQ;75b@Z#j-lf(67C(CsCSDM%rku9At~4kW&ldUr zKqe_=O?`e4xiDcP6@E1|UB(c@9j+#(qb#yvRQb zf*0@$5AkO2AJ?z`z3v- zn};ePhKKp^Y=o}lto>6Y!?U5Tbe|}i4#PRa!nr~*y_5+y4_T}+X!ix5bF%-S>fr}M zh$gEUE<-RcUUaDUVnAUqrGjv)?dK*YM{(?dw_1y9StGY+&u2q*jYNplQLSQ@ND zaAAMfiLP9YMxOebbjtW~l|xK2SEi?l#K_Jw3jD<8j6=57IeZ4_NF{gSISwcKn#Zg% zr$-&?hw))43YI7a?q9;&*>hQ;r6n8(K(h23tPISx*H+R4+w6k^sLrVatC z4eEloIl{GX*B?>FR6J7=6`|8vBdH^gROvnFB|M{k-a@^Cq)ETnUfEd@2-%|Sov{6)~}IG(eq8Q6=SxtG?{q#Ri+Aus3_)N5xwTz0aVjMnEC^PX$Xs zyjxV7yfTgka{uxZS*;>HS~S^;6DtN(upHJvvi5mgirs7{EX_u)!!X= z9T^ny>q*i`(fxZ#{hgvte8cn7bZcy0fSZ*?E04$Hw7HCHVoLVqYSy~3Ea0MdDtRlY zghPi(ymgNNzJ9?`kyzXj)5CNTNv zQge$=E%~{2pD>BaCM)ITQa`&GbU71%n^KEzSNZs?6}OHlnxFb^6d8(k1Wca+?Igoy ziuiWng&vch?c)qxD+u$mziR6|EJ)EE;FiMJhMITTj(1P5Fn2!tc>lv9lB~DDRY@mI zD+wurju#)T&g!r!k{92+HHPz&O?fKGsWLUFu+IFR(cl2h++)@i|4|~-geMN*Tul1% zF@|#*xx_KanOUUq+F_4OmvjY=tweAF{W46oOqoHLNyvkjnnI>qb(&b8#53& z0s+%hCT1q%6k2v&u8di>XTS5byX2Zw$^|$-g*)#)KzC^~$jiGrqhAsSM6R%ILNDgZ z`?X|>Ny<>?)g=$5EL8D=%Rgjub{Ro=Y?l=nFsK2Fm8@LI+Z%vQ*68bmou_!=iJWHi z5m%hF#CH~0@5s*HAPS#7Ru+$f7P_C{Ck1cgyUjuQm*q)0SfHM!(#&4y2`L9jD> zF)vAXO<;%b$J4CA!*v#CL`~CuR!{~;;1OIBT$F{jpUZ2T5NvtTdbT2LDP7mWaiK!O zPMj;N3+X&roiA|g?R&T%RS|#a&P-)|QFN_Vftzj|Rr9HtkaMG^ZjXifwwJDqt3?)yElenDxB~%qNwKa-FvB^z}+=Vo9I0iH3d2K$^gHi=i`!RMTNy z`2$UC;1e6>gARICI4a_&nkW(y-5ZGqd#yRBfGPw=!a!PI8AL~Ii}>H@KOU#S527%_ zYpkO#fQIBwQlkg1G#s=vbqPth$0)IpAfuxu>T&!|VD{`%(V;2B&EXRup;wgMu~@0W zKeBEKNhwvy`0EYm(J*ibprN&7%*Ab`O>m`~LSSLOB5I5O(qI^)=YqUACw%cZUa1lQ z&;EOAo&9*)I>~SbAFQ*(;G;eDskNiTDS5y$qefoAYZ(HJskZhL1Lkt^W@SRukvWjl zt=xg2u{yuWJp4HW(4r;JYd;*mCtI1b59!ybQ2f$d7}N6oBmcT2&s zYY_;YMwbk!$qf6!L}%4Ume%h}%uJ4D$4xH&?A{k94X;pCrDstniOk;>2~$6hR?Ux} zUakarubluIRxsvuZ5uz)Dei3g;$;`a7~`vd67Y-wnq102$P1HSbIH3wCFMX8G`b9p zW;r*G`eV>)MD4F;ydz5}XdFnvK~iykR2s~3Mh3w!$Yfgx2^d$X5G<`93|82n%6JHE zb_VgNy`faY=2FOLCFF5R-CgaWaSS!z$|V7f_ouwPG%u!{nJkDyQK~x#%k3HxNRV`GD!1SrI+8P_(l53WW zN{!Y;Cx)uAu7%9U6-m6ihbW|SGM6?y2$!sd>G?Rx3a>j;{}nZ8$q~)Mi>bpJYF3(y zB_)Jd22+l%6f;ovK!YV-e zDowGdd5~McVvw=Ufniv39L#%3bbL5y5XtEKW8cg~*)|2OoLZoNajn*8B^wZ5~d43h6Qk1pJ@OGKqMVzCr1!au*A*f{nPwZ7s;I<#%a64LbC zJBk&%nhkjezYc?w2dRW;7i8DF!%E{>Utqy-ezt$!N%aF>AGsaY@aBIbH|GH_e1G@7 zjM^Ss>Bu@!mMaO~vb745P+={6I`Y>0?EM-&+2&idUApjf658equBB}5m!&;(*6h(O zdX;o%f+qH7jM2G1_&Z5rdJJT24Q^d>>Ro(R5MwiQ{7C+!Y#Q||pU?erUijPOCF(wu ztDl@&l`Xaa&6>`T^<=kkye0#@BKv)QtL2!O1FSTrLIs*!au*bYO#F7Ymd$YX?&`wrKNCl9!U>HlIgQ^~N!T9qBS{fQ!`n+k0yb zG1=A*T;Ak4>Uwcdsk^E{4;9^U;O|mheO(_*WATsU!FV2PQ_j?*1q&jO&3Q ziBuBav^@(R*=28{jDts|#T6)ql>lIlBQP!FHB{Bt&9O_H_nme)37Vz%3o{rxGi=w| z@Rwk;Y%*Pa3Z#k|>J*>?9!kJYN#Nn5;sOsJn9Z&5HVcK>zvaBT{>SW{Jf*Su?ZXs< z=hey;A4AsCdE3k7FB@qp*DwnNu-kjEpg3J6TR*n<8T%uF?Lf;JC5N_k8Weclsds*e zJGt7-W~+V>I~zVJS4w{G*=WFl?mJm>*n{=tQs%+EC<3u%WH6^Bd=to;jgF62=`7dZ zdn)v>gW{mcq4@Tjwnnvj)`IL6(c{lu?Rd%ZpzH_eOEYzdwD1e*0 z0b-3Oicg0_^?u0tcVd0EUl0{et4~(Em%XEYlWTm*TrFhBai`2!yo+y7GGHcuhxv~SW`jQg*61t#Ac3b5C1OMY+ z%JTnJqY*TQa^yn6c5FnS9XU7Ba=*etBV2w@1JMWpuv$_wx*A_W6+(9Z7d8?Iqr*b- z{ zA`v<;zzCtDqRovQ`@JyH-V9j@7Ct!*7ZPCX%>Pb_DV|stn*smypATGHopsx`EsP3w zta{>JHj!G508(m@!i-uCE!HiZqK=2$%qE`$5h~KW3+DU8%#3)U80Th)3_BnG`WILn z=n!#ndg4&X^?u@AxsX3(nN3Mg^!bN*)@7ZOy~d>MO+-4_iLdEOq~to(*b$yju#$lJ z6U6TTdPhEdoypH1RRHdatB-dNoXng0$4b%1Aeu~HPWLCycgeOkOEcSiQba^4s!sxY z*jLSLQe;FQ*|&wtI7p#EiU~P58+^5ARjf_rFV`?(gnb<7vgEK=sIT9CQ2hQ}49VGK zgOU6p2%dVF`uEYiXsYsso%komU+;fF>;*zS;p=5jU}BF8RFr>4tdtuN{N$n?+>6zID^FZ2GY zXDr=0+laHtsY@+)OYznYb=>qvjQGH+)~QRB6T&Nsbcp0r?{9jwu{}O)IK+NH%8~43 z2YmznFP{aNBK!@dK2EKdq9tkaKkCC5A`8{n50v_#tzapH%QHaga&HTes$xv&RflF8 zyx<#}xc$#AXJGIiu+5Hx1Ei$ahTyA-f7K$UXF!BfKtOu^1hZ>WZ!VFPRR1uJs;f&W z8)IV{B8fAmI9}n4>+bxt4&Z+(7&J3shc|OahDk#4QYc4aLsXk3VW!<3)^;mP=+s@{ z-IT=S#7MY!>(E_E^{H8Z>!NNH9Lo0Azt0|J9n3S8mP> zvXTqG+P1o!AC5_UOL4?5F$d?suL~xHz{Hhb^*ha}PJPwZ4Kmz=(F@LJe@ot_%fgG= zWjY$|zUn=asOwNgYpoQ}Szt8gV*i}|YXc_;nIkU33iw`rl&W3 z&yvh{8f}O>YA;3{XThlEHN|B}h4Q3N)CjOQ>SuhU) zr7f}exj~H(*vds&G?o<`BKR~2SGcz?0eNC%rSz&)5cclBOMG4?Z*?Zz;WQp~Qohi* za|qDil5p*iA7Xrb6C1yd0~f--27Tp;OcCTW+&S(U7_t8C$&Ay}BhkB$(A}Yx#nqyTgr5 z>h5X|kjIb_>Okwp8*~zRC@1@IW0Tu^2QT#I&5}Plus~n%0~tQAv((1h!%0mmW}AOB zqP8!5CpB>ig-yjbB%q*PahbdQ6eaI;o!YPoeUojHv$Sk>_c?srv2d|?WNzm#6c=-__B18Mnq0+6KCB3!!L^Id`;T_TOgH4lF}%mc`il3&sC_1Fj;1s6W&C zv|8Bmz?YQBfefe7SpDO!<@4eL2UMm4UKhXM3^8n@Wz(>wh}ApX^x9bd;1eCwL^_o6 z1IWi{e-Pf2@{f1#%yGX6a!rf5FGPkJbd5uvqeulmc4+!l(`hzq6jhr&B$?)@8qu~+ zNS1rS&XIRJ%TH>QPpWcR#t}h2uqJ(2;RW*UIC3r-3tckl?dvX1PcJcX4OCgVs=73{ zn%LB!?$QLHyKPOIF1VKtwEPMUWS?Z60C4%>RGH7ITP^VFe>Hx4TH?M6tfRur8Bto{rKSbnbFFejRDym{iP^k|QkAQhlL@sE6Sqly?BN2h?n71ulFriH%4&FCD zEXu;?NL3K{VJ+HiE5}o;1--)LxxH+mIE-}$Vp>&4&`qhc5*hKxsV?9^sWS~U0OZTj zP4r9xEtnfjf)a<(^agEDjqR|VdzyHB7+X6@qdPJwT`7@7u%Bp{C&y;Arm7X=8<&G8 zPAo{{&Sa{dP&c)ORo2OBp#C|;u(B4V#3ju8V(={6F8)f+BJkSGr2Y!95jC#P$2;U) z=XP4BzcH7&_O*^%$ACrJ!Rw3OK#OCWjt<{}w=CvPJeHD*>-wotDYJWM)B%M#SO~#8 z%&OB+{#w2J_s*8Iz+~^J-F1~c=npC)TY0bOnf62tp`qYlQr(l6uXCB)!!?9Jq2j(+ z8~I#X{~r9#V&*61Q=k)7S;v=@dgh?50hI1$4E79#gU^BbinKYcq2F4%Ka`|4d1(NLtd=Tt5qhU3eC@yh0e5L^GoGNS0qP&oYAF(LXG9^*Cui z$Eg$HhjjkIw?7_Tm7Tx5{5dsGep5z#Z{uE}I&VcvL$)w*7SGisvEbAU2S(Ii5uAM! z8lW^VO!MZy&Z4wD5X@~B17`AUkfr>8i;`IcmGekLw)9n2OC26S(K32QqsL0Imyp<$ z2GX>Ix42WcxEa>$mhGMc!z*u(Y2| zn&6Qlm?F|x=;4g0z(D# z)Qs@YnZ=>@cLL}&)QSVUC0xH;H!o`w29D9*^7?Qd-DmN^A+Ek7 zY?G2mp_&Z)0Dj}}r)ZXLEI=cSL`t8!g?3?j1s9tppIG0d3N)(`=+9t!{3a!KS)de= zbwJwjuf?C+g+!cKM}QvTAxFB;B|`c3oc@$?rFJFBzM>+pjO4hbU@1 z4;q>|#NNO)?!wT&Or1VX&tr5!_l)st&%&dGketin6aKa>{1^_SUF?}!Y5n?DR$|aJtu0Zyd+1_e zRRQ3s!KxFL0z{Ny5;8tt6GO@Xi?;9`X++JvHQv#u!*IzVlxqqDKTxX-4b*|#(y?pV zNdrFSde!p5kzEevEj;{aY8DB3bNY&$_Xynua0lCTL_N~fGsjqrj}3Vo^?i1zrr)LX zmERwcFJCm=s?rv)Gmh7T-|gyujXwt=h!v}Lda^C>L}!WE1= zO4O3%;{z1nX!GvglaplMQ(Y+I%QRJ85Ya>3Mu2{_MX{^cm3w^lmF0-NSsD1wRXox2 z49*5^p4B;8&1+g-#&;8WsG4#}(|^qaq?ZHM;sV!VaOuS!N1AQwe?^eM7@x7Vrn9U| zaL-S#+P*H(Zf#rEMYdx_)~+;MlIX0{2b!ZHE6Ar`i2Qq)^FHeC7{v#J>Rb1!Uj$`N zewl!qYx@pq@-7!KRIV^4Cg@iSCP?(_6b#z$W7(3aVBRL2XBxIAEZ^=j@Qg4%QP#P*85g6p2%9{yT3R6Oru8c}a zq0myRuIV<54eK{6_m!~z;>bR_xJVAuhe|vKmw@0!GWOdOcq!=7-by) zzJt!u;q-97SDC8+J~g<`=ZsX0OE&*>6vtFX-ypxUv9TlY;orXGEBk3!HZY%@u`Shr zWTDq59W#2YxG=1mNqF`Z#eE86dO?Nl2Bkq7Knewk>FzMVx2G1FL%m332vVWJZbCoTnN_Mb0VHt{y!k;2J2)`9w z_m+MNq-mAVXjvdrF^F((^3c(qPH=4^39UNBTIgd?;uCWzNS!@|YHfvXxNu2~(~Jswk^oh=#zZ45mBB&g^rX6-&Znj% zKEZ}**P&nW2*?@;tn<_bW&OpJQ$#@riTLPJ_-gpl>f&cY88b=GUXA>ee2sp)9!dsE z?RysaOQpJ<1!(xz{q@XR*FVCTtvSEeR_VGHA(#)@TR#-x$dvdMUlPTFaoE0@3^}xs z&$t&McL0@4;i7mV?e%r$lFA(-*Vj`XabE0h)aWyHa`_meHL4oqpB4l|36V@9q3k*< z{~pdIocXa(rHEv>pllg13Ke`onpnB3#DI~Tkuj74Mbnn6j5wpZ=CZ_*NFm{}tN zB^?bHuOvkG?B!ALne0@DQwC6lFAB^h3GkHC&>P`-e{?n6mAZ_v$E)rjyf{-^ql+u_ zH33@UdbKl>!z>|ckWU@GK@96p?yc$>LL@uET?PPrL4CqttPaa6_2}aZe z=h;GnZ#5sGcKhbEKJ>gVCTWy_V{nMbsXBubsXxYl+=s9uC)$B)YGZU_P=nh|1VI9u z@+EVtXJoySREWq(w6W|J?5yG>J&CT{0I=i8ufnCP?oSGGz_^N4jgtzNh{(B; zpdRg#+p=14_vGxM-QX}M3-ew2fX@s|r0NNho z4E;}!vwzN769v&`)Opk$2U#qSa>}d$@oOHj*piW45^oz%@^Y#%9}fvd zc!OKYJ&^^Aw{FjAsUbJFeUnQEFfGT3W4Mpqv^kwoCX}{E#MY?#&T~E?n;??0p!e>T zt2hC-u94TtbmX$=mqBcT&$l^iW=fH}M~CwO;F!BabgCOmI2w-;JK-z3J)MeE;yl*3 zQJP!-ZX+mu&d}8S-L4yG5De8X>E_25+wj9txH^fqcwtAk7G=kh)yYu~kl5-D2v9s9 z4^uwS9KS6&s4mfEx%f+49vsxrL~T63j4)&RYA7_=VFQD(DEb8x)fY|xHZ|2!9woWB zp>?ww0fd7hlVtT=wBJg@D$V_ZxcVe|Qwul4y24rhz<*%8RP}N()|Mf2sH`ZNe?b(R z*1ApDGVDYb^hbU>P*2Pf!0Fv*ueFZ=7o{j;PtO?C&EBLisfVaE4aX2`1TDGaue$Q? zco4b@JtF#Dq*2gREPhp)WsC!P3jBcg_3<2CO*^GXVBNYN8z?~LI(wU19Ca0NrLh>- zLAWN=<5Y;J+O5G^lFxC8Hvf|9Ddo;AR$`<9Ky5p)pUmkTA_BC4m|fJ&xV*V>Wg#KG z8Q!(U(Z6vDh{CH8htF z*SYG}f9#g2tLa4;0Q>U%x-YNq<3Oni>3hF)g0mW?HbYYqV|7cw_N_2Fel^&iNk(LD z*n4#l>~V^N4+u$ARnR9$lslA}^Ikn+7GpX8R@0`Bq)dco(8;ea8)wOytIsrV<1u3| zfCeKNs~vLYGqIaeRBqg0VP8{wkA2;nb3GspN|0 zYexfT|AtHIIWC1dj-CtoX6g6lpWSMAzQW%>fI!>nO`GiXXo{GK>e}mcD6sh3bdij$ z?xFv>Q!#>o(l1{}h#x{HAHCI6xQtY!4o!O_^VHk`?GB7GJB7qlgdZB(y-kbx?HzGr z)JdzaRi+!ivrAgv>_6Cd#M`oxn1|SH9h9xvVJ~YgXw~U@h18p8olAaJMDc{*D}^0+ zYYWj3C~H~m+DIOsTxd`)*YbIEmQDHD%6U1i4*sP8@G2vw?p5V3oNcV4u=t!DU~9jb zPObHwL)ht;dKW$G1gZ)`1{Br>FchGa{LAn9d#GWJq|)zY)d$DsG}3J*U$fQ8%PcIB z6-;DP=UjU}p(G@~*~UUjyF$uv?*hjrI0DKp_f^~;|7MM%=;%mC-dN!1WAxWZYilAW zdb}SWz(L^f@S^oPhYIAC83qTa7)%vyN{ZK$je`Y^clnS!eH91;nCE|CsT1FrqEd7? zkqC3*E8>8yZd_dn)C7x~v9Q)vt18t?eNOp49^ggqI(O$5->x}Xa#l!I+@bRQT5b9) zao&Dd&zt3V7w>zGS4lt#{@yEjn*pO8x?&CjgtIMpKMCD5a^R@(TqZmy7x6h)i?|z7 zSyumayFKyfrTWoUF6vUmZVIJ8VAn&PL}r78)ylrBqKa@+&8)!A$JN`Ot*)>TMsSwl zlS8MK*3ur~4H%J$F_4Q@WR0Isk(3Dd8|e1ZzKI1we46fleua$ULXI8DM>l(*>H{F5 zgY2seK{SRTu<8mby2^T>N<+K<3mXZIa=*Z$z>uJDNH_MF=2AhoT}%dn%)&wtH5GL= zC6xYab^ugohz|Z_F2lXe^hj2c95Dy%NSM; zLM{stqlQWYVvN6H-xcR{;LIqf9p(B=5giKadN1VCe%|an9K4whbgWq!-}e! z3>}r-eHTBV(h}2>H1qb-aI5k&H$_Odh|-(c3cns1k`3sdX(qs+FKl@VOvNVlnp2{#;THTfKyv$ihKD?XK0f^>^X>+|_UU#<(S{-cCVH zMYtNHF0DubM#f)0MN$2p?8#4QTu|?fNHZ<@Wq~ZX8hnY2GstpNq-0{B?(a=*^9Q&K zr0(s%zFcC?rBAr=lvOrMe~yT3)JA0ksS|5_WHb55tn=*+#@1GDRcYYIBpy;$} ziXZC1#08WcqzMyb^v|4yYj9B50&l)L)!nyb_uj%`q1^$V4M`KcBKnx2e)Ke7Q5s>r zJI|G!J7s_rBe`bae7;)svn~Zv51GcZZ`Bg@3v^K&AKF)=H~c^7RQb)#48f|ZuP=SP z=T0tZT#eReH7&l(D;o>{>F?N+0UQc*9ldVc>uE1vpU%>BIE7FrY!28tDp1!Xz|l@I zps}P$x!fsCt6>|j_$&^T%8_QLaN!r}-JVdV&CKL|k1`*dGtPrP=~ovRQF~9m!Iu&n zY{73efn0*f>cFBQ($U`MYe>KGs9|d%+fa}J=@Pc;6YSYl4ndZ*r0uafpkKd(wLHo! z1-{E#@$O8}JXUl!@lwJ{YAhvk{u?=Q+L<;^z%6kt7Sw2dm><1MXI8LB&3A;|@{5JO zrY6LQ5q=n9ra8;(9cKiMV{RAsVo3_yn&iqT8Rm<>O=$!BBn++)pY?;BVYGRxdcLe% za$^lG!<7Xv-2Rv5;?E`_@P7Cx!IV>xWye35{_kmY<-YZy^rcnupg%{EK?J1A{RjHN z$EQ?@%v{n|L4*=}Zz$K%+i((D6^Zlb6mjrS%WC#a0E64-aN?S+(~*RbIfkF|LeO4% zsvAKZy53!~GI+q<~W1cMIzQ{|G*D+FwPSCYEKr36E9j{JnTWsP& zg4dcFn;N~BHxa*&ig6p69R;)g;^-r3UJ5I(JC|{OFAHkAIe1vbrc-2KFdmS zYUim4xN>y9*=qXy<5WPNRIJqg8h-HGF>l*;IlVQJz(Se^@J0K{dD4(mLP_=^dT%;E><|f0(a;FrKG5x#Z~{O_!K@V*g=7>nZybvf@t6OSweUlyE|=-91oD8R-Y( zY{y@5s3$XWtV;*Bb1-}l2dyC1sln6=r76l!EmZO`4r2NX`U{iLLbYcO}aPeoJJvDu~J zp6=OSAh^|UGN;S+sBNk~8;NeeCeEGCtFR`;DMBuRi?6UzSN_)jh0CdObXXZjmuO7b z_dCzW?877dY2>pm8yKfW?pAB_r@1K!`aWAd4k-H})L+}(%(p6Rqq!H?>tu|Nfa;9(S6dLI@X>h)gHDLo9^ES)?N6k34#rr_Grc=Wb&*aojYvfNtGv$6B($uC(URS%b84xQ;XG+2m_uSaKwW@$>O`o1AXao{4!VWc=$P z@DNH&D_mJ)WxrJT(l9yHtslIRK=hG6Me;jj3}MBpq46PGHaF4q=lb*_QF6+et5PK= zc>fg7ZgM5H+G)iM<;-7Q!+^o3)S?12$kqAp)suzN)|cDmhIojG`%#p(li_%)o2|08 zH$n`}3jSXo2uk6N@;TPFxdTp1Vf4o)z{)#YIxVfIGs$+IvBmKfj(%d!*vb2M#g1BS z8I$~E<$r~fOU;OAYPVW7a}cGcq}9ne_P1+8Kc!PbNu6edq%%X*?~WT>8wIROzc{Zw zb@DgqLyE^2v}Vw`czOMe)-9$*PWPiS-6m2%PP*ei>KD~Jspms*u7R8WnA)yX#?-b1FrYj9ixDmXeKSQh3-8 z0g-j4tOcAk43ymFZOTn;`#g}mg?@jyh^P}XaapdwkRuHd`8GRMxMxyqL%ogHh4yT; z-3DvCh}uAqx#+-d6u~T0K~9vQ5dA{6ZIaPcR5NCWr$cCfauoMtWm{$)cviH*y!-+F zWtHh|NWX?ePL<;U!{=VeudUK*g%ebqn!#}dKS{;DJ9S}ooxf>`x<5GnJ?F5?Z*7JY zR;a7ip}!y7=W$-r=zDMr_s#(?7M%2;*2NHa0eBcfjPBc`vg+SV3b}l%x|Y+kS-?-Dkwhf z)69Q%yZOX*yoaI-Oo*$Ug0s;~%ab z{=7EvBw#(%^LQ*!&P{~mwH~g9+p@M2?TblZF<9a`?o_$AYDFBZ0z}$M+O_BeSt+XR zAon6t#&v(X5f+j3l||t{NW*svV%0(j+AGHSw#U?*QXo;iT&jlrDfD`t-*-p9f$Bnl zjsmI7$us?xYQ-7#*#7@7!U!y;C z&_2*zzCR;yYaXYt0mP?|UCI+K9GxP4q)nE6YHew6?-#DV_0t_7-T!(i<=QRAP`@)K z6N>*{n2iv5Q;YDUZdBel)tz5A0B_-QNJB$GI!Hx7c(j&k(~f<}@OB*343m;vuxST+ z5u6ty$#@TcRhY9-n*HK{7?i&BTRF9>HI*Seba+)T>q;n_6`0M(VR+F9vl(SgXA~mn zA4K^+D!{r2gTtC9LN=qMOjneO@G2%^d(!_FfL;`pK~zlH6HgDFGat7$!h)aOpNu*a?6yiO6h zi);#S*Uyp*2mlI#TVVp*yg;Xb1{S3apWmamA{l0m?e)D-Iac);Pay! z3E~eLo!ueqC^RWi_W-}O6hBgVEb?_*Z-Yx&-N^;x!TY9g%UhdmK@`qO^?38zZ4xq% zfwu;@KwA`q7?^_Y1yr$|6l|Lsb3IA_h3Bc)W_Fhj4k z<&QDv{t9TmI(c1dr@~#&XqN+f?(t^;6~VF~3Ei@*vW}5;o%|+<|E;U$7fYUtfZ9dt z$_%#v&)E3ku@#(bF=ym03?zGxLeb`L$Oq*zfa`nqQHJS78ZYrx8kf?ozre9`3UKhV^MNF@-XZxx;@PxN9PA+5Y)eRP&{Q^^2roJNe=Txn za>V}z9Gv`o|BK_{;1T#=Ivzf55PJ^Ye=gO_iGkz=9p?Bj@cmB}503!X|Kj+0_(0*g zLcsr2a|v*AasLlBmjD+R`~T*6|MyvL_W$`3mjEyO|D*GCH@9>A=8h;VjL4>G=l=~P Rn#Tsufk;Cmttx}~{{ag0=bZom diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index 78a73f0..7d832e7 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -87,20 +87,20 @@ fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) /* x == modulus, y == value to invert */ if ((res = mp_copy (b, &x)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* we need y = |a| */ if ((res = mp_abs (a, &y)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } mp_set (&D, 1); @@ -109,17 +109,17 @@ top: while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 4.2 if B is odd then */ if (mp_isodd (&B) == 1) { if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* B = B/2 */ if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -127,18 +127,18 @@ top: while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 5.2 if D is odd then */ if (mp_isodd (&D) == 1) { /* D = (D-x)/2 */ if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* D = D/2 */ if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -146,20 +146,20 @@ top: if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } else { /* v - v - u, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -173,21 +173,21 @@ top: /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; - goto __ERR; + goto LBL_ERR; } /* b is now the inverse */ neg = a->sign; while (D.sign == MP_NEG) { if ((res = mp_add (&D, b, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } mp_exch (&D, c); c->sign = neg; res = MP_OKAY; -__ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); return res; } #endif @@ -420,7 +420,7 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* clear the carry */ _W = 0; - for (ix = 0; ix <= pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty; int iy; mp_digit *tmpx, *tmpy; @@ -450,6 +450,9 @@ fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) _W = _W >> ((mp_word)DIGIT_BIT); } + /* store final carry */ + W[ix] = _W; + /* setup dest */ olduse = c->used; c->used = digs; @@ -519,7 +522,7 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* number of output digits to produce */ pa = a->used + b->used; _W = 0; - for (ix = digs; ix <= pa; ix++) { + for (ix = digs; ix < pa; ix++) { int tx, ty, iy; mp_digit *tmpx, *tmpy; @@ -547,6 +550,9 @@ fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } + + /* store final carry */ + W[ix] = _W; /* setup dest */ olduse = c->used; @@ -636,7 +642,7 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* number of output digits to produce */ W1 = 0; - for (ix = 0; ix <= pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty, iy; mp_word _W; mp_digit *tmpy; @@ -1539,23 +1545,23 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) mp_set(&tq, 1); n = mp_count_bits(a) - mp_count_bits(b); - if (((res = mp_copy(a, &ta)) != MP_OKAY) || - ((res = mp_copy(b, &tb)) != MP_OKAY) || + if (((res = mp_abs(a, &ta)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } while (n-- >= 0) { if (mp_cmp(&tb, &ta) != MP_GT) { if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } } if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { - goto __ERR; + goto LBL_ERR; } } @@ -1564,13 +1570,13 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); if (c != NULL) { mp_exch(c, &q); - c->sign = n2; + c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; } if (d != NULL) { mp_exch(d, &ta); - d->sign = n; + d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; } -__ERR: +LBL_ERR: mp_clear_multi(&ta, &tb, &tq, &q, NULL); return res; } @@ -1619,19 +1625,19 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) q.used = a->used + 2; if ((res = mp_init (&t1)) != MP_OKAY) { - goto __Q; + goto LBL_Q; } if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; + goto LBL_T1; } if ((res = mp_init_copy (&x, a)) != MP_OKAY) { - goto __T2; + goto LBL_T2; } if ((res = mp_init_copy (&y, b)) != MP_OKAY) { - goto __X; + goto LBL_X; } /* fix the sign */ @@ -1643,10 +1649,10 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) if (norm < (int)(DIGIT_BIT-1)) { norm = (DIGIT_BIT-1) - norm; if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } } else { norm = 0; @@ -1658,13 +1664,13 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ - goto __Y; + goto LBL_Y; } while (mp_cmp (&x, &y) != MP_LT) { ++(q.dp[n - t]); if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } } @@ -1706,7 +1712,7 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) t1.dp[1] = y.dp[t]; t1.used = 2; if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* find right hand */ @@ -1718,27 +1724,27 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ if (x.sign == MP_NEG) { if ((res = mp_copy (&y, &t1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; @@ -1765,11 +1771,11 @@ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) res = MP_OKAY; -__Y:mp_clear (&y); -__X:mp_clear (&x); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); -__Q:mp_clear (&q); +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); +LBL_Q:mp_clear (&q); return res; } @@ -2199,7 +2205,7 @@ int mp_dr_is_modulus(mp_int *a) * Based on algorithm from the paper * * "Generating Efficient Primes for Discrete Log Cryptosystems" - * Chae Hoon Lim, Pil Loong Lee, + * Chae Hoon Lim, Pil Joong Lee, * POSTECH Information Research Laboratories * * The modulus must be of a special format [see manual] @@ -2457,7 +2463,7 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) return err; #else /* no invmod */ - return MP_VAL + return MP_VAL; #endif } @@ -2588,11 +2594,11 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) #ifdef BN_MP_MONTGOMERY_SETUP_C /* now setup montgomery */ if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { - goto __M; + goto LBL_M; } #else err = MP_VAL; - goto __M; + goto LBL_M; #endif /* automatically pick the comba one if available (saves quite a few calls/ifs) */ @@ -2608,7 +2614,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) redux = mp_montgomery_reduce; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } } else if (redmode == 1) { @@ -2618,24 +2624,24 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) redux = mp_dr_reduce; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } else { #if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) /* setup DR reduction for moduli of the form 2**k - b */ if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { - goto __M; + goto LBL_M; } redux = mp_reduce_2k; #else err = MP_VAL; - goto __M; + goto LBL_M; #endif } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { - goto __M; + goto LBL_M; } /* create M table @@ -2649,45 +2655,45 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* now we need R mod m */ if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } #else err = MP_VAL; - goto __RES; + goto LBL_RES; #endif /* now set M[1] to G * R mod m */ if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } else { mp_set(&res, 1); if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* 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 __RES; + goto LBL_RES; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* 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 __RES; + goto LBL_RES; } if ((err = redux (&M[x], P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } @@ -2727,10 +2733,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* 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; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } continue; } @@ -2744,19 +2750,19 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* empty window and reset */ @@ -2771,10 +2777,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* get next bit of the window */ @@ -2782,10 +2788,10 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } } @@ -2799,15 +2805,15 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) * of R. */ if ((err = redux(&res, P, mp)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* swap res with Y */ mp_exch (&res, Y); err = MP_OKAY; -__RES:mp_clear (&res); -__M: +LBL_RES:mp_clear (&res); +LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); @@ -3059,7 +3065,7 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) } if ((res = mp_init_copy (&v, b)) != MP_OKAY) { - goto __U; + goto LBL_U; } /* must be positive for the remainder of the algorithm */ @@ -3073,24 +3079,24 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) if (k > 0) { /* divide the power of two out */ if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_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; + goto LBL_V; } } if (v_lsb != k) { if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } } @@ -3103,23 +3109,23 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* subtract smallest from largest */ if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { - goto __V; + goto LBL_V; } /* Divide out all factors of two */ if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { - goto __V; + goto LBL_V; } } /* multiply by 2**k which we divided out at the beginning */ if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { - goto __V; + goto LBL_V; } c->sign = MP_ZPOS; res = MP_OKAY; -__V:mp_clear (&u); -__U:mp_clear (&v); +LBL_V:mp_clear (&u); +LBL_U:mp_clear (&v); return res; } #endif @@ -3556,24 +3562,24 @@ int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) /* x = a, y = b */ if ((res = mp_copy (a, &x)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (b, &y)) != MP_OKAY) { - goto __ERR; + goto LBL_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; - goto __ERR; + goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } mp_set (&A, 1); mp_set (&D, 1); @@ -3583,24 +3589,24 @@ top: while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 4.2 if A or B is odd then */ 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 LBL_ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* A = A/2, B = B/2 */ if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -3608,24 +3614,24 @@ top: while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* 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 LBL_ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* C = C/2, D = D/2 */ if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -3633,28 +3639,28 @@ top: 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 __ERR; + goto LBL_ERR; } if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } else { /* v - v - u, C = C - A, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } @@ -3667,27 +3673,27 @@ top: /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; - goto __ERR; + goto LBL_ERR; } /* if its too low */ while (mp_cmp_d(&C, 0) == MP_LT) { if ((res = mp_add(&C, b, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } } /* too big */ while (mp_cmp_mag(&C, b) != MP_LT) { if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { - goto __ERR; + goto LBL_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); +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } #endif @@ -3856,13 +3862,13 @@ int mp_jacobi (mp_int * a, mp_int * p, int *c) } if ((res = mp_init (&p1)) != MP_OKAY) { - goto __A1; + goto LBL_A1; } /* divide out larger power of two */ k = mp_cnt_lsb(&a1); if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } /* step 4. if e is even set s=1 */ @@ -3890,18 +3896,18 @@ int mp_jacobi (mp_int * a, mp_int * p, int *c) } else { /* n1 = n mod a1 */ if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { - goto __P1; + goto LBL_P1; } *c = s * r; } /* done */ res = MP_OKAY; -__P1:mp_clear (&p1); -__A1:mp_clear (&a1); +LBL_P1:mp_clear (&p1); +LBL_A1:mp_clear (&a1); return res; } #endif @@ -4227,20 +4233,20 @@ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) /* t1 = get the GCD of the two inputs */ if ((res = mp_gcd (a, b, &t1)) != MP_OKAY) { - goto __T; + goto LBL_T; } /* divide the smallest by the GCD */ if (mp_cmp_mag(a, b) == MP_LT) { /* store quotient in t2 such that t2 * b is the LCM */ if ((res = mp_div(a, &t1, &t2, NULL)) != MP_OKAY) { - goto __T; + goto LBL_T; } res = mp_mul(b, &t2, c); } else { /* store quotient in t2 such that t2 * a is the LCM */ if ((res = mp_div(b, &t1, &t2, NULL)) != MP_OKAY) { - goto __T; + goto LBL_T; } res = mp_mul(a, &t2, c); } @@ -4248,7 +4254,7 @@ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) /* fix the sign to positive */ c->sign = MP_ZPOS; -__T: +LBL_T: mp_clear_multi (&t1, &t2, NULL); return res; } @@ -4402,7 +4408,7 @@ mp_mod_2d (mp_int * a, int b, mp_int * c) } /* if the modulus is larger than the value than return */ - if (b > (int) (a->used * DIGIT_BIT)) { + if (b >= (int) (a->used * DIGIT_BIT)) { res = mp_copy (a, c); return res; } @@ -5085,11 +5091,11 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) } if ((res = mp_init (&t2)) != MP_OKAY) { - goto __T1; + goto LBL_T1; } if ((res = mp_init (&t3)) != MP_OKAY) { - goto __T2; + goto LBL_T2; } /* if a is negative fudge the sign but keep track */ @@ -5102,52 +5108,52 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) do { /* t1 = t2 */ if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t2 = t1 - ((t1**b - a) / (b * t1**(b-1))) */ /* t3 = t1**(b-1) */ if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* numerator */ /* t2 = t1**b */ if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t2 = t1**b - a */ if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* denominator */ /* t3 = t1**(b-1) * b */ if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } /* t3 = (t1**b - a)/(b * t1**(b-1)) */ if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } } while (mp_cmp (&t1, &t2) != MP_EQ); /* result can be off by a few so check */ for (;;) { if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { - goto __T3; + goto LBL_T3; } } else { break; @@ -5165,9 +5171,9 @@ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) res = MP_OKAY; -__T3:mp_clear (&t3); -__T2:mp_clear (&t2); -__T1:mp_clear (&t1); +LBL_T3:mp_clear (&t3); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); return res; } #endif @@ -5304,7 +5310,7 @@ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { - goto __T; + goto LBL_T; } /* is it equal to b? */ @@ -5313,7 +5319,7 @@ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) } err = MP_OKAY; -__T:mp_clear (&t); +LBL_T:mp_clear (&t); return err; } #endif @@ -5352,8 +5358,8 @@ int mp_prime_is_divisible (mp_int * a, int *result) *result = MP_NO; for (ix = 0; ix < PRIME_SIZE; ix++) { - /* what is a mod __prime_tab[ix] */ - if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { + /* what is a mod LBL_prime_tab[ix] */ + if ((err = mp_mod_d (a, ltm_prime_tab[ix], &res)) != MP_OKAY) { return err; } @@ -5410,7 +5416,7 @@ int mp_prime_is_prime (mp_int * a, int t, int *result) /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { - if (mp_cmp_d(a, __prime_tab[ix]) == MP_EQ) { + if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { *result = 1; return MP_OKAY; } @@ -5433,20 +5439,20 @@ int mp_prime_is_prime (mp_int * a, int t, int *result) for (ix = 0; ix < t; ix++) { /* set the prime */ - mp_set (&b, __prime_tab[ix]); + mp_set (&b, ltm_prime_tab[ix]); if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { - goto __B; + goto LBL_B; } if (res == MP_NO) { - goto __B; + goto LBL_B; } } /* passed the test */ *result = MP_YES; -__B:mp_clear (&b); +LBL_B:mp_clear (&b); return err; } #endif @@ -5496,12 +5502,12 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) return err; } if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { - goto __N1; + goto LBL_N1; } /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { - goto __N1; + goto LBL_N1; } /* count the number of least significant bits @@ -5511,15 +5517,15 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* now divide n - 1 by 2**s */ if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { - goto __R; + goto LBL_R; } /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { - goto __R; + goto LBL_R; } if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { - goto __Y; + goto LBL_Y; } /* if y != 1 and y != n1 do */ @@ -5528,12 +5534,12 @@ int 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 LBL_Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { - goto __Y; + goto LBL_Y; } ++j; @@ -5541,15 +5547,15 @@ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* if y != n1 then composite */ if (mp_cmp (&y, &n1) != MP_EQ) { - goto __Y; + goto LBL_Y; } } /* probably prime now */ *result = MP_YES; -__Y:mp_clear (&y); -__R:mp_clear (&r); -__N1:mp_clear (&n1); +LBL_Y:mp_clear (&y); +LBL_R:mp_clear (&r); +LBL_N1:mp_clear (&n1); return err; } #endif @@ -5594,10 +5600,10 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) a->sign = MP_ZPOS; /* simple algo if a is less than the largest prime in the table */ - if (mp_cmp_d(a, __prime_tab[PRIME_SIZE-1]) == MP_LT) { + if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { /* find which prime it is bigger than */ for (x = PRIME_SIZE - 2; x >= 0; x--) { - if (mp_cmp_d(a, __prime_tab[x]) != MP_LT) { + if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { if (bbs_style == 1) { /* ok we found a prime smaller or * equal [so the next is larger] @@ -5605,17 +5611,17 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) * however, the prime must be * congruent to 3 mod 4 */ - if ((__prime_tab[x + 1] & 3) != 3) { + if ((ltm_prime_tab[x + 1] & 3) != 3) { /* scan upwards for a prime congruent to 3 mod 4 */ for (y = x + 1; y < PRIME_SIZE; y++) { - if ((__prime_tab[y] & 3) == 3) { - mp_set(a, __prime_tab[y]); + if ((ltm_prime_tab[y] & 3) == 3) { + mp_set(a, ltm_prime_tab[y]); return MP_OKAY; } } } } else { - mp_set(a, __prime_tab[x + 1]); + mp_set(a, ltm_prime_tab[x + 1]); return MP_OKAY; } } @@ -5653,7 +5659,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* generate the restable */ for (x = 1; x < PRIME_SIZE; x++) { - if ((err = mp_mod_d(a, __prime_tab[x], res_tab + x)) != MP_OKAY) { + if ((err = mp_mod_d(a, ltm_prime_tab[x], res_tab + x)) != MP_OKAY) { return err; } } @@ -5679,8 +5685,8 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) res_tab[x] += kstep; /* subtract the modulus [instead of using division] */ - if (res_tab[x] >= __prime_tab[x]) { - res_tab[x] -= __prime_tab[x]; + if (res_tab[x] >= ltm_prime_tab[x]) { + res_tab[x] -= ltm_prime_tab[x]; } /* set flag if zero */ @@ -5692,7 +5698,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* add the step */ if ((err = mp_add_d(a, step, a)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } /* if didn't pass sieve and step == MAX then skip test */ @@ -5702,9 +5708,9 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) /* is this prime? */ for (x = 0; x < t; x++) { - mp_set(&b, __prime_tab[t]); + mp_set(&b, ltm_prime_tab[t]); if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { - goto __ERR; + goto LBL_ERR; } if (res == MP_NO) { break; @@ -5717,7 +5723,7 @@ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) } err = MP_OKAY; -__ERR: +LBL_ERR: mp_clear(&b); return err; } @@ -5828,7 +5834,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback } /* calc the byte size */ - bsize = (size>>3)+(size&7?1:0); + bsize = (size>>3) + ((size&7)?1:0); /* we need a buffer of bsize bytes */ tmp = OPT_CAST(unsigned char) XMALLOC(bsize); @@ -5837,7 +5843,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback } /* calc the maskAND value for the MSbyte*/ - maskAND = 0xFF >> (8 - (size & 7)); + maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); /* calc the maskOR_msb */ maskOR_msb = 0; @@ -5846,7 +5852,7 @@ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback maskOR_msb |= 1 << ((size - 2) & 7); } else if (flags & LTM_PRIME_2MSB_OFF) { maskAND &= ~(1 << ((size - 2) & 7)); - } + } /* get the maskOR_lsb */ maskOR_lsb = 0; @@ -7996,7 +8002,7 @@ mp_zero (mp_int * a) * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org */ -const mp_digit __prime_tab[] = { +const mp_digit ltm_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, @@ -8261,10 +8267,10 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* create mu, used for Barrett reduction */ if ((err = mp_init (&mu)) != MP_OKAY) { - goto __M; + goto LBL_M; } if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } /* create M table @@ -8276,23 +8282,23 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { - goto __MU; + goto LBL_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; + goto LBL_MU; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { - goto __MU; + goto LBL_MU; } if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } @@ -8301,16 +8307,16 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) */ 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; + goto LBL_MU; } if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { - goto __MU; + goto LBL_MU; } mp_set (&res, 1); @@ -8350,10 +8356,10 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* 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; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } continue; } @@ -8367,19 +8373,19 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } /* empty window and reset */ @@ -8394,20 +8400,20 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { - goto __RES; + goto LBL_RES; } } } @@ -8415,9 +8421,9 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) mp_exch (&res, Y); err = MP_OKAY; -__RES:mp_clear (&res); -__MU:mp_clear (&mu); -__M: +LBL_RES:mp_clear (&res); +LBL_MU:mp_clear (&mu); +LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); diff --git a/tommath.h b/tommath.h index 896d389..7cc92c2 100644 --- a/tommath.h +++ b/tommath.h @@ -442,7 +442,7 @@ int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); #endif /* table of first PRIME_SIZE primes */ -extern const mp_digit __prime_tab[]; +extern const mp_digit ltm_prime_tab[]; /* result=1 if a is divisible by one of the first PRIME_SIZE primes */ int mp_prime_is_divisible(mp_int *a, int *result); diff --git a/tommath.pdf b/tommath.pdf index 18cac6f2db318bf5fb3dae69c62855dfbce54bbe..88e2dc7ae7dd5bd518aa241f5048333082ce753c 100644 GIT binary patch delta 219089 zcmV)JK)b)P-bT>hMvzEmK|pv5C;4*7kW z+c*Ia1beBfuI8CgV1$N~?{2Ej)#n#UhOIgi7E|TwCUVzc5}(WfXG)UhtxA22SO!iL zWjSz8nyI?^I=zqm)X%rg?@Akx+DR;IPSwrs=OIJ|2cewH(c@)*+ $dI4N>mNVbi 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