From b1756f2f9872a2981a6fea650d40fe5eedb561e7 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Sat, 22 Mar 2003 15:10:20 +0000 Subject: [PATCH] added libtommath-0.15 --- bn.pdf | Bin 168836 -> 233107 bytes bn.tex | 376 ++- bn_fast_mp_invmod.c | 1 - bn_mp_div.c | 6 +- bn_mp_div_2d.c | 4 +- bn_mp_div_d.c | 1 - bn_mp_dr_reduce.c | 150 + bn_mp_exptmod.c | 7 +- bn_mp_exptmod_fast.c | 65 +- bn_mp_grow.c | 2 +- bn_mp_init.c | 2 +- bn_mp_init_size.c | 2 +- bn_mp_lshd.c | 4 +- bn_mp_mul_2d.c | 8 +- bn_mp_prime_fermat.c | 52 + bn_mp_prime_is_divisible.c | 50 + bn_mp_prime_is_prime.c | 68 + bn_mp_prime_miller_rabin.c | 90 + bn_mp_prime_next_prime.c | 54 + bn_mp_rshd.c | 8 +- bn_mp_shrink.c | 2 +- bn_prime_tab.c | 52 + bn_radix.c | 2 +- bn_s_mp_add.c | 6 +- bncore.c | 2 - changes.txt | 11 + demo/demo.c | 54 +- etc/drprime.c | 53 + etc/drprimes.1 | 23 + etc/makefile | 5 +- etc/makefile.msvc | 5 +- etc/tune.c | 12 +- makefile | 7 +- makefile.msvc | 5 +- mtest/mtest.c | 6 +- pre_gen/mpi.c | 5993 ++++++++++++++++++++++++++++++++++++ tommath.h | 56 +- 37 files changed, 7154 insertions(+), 90 deletions(-) create mode 100644 bn_mp_dr_reduce.c create mode 100644 bn_mp_prime_fermat.c create mode 100644 bn_mp_prime_is_divisible.c create mode 100644 bn_mp_prime_is_prime.c create mode 100644 bn_mp_prime_miller_rabin.c create mode 100644 bn_mp_prime_next_prime.c create mode 100644 bn_prime_tab.c create mode 100644 etc/drprime.c create mode 100644 etc/drprimes.1 create mode 100644 pre_gen/mpi.c diff --git a/bn.pdf b/bn.pdf index 59de4e33450cf32a217fc93aa7600c793c35bd0b..596c4402b085876b6b6700ee8eba48ed1ca903d7 100644 GIT binary patch delta 187529 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

3_3X^PLeJi%XRtMRC=~Eaq7O3ILs4>Oy{=G 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

#r4y)g&Mm{~e{!laBj} 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 Primes <--- */ +/* table of first 256 primes */ +extern const mp_digit __prime_tab[]; + +/* result=1 if a is divisible by one of the first 256 primes */ +int mp_prime_is_divisible(mp_int *a, int *result); + +/* performs one Fermat test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_fermat(mp_int *a, mp_int *b, int *result); + +/* performs one Miller-Rabin test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); + +/* performs t rounds of Miller-Rabin on "a" using the first + * t prime bases. Also performs an initial sieve of trial + * division. Determines if "a" is prime with probability + * of error no more than (1/4)^t. + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int mp_prime_is_prime(mp_int *a, int t, int *result); + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + */ +int mp_prime_next_prime(mp_int *a, int t); +\end{verbatim} + \subsection{Radix Conversions} To read or store integers in other formats there are the following functions. @@ -533,23 +592,131 @@ $n$ is prime then $\left ( {a \over n} \right )$ is equal to $1$ if $a$ is a qua it is not. \subsubsection{mp\_exptmod(mp\_int *a, mp\_int *b, mp\_int *c, mp\_int *d)} -Computes $d = a^b \mbox{ (mod }c\mbox{)}$ using a sliding window $k$-ary exponentiation algorithm. For an $\alpha$-bit +Computes $d \equiv a^b \mbox{ (mod }c\mbox{)}$ using a sliding window $k$-ary exponentiation algorithm. For an $\alpha$-bit exponent it performs $\alpha$ squarings and at most $\lfloor \alpha/k \rfloor + 2^{k-1}$ multiplications. The value of $k$ is -chosen to minimize the number of multiplications required for a given value of $\alpha$. Barrett or Montgomery -reductions are used to reduce the squared or multiplied temporary results modulo $c$. +chosen to minimize the number of multiplications required for a given value of $\alpha$. Barrett, Montgomery or +Dimminished-Radix reductions are used to reduce the squared or multiplied temporary results modulo $c$. \subsection{Fast Modular Reductions} +A modular reduction of $a \mbox{ (mod }b\mbox{)}$ means to divide $a$ by $b$ and obtain the remainder. +Typically modular reductions are popular in public key cryptography algorithms such as RSA, +Diffie-Hellman and Elliptic Curve. Modular reductions are also a large portion of modular exponentiation +(e.g. $a^b \mbox{ (mod }c\mbox{)}$). + +In a simplistic sense a normal integer division could be used to compute reduction. Division is by far +the most complicated of routines in terms of the work required. As a result it is desirable to avoid +division as much as possible. This is evident in quite a few fields in computing. For example, often in +signal analysis uses multiplication by the reciprocal to approximate divisions. Number theory is no +different. + +In most cases for the reduction of $a$ modulo $b$ the integer $a$ will be limited to the range +$0 \le a \le b^2$ which led to the invention of specialized algorithms to do the work. + +The first algorithm is the most generic and is called the Barrett reduction. When the input is of the +limited form (e.g. $0 \le a \le b^2$) Barrett reduction is numerically equivalent to a full integer +division with remainder. For a $n$-digit value $b$ the Barrett reduction requires approximately $2n^2$ +multiplications. + +The second algorithm is the Montgomery reduction. It is slightly different since the result is not +numerically equivalent to a standard integer division with remainder. Also this algorithm only works for +odd moduli. The final result can be converted easily back to the desired for which makes the reduction +technique useful for algorithms where only the final output is desired. For a $n$-digit value $b$ the +Montgomery reduction requires approximately $n^2 + n$ multiplications, about half as many as the +Barrett algorithm. + +The third algorithm is the Diminished Radix ``DR'' reduction. It is a highly optimized reduction algorithm +suitable only for a limited set of moduli. For the specific moduli it is numerically equivalent to +integer division with remainder. For a $n$-digit value $b$ the DR reduction rquires exactly $n$ +multiplications which is considerably faster than either of the two previous algorithms. + +All three algorithms are automatically used in the modular exponentiation function mp\_exptmod() when +appropriate moduli are detected. + +\begin{figure}[here] +\begin{small} +\begin{center} +\begin{tabular}{|c|c|l|} +\hline \textbf{Algorithm} & \textbf{Multiplications} & \textbf{Limitations} \\ + Barrett Reduction & $2n^2$ & Any modulus. \\ + Montgomery Reduction & $n^2 + n$ & Any odd modulus. \\ + DR Reduction & $n$ & Moduli of the form $p = \beta^k - p'$.\\ +\hline +\end{tabular} +\caption{Summary of reduction techniques.} +\end{center} +\end{small} +\end{figure} + \subsubsection{mp\_reduce(mp\_int *a, mp\_int *b, mp\_int *c)} Computes a Barrett reduction in-place of $a$ modulo $b$ with respect to $c$. In essence it computes -$a \equiv a \mbox{ (mod }b\mbox{)}$ provided $0 \le a \le b^2$. The value of $c$ is precomputed with the +$a \mbox{ (mod }b\mbox{)}$ provided $0 \le a \le b^2$. The value of $c$ is precomputed with the function mp\_reduce\_setup(). The modulus $b$ must be larger than zero. +This reduction function is much faster than simply calling mp\_mod() (\textit{Which simply uses mp\_div() anyways}) and is +desirable where ever an appropriate reduction is desired. + The Barrett reduction function has been optimized to use partial multipliers which means compared to MPI it performs have the number of single precision multipliers (\textit{provided they have the same size digits}). The partial multipliers (\textit{one of which is shared with mp\_mul}) both have baseline and comba variants. Barrett reduction can reduce a number modulo a $n-$digit modulus with approximately $2n^2$ single precision multiplications. +Consider the following snippet (from a BBS generator) using the more traditional approach: + +\begin{small} +\begin{verbatim} + mp_int modulus, n; + unsigned char buf[128]; + int ix, err; + + /* ... init code ..., e.g. init modulus and n */ + /* now output 128 bytes */ + for (ix = 0; ix < 128; ix++) { + if ((err = mp_sqrmod(&n, &modulus, &n)) != MP_OKAY) { + printf("Err: %d\n", err); + exit(EXIT_FAILURE); + } + buf[ix] = n->dp[0] & 255; + } +\end{verbatim} +\end{small} + +And now consider the same function using Barrett reductions: + +\begin{small} +\begin{verbatim} + mp_int modulus, n, mp; + unsigned char buf[128]; + int ix, err; + + /* ... init code ... e.g. modulus and n */ + + /* now setup mp which is the Barrett param */ + if ((err = mp_reduce_setup(&mp, &modulus)) != MP_OKAY) { + printf("Err: %d\n", err); + exit(EXIT_FAILURE); + } + /* now output 128 bytes */ + for (ix = 0; ix < 128; ix++) { + /* square n */ + if ((err = mp_sqr(&n, &n)) != MP_OKAY) { + printf("Err: %d\n", err); + exit(EXIT_FAILURE); + } + /* now reduce the square modulo modulus */ + if ((err = mp_reduce(&n, &modulus, &mp)) != MP_OKAY) { + printf("Err: %d\n", err); + exit(EXIT_FAILURE); + } + buf[ix] = n->dp[0] & 255; + } +\end{verbatim} +\end{small} + +Both routines will produce the same output provided the same initial values of $modulus$ and $n$. The Barrett +method seems like more work but the optimization stems from the use of the Barrett reduction instead of the normal +integer division. + \subsubsection{mp\_montgomery\_reduce(mp\_int *a, mp\_int *m, mp\_digit mp)} Computes a Montgomery reduction in-place of $a$ modulo $b$ with respect to $mp$. If $b$ is some $n-$digit modulus then $R = \beta^{n+1}$. The result of this function is $aR^{-1} \mbox{ (mod }b\mbox{)}$ provided that $0 \le a \le b^2$. @@ -576,7 +743,95 @@ Now all the variables in the system can be multiplied by $\hat x$ and reduced wi two long divisions would be required to setup $\hat x$ and a multiplication followed by reduction for each variable. A very useful observation is that multiplying by $R = \beta^n$ amounts to performing a left shift by $n$ positions which -requires no single precision multiplications. +requires no single precision multiplications. + +\subsubsection{mp\_dr\_reduce(mp\_int *a, mp\_int *b, mp\_digit mp)} +Computes the Diminished-Radix reduction of $a$ in place modulo $b$ with respect to $mp$. $a$ must be in the range +$0 \le a \le b^2$ and $mp$ must be precomputed with the function mp\_dr\_setup(). + +This reduction technique performs the reduction with $n$ multiplications and is much faster than either of the previous +reduction methods. Essentially it is very much like the Montgomery reduction except it is particularly optimized for +specific types of moduli. The moduli must be of the form $p = \beta^k - p'$ where $0 \le p' < \beta$ for $k \ge 2$. +This algorithm is suitable for several applications such as Diffie-Hellman public key cryptsystems where the prime $p$ is +of this form. + +In appendix A several ``safe'' primes of various sizes are provided. These primes are DR moduli and of the form +$p = 2q + 1$ where both $p$ and $q$ are prime. A trivial observation is that $g = 4$ will be a generator for all of them +since the order of the multiplicative sub-group is at most $2q$. Since $2^2 \ne 1$ that means $4^q \equiv 2^{2q} \equiv 1$ +and that $g = 4$ is a generator of order $q$. + +These moduli can be used to construct a Diffie-Hellman public key cryptosystem. Since the moduli are of the +DR form the modular exponentiation steps will be efficient. + +\subsection{Primality Testing and Generation} + +\subsubsection{mp\_prime\_is\_divisible(mp\_int *a, int *result)} +Determines if $a$ is divisible by any of the first 256 primes. Sets $result$ to $1$ if true or $0$ +otherwise. Also will set $result$ to $1$ if $a$ is equal to one of the first 256 primes. + +\subsubsection{mp\_prime\_fermat(mp\_int *a, mp\_int *b, int *result)} +Determines if $b$ is a witness to the compositeness of $a$ using the Fermat test. Essentially this +computes $b^a \mbox{ (mod }a\mbox{)}$ and compares it to $b$. If they match $result$ is set +to $1$ otherwise it is set to $0$. If $a$ is prime and $1 < b < a$ then this function will set +$result$ to $1$ with a probability of one. If $a$ is composite then this function will set +$result$ to $1$ with a probability of no more than $1 \over 2$. + +If this function is repeated $t$ times with different bases $b$ then the probability of a false positive +is no more than $2^{-t}$. + +\subsubsection{mp\_prime\_miller\_rabin(mp\_int *a, mp\_int *b, int *result)} +Determines if $b$ is a witness to the compositeness of $a$ using the Miller-Rabin test. This test +works much (\textit{on an abstract level}) the same as the Fermat test except is more robust. The +set of pseudo-primes to any given base for the Miller-Rabin test is a proper subset of the pseudo-primes +for the Fermat test. + +If $a$ is prime and $1 < b < a$ then this function will always set $result$ to $1$. If $a$ is composite +the trivial bound of error is $1 \over 4$. However, according to HAC\footnote{Handbook of Applied +Cryptography, Chapter 4, Section 4, pp. 147, Fact 4.48.} the following bounds are +known. For a test of $t$ trials on a $k$-bit number the probability $P_{k,t}$ of error is given as +follows. + +\begin{enumerate} +\item $P_{k,1} < k^24^{2 - \sqrt{k}}$ for $k \ge 2$ +\item $P_{k,t} < k^{3/2}2^tt^{-1/2}4^{2-\sqrt{tk}}$ for $(t = 2, k \ge 88)$ or $(3 \le t \le k/9, k \ge 21)$. +\item $P_{k,t} < {7 \over 20}k2^{-5t} + {1 \over 7}k^{15/4}2^{-k/2-2t} + 12k2^{-k/4-3t}$ for $k/9 \le t \le k/4, k \ge 21$. +\item $P_{k,t} < {1 \over 7}k^{15/4}2^{-k/2 - 2t}$ for $t \ge k/4, k \ge 21$. +\end{enumerate} + +For instance, $P_{1024,1}$ which indicates the probability of failure of one test with a 1024-bit candidate +is no more than $2^{-40}$. However, ideally at least a couple of trials should be used. In LibTomCrypt +for instance eight tests are used. In this case $P_{1024,8}$ falls under the second rule which leads +to a probability of failure of no more than $2^{-155.52}$. + +\begin{figure}[here] +\begin{small} +\begin{center} +\begin{tabular}{|c|c|c|c|c|c|c|} +\hline \textbf{Size (k)} & \textbf{$t = 3$} & \textbf{$t = 4$} & \textbf{$t = 5$} & \textbf{$t = 6$} & \textbf{$t = 7$} & \textbf{$t = 8$}\\ +\hline 512 & -58 & -70 & -79 & -88 & -96 & -104 \\ +\hline 768 & -75 & -89 & -101 & -112 & -122 & -131\\ +\hline 1024 & -89 & -106 & -120 & -133 & -144 & -155 \\ +\hline 1280 & -102 & -120 & -136 & -151 & -164 & -176 \\ +\hline 1536 & -113 & -133 & -151 & -167 & -181 & -195 \\ +\hline 1792 & -124 & -146 & -165 & -182 & -198 & -212 \\ +\hline 2048 & -134 & -157 & -178 & -196 & -213 & -228\\ +\hline +\end{tabular} +\end{center} +\end{small} +\caption{Probability of error for a given random candidate of $k$ bits with $t$ trials. Denoted as +log$_2(P_{k,t})$. } +\end{figure} + +\subsubsection{mp\_prime\_is\_prime(mp\_int *a, int t, int *result)} +This function determines if $a$ is probably prime by first performing trial division by the first 256 +primes and then $t$ rounds of Miller-Rabin using the first $t$ primes as bases. If $a$ is prime this +function will always set $result$ to $1$. If $a$ is composite then it will almost always set $result$ +to $0$. The probability of error is given in figure two. + +\subsubsection{mp\_prime\_next\_prime(mp\_int *a, int t)} +This function will find the next prime \textbf{after} $a$ by using trial division and $t$ trials of +Miller-Rabin. \section{Timing Analysis} @@ -662,8 +917,12 @@ MPI uses a binary square-multiply method for exponentiation. For the same expon perform 8 squarings and 5 multiplications. There is a precomputation phase for the method LibTomMath uses but it generally cuts down considerably on the number of multiplications. Consider a 512-bit exponent. The worst case for the LibTomMath method results in 512 squarings and 124 multiplications. The MPI method would have 512 squarings -and 512 multiplications. Randomly every $2k$ bits another multiplication is saved via the sliding-window -technique on top of the savings the $k$-ary method provides. +and 512 multiplications. + +Randomly the most probable event is that every $2k^2$ bits another multiplication is saved via the +sliding-window technique on top of the savings the $k$-ary method provides. This stems from the fact that each window +has a probability of $2^{-1}$ of being delayed by one bit. In reality the savings can be much more when the exponent +has an abundance of zero bits. Both LibTomMath and MPI use Barrett reduction instead of division to reduce the numbers modulo the modulus given. However, LibTomMath can take advantage of the fact that the multiplications required within the Barrett reduction @@ -671,12 +930,103 @@ do not have to give full precision. As a result the reduction step is much fast code will automatically determine at run-time (e.g. when its called) whether the faster multiplier can be used. The faster multipliers have also been optimized into the two variants (baseline and comba baseline). -LibTomMath also has a variant of the exptmod function that uses Montgomery reductions instead of Barrett reductions -which is faster. The code will automatically detect when the Montgomery version can be used (\textit{Requires the -modulus to be odd and below the MONTGOMERY\_EXPT\_CUTOFF size}). The Montgomery routine is essentially a copy of the -Barrett exponentiation routine except it uses Montgomery reduction. +LibTomMath also has a variant of the exptmod function that uses Montgomery or Diminished-Radix reductions instead of +Barrett reductions which are faster. The code will automatically detect when the Montgomery version can be used +(\textit{Requires the modulus to be odd and below the MONTGOMERY\_EXPT\_CUTOFF size}). The Montgomery routine is +essentially a copy of the Barrett exponentiation routine except it uses Montgomery reduction. As a result of all these changes exponentiation in LibTomMath is much faster than compared to MPI. On most ALU-strong -processors (AMD Athlon for instance) exponentiation in LibTomMath is often more then ten times faster than MPI. +processors (AMD Athlon for instance) exponentiation in LibTomMath is often more then ten times faster than MPI. + +\newpage +\section*{Appendix A -- DR Safe Prime Moduli} +These are safe primes suitable for the DR reduction techniques. + +\begin{small} +\begin{verbatim} +224-bit prime: +p == 26959946667150639794667015087019630673637144422540572481103341844143 + +532-bit prime: +p == 14059105607947488696282932836518693308967803494693489478439861164411 + 99243959839959474700214407465892859350284572975279726002583142341968 + 6528151609940203368691747 + +784-bit prime: +p == 10174582569701926077392351975587856746131528201775982910760891436407 + 52752352543956225804474009941755789631639189671820136396606697711084 + 75957692810857098847138903161308502419410142185759152435680068435915 + 159402496058513611411688900243039 + +1036-bit prime: +p == 73633510803960459580592340614718453088992337057476877219196961242207 + 30400993319449915739231125812675425079864519532271929704028930638504 + 85730703075899286013451337291468249027691733891486704001513279827771 + 74018362916106519487472796251714810077522836342108369176406547759082 + 3919364012917984605619526140821798437127 + +1540-bit prime: +p == 38564998830736521417281865696453025806593491967131023221754800625044 + 11826546885121070536038571753679461518026049420807660579867166071933 + 31995138078062523944232834134301060035963325132466829039948295286901 + 98205120921557533726473585751382193953592127439965050261476810842071 + 57368450587885458870662348457392592590350574754547108886771218500413 + 52012892734056144158994382765356263460989042410208779740029161680999 + 51885406379295536200413493190419727789712076165162175783 + +2072-bit prime: +p == 54218939133169617266167044061918053674999416641599333415160174539219 + 34845902966009796023786766248081296137779934662422030250545736925626 + 89251250471628358318743978285860720148446448885701001277560572526947 + 61939255157449083928645845499448866574499182283776991809511712954641 + 41244487770339412235658314203908468644295047744779491537946899487476 + 80362212954278693335653935890352619041936727463717926744868338358149 + 56836864340303776864961677852601361049369618605589931826833943267154 + 13281957242613296066998310166663594408748431030206661065682224010477 + 20269951530296879490444224546654729111504346660859907296364097126834 + 834235287147 +\end{verbatim} +\newpage +\begin{verbatim} +3080-bit prime: +p == 14872591348147092640920326485259710388958656451489011805853404549855 + 24155135260217788758027400478312256339496385275012465661575576202252 + 06314569873207988029466422057976484876770407676185319721656326266004 + 66027039730507982182461708359620055985616697068444694474354610925422 + 65792444947706769615695252256130901271870341005768912974433684521436 + 21126335809752272646208391793909176002665892575707673348417320292714 + 14414925737999142402226287954056239531091315945236233530448983394814 + 94120112723445689647986475279242446083151413667587008191682564376412 + 34796414611389856588668313940700594138366932599747507691048808666325 + 63356891811579575714450674901879395531659037735542902605310091218790 + 44170766615232300936675369451260747671432073394867530820527479172464 + 10644245072764022650374658634027981631882139521072626829153564850619 + 07146160831634031899433344310568760382865303657571873671474460048559 + 12033137386225053275419626102417236133948503 + +4116-bit prime: +p == 10951211157166778028568112903923951285881685924091094949001780089679 + 55253005183831872715423151551999734857184538199864469605657805519106 + 71752965504405483319768745978263629725521974299473675154181526972794 + 07518606702687749033402960400061140139713092570283328496790968248002 + 50742691718610670812374272414086863715763724622797509437062518082383 + 05605014462496277630214789052124947706021514827516368830127584715531 + 60422794055576326393660668474428614221648326558746558242215778499288 + 63023018366835675399949740429332468186340518172487073360822220449055 + 34058256846156864525995487330361695377639385317484513208112197632746 + 27403549307444874296172025850155107442985301015477068215901887335158 + 80733527449780963163909830077616357506845523215289297624086914545378 + 51108253422962011656326016849452390656670941816601111275452976618355 + 45793212249409511773940884655967126200762400673705890369240247283750 + 76210477267488679008016579588696191194060127319035195370137160936882 + 40224439969917201783514453748848639690614421772002899286394128821718 + 53539149915834004216827510006035966557909908155251261543943446413363 + 97793791497068253936771017031980867706707490224041075826337383538651 + 82549367950377193483609465580277633166426163174014828176348776585274 + 6577808019633679 +\end{verbatim} +\end{small} + + \end{document} diff --git a/bn_fast_mp_invmod.c b/bn_fast_mp_invmod.c index 1cd0150..38c265e 100644 --- a/bn_fast_mp_invmod.c +++ b/bn_fast_mp_invmod.c @@ -80,7 +80,6 @@ fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) } mp_set (&D, 1); - top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { diff --git a/bn_mp_div.c b/bn_mp_div.c index 96e7e6f..8eceec8 100644 --- a/bn_mp_div.c +++ b/bn_mp_div.c @@ -106,7 +106,7 @@ mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) /* step 3. for i from n down to (t + 1) */ for (i = n; i >= (t + 1); i--) { - if (i > x.alloc) + if (i > x.used) continue; /* step 3.1 if xi == yt then set q{i-t-1} to b-1, otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ @@ -171,10 +171,11 @@ mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; } } - + /* now q is the quotient and x is the remainder [which we have to normalize] */ /* get sign before writing to c */ x.sign = a->sign; + if (c != NULL) { mp_clamp (&q); mp_exch (&q, c); @@ -183,7 +184,6 @@ mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) if (d != NULL) { mp_div_2d (&x, norm, &x, NULL); - mp_clamp (&x); mp_exch (&x, d); } diff --git a/bn_mp_div_2d.c b/bn_mp_div_2d.c index c208f5e..4258c05 100644 --- a/bn_mp_div_2d.c +++ b/bn_mp_div_2d.c @@ -52,8 +52,8 @@ mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) /* shift by as many digits in the bit count */ if (b >= DIGIT_BIT) { - mp_rshd (c, b / DIGIT_BIT); - } + mp_rshd (c, b / DIGIT_BIT); + } /* shift any bit count < DIGIT_BIT */ D = (mp_digit) (b % DIGIT_BIT); diff --git a/bn_mp_div_d.c b/bn_mp_div_d.c index b7de4d1..4c25a74 100644 --- a/bn_mp_div_d.c +++ b/bn_mp_div_d.c @@ -21,7 +21,6 @@ mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) mp_int t, t2; int res; - if ((res = mp_init (&t)) != MP_OKAY) { return res; } diff --git a/bn_mp_dr_reduce.c b/bn_mp_dr_reduce.c new file mode 100644 index 0000000..75fb7ba --- /dev/null +++ b/bn_mp_dr_reduce.c @@ -0,0 +1,150 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reduce "a" in place modulo "b" using the Diminished Radix algorithm. + * + * Based on algorithm from the paper + * + * "Generating Efficient Primes for Discrete Log Cryptosystems" + * Chae Hoon Lim, Pil Loong Lee, + * POSTECH Information Research Laboratories + * + * The modulus must be of a special format [see manual] + */ +int +mp_dr_reduce (mp_int * a, mp_int * b, mp_digit mp) +{ + int err, i, j, k; + mp_word r; + mp_digit mu, *tmpj, *tmpi; + + /* k = digits in modulus */ + k = b->used; + + /* ensure that "a" has at least 2k digits */ + if (a->alloc < k + k) { + if ((err = mp_grow (a, k + k)) != MP_OKAY) { + return err; + } + } + + /* alias for a->dp[i] */ + tmpi = a->dp + k + k - 1; + + /* for (i = 2k - 1; i >= k; i = i - 1) + * + * This is the main loop of the reduction. Note that at the end + * the words above position k are not zeroed as expected. The end + * result is that the digits from 0 to k-1 are the residue. So + * we have to clear those afterwards. + */ + for (i = k + k - 1; i >= k; i = i - 1) { + /* x[i - 1 : i - k] += x[i]*mp */ + + /* x[i] * mp */ + r = ((mp_word) *tmpi--) * ((mp_word) mp); + + /* now add r to x[i-1:i-k] + * + * First add it to the first digit x[i-k] then form the carry + * then enter the main loop + */ + j = i - k; + + /* alias for a->dp[j] */ + tmpj = a->dp + j; + + /* add digit */ + *tmpj += (mp_digit)(r & MP_MASK); + + /* this is the carry */ + mu = (r >> ((mp_word) DIGIT_BIT)) + (*tmpj >> DIGIT_BIT); + + /* clear carry from a->dp[j] */ + *tmpj++ &= MP_MASK; + + /* now add rest of the digits + * + * Note this is basically a simple single digit addition to + * a larger multiple digit number. This is optimized somewhat + * because the propagation of carries is not likely to move + * more than a few digits. + * + */ + for (++j; mu != 0 && j <= (i - 1); ++j) { + *tmpj += mu; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + } + + /* if final carry */ + if (mu != 0) { + /* add mp to this to correct */ + j = i - k; + tmpj = a->dp + j; + + *tmpj += mp; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + + /* now handle carries */ + for (++j; mu != 0 && j <= (i - 1); j++) { + *tmpj += mu; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + } + } + } + + /* zero words above k */ + tmpi = a->dp + k; + for (i = k; i < a->used; i++) { + *tmpi++ = 0; + } + + /* clamp, sub and return */ + mp_clamp (a); + + if (mp_cmp_mag (a, b) != MP_LT) { + return s_mp_sub (a, b, a); + } + return MP_OKAY; +} + +/* determines if a number is a valid DR modulus */ +int mp_dr_is_modulus(mp_int *a) +{ + int ix; + + /* must be at least two digits */ + if (a->used < 2) { + return 0; + } + + for (ix = 1; ix < a->used; ix++) { + if (a->dp[ix] != MP_MASK) { + return 0; + } + } + return 1; +} + +/* determines the setup value */ +void mp_dr_setup(mp_int *a, mp_digit *d) +{ + *d = (1 << DIGIT_BIT) - a->dp[0]; +} + diff --git a/bn_mp_exptmod.c b/bn_mp_exptmod.c index 8b3f27f..a780dbc 100644 --- a/bn_mp_exptmod.c +++ b/bn_mp_exptmod.c @@ -24,9 +24,12 @@ static int f_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) { + int dr; + + dr = mp_dr_is_modulus(P); /* if the modulus is odd use the fast method */ - if (mp_isodd (P) == 1 && P->used > 4 && P->used < MONTGOMERY_EXPT_CUTOFF) { - return mp_exptmod_fast (G, X, P, Y); + if (((mp_isodd (P) == 1 && P->used < MONTGOMERY_EXPT_CUTOFF) || dr == 1) && P->used > 4) { + return mp_exptmod_fast (G, X, P, Y, dr); } else { return f_mp_exptmod (G, X, P, Y); } diff --git a/bn_mp_exptmod_fast.c b/bn_mp_exptmod_fast.c index 902a894..83c7b7a 100644 --- a/bn_mp_exptmod_fast.c +++ b/bn_mp_exptmod_fast.c @@ -22,11 +22,13 @@ * Uses Montgomery reduction */ int -mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { mp_int M[256], res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + int (*redux)(mp_int*,mp_int*,mp_digit); + /* find window size */ x = mp_count_bits (X); @@ -55,10 +57,17 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) return err; } } - - /* now setup montgomery */ - if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { - goto __M; + + if (redmode == 0) { + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto __M; + } + redux = mp_montgomery_reduce; + } else { + /* setup DR reduction */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; } /* setup result */ @@ -73,15 +82,23 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) * The first half of the table is not computed though accept for M[0] and M[1] */ - /* now we need R mod m */ - if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { - goto __RES; - } + if (redmode == 0) { + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto __RES; + } - /* now set M[1] to G * R mod m */ - if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { - goto __RES; + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto __RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto __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; @@ -91,7 +108,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { goto __RES; } } @@ -101,7 +118,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&M[x], P, mp)) != MP_OKAY) { + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { goto __RES; } } @@ -141,7 +158,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + if ((err = redux (&res, P, mp)) != MP_OKAY) { goto __RES; } continue; @@ -158,7 +175,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + if ((err = redux (&res, P, mp)) != MP_OKAY) { goto __RES; } } @@ -167,7 +184,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + if ((err = redux (&res, P, mp)) != MP_OKAY) { goto __RES; } @@ -184,7 +201,7 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + if ((err = redux (&res, P, mp)) != MP_OKAY) { goto __RES; } @@ -194,17 +211,19 @@ mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { goto __RES; } - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + if ((err = redux (&res, P, mp)) != MP_OKAY) { goto __RES; } } } } - /* fixup result */ - if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { - goto __RES; - } + if (redmode == 0) { + /* fixup result */ + if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } mp_exch (&res, Y); err = MP_OKAY; diff --git a/bn_mp_grow.c b/bn_mp_grow.c index 0a0a33b..369fb4e 100644 --- a/bn_mp_grow.c +++ b/bn_mp_grow.c @@ -24,7 +24,7 @@ mp_grow (mp_int * a, int size) if (a->alloc < size) { size += (MP_PREC * 2) - (size & (MP_PREC - 1)); /* ensure there are always at least MP_PREC digits extra on top */ - a->dp = realloc (a->dp, sizeof (mp_digit) * size); + a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * size); if (a->dp == NULL) { return MP_MEM; } diff --git a/bn_mp_init.c b/bn_mp_init.c index ae5c30f..7c3ee01 100644 --- a/bn_mp_init.c +++ b/bn_mp_init.c @@ -20,7 +20,7 @@ mp_init (mp_int * a) { /* allocate ram required and clear it */ - a->dp = calloc (sizeof (mp_digit), MP_PREC); + a->dp = OPT_CAST calloc (sizeof (mp_digit), MP_PREC); if (a->dp == NULL) { return MP_MEM; } diff --git a/bn_mp_init_size.c b/bn_mp_init_size.c index ce25b91..45d8dc5 100644 --- a/bn_mp_init_size.c +++ b/bn_mp_init_size.c @@ -21,7 +21,7 @@ mp_init_size (mp_int * a, int size) /* pad up so there are at least 16 zero digits */ size += (MP_PREC * 2) - (size & (MP_PREC - 1)); /* ensure there are always at least 16 digits extra on top */ - a->dp = calloc (sizeof (mp_digit), size); + a->dp = OPT_CAST calloc (sizeof (mp_digit), size); if (a->dp == NULL) { return MP_MEM; } diff --git a/bn_mp_lshd.c b/bn_mp_lshd.c index 6242957..600afda 100644 --- a/bn_mp_lshd.c +++ b/bn_mp_lshd.c @@ -36,10 +36,10 @@ mp_lshd (mp_int * a, int b) /* increment the used by the shift amount than copy upwards */ a->used += b; - + /* top */ tmpa = a->dp + a->used - 1; - + /* base */ tmpaa = a->dp + a->used - 1 - b; diff --git a/bn_mp_mul_2d.c b/bn_mp_mul_2d.c index faa9a7f..3b336d1 100644 --- a/bn_mp_mul_2d.c +++ b/bn_mp_mul_2d.c @@ -33,10 +33,10 @@ mp_mul_2d (mp_int * a, int b, mp_int * c) /* shift by as many digits in the bit count */ if (b >= DIGIT_BIT) { - if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { - return res; - } - } + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } c->used = c->alloc; /* shift any bit count < DIGIT_BIT */ diff --git a/bn_mp_prime_fermat.c b/bn_mp_prime_fermat.c new file mode 100644 index 0000000..b218077 --- /dev/null +++ b/bn_mp_prime_fermat.c @@ -0,0 +1,52 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs one Fermat test. + * + * If "a" were prime then b^a == b (mod a) since the order of + * the multiplicative sub-group would be phi(a) = a-1. That means + * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). + * + * Sets result to 1 if the congruence holds, or zero otherwise. + */ +int +mp_prime_fermat (mp_int * a, mp_int * b, int *result) +{ + mp_int t; + int err; + + /* default to fail */ + *result = 0; + + /* init t */ + if ((err = mp_init (&t)) != MP_OKAY) { + return err; + } + + /* compute t = b^a mod a */ + if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { + goto __T; + } + + /* is it equal to b? */ + if (mp_cmp (&t, b) == MP_EQ) { + *result = 1; + } + + err = MP_OKAY; +__T:mp_clear (&t); + return err; +} diff --git a/bn_mp_prime_is_divisible.c b/bn_mp_prime_is_divisible.c new file mode 100644 index 0000000..dac2d0e --- /dev/null +++ b/bn_mp_prime_is_divisible.c @@ -0,0 +1,50 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* determines if an integers is divisible by one of the first 256 primes or not + * + * sets result to 0 if not, 1 if yes + */ +int +mp_prime_is_divisible (mp_int * a, int *result) +{ + int err, ix; + mp_digit res; + + /* default to not */ + *result = 0; + + for (ix = 0; ix < 256; ix++) { + /* is it equal to the prime? */ + if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { + *result = 1; + return MP_OKAY; + } + + /* what is a mod __prime_tab[ix] */ + if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { + return err; + } + + /* is the residue zero? */ + if (res == 0) { + *result = 1; + return MP_OKAY; + } + } + + return MP_OKAY; +} diff --git a/bn_mp_prime_is_prime.c b/bn_mp_prime_is_prime.c new file mode 100644 index 0000000..8910c87 --- /dev/null +++ b/bn_mp_prime_is_prime.c @@ -0,0 +1,68 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs a variable number of rounds of Miller-Rabin + * + * Probability of error after t rounds is no more than + * (1/4)^t when 1 <= t <= 256 + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int +mp_prime_is_prime (mp_int * a, int t, int *result) +{ + mp_int b; + int ix, err, res; + + /* default to no */ + *result = 0; + + /* valid value of t? */ + if (t < 1 || t > 256) { + return MP_VAL; + } + + /* first perform trial division */ + if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { + return err; + } + if (res == 1) { + return MP_OKAY; + } + + /* now perform the miller-rabin rounds */ + if ((err = mp_init (&b)) != MP_OKAY) { + return err; + } + + for (ix = 0; ix < t; ix++) { + /* set the prime */ + mp_set (&b, __prime_tab[ix]); + + if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { + goto __B; + } + + if (res == 0) { + goto __B; + } + } + + /* passed the test */ + *result = 1; +__B:mp_clear (&b); + return err; +} diff --git a/bn_mp_prime_miller_rabin.c b/bn_mp_prime_miller_rabin.c new file mode 100644 index 0000000..422a5eb --- /dev/null +++ b/bn_mp_prime_miller_rabin.c @@ -0,0 +1,90 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Miller-Rabin test of "a" to the base of "b" as described in + * HAC pp. 139 Algorithm 4.24 + * + * Sets result to 0 if definitely composite or 1 if probably prime. + * Randomly the chance of error is no more than 1/4 and often + * very much lower. + */ +int +mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) +{ + mp_int n1, y, r; + int s, j, err; + + /* default */ + *result = 0; + + /* get n1 = a - 1 */ + if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { + return err; + } + if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { + goto __N1; + } + + /* set 2^s * r = n1 */ + if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { + goto __N1; + } + s = 0; + while (mp_iseven (&r) == 1) { + ++s; + if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { + goto __R; + } + } + + /* compute y = b^r mod a */ + if ((err = mp_init (&y)) != MP_OKAY) { + goto __R; + } + if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { + goto __Y; + } + + /* if y != 1 and y != n1 do */ + if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { + j = 1; + /* 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; + } + + /* if y == 1 then composite */ + if (mp_cmp_d (&y, 1) == MP_EQ) { + goto __Y; + } + + ++j; + } + + /* if y != n1 then composite */ + if (mp_cmp (&y, &n1) != MP_EQ) { + goto __Y; + } + } + + /* probably prime now */ + *result = 1; +__Y:mp_clear (&y); +__R:mp_clear (&r); +__N1:mp_clear (&n1); + return err; +} diff --git a/bn_mp_prime_next_prime.c b/bn_mp_prime_next_prime.c new file mode 100644 index 0000000..932d914 --- /dev/null +++ b/bn_mp_prime_next_prime.c @@ -0,0 +1,54 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + */ +int mp_prime_next_prime(mp_int *a, int t) +{ + int err, res; + + if (mp_iseven(a) == 1) { + /* force odd */ + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { + return err; + } + } else { + /* force to next number */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + for (;;) { + /* is this prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { + return err; + } + + if (res == 1) { + break; + } + + /* add two, next candidate */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + return MP_OKAY; +} + diff --git a/bn_mp_rshd.c b/bn_mp_rshd.c index ef1a6bf..582c8c5 100644 --- a/bn_mp_rshd.c +++ b/bn_mp_rshd.c @@ -38,19 +38,19 @@ mp_rshd (mp_int * a, int b) /* base */ tmpa = a->dp; - + /* offset into digits */ tmpaa = a->dp + b; - + /* this is implemented as a sliding window where the window is b-digits long * and digits from the top of the window are copied to the bottom * * e.g. - + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> /\ | ----> \-------------------/ ----> - */ + */ for (x = 0; x < (a->used - b); x++) { *tmpa++ = *tmpaa++; } diff --git a/bn_mp_shrink.c b/bn_mp_shrink.c index c3f1aa9..023a46b 100644 --- a/bn_mp_shrink.c +++ b/bn_mp_shrink.c @@ -19,7 +19,7 @@ int mp_shrink (mp_int * a) { if (a->alloc != a->used) { - if ((a->dp = realloc (a->dp, sizeof (mp_digit) * a->used)) == NULL) { + if ((a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * a->used)) == NULL) { return MP_MEM; } a->alloc = a->used; diff --git a/bn_prime_tab.c b/bn_prime_tab.c new file mode 100644 index 0000000..e663578 --- /dev/null +++ b/bn_prime_tab.c @@ -0,0 +1,52 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include +const mp_digit __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, + 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083, + 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, + 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, + 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, + 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, + + 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, + 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, + 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, + 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, + 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, + 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, + 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, + 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, + + 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, + 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, + 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, + 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, + 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, + 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, + 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, + 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, + + 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, + 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, + 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, + 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, + 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, + 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, + 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, + 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 +}; diff --git a/bn_radix.c b/bn_radix.c index 1f06389..6aeda17 100644 --- a/bn_radix.c +++ b/bn_radix.c @@ -93,7 +93,7 @@ mp_toradix (mp_int * a, char *str, int radix) *str++ = s_rmap[d]; ++digs; } - bn_reverse ((unsigned char *) _s, digs); + bn_reverse ((unsigned char *)_s, digs); *str++ = '\0'; mp_clear (&t); return MP_OKAY; diff --git a/bn_s_mp_add.c b/bn_s_mp_add.c index 314db79..ceb2702 100644 --- a/bn_s_mp_add.c +++ b/bn_s_mp_add.c @@ -55,13 +55,13 @@ s_mp_add (mp_int * a, mp_int * b, mp_int * c) register int i; /* alias for digit pointers */ - + /* first input */ tmpa = a->dp; - + /* second input */ tmpb = b->dp; - + /* destination */ tmpc = c->dp; diff --git a/bncore.c b/bncore.c index ba9fbf9..3660c6d 100644 --- a/bncore.c +++ b/bncore.c @@ -18,5 +18,3 @@ int KARATSUBA_MUL_CUTOFF = 73, /* Min. number of digits before Karatsuba multiplication is used. */ KARATSUBA_SQR_CUTOFF = 121, /* Min. number of digits before Karatsuba squaring is used. */ MONTGOMERY_EXPT_CUTOFF = 128; /* max. number of digits that montgomery reductions will help for */ - - diff --git a/changes.txt b/changes.txt index 284d40e..df7ac4e 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,14 @@ +Mar 22nd, 2003 +v0.15 -- Added series of prime testing routines to lib + -- Fixed up etc/tune.c + -- Added DR reduction algorithm + -- Beefed up the manual more. + -- Fixed up demo/demo.c so it doesn't have so many warnings and it does the full series of + tests + -- Added "pre-gen" directory which will hold a "gen.pl"'ed copy of the entire lib [done at + zipup time so its always the latest] + -- Added conditional casts for C++ users [boo!] + Mar 15th, 2003 v0.14 -- Tons of manual updates -- cleaned up the directory diff --git a/demo/demo.c b/demo/demo.c index 0d79021..8cf6dfe 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -89,7 +89,7 @@ int main(void) unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, inv_n, div2_n, mul2_n; unsigned rr; - int cnt; + int cnt, ix; #ifdef TIMER int n; @@ -103,10 +103,43 @@ int main(void) mp_init(&d); mp_init(&e); mp_init(&f); + +/* test the DR reduction */ +#if 0 + + srand(time(NULL)); + for (cnt = 2; cnt < 32; cnt++) { + printf("%d digit modulus\n", cnt); + mp_grow(&a, cnt); + mp_zero(&a); + for (ix = 1; ix < cnt; ix++) { + a.dp[ix] = MP_MASK; + } + a.used = cnt; + mp_prime_next_prime(&a, 3); + + mp_rand(&b, cnt - 1); + mp_copy(&b, &c); + + rr = 0; + do { + if (!(rr & 127)) { printf("%9lu\r", rr); fflush(stdout); } + mp_sqr(&b, &b); mp_add_d(&b, 1, &b); + mp_copy(&b, &c); + + mp_mod(&b, &a, &b); + mp_dr_reduce(&c, &a, (1< + +const int sizes[] = { 8, 19, 28, 37, 55, 74, 110, 147 }; +int main(void) +{ + int res, x, y; + char buf[4096]; + FILE *out; + mp_int a, b; + + mp_init(&a); + mp_init(&b); + + out = fopen("drprimes.txt", "w"); + for (x = 0; x < (int)(sizeof(sizes)/sizeof(sizes[0])); x++) { + printf("Seeking a %d-bit safe prime\n", sizes[x] * DIGIT_BIT); + mp_grow(&a, sizes[x]); + mp_zero(&a); + for (y = 1; y < sizes[x]; y++) { + a.dp[y] = MP_MASK; + } + + /* make a DR modulus */ + a.dp[0] = 1; + a.used = sizes[x]; + + /* now loop */ + do { + fflush(stdout); + mp_prime_next_prime(&a, 3); + printf("."); + mp_sub_d(&a, 1, &b); + mp_div_2(&b, &b); + mp_prime_is_prime(&b, 3, &res); + } while (res == 0); + + if (mp_dr_is_modulus(&a) != 1) { + printf("Error not DR modulus\n"); + } else { + mp_toradix(&a, buf, 10); + printf("\n\np == %s\n\n", buf); + fprintf(out, "%d-bit prime:\np == %s\n\n", mp_count_bits(&a), buf); fflush(out); + } + } + fclose(out); + + mp_clear(&a); + mp_clear(&b); + + return 0; +} + diff --git a/etc/drprimes.1 b/etc/drprimes.1 new file mode 100644 index 0000000..e7cc366 --- /dev/null +++ b/etc/drprimes.1 @@ -0,0 +1,23 @@ +224-bit prime: +p == 26959946667150639794667015087019630673637144422540572481103341844143 + +532-bit prime: +p == 14059105607947488696282932836518693308967803494693489478439861164411992439598399594747002144074658928593502845729752797260025831423419686528151609940203368691747 + +784-bit prime: +p == 101745825697019260773923519755878567461315282017759829107608914364075275235254395622580447400994175578963163918967182013639660669771108475957692810857098847138903161308502419410142185759152435680068435915159402496058513611411688900243039 + +1036-bit prime: +p == 736335108039604595805923406147184530889923370574768772191969612422073040099331944991573923112581267542507986451953227192970402893063850485730703075899286013451337291468249027691733891486704001513279827771740183629161065194874727962517148100775228363421083691764065477590823919364012917984605619526140821798437127 + +1540-bit prime: +p == 38564998830736521417281865696453025806593491967131023221754800625044118265468851210705360385717536794615180260494208076605798671660719333199513807806252394423283413430106003596332513246682903994829528690198205120921557533726473585751382193953592127439965050261476810842071573684505878854588706623484573925925903505747545471088867712185004135201289273405614415899438276535626346098904241020877974002916168099951885406379295536200413493190419727789712076165162175783 + +2072-bit prime: +p == 542189391331696172661670440619180536749994166415993334151601745392193484590296600979602378676624808129613777993466242203025054573692562689251250471628358318743978285860720148446448885701001277560572526947619392551574490839286458454994488665744991822837769918095117129546414124448777033941223565831420390846864429504774477949153794689948747680362212954278693335653935890352619041936727463717926744868338358149568368643403037768649616778526013610493696186055899318268339432671541328195724261329606699831016666359440874843103020666106568222401047720269951530296879490444224546654729111504346660859907296364097126834834235287147 + +3080-bit prime: +p == 1487259134814709264092032648525971038895865645148901180585340454985524155135260217788758027400478312256339496385275012465661575576202252063145698732079880294664220579764848767704076761853197216563262660046602703973050798218246170835962005598561669706844469447435461092542265792444947706769615695252256130901271870341005768912974433684521436211263358097522726462083917939091760026658925757076733484173202927141441492573799914240222628795405623953109131594523623353044898339481494120112723445689647986475279242446083151413667587008191682564376412347964146113898565886683139407005941383669325997475076910488086663256335689181157957571445067490187939553165903773554290260531009121879044170766615232300936675369451260747671432073394867530820527479172464106442450727640226503746586340279816318821395210726268291535648506190714616083163403189943334431056876038286530365757187367147446004855912033137386225053275419626102417236133948503 + +4116-bit prime: +p == 1095121115716677802856811290392395128588168592409109494900178008967955253005183831872715423151551999734857184538199864469605657805519106717529655044054833197687459782636297255219742994736751541815269727940751860670268774903340296040006114013971309257028332849679096824800250742691718610670812374272414086863715763724622797509437062518082383056050144624962776302147890521249477060215148275163688301275847155316042279405557632639366066847442861422164832655874655824221577849928863023018366835675399949740429332468186340518172487073360822220449055340582568461568645259954873303616953776393853174845132081121976327462740354930744487429617202585015510744298530101547706821590188733515880733527449780963163909830077616357506845523215289297624086914545378511082534229620116563260168494523906566709418166011112754529766183554579321224940951177394088465596712620076240067370589036924024728375076210477267488679008016579588696191194060127319035195370137160936882402244399699172017835144537488486396906144217720028992863941288217185353914991583400421682751000603596655790990815525126154394344641336397793791497068253936771017031980867706707490224041075826337383538651825493679503771934836094655802776331664261631740148281763487765852746577808019633679 diff --git a/etc/makefile b/etc/makefile index 81f692c..261cd1c 100644 --- a/etc/makefile +++ b/etc/makefile @@ -15,6 +15,9 @@ tune: tune.o mersenne: mersenne.o $(CC) mersenne.o $(LIBNAME) -o mersenne + +drprime: drprime.o + $(CC) drprime.o $(LIBNAME) -o drprime clean: - rm -f *.log *.o *.obj *.exe pprime tune mersenne \ No newline at end of file + rm -f *.log *.o *.obj *.exe pprime tune mersenne drprime \ No newline at end of file diff --git a/etc/makefile.msvc b/etc/makefile.msvc index 6011cf3..06a95e2 100644 --- a/etc/makefile.msvc +++ b/etc/makefile.msvc @@ -11,4 +11,7 @@ mersenne: mersenne.obj cl mersenne.obj ../tommath.lib tune: tune.obj - cl tune.obj ../tommath.lib \ No newline at end of file + cl tune.obj ../tommath.lib + +drprime: drprime.obj + cl drprime.obj ../tommath.lib \ No newline at end of file diff --git a/etc/tune.c b/etc/tune.c index f50edab..0346677 100644 --- a/etc/tune.c +++ b/etc/tune.c @@ -17,7 +17,7 @@ time_mult (void) mp_init (&c); t1 = clock (); - for (x = 4; x <= 128; x += 4) { + for (x = 4; x <= 144; x += 4) { mp_rand (&a, x); mp_rand (&b, x); for (y = 0; y < 10000; y++) { @@ -41,7 +41,7 @@ time_sqr (void) mp_init (&b); t1 = clock (); - for (x = 4; x <= 128; x += 4) { + for (x = 4; x <= 144; x += 4) { mp_rand (&a, x); for (y = 0; y < 10000; y++) { mp_sqr (&a, &b); @@ -65,7 +65,7 @@ time_expt (void) mp_init (&d); t1 = clock (); - for (x = 4; x <= 128; x += 4) { + for (x = 4; x <= 144; x += 4) { mp_rand (&a, x); mp_rand (&b, x); mp_rand (&c, x); @@ -96,7 +96,7 @@ main (void) /* tune multiplication first */ log = fopen ("mult.log", "w"); best = CLOCKS_PER_SEC * 1000; - for (KARATSUBA_MUL_CUTOFF = 8; KARATSUBA_MUL_CUTOFF <= 128; KARATSUBA_MUL_CUTOFF++) { + for (KARATSUBA_MUL_CUTOFF = 8; KARATSUBA_MUL_CUTOFF <= 144; KARATSUBA_MUL_CUTOFF++) { ti = time_mult (); printf ("%4d : %9lu\r", KARATSUBA_MUL_CUTOFF, ti); fprintf (log, "%d, %lu\n", KARATSUBA_MUL_CUTOFF, ti); @@ -112,7 +112,7 @@ main (void) /* tune squaring */ log = fopen ("sqr.log", "w"); best = CLOCKS_PER_SEC * 1000; - for (KARATSUBA_SQR_CUTOFF = 8; KARATSUBA_SQR_CUTOFF <= 128; KARATSUBA_SQR_CUTOFF++) { + for (KARATSUBA_SQR_CUTOFF = 8; KARATSUBA_SQR_CUTOFF <= 144; KARATSUBA_SQR_CUTOFF++) { ti = time_sqr (); printf ("%4d : %9lu\r", KARATSUBA_SQR_CUTOFF, ti); fprintf (log, "%d, %lu\n", KARATSUBA_SQR_CUTOFF, ti); @@ -131,7 +131,7 @@ main (void) log = fopen ("expt.log", "w"); best = CLOCKS_PER_SEC * 1000; - for (MONTGOMERY_EXPT_CUTOFF = 8; MONTGOMERY_EXPT_CUTOFF <= 192; MONTGOMERY_EXPT_CUTOFF++) { + for (MONTGOMERY_EXPT_CUTOFF = 8; MONTGOMERY_EXPT_CUTOFF <= 144; MONTGOMERY_EXPT_CUTOFF++) { ti = time_expt (); printf ("%4d : %9lu\r", MONTGOMERY_EXPT_CUTOFF, ti); fflush (stdout); diff --git a/makefile b/makefile index 856274b..4219e6b 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ CFLAGS += -I./ -Wall -W -Wshadow -O3 -fomit-frame-pointer -funroll-loops -VERSION=0.14 +VERSION=0.15 default: libtommath.a @@ -30,7 +30,9 @@ bn_mp_reduce.o bn_mp_montgomery_setup.o bn_fast_mp_montgomery_reduce.o bn_mp_mon bn_mp_exptmod_fast.o bn_mp_exptmod.o bn_mp_2expt.o bn_mp_n_root.o bn_mp_jacobi.o bn_reverse.o \ bn_mp_count_bits.o bn_mp_read_unsigned_bin.o bn_mp_read_signed_bin.o bn_mp_to_unsigned_bin.o \ bn_mp_to_signed_bin.o bn_mp_unsigned_bin_size.o bn_mp_signed_bin_size.o bn_radix.o \ -bn_mp_xor.o bn_mp_and.o bn_mp_or.o bn_mp_rand.o bn_mp_montgomery_calc_normalization.o +bn_mp_xor.o bn_mp_and.o bn_mp_or.o bn_mp_rand.o bn_mp_montgomery_calc_normalization.o \ +bn_mp_prime_is_divisible.o bn_prime_tab.o bn_mp_prime_fermat.o bn_mp_prime_miller_rabin.o \ +bn_mp_prime_is_prime.o bn_mp_prime_next_prime.o bn_mp_dr_reduce.o libtommath.a: $(OBJECTS) $(AR) $(ARFLAGS) libtommath.a $(OBJECTS) @@ -65,6 +67,7 @@ clean: cd etc ; make clean zipup: clean docs + perl gen.pl ; mv mpi.c pre_gen/ ; \ cd .. ; rm -rf ltm* libtommath-$(VERSION) ; mkdir libtommath-$(VERSION) ; \ cp -R ./libtommath/* ./libtommath-$(VERSION)/ ; tar -c libtommath-$(VERSION)/* > ltm-$(VERSION).tar ; \ bzip2 -9vv ltm-$(VERSION).tar ; zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/* diff --git a/makefile.msvc b/makefile.msvc index 7c5f763..4daf310 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -20,7 +20,10 @@ bn_mp_reduce.obj bn_mp_montgomery_setup.obj bn_fast_mp_montgomery_reduce.obj bn_ bn_mp_exptmod_fast.obj bn_mp_exptmod.obj bn_mp_2expt.obj bn_mp_n_root.obj bn_mp_jacobi.obj bn_reverse.obj \ bn_mp_count_bits.obj bn_mp_read_unsigned_bin.obj bn_mp_read_signed_bin.obj bn_mp_to_unsigned_bin.obj \ bn_mp_to_signed_bin.obj bn_mp_unsigned_bin_size.obj bn_mp_signed_bin_size.obj bn_radix.obj \ -bn_mp_xor.obj bn_mp_and.obj bn_mp_or.obj bn_mp_rand.obj bn_mp_montgomery_calc_normalization.obj +bn_mp_xor.obj bn_mp_and.obj bn_mp_or.obj bn_mp_rand.obj bn_mp_montgomery_calc_normalization.obj \ +bn_mp_prime_is_divisible.obj bn_prime_tab.obj bn_mp_prime_fermat.obj bn_mp_prime_miller_rabin.obj \ +bn_mp_prime_is_prime.obj bn_mp_prime_next_prime.obj bn_mp_dr_reduce.obj + library: $(OBJECTS) lib /out:tommath.lib $(OBJECTS) diff --git a/mtest/mtest.c b/mtest/mtest.c index 245c0d7..fe02906 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -41,7 +41,7 @@ void rand_num(mp_int *a) unsigned char buf[512]; top: - size = 1 + ((fgetc(rng)*fgetc(rng)) % 512); + size = 1 + ((fgetc(rng)*fgetc(rng)) % 96); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); for (n = 0; n < size; n++) { @@ -57,7 +57,7 @@ void rand_num2(mp_int *a) unsigned char buf[512]; top: - size = 1 + ((fgetc(rng)*fgetc(rng)) % 512); + size = 1 + ((fgetc(rng)*fgetc(rng)) % 96); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); for (n = 0; n < size; n++) { @@ -73,8 +73,6 @@ int main(void) mp_int a, b, c, d, e; char buf[4096]; - static int tests[] = { 11, 12 }; - mp_init(&a); mp_init(&b); mp_init(&c); diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c new file mode 100644 index 0000000..d659761 --- /dev/null +++ b/pre_gen/mpi.c @@ -0,0 +1,5993 @@ +/* File Generated Automatically by gen.pl */ + +/* Start: bncore.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* configured for a AMD Duron Morgan core with etc/tune.c */ +int KARATSUBA_MUL_CUTOFF = 73, /* Min. number of digits before Karatsuba multiplication is used. */ + KARATSUBA_SQR_CUTOFF = 121, /* Min. number of digits before Karatsuba squaring is used. */ + MONTGOMERY_EXPT_CUTOFF = 128; /* max. number of digits that montgomery reductions will help for */ + +/* End: bncore.c */ + +/* Start: bn_fast_mp_invmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes the modular inverse via binary extended euclidean algorithm, + * that is c = 1/a mod b + * + * Based on mp_invmod except this is optimized for the case where b is + * odd as per HAC Note 14.64 on pp. 610 + */ +int +fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, B, D; + int res, neg; + + if ((res = mp_init (&x)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_init (&y)) != MP_OKAY) { + goto __X; + } + + if ((res = mp_init (&u)) != MP_OKAY) { + goto __Y; + } + + if ((res = mp_init (&v)) != MP_OKAY) { + goto __U; + } + + if ((res = mp_init (&B)) != MP_OKAY) { + goto __V; + } + + if ((res = mp_init (&D)) != MP_OKAY) { + goto __B; + } + + /* x == modulus, y == value to invert */ + if ((res = mp_copy (b, &x)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy (a, &y)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_abs (&y, &y)) != MP_OKAY) { + goto __D; + } + + /* 2. [modified] if x,y are both even then return an error! + * + * That is if gcd(x,y) = 2 * k then obviously there is no inverse. + */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto __D; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto __D; + } + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __D; + } + /* 4.2 if A or B is odd then */ + if (mp_iseven (&B) == 0) { + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto __D; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto __D; + } + } + + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __D; + } + /* 5.2 if C,D are even then */ + if (mp_iseven (&D) == 0) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto __D; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto __D; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto __D; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto __D; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) { + goto top; + } + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto __D; + } + + /* b is now the inverse */ + neg = a->sign; + while (D.sign == MP_NEG) { + if ((res = mp_add (&D, b, &D)) != MP_OKAY) { + goto __D; + } + } + mp_exch (&D, c); + c->sign = neg; + res = MP_OKAY; + +__D:mp_clear (&D); +__B:mp_clear (&B); +__V:mp_clear (&v); +__U:mp_clear (&u); +__Y:mp_clear (&y); +__X:mp_clear (&x); +__ERR: + return res; +} + +/* End: bn_fast_mp_invmod.c */ + +/* Start: bn_fast_mp_montgomery_reduce.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes xR^-1 == x (mod N) via Montgomery Reduction + * + * This is an optimized implementation of mp_montgomery_reduce + * which uses the comba method to quickly calculate the columns of the + * reduction. + * + * Based on Algorithm 14.32 on pp.601 of HAC. +*/ +int +fast_mp_montgomery_reduce (mp_int * a, mp_int * m, mp_digit mp) +{ + int ix, res, olduse; + mp_word W[512]; + + /* get old used count */ + olduse = a->used; + + /* grow a as required */ + if (a->alloc < m->used + 1) { + if ((res = mp_grow (a, m->used + 1)) != MP_OKAY) { + return res; + } + } + + { + register mp_word *_W; + register mp_digit *tmpa; + + _W = W; + tmpa = a->dp; + + /* copy the digits of a */ + for (ix = 0; ix < a->used; ix++) { + *_W++ = *tmpa++; + } + + /* zero the high words */ + for (; ix < m->used * 2 + 1; ix++) { + *_W++ = 0; + } + } + + for (ix = 0; ix < m->used; ix++) { + /* ui = ai * m' mod b + * + * We avoid a double precision multiplication (which isn't required) + * by casting the value down to a mp_digit. Note this requires that W[ix-1] have + * the carry cleared (see after the inner loop) + */ + register mp_digit ui; + ui = (((mp_digit) (W[ix] & MP_MASK)) * mp) & MP_MASK; + + /* a = a + ui * m * b^i + * + * This is computed in place and on the fly. The multiplication + * by b^i is handled by offseting which columns the results + * are added to. + * + * Note the comba method normally doesn't handle carries in the inner loop + * In this case we fix the carry from the previous column since the Montgomery + * reduction requires digits of the result (so far) [see above] to work. This is + * handled by fixing up one carry after the inner loop. The carry fixups are done + * in order so after these loops the first m->used words of W[] have the carries + * fixed + */ + { + register int iy; + register mp_digit *tmpx; + register mp_word *_W; + + /* alias for the digits of the modulus */ + tmpx = m->dp; + + /* Alias for the columns set by an offset of ix */ + _W = W + ix; + + /* inner loop */ + for (iy = 0; iy < m->used; iy++) { + *_W++ += ((mp_word) ui) * ((mp_word) * tmpx++); + } + } + + /* now fix carry for next digit, W[ix+1] */ + W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); + } + + + { + register mp_digit *tmpa; + register mp_word *_W, *_W1; + + /* nox fix rest of carries */ + _W1 = W + ix; + _W = W + ++ix; + + for (; ix <= m->used * 2 + 1; ix++) { + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); + } + + /* copy out, A = A/b^n + * + * The result is A/b^n but instead of converting from an array of mp_word + * to mp_digit than calling mp_rshd we just copy them in the right + * order + */ + tmpa = a->dp; + _W = W + m->used; + + for (ix = 0; ix < m->used + 1; ix++) { + *tmpa++ = *_W++ & ((mp_word) MP_MASK); + } + + /* zero oldused digits, if the input a was larger than + * m->used+1 we'll have to clear the digits */ + for (; ix < olduse; ix++) { + *tmpa++ = 0; + } + } + + /* set the max used and clamp */ + a->used = m->used + 1; + mp_clamp (a); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (a, m) != MP_LT) { + return s_mp_sub (a, m, a); + } + return MP_OKAY; +} + +/* End: bn_fast_mp_montgomery_reduce.c */ + +/* Start: bn_fast_s_mp_mul_digs.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Fast (comba) multiplier + * + * This is the fast column-array [comba] multiplier. It is designed to compute + * the columns of the product first then handle the carries afterwards. This + * has the effect of making the nested loops that compute the columns very + * simple and schedulable on super-scalar processors. + * + * This has been modified to produce a variable number of digits of output so + * if say only a half-product is required you don't have to compute the upper half + * (a feature required for fast Barrett reduction). + * + * Based on Algorithm 14.12 on pp.595 of HAC. + * + */ +int +fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix; + mp_word W[512]; + + /* grow the destination as required */ + if (c->alloc < digs) { + if ((res = mp_grow (c, digs)) != MP_OKAY) { + return res; + } + } + + /* clear temp buf (the columns) */ + memset (W, 0, sizeof (mp_word) * digs); + + /* calculate the columns */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + + /* this multiplier has been modified to allow you to control how many digits + * of output are produced. So at most we want to make upto "digs" digits + * of output. + * + * this adds products to distinct columns (at ix+iy) of W + * note that each step through the loop is not dependent on + * the previous which means the compiler can easily unroll + * the loop without scheduling problems + */ + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy, pb; + + /* alias for the the word on the left e.g. A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for the right side */ + tmpy = b->dp; + + /* alias for the columns, each step through the loop adds a new + term to each column + */ + _W = W + ix; + + /* the number of digits is limited by their placement. E.g. + we avoid multiplying digits that will end up above the # of + digits of precision requested + */ + pb = MIN (b->used, digs - ix); + + for (iy = 0; iy < pb; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + + } + + /* setup dest */ + olduse = c->used; + c->used = digs; + + { + register mp_digit *tmpc; + + /* At this point W[] contains the sums of each column. To get the + * correct result we must take the extra bits from each column and + * carry them down + * + * Note that while this adds extra code to the multiplier it saves time + * since the carry propagation is removed from the above nested loop. + * This has the effect of reducing the work from N*(N+N*c)==N^2 + c*N^2 to + * N^2 + N*c where c is the cost of the shifting. On very small numbers + * this is slower but on most cryptographic size numbers it is faster. + */ + tmpc = c->dp; + for (ix = 1; ix < digs; ix++) { + W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + *tmpc++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + *tmpc++ = (mp_digit) (W[digs - 1] & ((mp_word) MP_MASK)); + + /* clear unused */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_mul_digs.c */ + +/* Start: bn_fast_s_mp_mul_high_digs.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* this is a modified version of fast_s_mp_mul_digs that only produces + * output digits *above* digs. See the comments for fast_s_mp_mul_digs + * to see how it works. + * + * This is used in the Barrett reduction since for one of the multiplications + * only the higher digits were needed. This essentially halves the work. + * + * Based on Algorithm 14.12 on pp.595 of HAC. + */ +int +fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int oldused, newused, res, pa, pb, ix; + mp_word W[512]; + + /* calculate size of product and allocate more space if required */ + newused = a->used + b->used + 1; + if (c->alloc < newused) { + if ((res = mp_grow (c, newused)) != MP_OKAY) { + return res; + } + } + + /* like the other comba method we compute the columns first */ + pa = a->used; + pb = b->used; + memset (W + digs, 0, (pa + pb + 1 - digs) * sizeof (mp_word)); + for (ix = 0; ix < pa; ix++) { + { + register mp_digit tmpx, *tmpy; + register int iy; + register mp_word *_W; + + /* work todo, that is we only calculate digits that are at "digs" or above */ + iy = digs - ix; + + /* copy of word on the left of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = b->dp + iy; + + /* alias for the columns of output. Offset to be equal to or above the + * smallest digit place requested + */ + _W = &(W[digs]); + + /* compute column products for digits above the minimum */ + for (; iy < pb; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + } + + /* setup dest */ + oldused = c->used; + c->used = newused; + + /* now convert the array W downto what we need */ + for (ix = digs + 1; ix < newused; ix++) { + W[ix] += (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + c->dp[ix - 1] = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + c->dp[(pa + pb + 1) - 1] = (mp_digit) (W[(pa + pb + 1) - 1] & ((mp_word) MP_MASK)); + + for (; ix < oldused; ix++) { + c->dp[ix] = 0; + } + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_mul_high_digs.c */ + +/* Start: bn_fast_s_mp_sqr.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* fast squaring + * + * This is the comba method where the columns of the product are computed first + * then the carries are computed. This has the effect of making a very simple + * inner loop that is executed the most + * + * W2 represents the outer products and W the inner. + * + * A further optimizations is made because the inner products are of the form + * "A * B * 2". The *2 part does not need to be computed until the end which is + * good because 64-bit shifts are slow! + * + * Based on Algorithm 14.16 on pp.597 of HAC. + * + */ +int +fast_s_mp_sqr (mp_int * a, mp_int * b) +{ + int olduse, newused, res, ix, pa; + mp_word W2[512], W[512]; + + /* calculate size of product and allocate as required */ + pa = a->used; + newused = pa + pa + 1; + if (b->alloc < newused) { + if ((res = mp_grow (b, newused)) != MP_OKAY) { + return res; + } + } + + /* zero temp buffer (columns) + * Note that there are two buffers. Since squaring requires + * a outter and inner product and the inner product requires + * computing a product and doubling it (a relatively expensive + * op to perform n^2 times if you don't have to) the inner and + * outer products are computed in different buffers. This way + * the inner product can be doubled using n doublings instead of + * n^2 + */ + memset (W, 0, newused * sizeof (mp_word)); + memset (W2, 0, newused * sizeof (mp_word)); + +/* note optimization + * values in W2 are only written in even locations which means + * we can collapse the array to 256 words [and fixup the memset above] + * provided we also fix up the summations below. Ideally + * the fixup loop should be unrolled twice to handle the even/odd + * cases, and then a final step to handle odd cases [e.g. newused == odd] + * + * This will not only save ~8*256 = 2KB of stack but lower the number of + * operations required to finally fix up the columns + */ + + /* This computes the inner product. To simplify the inner N^2 loop + * the multiplication by two is done afterwards in the N loop. + */ + for (ix = 0; ix < pa; ix++) { + /* compute the outer product + * + * Note that every outer product is computed + * for a particular column only once which means that + * there is no need todo a double precision addition + */ + W2[ix + ix] = ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); + + { + register mp_digit tmpx, *tmpy; + register mp_word *_W; + register int iy; + + /* copy of left side */ + tmpx = a->dp[ix]; + + /* alias for right side */ + tmpy = a->dp + (ix + 1); + + /* the column to store the result in */ + _W = W + (ix + ix + 1); + + /* inner products */ + for (iy = ix + 1; iy < pa; iy++) { + *_W++ += ((mp_word) tmpx) * ((mp_word) * tmpy++); + } + } + } + + /* setup dest */ + olduse = b->used; + b->used = newused; + + /* double first value, since the inner products are half of what they should be */ + W[0] += W[0] + W2[0]; + + /* now compute digits */ + { + register mp_digit *tmpb; + + tmpb = b->dp; + + for (ix = 1; ix < newused; ix++) { + /* double/add next digit */ + W[ix] += W[ix] + W2[ix]; + + W[ix] = W[ix] + (W[ix - 1] >> ((mp_word) DIGIT_BIT)); + *tmpb++ = (mp_digit) (W[ix - 1] & ((mp_word) MP_MASK)); + } + *tmpb++ = (mp_digit) (W[(newused) - 1] & ((mp_word) MP_MASK)); + + /* clear high */ + for (; ix < olduse; ix++) { + *tmpb++ = 0; + } + } + + mp_clamp (b); + return MP_OKAY; +} + +/* End: bn_fast_s_mp_sqr.c */ + +/* Start: bn_mp_2expt.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes a = 2^b + * + * Simple algorithm which zeroes the int, grows it then just sets one bit + * as required. + */ +int +mp_2expt (mp_int * a, int b) +{ + int res; + + mp_zero (a); + if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + a->used = b / DIGIT_BIT + 1; + a->dp[b / DIGIT_BIT] = 1 << (b % DIGIT_BIT); + + return MP_OKAY; +} + +/* End: bn_mp_2expt.c */ + +/* Start: bn_mp_abs.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = |a| + * + * Simple function copies the input and fixes the sign to positive + */ +int +mp_abs (mp_int * a, mp_int * b) +{ + int res; + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + b->sign = MP_ZPOS; + return MP_OKAY; +} + +/* End: bn_mp_abs.c */ + +/* Start: bn_mp_add.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level addition (handles signs) */ +int +mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + /* get sign of both inputs */ + sa = a->sign; + sb = b->sign; + + /* handle four cases */ + if (sa == MP_ZPOS && sb == MP_ZPOS) { + /* both positive */ + res = s_mp_add (a, b, c); + c->sign = MP_ZPOS; + } else if (sa == MP_ZPOS && sb == MP_NEG) { + /* a + -b == a - b, but if b>a then we do it as -(b-a) */ + if (mp_cmp_mag (a, b) == MP_LT) { + res = s_mp_sub (b, a, c); + c->sign = MP_NEG; + } else { + res = s_mp_sub (a, b, c); + c->sign = MP_ZPOS; + } + } else if (sa == MP_NEG && sb == MP_ZPOS) { + /* -a + b == b - a, but if a>b then we do it as -(a-b) */ + if (mp_cmp_mag (a, b) == MP_GT) { + res = s_mp_sub (a, b, c); + c->sign = MP_NEG; + } else { + res = s_mp_sub (b, a, c); + c->sign = MP_ZPOS; + } + } else { + /* -a + -b == -(a + b) */ + res = s_mp_add (a, b, c); + c->sign = MP_NEG; + } + return res; +} + +/* End: bn_mp_add.c */ + +/* Start: bn_mp_addmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a + b (mod c) */ +int +mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_add (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_addmod.c */ + +/* Start: bn_mp_add_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit addition */ +int +mp_add_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t; + int res; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + mp_set (&t, b); + res = mp_add (a, &t, c); + + mp_clear (&t); + return res; +} + +/* End: bn_mp_add_d.c */ + +/* Start: bn_mp_and.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* AND two ints together */ +int +mp_and (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] &= x->dp[ix]; + } + + /* zero digits above the last from the smallest mp_int */ + for (; ix < t.used; ix++) { + t.dp[ix] = 0; + } + + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_and.c */ + +/* Start: bn_mp_clamp.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* trim unused digits + * + * This is used to ensure that leading zero digits are + * trimed and the leading "used" digit will be non-zero + * Typically very fast. Also fixes the sign if there + * are no more leading digits + */ +void +mp_clamp (mp_int * a) +{ + while (a->used > 0 && a->dp[a->used - 1] == 0) + --(a->used); + if (a->used == 0) { + a->sign = MP_ZPOS; + } +} + +/* End: bn_mp_clamp.c */ + +/* Start: bn_mp_clear.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* clear one (frees) */ +void +mp_clear (mp_int * a) +{ + if (a->dp != NULL) { + + /* first zero the digits */ + memset (a->dp, 0, sizeof (mp_digit) * a->used); + + /* free ram */ + free (a->dp); + + /* reset members to make debugging easier */ + a->dp = NULL; + a->alloc = a->used = 0; + } +} + +/* End: bn_mp_clear.c */ + +/* Start: bn_mp_cmp.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare two ints (signed)*/ +int +mp_cmp (mp_int * a, mp_int * b) +{ + /* compare based on sign */ + if (a->sign == MP_NEG && b->sign == MP_ZPOS) { + return MP_LT; + } else if (a->sign == MP_ZPOS && b->sign == MP_NEG) { + return MP_GT; + } + return mp_cmp_mag (a, b); +} + +/* End: bn_mp_cmp.c */ + +/* Start: bn_mp_cmp_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare a digit */ +int +mp_cmp_d (mp_int * a, mp_digit b) +{ + + if (a->sign == MP_NEG) { + return MP_LT; + } + + if (a->used > 1) { + return MP_GT; + } + + if (a->dp[0] > b) { + return MP_GT; + } else if (a->dp[0] < b) { + return MP_LT; + } else { + return MP_EQ; + } +} + +/* End: bn_mp_cmp_d.c */ + +/* Start: bn_mp_cmp_mag.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* compare maginitude of two ints (unsigned) */ +int +mp_cmp_mag (mp_int * a, mp_int * b) +{ + int n; + + /* compare based on # of non-zero digits */ + if (a->used > b->used) { + return MP_GT; + } else if (a->used < b->used) { + return MP_LT; + } + + /* compare based on digits */ + for (n = a->used - 1; n >= 0; n--) { + if (a->dp[n] > b->dp[n]) { + return MP_GT; + } else if (a->dp[n] < b->dp[n]) { + return MP_LT; + } + } + return MP_EQ; +} + +/* End: bn_mp_cmp_mag.c */ + +/* Start: bn_mp_copy.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* copy, b = a */ +int +mp_copy (mp_int * a, mp_int * b) +{ + int res, n; + + /* if dst == src do nothing */ + if (a == b || a->dp == b->dp) { + return MP_OKAY; + } + + /* grow dest */ + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + + /* zero b and copy the parameters over */ + b->used = a->used; + b->sign = a->sign; + + { + register mp_digit *tmpa, *tmpb; + + tmpa = a->dp; + tmpb = b->dp; + + /* copy all the digits */ + for (n = 0; n < a->used; n++) { + *tmpb++ = *tmpa++; + } + + /* clear high digits */ + for (; n < b->alloc; n++) { + *tmpb++ = 0; + } + } + return MP_OKAY; +} + +/* End: bn_mp_copy.c */ + +/* Start: bn_mp_count_bits.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* returns the number of bits in an int */ +int +mp_count_bits (mp_int * a) +{ + int r; + mp_digit q; + + if (a->used == 0) { + return 0; + } + + r = (a->used - 1) * DIGIT_BIT; + q = a->dp[a->used - 1]; + while (q > ((mp_digit) 0)) { + ++r; + q >>= ((mp_digit) 1); + } + return r; +} + +/* End: bn_mp_count_bits.c */ + +/* Start: bn_mp_div.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* integer signed division. c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly incomplete. For example, + * it doesn't consider the case where digits are removed from 'x' in the inner + * loop. It also doesn't consider the case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as 14.20 from HAC but fixed to treat these cases. +*/ +int +mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int q, x, y, t1, t2; + int res, n, t, i, norm, neg; + + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { + return res; + } + q.used = a->used + 2; + + if ((res = mp_init (&t1)) != MP_OKAY) { + goto __Q; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto __T1; + } + + if ((res = mp_init_copy (&x, a)) != MP_OKAY) { + goto __T2; + } + + if ((res = mp_init_copy (&y, b)) != MP_OKAY) { + goto __X; + } + + /* fix the sign */ + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + x.sign = y.sign = MP_ZPOS; + + /* normalize both x and y, ensure that y >= b/2, [b == 2^DIGIT_BIT] */ + norm = 0; + while ((y.dp[y.used - 1] & (((mp_digit) 1) << (DIGIT_BIT - 1))) == ((mp_digit) 0)) { + ++norm; + if ((res = mp_mul_2 (&x, &x)) != MP_OKAY) { + goto __Y; + } + if ((res = mp_mul_2 (&y, &y)) != MP_OKAY) { + goto __Y; + } + } + + /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ + n = x.used - 1; + t = y.used - 1; + + /* step 2. 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; + } + + while (mp_cmp (&x, &y) != MP_LT) { + ++(q.dp[n - t]); + if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { + goto __Y; + } + } + + /* reset y by shifting it back down */ + mp_rshd (&y, n - t); + + /* step 3. for i from n down to (t + 1) */ + for (i = n; i >= (t + 1); i--) { + if (i > x.used) + continue; + + /* step 3.1 if xi == yt then set q{i-t-1} to b-1, otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ + if (x.dp[i] == y.dp[t]) { + q.dp[i - t - 1] = ((1UL << DIGIT_BIT) - 1UL); + } else { + mp_word tmp; + tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); + tmp |= ((mp_word) x.dp[i - 1]); + tmp /= ((mp_word) y.dp[t]); + if (tmp > (mp_word) MP_MASK) + tmp = MP_MASK; + q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); + } + + /* step 3.2 while (q{i-t-1} * (yt * b + y{t-1})) > xi * b^2 + xi-1 * b + xi-2 do q{i-t-1} -= 1; */ + q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; + do { + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; + + /* find left hand */ + mp_zero (&t1); + t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; + 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; + } + + /* find right hand */ + t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; + t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; + t2.dp[2] = x.dp[i]; + t2.used = 3; + } while (mp_cmp (&t1, &t2) == MP_GT); + + /* 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; + } + + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto __Y; + } + + if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { + goto __Y; + } + + /* step 3.4 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; + } + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto __Y; + } + if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { + goto __Y; + } + + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; + } + } + + /* now q is the quotient and x is the remainder [which we have to normalize] */ + /* get sign before writing to c */ + x.sign = a->sign; + + if (c != NULL) { + mp_clamp (&q); + mp_exch (&q, c); + c->sign = neg; + } + + if (d != NULL) { + mp_div_2d (&x, norm, &x, NULL); + mp_exch (&x, d); + } + + res = MP_OKAY; + +__Y:mp_clear (&y); +__X:mp_clear (&x); +__T2:mp_clear (&t2); +__T1:mp_clear (&t1); +__Q:mp_clear (&q); + return res; +} + +/* End: bn_mp_div.c */ + +/* Start: bn_mp_div_2.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = a/2 */ +int +mp_div_2 (mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* copy */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + { + register mp_digit r, rr, *tmpa, *tmpb; + + tmpa = a->dp + b->used - 1; + tmpb = b->dp + b->used - 1; + r = 0; + for (x = b->used - 1; x >= 0; x--) { + rr = *tmpa & 1; + *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); + r = rr; + } + + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + mp_clamp (b); + return MP_OKAY; +} + +/* End: bn_mp_div_2.c */ + +/* Start: bn_mp_div_2d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift right by a certain bit count (store quotient in c, remainder in d) */ +int +mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) +{ + mp_digit D, r, rr; + int x, res; + mp_int t; + + + /* if the shift count is <= 0 then we do no work */ + if (b <= 0) { + res = mp_copy (a, c); + if (d != NULL) { + mp_zero (d); + } + return res; + } + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + /* get the remainder */ + if (d != NULL) { + if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= DIGIT_BIT) { + mp_rshd (c, b / DIGIT_BIT); + } + + /* shift any bit count < DIGIT_BIT */ + D = (mp_digit) (b % DIGIT_BIT); + if (D != 0) { + r = 0; + for (x = c->used - 1; x >= 0; x--) { + /* get the lower bits of this word in a temp */ + rr = c->dp[x] & ((mp_digit) ((1U << D) - 1U)); + + /* shift the current word and mix in the carry bits from the previous word */ + c->dp[x] = (c->dp[x] >> D) | (r << (DIGIT_BIT - D)); + + /* set the carry to the carry bits of the current word found above */ + r = rr; + } + } + mp_clamp (c); + res = MP_OKAY; + if (d != NULL) { + mp_exch (&t, d); + } + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_div_2d.c */ + +/* Start: bn_mp_div_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit division */ +int +mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) +{ + mp_int t, t2; + int res; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + mp_set (&t, b); + res = mp_div (a, &t, c, &t2); + + if (d != NULL) { + *d = t2.dp[0]; + } + + mp_clear (&t); + mp_clear (&t2); + return res; +} + +/* End: bn_mp_div_d.c */ + +/* Start: bn_mp_dr_reduce.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reduce "a" in place modulo "b" using the Diminished Radix algorithm. + * + * Based on algorithm from the paper + * + * "Generating Efficient Primes for Discrete Log Cryptosystems" + * Chae Hoon Lim, Pil Loong Lee, + * POSTECH Information Research Laboratories + * + * The modulus must be of a special format [see manual] + */ +int +mp_dr_reduce (mp_int * a, mp_int * b, mp_digit mp) +{ + int err, i, j, k; + mp_word r; + mp_digit mu, *tmpj, *tmpi; + + /* k = digits in modulus */ + k = b->used; + + /* ensure that "a" has at least 2k digits */ + if (a->alloc < k + k) { + if ((err = mp_grow (a, k + k)) != MP_OKAY) { + return err; + } + } + + /* alias for a->dp[i] */ + tmpi = a->dp + k + k - 1; + + /* for (i = 2k - 1; i >= k; i = i - 1) + * + * This is the main loop of the reduction. Note that at the end + * the words above position k are not zeroed as expected. The end + * result is that the digits from 0 to k-1 are the residue. So + * we have to clear those afterwards. + */ + for (i = k + k - 1; i >= k; i = i - 1) { + /* x[i - 1 : i - k] += x[i]*mp */ + + /* x[i] * mp */ + r = ((mp_word) *tmpi--) * ((mp_word) mp); + + /* now add r to x[i-1:i-k] + * + * First add it to the first digit x[i-k] then form the carry + * then enter the main loop + */ + j = i - k; + + /* alias for a->dp[j] */ + tmpj = a->dp + j; + + /* add digit */ + *tmpj += (mp_digit)(r & MP_MASK); + + /* this is the carry */ + mu = (r >> ((mp_word) DIGIT_BIT)) + (*tmpj >> DIGIT_BIT); + + /* clear carry from a->dp[j] */ + *tmpj++ &= MP_MASK; + + /* now add rest of the digits + * + * Note this is basically a simple single digit addition to + * a larger multiple digit number. This is optimized somewhat + * because the propagation of carries is not likely to move + * more than a few digits. + * + */ + for (++j; mu != 0 && j <= (i - 1); ++j) { + *tmpj += mu; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + } + + /* if final carry */ + if (mu != 0) { + /* add mp to this to correct */ + j = i - k; + tmpj = a->dp + j; + + *tmpj += mp; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + + /* now handle carries */ + for (++j; mu != 0 && j <= (i - 1); j++) { + *tmpj += mu; + mu = *tmpj >> DIGIT_BIT; + *tmpj++ &= MP_MASK; + } + } + } + + /* zero words above k */ + tmpi = a->dp + k; + for (i = k; i < a->used; i++) { + *tmpi++ = 0; + } + + /* clamp, sub and return */ + mp_clamp (a); + + if (mp_cmp_mag (a, b) != MP_LT) { + return s_mp_sub (a, b, a); + } + return MP_OKAY; +} + +/* determines if a number is a valid DR modulus */ +int mp_dr_is_modulus(mp_int *a) +{ + int ix; + + /* must be at least two digits */ + if (a->used < 2) { + return 0; + } + + for (ix = 1; ix < a->used; ix++) { + if (a->dp[ix] != MP_MASK) { + return 0; + } + } + return 1; +} + +/* determines the setup value */ +void mp_dr_setup(mp_int *a, mp_digit *d) +{ + *d = (1 << DIGIT_BIT) - a->dp[0]; +} + + +/* End: bn_mp_dr_reduce.c */ + +/* Start: bn_mp_exch.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +void +mp_exch (mp_int * a, mp_int * b) +{ + mp_int t; + + t = *a; + *a = *b; + *b = t; +} + +/* End: bn_mp_exch.c */ + +/* Start: bn_mp_exptmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +static int f_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); + +/* this is a shell function that calls either the normal or Montgomery + * exptmod functions. Originally the call to the montgomery code was + * embedded in the normal function but that wasted alot of stack space + * for nothing (since 99% of the time the Montgomery code would be called) + */ +int +mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + int dr; + + dr = mp_dr_is_modulus(P); + /* if the modulus is odd use the fast method */ + if (((mp_isodd (P) == 1 && P->used < MONTGOMERY_EXPT_CUTOFF) || dr == 1) && P->used > 4) { + return mp_exptmod_fast (G, X, P, Y, dr); + } else { + return f_mp_exptmod (G, X, P, Y); + } +} + +static int +f_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + mp_int M[256], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + + /* init G array */ + for (x = 0; x < (1 << winsize); x++) { + if ((err = mp_init_size (&M[x], 1)) != MP_OKAY) { + for (y = 0; y < x; y++) { + mp_clear (&M[y]); + } + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto __M; + } + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto __MU; + } + + /* create M table + * + * The M table contains powers of the input base, e.g. M[x] = G^x mod P + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto __MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&M[x], P, &mu)) != MP_OKAY) { + goto __MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto __MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 0; + buf = 0; + digidx = X->used - 1; + bitcpy = bitbuf = 0; + + bitcnt = 1; + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + if (digidx == -1) { + break; + } + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (DIGIT_BIT - 1)) & 1; + buf <<= 1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) + continue; + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto __MU; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __MU; + } + + /* empty window and reset */ + bitcpy = bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = mp_reduce (&res, P, &mu)) != MP_OKAY) { + goto __RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +__RES:mp_clear (&res); +__MU:mp_clear (&mu); +__M: + for (x = 0; x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} + +/* End: bn_mp_exptmod.c */ + +/* Start: bn_mp_exptmod_fast.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes Y == G^X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + * + * Uses Montgomery reduction + */ +int +mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[256], res; + mp_digit buf, mp; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + int (*redux)(mp_int*,mp_int*,mp_digit); + + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + + /* init G array */ + for (x = 0; x < (1 << winsize); x++) { + if ((err = mp_init (&M[x])) != MP_OKAY) { + for (y = 0; y < x; y++) { + mp_clear (&M[y]); + } + return err; + } + } + + if (redmode == 0) { + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto __M; + } + redux = mp_montgomery_reduce; + } else { + /* setup DR reduction */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto __RES; + } + + /* create M table + * + * The M table contains powers of the input base, e.g. M[x] = G^x mod P + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + + if (redmode == 0) { + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto __RES; + } + + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto __RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto __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; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + goto __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; + } + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { + goto __RES; + } + } + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 0; + buf = 0; + digidx = X->used - 1; + bitcpy = bitbuf = 0; + + bitcnt = 1; + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + if (digidx == -1) { + break; + } + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (DIGIT_BIT - 1)) & 1; + buf <<= 1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) + continue; + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + + /* empty window and reset */ + bitcpy = bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto __RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + } + } + + if (redmode == 0) { + /* fixup result */ + if ((err = mp_montgomery_reduce (&res, P, mp)) != MP_OKAY) { + goto __RES; + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +__RES:mp_clear (&res); +__M: + for (x = 0; x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} + +/* End: bn_mp_exptmod_fast.c */ + +/* Start: bn_mp_expt_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int +mp_expt_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, x; + mp_int g; + + + if ((res = mp_init_copy (&g, a)) != MP_OKAY) { + return res; + } + + /* set initial result */ + mp_set (c, 1); + + for (x = 0; x < (int) DIGIT_BIT; x++) { + if ((res = mp_sqr (c, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + + if ((b & (mp_digit) (1 << (DIGIT_BIT - 1))) != 0) { + if ((res = mp_mul (c, &g, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + } + + b <<= 1; + } + + mp_clear (&g); + return MP_OKAY; +} + +/* End: bn_mp_expt_d.c */ + +/* Start: bn_mp_gcd.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Greatest Common Divisor using the binary method [Algorithm B, page 338, vol2 of TAOCP] + */ +int +mp_gcd (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int u, v, t; + int k, res, neg; + + + /* either zero than gcd is the largest */ + if (mp_iszero (a) == 1 && mp_iszero (b) == 0) { + return mp_copy (b, c); + } + if (mp_iszero (a) == 0 && mp_iszero (b) == 1) { + return mp_copy (a, c); + } + if (mp_iszero (a) == 1 && mp_iszero (b) == 1) { + mp_set (c, 1); + return MP_OKAY; + } + + /* if both are negative they share (-1) as a common divisor */ + neg = (a->sign == b->sign) ? a->sign : MP_ZPOS; + + if ((res = mp_init_copy (&u, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init_copy (&v, b)) != MP_OKAY) { + goto __U; + } + + /* must be positive for the remainder of the algorithm */ + u.sign = v.sign = MP_ZPOS; + + if ((res = mp_init (&t)) != MP_OKAY) { + goto __V; + } + + /* B1. Find power of two */ + k = 0; + while ((u.dp[0] & 1) == 0 && (v.dp[0] & 1) == 0) { + ++k; + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __T; + } + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __T; + } + } + + /* B2. Initialize */ + if ((u.dp[0] & 1) == 1) { + if ((res = mp_copy (&v, &t)) != MP_OKAY) { + goto __T; + } + t.sign = MP_NEG; + } else { + if ((res = mp_copy (&u, &t)) != MP_OKAY) { + goto __T; + } + } + + do { + /* B3 (and B4). Halve t, if even */ + while (t.used != 0 && (t.dp[0] & 1) == 0) { + if ((res = mp_div_2 (&t, &t)) != MP_OKAY) { + goto __T; + } + } + + /* B5. if t>0 then u=t otherwise v=-t */ + if (t.used != 0 && t.sign != MP_NEG) { + if ((res = mp_copy (&t, &u)) != MP_OKAY) { + goto __T; + } + } else { + if ((res = mp_copy (&t, &v)) != MP_OKAY) { + goto __T; + } + v.sign = (v.sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; + } + + /* B6. t = u - v, if t != 0 loop otherwise terminate */ + if ((res = mp_sub (&u, &v, &t)) != MP_OKAY) { + goto __T; + } + } + while (t.used != 0); + + if ((res = mp_mul_2d (&u, k, &u)) != MP_OKAY) { + goto __T; + } + + mp_exch (&u, c); + c->sign = neg; + res = MP_OKAY; +__T:mp_clear (&t); +__V:mp_clear (&u); +__U:mp_clear (&v); + return res; +} + +/* End: bn_mp_gcd.c */ + +/* Start: bn_mp_grow.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* grow as required */ +int +mp_grow (mp_int * a, int size) +{ + int i, n; + + /* if the alloc size is smaller alloc more ram */ + if (a->alloc < size) { + size += (MP_PREC * 2) - (size & (MP_PREC - 1)); /* ensure there are always at least MP_PREC digits extra on top */ + + a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * size); + if (a->dp == NULL) { + return MP_MEM; + } + + n = a->alloc; + a->alloc = size; + for (i = n; i < a->alloc; i++) { + a->dp[i] = 0; + } + } + return MP_OKAY; +} + +/* End: bn_mp_grow.c */ + +/* Start: bn_mp_init.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* init a new bigint */ +int +mp_init (mp_int * a) +{ + + /* allocate ram required and clear it */ + a->dp = OPT_CAST calloc (sizeof (mp_digit), MP_PREC); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the used to zero, allocated digit to the default precision + * and sign to positive */ + a->used = 0; + a->alloc = MP_PREC; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + +/* End: bn_mp_init.c */ + +/* Start: bn_mp_init_copy.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* creates "a" then copies b into it */ +int +mp_init_copy (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_init (a)) != MP_OKAY) { + return res; + } + return mp_copy (b, a); +} + +/* End: bn_mp_init_copy.c */ + +/* Start: bn_mp_init_size.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* init a mp_init and grow it to a given size */ +int +mp_init_size (mp_int * a, int size) +{ + + /* pad up so there are at least 16 zero digits */ + size += (MP_PREC * 2) - (size & (MP_PREC - 1)); /* ensure there are always at least 16 digits extra on top */ + a->dp = OPT_CAST calloc (sizeof (mp_digit), size); + if (a->dp == NULL) { + return MP_MEM; + } + a->used = 0; + a->alloc = size; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + +/* End: bn_mp_init_size.c */ + +/* Start: bn_mp_invmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int +mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == MP_NEG) { + return MP_VAL; + } + + /* if the modulus is odd we can use a faster routine instead */ + if (mp_iseven (b) == 0) { + return fast_mp_invmod (a, b, c); + } + + if ((res = mp_init (&x)) != MP_OKAY) { + goto __ERR; + } + + if ((res = mp_init (&y)) != MP_OKAY) { + goto __X; + } + + if ((res = mp_init (&u)) != MP_OKAY) { + goto __Y; + } + + if ((res = mp_init (&v)) != MP_OKAY) { + goto __U; + } + + if ((res = mp_init (&A)) != MP_OKAY) { + goto __V; + } + + if ((res = mp_init (&B)) != MP_OKAY) { + goto __A; + } + + if ((res = mp_init (&C)) != MP_OKAY) { + goto __B; + } + + if ((res = mp_init (&D)) != MP_OKAY) { + goto __C; + } + + /* x = a, y = b */ + if ((res = mp_copy (a, &x)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy (b, &y)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_abs (&x, &x)) != MP_OKAY) { + goto __D; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto __D; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto __D; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto __D; + } + mp_set (&A, 1); + mp_set (&D, 1); + + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto __D; + } + /* 4.2 if A or B is odd then */ + if (mp_iseven (&A) == 0 || mp_iseven (&B) == 0) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { + goto __D; + } + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto __D; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { + goto __D; + } + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto __D; + } + } + + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto __D; + } + /* 5.2 if C,D are even then */ + if (mp_iseven (&C) == 0 || mp_iseven (&D) == 0) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { + goto __D; + } + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto __D; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { + goto __D; + } + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto __D; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto __D; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { + goto __D; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto __D; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto __D; + } + + /* a is now the inverse */ + mp_exch (&C, c); + res = MP_OKAY; + +__D:mp_clear (&D); +__C:mp_clear (&C); +__B:mp_clear (&B); +__A:mp_clear (&A); +__V:mp_clear (&v); +__U:mp_clear (&u); +__Y:mp_clear (&y); +__X:mp_clear (&x); +__ERR: + return res; +} + +/* End: bn_mp_invmod.c */ + +/* Start: bn_mp_jacobi.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes the jacobi c = (a | n) (or Legendre if b is prime) + * HAC pp. 73 Algorithm 2.149 + */ +int +mp_jacobi (mp_int * a, mp_int * n, int *c) +{ + mp_int a1, n1, e; + int s, r, res; + mp_digit residue; + + /* step 1. if a == 0, return 0 */ + if (mp_iszero (a) == 1) { + *c = 0; + return MP_OKAY; + } + + /* step 2. if a == 1, return 1 */ + if (mp_cmp_d (a, 1) == MP_EQ) { + *c = 1; + return MP_OKAY; + } + + /* default */ + s = 0; + + /* step 3. write a = a1 * 2^e */ + if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&n1)) != MP_OKAY) { + goto __A1; + } + + if ((res = mp_init (&e)) != MP_OKAY) { + goto __N1; + } + + while (mp_iseven (&a1) == 1) { + if ((res = mp_add_d (&e, 1, &e)) != MP_OKAY) { + goto __E; + } + + if ((res = mp_div_2 (&a1, &a1)) != MP_OKAY) { + goto __E; + } + } + + /* step 4. if e is even set s=1 */ + if (mp_iseven (&e) == 1) { + s = 1; + } else { + /* else set s=1 if n = 1/7 (mod 8) or s=-1 if n = 3/5 (mod 8) */ + if ((res = mp_mod_d (n, 8, &residue)) != MP_OKAY) { + goto __E; + } + + if (residue == 1 || residue == 7) { + s = 1; + } else if (residue == 3 || residue == 5) { + s = -1; + } + } + + /* step 5. if n == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ + if ((res = mp_mod_d (n, 4, &residue)) != MP_OKAY) { + goto __E; + } + if (residue == 3) { + if ((res = mp_mod_d (&a1, 4, &residue)) != MP_OKAY) { + goto __E; + } + if (residue == 3) { + s = -s; + } + } + + /* if a1 == 1 we're done */ + if (mp_cmp_d (&a1, 1) == MP_EQ) { + *c = s; + } else { + /* n1 = n mod a1 */ + if ((res = mp_mod (n, &a1, &n1)) != MP_OKAY) { + goto __E; + } + if ((res = mp_jacobi (&n1, &a1, &r)) != MP_OKAY) { + goto __E; + } + *c = s * r; + } + + /* done */ + res = MP_OKAY; +__E:mp_clear (&e); +__N1:mp_clear (&n1); +__A1:mp_clear (&a1); + return res; +} + +/* End: bn_mp_jacobi.c */ + +/* Start: bn_mp_karatsuba_mul.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = |a| * |b| using Karatsuba Multiplication using three half size multiplications + * + * Let B represent the radix [e.g. 2**DIGIT_BIT] and let n represent half of the number of digits in the min(a,b) + * + * a = a1 * B^n + a0 + * b = b1 * B^n + b0 + * + * Then, a * b => a1b1 * B^2n + ((a1 - b1)(a0 - b0) + a0b0 + a1b1) * B + a0b0 + * + * Note that a1b1 and a0b0 are used twice and only need to be computed once. So in total + * three half size (half # of digit) multiplications are performed, a0b0, a1b1 and (a1-b1)(a0-b0) + * + * Note that a multiplication of half the digits requires 1/4th the number of single precision + * multiplications so in total after one call 25% of the single precision multiplications are saved. + * Note also that the call to mp_mul can end up back in this function if the a0, a1, b0, or b1 are above + * the threshold. This is known as divide-and-conquer and leads to the famous O(N^lg(3)) or O(N^1.584) work which + * is asymptopically lower than the standard O(N^2) that the baseline/comba methods use. Generally though the + * overhead of this method doesn't pay off until a certain size (N ~ 80) is reached. + */ +int +mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x0, x1, y0, y1, t1, t2, x0y0, x1y1; + int B, err; + + err = MP_MEM; + + /* min # of digits */ + B = MIN (a->used, b->used); + + /* now divide in two */ + B = B / 2; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + if (mp_init_size (&y0, B) != MP_OKAY) + goto X1; + if (mp_init_size (&y1, b->used - B) != MP_OKAY) + goto Y0; + + /* init temps */ + if (mp_init_size (&t1, B * 2) != MP_OKAY) + goto Y1; + if (mp_init_size (&t2, B * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x0y0, B * 2) != MP_OKAY) + goto T2; + if (mp_init_size (&x1y1, B * 2) != MP_OKAY) + goto X0Y0; + + /* now shift the digits */ + x0.sign = x1.sign = a->sign; + y0.sign = y1.sign = b->sign; + + x0.used = y0.used = B; + x1.used = a->used - B; + y1.used = b->used - B; + + { + register int x; + register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; + + /* we copy the digits directly instead of using higher level functions + * since we also need to shift the digits + */ + tmpa = a->dp; + tmpb = b->dp; + + tmpx = x0.dp; + tmpy = y0.dp; + for (x = 0; x < B; x++) { + *tmpx++ = *tmpa++; + *tmpy++ = *tmpb++; + } + + tmpx = x1.dp; + for (x = B; x < a->used; x++) { + *tmpx++ = *tmpa++; + } + + tmpy = y1.dp; + for (x = B; x < b->used; x++) { + *tmpy++ = *tmpb++; + } + } + + /* only need to clamp the lower words since by definition the upper words x1/y1 must + * have a known number of digits + */ + mp_clamp (&x0); + mp_clamp (&y0); + + /* now calc the products x0y0 and x1y1 */ + if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) + goto X1Y1; /* x0y0 = x0*y0 */ + if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) + goto X1Y1; /* x1y1 = x1*y1 */ + + /* now calc x1-x0 and y1-y0 */ + if (mp_sub (&x1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = x1 - x0 */ + if (mp_sub (&y1, &y0, &t2) != MP_OKAY) + goto X1Y1; /* t2 = y1 - y0 */ + if (mp_mul (&t1, &t2, &t1) != MP_OKAY) + goto X1Y1; /* t1 = (x1 - x0) * (y1 - y0) */ + + /* add x0y0 */ + if (mp_add (&x0y0, &x1y1, &t2) != MP_OKAY) + goto X1Y1; /* t2 = x0y0 + x1y1 */ + if (mp_sub (&t2, &t1, &t1) != MP_OKAY) + goto X1Y1; /* t1 = x0y0 + x1y1 - (x1-x0)*(y1-y0) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< + +/* Karatsuba squaring, computes b = a*a using three half size squarings + * + * See comments of mp_karatsuba_mul for details. It is essentially the same algorithm + * but merely tuned to perform recursive squarings. + */ +int +mp_karatsuba_sqr (mp_int * a, mp_int * b) +{ + mp_int x0, x1, t1, t2, x0x0, x1x1; + int B, err; + + err = MP_MEM; + + /* min # of digits */ + B = a->used; + + /* now divide in two */ + B = B / 2; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + + /* init temps */ + if (mp_init_size (&t1, a->used * 2) != MP_OKAY) + goto X1; + if (mp_init_size (&t2, a->used * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x0x0, B * 2) != MP_OKAY) + goto T2; + if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) + goto X0X0; + + { + register int x; + register mp_digit *dst, *src; + + src = a->dp; + + /* now shift the digits */ + dst = x0.dp; + for (x = 0; x < B; x++) { + *dst++ = *src++; + } + + dst = x1.dp; + for (x = B; x < a->used; x++) { + *dst++ = *src++; + } + } + + x0.used = B; + x1.used = a->used - B; + + mp_clamp (&x0); + + /* now calc the products x0*x0 and x1*x1 */ + if (mp_sqr (&x0, &x0x0) != MP_OKAY) + goto X1X1; /* x0x0 = x0*x0 */ + if (mp_sqr (&x1, &x1x1) != MP_OKAY) + goto X1X1; /* x1x1 = x1*x1 */ + + /* now calc x1-x0 and y1-y0 */ + if (mp_sub (&x1, &x0, &t1) != MP_OKAY) + goto X1X1; /* t1 = x1 - x0 */ + if (mp_sqr (&t1, &t1) != MP_OKAY) + goto X1X1; /* t1 = (x1 - x0) * (y1 - y0) */ + + /* add x0y0 */ + if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) + goto X1X1; /* t2 = x0y0 + x1y1 */ + if (mp_sub (&t2, &t1, &t1) != MP_OKAY) + goto X1X1; /* t1 = x0y0 + x1y1 - (x1-x0)*(y1-y0) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1X1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< + +/* computes least common multiple as a*b/(a, b) */ +int +mp_lcm (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if ((res = mp_gcd (a, b, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + res = mp_div (&t, c, c, NULL); + mp_clear (&t); + return res; +} + +/* End: bn_mp_lcm.c */ + +/* Start: bn_mp_lshd.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift left a certain amount of digits */ +int +mp_lshd (mp_int * a, int b) +{ + int x, res; + + + /* if its less than zero return */ + if (b <= 0) { + return MP_OKAY; + } + + /* grow to fit the new digits */ + if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { + return res; + } + + { + register mp_digit *tmpa, *tmpaa; + + /* increment the used by the shift amount than copy upwards */ + a->used += b; + + /* top */ + tmpa = a->dp + a->used - 1; + + /* base */ + tmpaa = a->dp + a->used - 1 - b; + + /* much like mp_rshd this is implemented using a sliding window + * except the window goes the otherway around. Copying from + * the bottom to the top. see bn_mp_rshd.c for more info. + */ + for (x = a->used - 1; x >= b; x--) { + *tmpa-- = *tmpaa--; + } + + /* zero the lower digits */ + tmpa = a->dp; + for (x = 0; x < b; x++) { + *tmpa++ = 0; + } + } + return MP_OKAY; +} + +/* End: bn_mp_lshd.c */ + +/* Start: bn_mp_mod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = a mod b, 0 <= c < b */ +int +mp_mod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int t; + int res; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if (t.sign == MP_NEG) { + res = mp_add (b, &t, c); + } else { + res = MP_OKAY; + mp_exch (&t, c); + } + + mp_clear (&t); + return res; +} + +/* End: bn_mp_mod.c */ + +/* Start: bn_mp_mod_2d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* calc a value mod 2^b */ +int +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b > (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mod_2d.c */ + +/* Start: bn_mp_mod_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +int +mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) +{ + mp_int t, t2; + int res; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + mp_set (&t, b); + mp_div (a, &t, NULL, &t2); + + if (t2.sign == MP_NEG) { + if ((res = mp_add_d (&t2, b, &t2)) != MP_OKAY) { + mp_clear (&t); + mp_clear (&t2); + return res; + } + } + *c = t2.dp[0]; + mp_clear (&t); + mp_clear (&t2); + return MP_OKAY; +} + +/* End: bn_mp_mod_d.c */ + +/* Start: bn_mp_montgomery_calc_normalization.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* calculates a = B^n mod b for Montgomery reduction + * Where B is the base [e.g. 2^DIGIT_BIT]. + * B^n mod b is computed by first computing + * A = B^(n-1) which doesn't require a reduction but a simple OR. + * then C = A * B = B^n is computed by performing upto DIGIT_BIT + * shifts with subtractions when the result is greater than b. + * + * The method is slightly modified to shift B unconditionally upto just under + * the leading bit of b. This saves alot of multiple precision shifting. + */ +int +mp_montgomery_calc_normalization (mp_int * a, mp_int * b) +{ + int x, bits, res; + + /* how many bits of last digit does b use */ + bits = mp_count_bits (b) % DIGIT_BIT; + + /* compute A = B^(n-1) * 2^(bits-1) */ + if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { + return res; + } + + /* now compute C = A * B mod b */ + for (x = bits - 1; x < DIGIT_BIT; x++) { + if ((res = mp_mul_2 (a, a)) != MP_OKAY) { + return res; + } + if (mp_cmp_mag (a, b) != MP_LT) { + if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { + return res; + } + } + } + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_calc_normalization.c */ + +/* Start: bn_mp_montgomery_reduce.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes xR^-1 == x (mod N) via Montgomery Reduction */ +int +mp_montgomery_reduce (mp_int * a, mp_int * m, mp_digit mp) +{ + int ix, res, digs; + mp_digit ui; + + digs = m->used * 2 + 1; + if ((digs < 512) + && digs < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_mp_montgomery_reduce (a, m, mp); + } + + if (a->alloc < m->used * 2 + 1) { + if ((res = mp_grow (a, m->used * 2 + 1)) != MP_OKAY) { + return res; + } + } + a->used = m->used * 2 + 1; + + for (ix = 0; ix < m->used; ix++) { + /* ui = ai * m' mod b */ + ui = (a->dp[ix] * mp) & MP_MASK; + + /* a = a + ui * m * b^i */ + { + register int iy; + register mp_digit *tmpx, *tmpy, mu; + register mp_word r; + + /* aliases */ + tmpx = m->dp; + tmpy = a->dp + ix; + + mu = 0; + for (iy = 0; iy < m->used; iy++) { + r = ((mp_word) ui) * ((mp_word) * tmpx++) + ((mp_word) mu) + ((mp_word) * tmpy); + mu = (r >> ((mp_word) DIGIT_BIT)); + *tmpy++ = (r & ((mp_word) MP_MASK)); + } + /* propagate carries */ + while (mu) { + *tmpy += mu; + mu = (*tmpy >> DIGIT_BIT) & 1; + *tmpy++ &= MP_MASK; + } + } + } + + /* A = A/b^n */ + mp_rshd (a, m->used); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (a, m) != MP_LT) { + return s_mp_sub (a, m, a); + } + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_reduce.c */ + +/* Start: bn_mp_montgomery_setup.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* setups the montgomery reduction stuff */ +int +mp_montgomery_setup (mp_int * a, mp_digit * mp) +{ + unsigned long x, b; + +/* fast inversion mod 2^32 + * + * Based on the fact that + * + * XA = 1 (mod 2^n) => (X(2-XA)) A = 1 (mod 2^2n) + * => 2*X*A - X*X*A*A = 1 + * => 2*(1) - (1) = 1 + */ + b = a->dp[0]; + + if ((b & 1) == 0) { + return MP_VAL; + } + + x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2^4 */ + x *= 2 - b * x; /* here x*a==1 mod 2^8 */ + x *= 2 - b * x; /* here x*a==1 mod 2^16; each step doubles the nb of bits */ + x *= 2 - b * x; /* here x*a==1 mod 2^32 */ + + /* t = -1/m mod b */ + *mp = ((mp_digit) 1 << ((mp_digit) DIGIT_BIT)) - (x & MP_MASK); + + return MP_OKAY; +} + +/* End: bn_mp_montgomery_setup.c */ + +/* Start: bn_mp_mul.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level multiplication (handles sign) */ +int +mp_mul (mp_int * a, mp_int * b, mp_int * c) +{ + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + if (MIN (a->used, b->used) > KARATSUBA_MUL_CUTOFF) { + res = mp_karatsuba_mul (a, b, c); + } else { + + /* can we use the fast multiplier? + * + * The fast multiplier can be used if the output will have less than + * 512 digits and the number of digits won't affect carry propagation + */ + int digs = a->used + b->used + 1; + + if ((digs < 512) + && digs < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + res = fast_s_mp_mul_digs (a, b, c, digs); + } else { + res = s_mp_mul (a, b, c); + } + + } + c->sign = neg; + return res; +} + +/* End: bn_mp_mul.c */ + +/* Start: bn_mp_mulmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a * b (mod c) */ +int +mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_mulmod.c */ + +/* Start: bn_mp_mul_2.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = a*2 */ +int +mp_mul_2 (mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* Optimization: should copy and shift at the same time */ + + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + + /* shift any bit count < DIGIT_BIT */ + { + register mp_digit r, rr, *tmpa, *tmpb; + + r = 0; + tmpa = a->dp; + tmpb = b->dp; + for (x = 0; x < b->used; x++) { + rr = *tmpa >> (DIGIT_BIT - 1); + *tmpb++ = ((*tmpa++ << 1) | r) & MP_MASK; + r = rr; + } + + /* new leading digit? */ + if (r != 0) { + if (b->alloc == b->used) { + if ((res = mp_grow (b, b->used + 1)) != MP_OKAY) { + return res; + } + + /* after the grow *tmpb is no longer valid so we have to reset it! + * (this bug took me about 17 minutes to find...!) + */ + tmpb = b->dp + b->used; + } + /* add a MSB of 1 */ + *tmpb = 1; + ++b->used; + } + + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + return MP_OKAY; +} + +/* End: bn_mp_mul_2.c */ + +/* Start: bn_mp_mul_2d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift left by a certain bit count */ +int +mp_mul_2d (mp_int * a, int b, mp_int * c) +{ + mp_digit d, r, rr; + int x, res; + + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= DIGIT_BIT) { + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } + c->used = c->alloc; + + /* shift any bit count < DIGIT_BIT */ + d = (mp_digit) (b % DIGIT_BIT); + if (d != 0) { + r = 0; + for (x = 0; x < c->used; x++) { + /* get the higher bits of the current word */ + rr = (c->dp[x] >> (DIGIT_BIT - d)) & ((mp_digit) ((1U << d) - 1U)); + + /* shift the current word and OR in the carry */ + c->dp[x] = ((c->dp[x] << d) | r) & MP_MASK; + + /* set the carry to the carry bits of the current word */ + r = rr; + } + } + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mul_2d.c */ + +/* Start: bn_mp_mul_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiply by a digit */ +int +mp_mul_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, pa, olduse; + + pa = a->used; + if (c->alloc < pa + 1) { + if ((res = mp_grow (c, pa + 1)) != MP_OKAY) { + return res; + } + } + + olduse = c->used; + c->used = pa + 1; + + { + register mp_digit u, *tmpa, *tmpc; + register mp_word r; + register int ix; + + tmpc = c->dp + c->used; + for (ix = c->used; ix < olduse; ix++) { + *tmpc++ = 0; + } + + tmpa = a->dp; + tmpc = c->dp; + + u = 0; + for (ix = 0; ix < pa; ix++) { + r = ((mp_word) u) + ((mp_word) * tmpa++) * ((mp_word) b); + *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpc = u; + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_mp_mul_d.c */ + +/* Start: bn_mp_neg.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* b = -a */ +int +mp_neg (mp_int * a, mp_int * b) +{ + int res; + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; + return MP_OKAY; +} + +/* End: bn_mp_neg.c */ + +/* Start: bn_mp_n_root.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* find the n'th root of an integer + * + * Result found such that (c)^b <= a and (c+1)^b > a + * + * This algorithm uses Newton's approximation x[i+1] = x[i] - f(x[i])/f'(x[i]) + * which will find the root in log(N) time where each step involves a fair bit. This + * is not meant to find huge roots [square and cube at most]. + */ +int +mp_n_root (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t1, t2, t3; + int res, neg; + + /* input must be positive if b is even */ + if ((b & 1) == 0 && a->sign == MP_NEG) { + return MP_VAL; + } + + if ((res = mp_init (&t1)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto __T1; + } + + if ((res = mp_init (&t3)) != MP_OKAY) { + goto __T2; + } + + /* if a is negative fudge the sign but keep track */ + neg = a->sign; + a->sign = MP_ZPOS; + + /* t2 = 2 */ + mp_set (&t2, 2); + + do { + /* t1 = t2 */ + if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { + goto __T3; + } + + /* t2 = t1 - ((t1^b - a) / (b * t1^(b-1))) */ + if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) */ + goto __T3; + } + + /* numerator */ + if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { /* t2 = t1^b */ + goto __T3; + } + + if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { /* t2 = t1^b - a */ + goto __T3; + } + + if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { /* t3 = t1^(b-1) * b */ + goto __T3; + } + + if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { /* t3 = (t1^b - a)/(b * t1^(b-1)) */ + goto __T3; + } + + if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { + goto __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; + } + + if (mp_cmp (&t2, a) == MP_GT) { + if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { + goto __T3; + } + } else { + break; + } + } + + /* reset the sign of a first */ + a->sign = neg; + + /* set the result */ + mp_exch (&t1, c); + + /* set the sign of the result */ + c->sign = neg; + + res = MP_OKAY; + +__T3:mp_clear (&t3); +__T2:mp_clear (&t2); +__T1:mp_clear (&t1); + return res; +} + +/* End: bn_mp_n_root.c */ + +/* Start: bn_mp_or.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* OR two ints together */ +int +mp_or (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] |= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_or.c */ + +/* Start: bn_mp_prime_fermat.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs one Fermat test. + * + * If "a" were prime then b^a == b (mod a) since the order of + * the multiplicative sub-group would be phi(a) = a-1. That means + * it would be the same as b^(a mod (a-1)) == b^1 == b (mod a). + * + * Sets result to 1 if the congruence holds, or zero otherwise. + */ +int +mp_prime_fermat (mp_int * a, mp_int * b, int *result) +{ + mp_int t; + int err; + + /* default to fail */ + *result = 0; + + /* init t */ + if ((err = mp_init (&t)) != MP_OKAY) { + return err; + } + + /* compute t = b^a mod a */ + if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { + goto __T; + } + + /* is it equal to b? */ + if (mp_cmp (&t, b) == MP_EQ) { + *result = 1; + } + + err = MP_OKAY; +__T:mp_clear (&t); + return err; +} + +/* End: bn_mp_prime_fermat.c */ + +/* Start: bn_mp_prime_is_divisible.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* determines if an integers is divisible by one of the first 256 primes or not + * + * sets result to 0 if not, 1 if yes + */ +int +mp_prime_is_divisible (mp_int * a, int *result) +{ + int err, ix; + mp_digit res; + + /* default to not */ + *result = 0; + + for (ix = 0; ix < 256; ix++) { + /* is it equal to the prime? */ + if (mp_cmp_d (a, __prime_tab[ix]) == MP_EQ) { + *result = 1; + return MP_OKAY; + } + + /* what is a mod __prime_tab[ix] */ + if ((err = mp_mod_d (a, __prime_tab[ix], &res)) != MP_OKAY) { + return err; + } + + /* is the residue zero? */ + if (res == 0) { + *result = 1; + return MP_OKAY; + } + } + + return MP_OKAY; +} + +/* End: bn_mp_prime_is_divisible.c */ + +/* Start: bn_mp_prime_is_prime.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* performs a variable number of rounds of Miller-Rabin + * + * Probability of error after t rounds is no more than + * (1/4)^t when 1 <= t <= 256 + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int +mp_prime_is_prime (mp_int * a, int t, int *result) +{ + mp_int b; + int ix, err, res; + + /* default to no */ + *result = 0; + + /* valid value of t? */ + if (t < 1 || t > 256) { + return MP_VAL; + } + + /* first perform trial division */ + if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { + return err; + } + if (res == 1) { + return MP_OKAY; + } + + /* now perform the miller-rabin rounds */ + if ((err = mp_init (&b)) != MP_OKAY) { + return err; + } + + for (ix = 0; ix < t; ix++) { + /* set the prime */ + mp_set (&b, __prime_tab[ix]); + + if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { + goto __B; + } + + if (res == 0) { + goto __B; + } + } + + /* passed the test */ + *result = 1; +__B:mp_clear (&b); + return err; +} + +/* End: bn_mp_prime_is_prime.c */ + +/* Start: bn_mp_prime_miller_rabin.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* Miller-Rabin test of "a" to the base of "b" as described in + * HAC pp. 139 Algorithm 4.24 + * + * Sets result to 0 if definitely composite or 1 if probably prime. + * Randomly the chance of error is no more than 1/4 and often + * very much lower. + */ +int +mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) +{ + mp_int n1, y, r; + int s, j, err; + + /* default */ + *result = 0; + + /* get n1 = a - 1 */ + if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { + return err; + } + if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { + goto __N1; + } + + /* set 2^s * r = n1 */ + if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { + goto __N1; + } + s = 0; + while (mp_iseven (&r) == 1) { + ++s; + if ((err = mp_div_2 (&r, &r)) != MP_OKAY) { + goto __R; + } + } + + /* compute y = b^r mod a */ + if ((err = mp_init (&y)) != MP_OKAY) { + goto __R; + } + if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { + goto __Y; + } + + /* if y != 1 and y != n1 do */ + if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { + j = 1; + /* 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; + } + + /* if y == 1 then composite */ + if (mp_cmp_d (&y, 1) == MP_EQ) { + goto __Y; + } + + ++j; + } + + /* if y != n1 then composite */ + if (mp_cmp (&y, &n1) != MP_EQ) { + goto __Y; + } + } + + /* probably prime now */ + *result = 1; +__Y:mp_clear (&y); +__R:mp_clear (&r); +__N1:mp_clear (&n1); + return err; +} + +/* End: bn_mp_prime_miller_rabin.c */ + +/* Start: bn_mp_prime_next_prime.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + */ +int mp_prime_next_prime(mp_int *a, int t) +{ + int err, res; + + if (mp_iseven(a) == 1) { + /* force odd */ + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { + return err; + } + } else { + /* force to next number */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + for (;;) { + /* is this prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { + return err; + } + + if (res == 1) { + break; + } + + /* add two, next candidate */ + if ((err = mp_add_d(a, 2, a)) != MP_OKAY) { + return err; + } + } + + return MP_OKAY; +} + + +/* End: bn_mp_prime_next_prime.c */ + +/* Start: bn_mp_rand.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* makes a pseudo-random int of a given size */ +int +mp_rand (mp_int * a, int digits) +{ + int res; + mp_digit d; + + mp_zero (a); + if (digits <= 0) { + return MP_OKAY; + } + + /* first place a random non-zero digit */ + do { + d = ((mp_digit) abs (rand ())); + } while (d == 0); + + if ((res = mp_add_d (a, d, a)) != MP_OKAY) { + return res; + } + + while (digits-- > 0) { + if ((res = mp_lshd (a, 1)) != MP_OKAY) { + return res; + } + + if ((res = mp_add_d (a, ((mp_digit) abs (rand ())), a)) != MP_OKAY) { + return res; + } + } + + return MP_OKAY; +} + +/* End: bn_mp_rand.c */ + +/* Start: bn_mp_read_signed_bin.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* read signed bin, big endian, first byte is 0==positive or 1==negative */ +int +mp_read_signed_bin (mp_int * a, unsigned char *b, int c) +{ + int res; + + if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { + return res; + } + a->sign = ((b[0] == (unsigned char) 0) ? MP_ZPOS : MP_NEG); + return MP_OKAY; +} + +/* End: bn_mp_read_signed_bin.c */ + +/* Start: bn_mp_read_unsigned_bin.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reads a unsigned char array, assumes the msb is stored first [big endian] */ +int +mp_read_unsigned_bin (mp_int * a, unsigned char *b, int c) +{ + int res; + mp_zero (a); + while (c-- > 0) { + if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { + return res; + } + + if (DIGIT_BIT != 7) { + a->dp[0] |= *b++; + a->used += 1; + } else { + a->dp[0] = (*b & MP_MASK); + a->dp[1] |= ((*b++ >> 7U) & 1); + a->used += 2; + } + } + mp_clamp (a); + return MP_OKAY; +} + +/* End: bn_mp_read_unsigned_bin.c */ + +/* Start: bn_mp_reduce.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* pre-calculate the value required for Barrett reduction + * For a given modulus "b" it calulates the value required in "a" + */ +int +mp_reduce_setup (mp_int * a, mp_int * b) +{ + int res; + + + if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { + return res; + } + res = mp_div (a, b, a, NULL); + return res; +} + +/* reduces x mod m, assumes 0 < x < m^2, mu is precomputed via mp_reduce_setup + * From HAC pp.604 Algorithm 14.42 + */ +int +mp_reduce (mp_int * x, mp_int * m, mp_int * mu) +{ + mp_int q; + int res, um = m->used; + + + if ((res = mp_init_copy (&q, x)) != MP_OKAY) { + return res; + } + + mp_rshd (&q, um - 1); /* q1 = x / b^(k-1) */ + + /* according to HAC this is optimization is ok */ + if (((unsigned long) m->used) > (1UL << (unsigned long) (DIGIT_BIT - 1UL))) { + if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { + goto CLEANUP; + } + } else { + if ((res = s_mp_mul_high_digs (&q, mu, &q, um - 1)) != MP_OKAY) { + goto CLEANUP; + } + } + + mp_rshd (&q, um + 1); /* q3 = q2 / b^(k+1) */ + + /* x = x mod b^(k+1), quick (no division) */ + if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } + + /* q = q * m mod b^(k+1), quick (no division) */ + if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + + /* x = x - q */ + if ((res = mp_sub (x, &q, x)) != MP_OKAY) + goto CLEANUP; + + /* If x < 0, add b^(k+1) to it */ + if (mp_cmp_d (x, 0) == MP_LT) { + mp_set (&q, 1); + if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) + goto CLEANUP; + if ((res = mp_add (x, &q, x)) != MP_OKAY) + goto CLEANUP; + } + + /* Back off if it's too big */ + while (mp_cmp (x, m) != MP_LT) { + if ((res = s_mp_sub (x, m, x)) != MP_OKAY) + break; + } + +CLEANUP: + mp_clear (&q); + + return res; +} + +/* End: bn_mp_reduce.c */ + +/* Start: bn_mp_rshd.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shift right a certain amount of digits */ +void +mp_rshd (mp_int * a, int b) +{ + int x; + + /* if b <= 0 then ignore it */ + if (b <= 0) { + return; + } + + /* if b > used then simply zero it and return */ + if (a->used < b) { + mp_zero (a); + return; + } + + { + register mp_digit *tmpa, *tmpaa; + + /* shift the digits down */ + + /* base */ + tmpa = a->dp; + + /* offset into digits */ + tmpaa = a->dp + b; + + /* this is implemented as a sliding window where the window is b-digits long + * and digits from the top of the window are copied to the bottom + * + * e.g. + + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> + /\ | ----> + \-------------------/ ----> + */ + for (x = 0; x < (a->used - b); x++) { + *tmpa++ = *tmpaa++; + } + + /* zero the top digits */ + for (; x < a->used; x++) { + *tmpa++ = 0; + } + } + mp_clamp (a); +} + +/* End: bn_mp_rshd.c */ + +/* Start: bn_mp_set.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set to a digit */ +void +mp_set (mp_int * a, mp_digit b) +{ + mp_zero (a); + a->dp[0] = b & MP_MASK; + a->used = (a->dp[0] != 0) ? 1 : 0; +} + +/* End: bn_mp_set.c */ + +/* Start: bn_mp_set_int.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set a 32-bit const */ +int +mp_set_int (mp_int * a, unsigned long b) +{ + int x, res; + + mp_zero (a); + + /* set four bits at a time, simplest solution to the what if DIGIT_BIT==7 case */ + for (x = 0; x < 8; x++) { + + /* shift the number up four bits */ + if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { + return res; + } + + /* OR in the top four bits of the source */ + a->dp[0] |= (b >> 28) & 15; + + /* shift the source up to the next four bits */ + b <<= 4; + + /* ensure that digits are not clamped off */ + a->used += 32 / DIGIT_BIT + 1; + } + + mp_clamp (a); + return MP_OKAY; +} + +/* End: bn_mp_set_int.c */ + +/* Start: bn_mp_shrink.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* shrink a bignum */ +int +mp_shrink (mp_int * a) +{ + if (a->alloc != a->used) { + if ((a->dp = OPT_CAST realloc (a->dp, sizeof (mp_digit) * a->used)) == NULL) { + return MP_MEM; + } + a->alloc = a->used; + } + return MP_OKAY; +} + +/* End: bn_mp_shrink.c */ + +/* Start: bn_mp_signed_bin_size.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the size for an signed equivalent */ +int +mp_signed_bin_size (mp_int * a) +{ + return 1 + mp_unsigned_bin_size (a); +} + +/* End: bn_mp_signed_bin_size.c */ + +/* Start: bn_mp_sqr.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* computes b = a*a */ +int +mp_sqr (mp_int * a, mp_int * b) +{ + int res; + if (a->used > KARATSUBA_SQR_CUTOFF) { + res = mp_karatsuba_sqr (a, b); + } else { + + /* can we use the fast multiplier? */ + if (((a->used * 2 + 1) < 512) + && a->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT) - 1))) { + res = fast_s_mp_sqr (a, b); + } else { + res = s_mp_sqr (a, b); + } + } + b->sign = MP_ZPOS; + return res; +} + +/* End: bn_mp_sqr.c */ + +/* Start: bn_mp_sqrmod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* c = a * a (mod b) */ +int +mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sqr (a, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, b, c); + mp_clear (&t); + return res; +} + +/* End: bn_mp_sqrmod.c */ + +/* Start: bn_mp_sub.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* high level subtraction (handles signs) */ +int +mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + + sa = a->sign; + sb = b->sign; + + /* handle four cases */ + if (sa == MP_ZPOS && sb == MP_ZPOS) { + /* both positive, a - b, but if b>a then we do -(b - a) */ + if (mp_cmp_mag (a, b) == MP_LT) { + /* b>a */ + res = s_mp_sub (b, a, c); + c->sign = MP_NEG; + } else { + res = s_mp_sub (a, b, c); + c->sign = MP_ZPOS; + } + } else if (sa == MP_ZPOS && sb == MP_NEG) { + /* a - -b == a + b */ + res = s_mp_add (a, b, c); + c->sign = MP_ZPOS; + } else if (sa == MP_NEG && sb == MP_ZPOS) { + /* -a - b == -(a + b) */ + res = s_mp_add (a, b, c); + c->sign = MP_NEG; + } else { + /* -a - -b == b - a, but if a>b == -(a - b) */ + if (mp_cmp_mag (a, b) == MP_GT) { + res = s_mp_sub (a, b, c); + c->sign = MP_NEG; + } else { + res = s_mp_sub (b, a, c); + c->sign = MP_ZPOS; + } + } + + return res; +} + +/* End: bn_mp_sub.c */ + +/* Start: bn_mp_submod.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* d = a - b (mod c) */ +int +mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sub (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + +/* End: bn_mp_submod.c */ + +/* Start: bn_mp_sub_d.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* single digit subtraction */ +int +mp_sub_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t; + int res; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + mp_set (&t, b); + res = mp_sub (a, &t, c); + + mp_clear (&t); + return res; +} + +/* End: bn_mp_sub_d.c */ + +/* Start: bn_mp_to_signed_bin.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* store in signed [big endian] format */ +int +mp_to_signed_bin (mp_int * a, unsigned char *b) +{ + int res; + + if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { + return res; + } + b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); + return MP_OKAY; +} + +/* End: bn_mp_to_signed_bin.c */ + +/* Start: bn_mp_to_unsigned_bin.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* store in unsigned [big endian] format */ +int +mp_to_unsigned_bin (mp_int * a, unsigned char *b) +{ + int x, res; + mp_int t; + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + x = 0; + while (mp_iszero (&t) == 0) { + if (DIGIT_BIT != 7) { + b[x++] = (unsigned char) (t.dp[0] & 255); + } else { + b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); + } + if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + bn_reverse (b, x); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_to_unsigned_bin.c */ + +/* Start: bn_mp_unsigned_bin_size.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* get the size for an unsigned equivalent */ +int +mp_unsigned_bin_size (mp_int * a) +{ + int size = mp_count_bits (a); + return (size / 8 + ((size & 7) != 0 ? 1 : 0)); +} + +/* End: bn_mp_unsigned_bin_size.c */ + +/* Start: bn_mp_xor.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* XOR two ints together */ +int +mp_xor (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] ^= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_mp_xor.c */ + +/* Start: bn_mp_zero.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* set to zero */ +void +mp_zero (mp_int * a) +{ + a->sign = MP_ZPOS; + a->used = 0; + memset (a->dp, 0, sizeof (mp_digit) * a->alloc); +} + +/* End: bn_mp_zero.c */ + +/* Start: bn_prime_tab.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include +const mp_digit __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, + 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083, + 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, + 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, + 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, + 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, + + 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, + 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, + 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, + 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, + 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, + 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, + 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, + 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, + + 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, + 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, + 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, + 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, + 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, + 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, + 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, + 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, + + 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, + 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, + 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, + 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, + 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, + 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, + 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, + 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 +}; + +/* End: bn_prime_tab.c */ + +/* Start: bn_radix.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* chars used in radix conversions */ +static const char *s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + + +/* read a string [ASCII] in a given radix */ +int +mp_read_radix (mp_int * a, char *str, int radix) +{ + int y, res, neg; + char ch; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + if (*str == '-') { + ++str; + neg = MP_NEG; + } else { + neg = MP_ZPOS; + } + + mp_zero (a); + while (*str) { + ch = (char) ((radix < 36) ? toupper (*str) : *str); + for (y = 0; y < 64; y++) { + if (ch == s_rmap[y]) { + break; + } + } + + if (y < radix) { + if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + return res; + } + if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + return res; + } + } else { + break; + } + ++str; + } + a->sign = neg; + return MP_OKAY; +} + +/* stores a bignum as a ASCII string in a given radix (2..64) */ +int +mp_toradix (mp_int * a, char *str, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + if (t.sign == MP_NEG) { + ++_s; + *str++ = '-'; + t.sign = MP_ZPOS; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = s_rmap[d]; + ++digs; + } + bn_reverse ((unsigned char *)_s, digs); + *str++ = '\0'; + mp_clear (&t); + return MP_OKAY; +} + +/* returns size of ASCII reprensentation */ +int +mp_radix_size (mp_int * a, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + + /* special case for binary */ + if (radix == 2) { + return mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; + } + + if (radix < 2 || radix > 64) { + return 0; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return 0; + } + + digs = 0; + if (t.sign == MP_NEG) { + ++digs; + t.sign = MP_ZPOS; + } + + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return 0; + } + ++digs; + } + mp_clear (&t); + return digs + 1; +} + +/* End: bn_radix.c */ + +/* Start: bn_reverse.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* reverse an array, used for radix code */ +void +bn_reverse (unsigned char *s, int len) +{ + int ix, iy; + unsigned char t; + + ix = 0; + iy = len - 1; + while (ix < iy) { + t = s[ix]; + s[ix] = s[iy]; + s[iy] = t; + ++ix; + --iy; + } +} + +/* End: bn_reverse.c */ + +/* Start: bn_s_mp_add.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ +int +s_mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int *x; + int olduse, res, min, max; + + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else if (a->used < b->used) { + min = a->used; + max = b->used; + x = b; + } else { + min = max = a->used; + x = NULL; + } + + /* init result */ + if (c->alloc < max + 1) { + if ((res = mp_grow (c, max + 1)) != MP_OKAY) { + return res; + } + } + + olduse = c->used; + c->used = max + 1; + + /* add digits from lower part */ + + /* set the carry to zero */ + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + + /* first input */ + tmpa = a->dp; + + /* second input */ + tmpb = b->dp; + + /* destination */ + tmpc = c->dp; + + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> DIGIT_BIT; + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, that is in A+B if A or B has more digits add those in */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> DIGIT_BIT; + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + } + + /* add carry */ + *tmpc++ = u; + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_s_mp_add.c */ + +/* Start: bn_s_mp_mul_digs.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiplies |a| * |b| and only computes upto digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how many digits of + * output are created. + */ +int +s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + if ((res = mp_init_size (&t, digs)) != MP_OKAY) { + return res; + } + t.used = digs; + + /* compute the digits of the product directly */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* set the carry to zero */ + u = 0; + + /* limit ourselves to making digs digits of output */ + pb = MIN (b->used, digs - ix); + + /* setup some aliases */ + tmpx = a->dp[ix]; + tmpt = &(t.dp[ix]); + tmpy = b->dp; + + /* compute the columns of the output and propagate the carry */ + for (iy = 0; iy < pb; iy++) { + /* compute the column as a mp_word */ + r = ((mp_word) * tmpt) + ((mp_word) tmpx) * ((mp_word) * tmpy++) + ((mp_word) u); + + /* the new column is the lower part of the result */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry word from the result */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + if (ix + iy < digs) + *tmpt = u; + } + + mp_clamp (&t); + mp_exch (&t, c); + + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_mul_digs.c */ + +/* Start: bn_s_mp_mul_high_digs.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* multiplies |a| * |b| and does not compute the lower digs digits + * [meant to get the higher part of the product] + */ +int +s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + + /* can we use the fast multiplier? */ + if (((a->used + b->used + 1) < 512) + && MAX (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_high_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { + return res; + } + t.used = a->used + b->used + 1; + + pa = a->used; + pb = b->used; + for (ix = 0; ix < pa; ix++) { + /* clear the carry */ + u = 0; + + /* left hand side of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ + tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ + tmpy = b->dp + (digs - ix); + + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ + r = ((mp_word) * tmpt) + ((mp_word) tmpx) * ((mp_word) * tmpy++) + ((mp_word) u); + + /* get the lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* carry the carry */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpt = u; + } + mp_clamp (&t); + mp_exch (&t, c); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_mul_high_digs.c */ + +/* Start: bn_s_mp_sqr.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ +int +s_mp_sqr (mp_int * a, mp_int * b) +{ + mp_int t; + int res, ix, iy, pa; + mp_word r, u; + mp_digit tmpx, *tmpt; + + pa = a->used; + if ((res = mp_init_size (&t, pa + pa + 1)) != MP_OKAY) { + return res; + } + t.used = pa + pa + 1; + + for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ + r = ((mp_word) t.dp[ix + ix]) + ((mp_word) a->dp[ix]) * ((mp_word) a->dp[ix]); + + /* store lower part in result */ + t.dp[ix + ix] = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry */ + u = (r >> ((mp_word) DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for where to store the results */ + tmpt = &(t.dp[ix + ix + 1]); + for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ + r = ((mp_word) tmpx) * ((mp_word) a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since its easier to optimize + */ + r = ((mp_word) * tmpt) + r + r + ((mp_word) u); + + /* store lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get carry */ + u = (r >> ((mp_word) DIGIT_BIT)); + } + r = ((mp_word) * tmpt) + u; + *tmpt = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (r >> ((mp_word) DIGIT_BIT)); + /* propagate upwards */ + ++tmpt; + while (u != ((mp_word) 0)) { + r = ((mp_word) * tmpt) + ((mp_word) 1); + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (r >> ((mp_word) DIGIT_BIT)); + } + } + + mp_clamp (&t); + mp_exch (&t, b); + mp_clear (&t); + return MP_OKAY; +} + +/* End: bn_s_mp_sqr.c */ + +/* Start: bn_s_mp_sub.c */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is library that provides for multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library is designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#include + +/* low level subtraction (assumes a > b), HAC pp.595 Algorithm 14.9 */ +int +s_mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int olduse, res, min, max; + + /* find sizes */ + min = b->used; + max = a->used; + + /* init result */ + if (c->alloc < max) { + if ((res = mp_grow (c, max)) != MP_OKAY) { + return res; + } + } + olduse = c->used; + c->used = max; + + /* sub digits from lower part */ + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + tmpa = a->dp; + tmpb = b->dp; + tmpc = c->dp; + + /* set carry to zero */ + u = 0; + for (i = 0; i < min; i++) { + /* T[i] = A[i] - B[i] - U */ + *tmpc = *tmpa++ - *tmpb++ - u; + + /* U = carry bit of T[i] + * Note this saves performing an AND operation since + * if a carry does occur it will propagate all the way to the + * MSB. As a result a single shift is required to get the carry + */ + u = *tmpc >> (CHAR_BIT * sizeof (mp_digit) - 1); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, e.g. if A has more digits than B */ + for (; i < max; i++) { + /* T[i] = A[i] - U */ + *tmpc = *tmpa++ - u; + + /* U = carry bit of T[i] */ + u = *tmpc >> (CHAR_BIT * sizeof (mp_digit) - 1); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +/* End: bn_s_mp_sub.c */ + + +/* EOF */ diff --git a/tommath.h b/tommath.h index eb8a488..d8f8d9d 100644 --- a/tommath.h +++ b/tommath.h @@ -28,8 +28,16 @@ #ifdef __cplusplus extern "C" { -#endif +/* C++ compilers don't like assigning void * to mp_digit * */ +#define OPT_CAST (mp_digit *) + +#else + +/* C on the other hand dosen't care */ +#define OPT_CAST + +#endif /* some default configurations. * @@ -202,7 +210,6 @@ int mp_cmp_mag(mp_int *a, mp_int *b); /* c = a + b */ int mp_add(mp_int *a, mp_int *b, mp_int *c); - /* c = a - b */ int mp_sub(mp_int *a, mp_int *b, mp_int *c); @@ -297,9 +304,52 @@ int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); /* computes xR^-1 == x (mod N) via Montgomery Reduction */ int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); +/* returns 1 if a is a valid DR modulus */ +int mp_dr_is_modulus(mp_int *a); + +/* sets the value of "d" required for mp_dr_reduce */ +void mp_dr_setup(mp_int *a, mp_digit *d); + +/* reduces a modulo b using the Diminished Radix method */ +int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); + /* d = a^b (mod c) */ int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); +/* ---> Primes <--- */ +#define PRIME_SIZE 256 /* number of primes */ + +/* table of first 256 primes */ +extern const mp_digit __prime_tab[]; + +/* result=1 if a is divisible by one of the first 256 primes */ +int mp_prime_is_divisible(mp_int *a, int *result); + +/* performs one Fermat test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_fermat(mp_int *a, mp_int *b, int *result); + +/* performs one Miller-Rabin test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); + +/* performs t rounds of Miller-Rabin on "a" using the first + * t prime bases. Also performs an initial sieve of trial + * division. Determines if "a" is prime with probability + * of error no more than (1/4)^t. + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int mp_prime_is_prime(mp_int *a, int t, int *result); + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + */ +int mp_prime_next_prime(mp_int *a, int t); + + /* ---> radix conversion <--- */ int mp_count_bits(mp_int *a); @@ -341,7 +391,7 @@ int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c); int mp_karatsuba_sqr(mp_int *a, mp_int *b); int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c); int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); -int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y); +int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); void bn_reverse(unsigned char *s, int len); #ifdef __cplusplus