README
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:34k
源码类别:

CA认证

开发平台:

WINDOWS

  1. The contents of this file are subject to the Mozilla Public
  2. License Version 1.1 (the "License"); you may not use this file
  3. except in compliance with the License. You may obtain a copy of
  4. the License at http://www.mozilla.org/MPL/
  5. Software distributed under the License is distributed on an "AS
  6. IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  7. implied. See the License for the specific language governing
  8. rights and limitations under the License.
  9. The Original Code is the MPI Arbitrary Precision Integer Arithmetic
  10. library.
  11. The Initial Developer of the Original Code is 
  12. Michael J. Fromberger <sting@linguist.dartmouth.edu>
  13. Portions created by Michael J. Fromberger are 
  14. Copyright (C) 1997, 1998, 1999, 2000 Michael J. Fromberger. 
  15. All Rights Reserved.
  16. Contributor(s):
  17. Alternatively, the contents of this file may be used under the
  18. terms of the GNU General Public License Version 2 or later (the
  19. "GPL"), in which case the provisions of the GPL are applicable
  20. instead of those above.  If you wish to allow use of your
  21. version of this file only under the terms of the GPL and not to
  22. allow others to use your version of this file under the MPL,
  23. indicate your decision by deleting the provisions above and
  24. replace them with the notice and other provisions required by
  25. the GPL.  If you do not delete the provisions above, a recipient
  26. may use your version of this file under either the MPL or the GPL.
  27. About the MPI Library
  28. ---------------------
  29. The files 'mpi.h' and 'mpi.c' define a simple, arbitrary precision
  30. signed integer arithmetic package.  The implementation is not the most
  31. efficient possible, but the code is small and should be fairly easily
  32. portable to just about any machine that supports an ANSI C compiler,
  33. as long as it is capable of at least 16-bit arithmetic (but also see
  34. below for more on this).
  35. This library was written with an eye to cryptographic applications;
  36. thus, some care is taken to make sure that temporary values are not
  37. left lying around in memory when they are no longer in use.  This adds
  38. some overhead for zeroing buffers before they are released back into
  39. the free pool; however, it gives you the assurance that there is only
  40. one copy of your important values residing in your process's address
  41. space at a time.  Obviously, it is difficult to guarantee anything, in
  42. a pre-emptive multitasking environment, but this at least helps you
  43. keep a lid on the more obvious ways your data can get spread around in
  44. memory.
  45. Using the Library
  46. -----------------
  47. To use the MPI library in your program, you must include the header:
  48. #include "mpi.h"
  49. This header provides all the type and function declarations you'll
  50. need to use the library.  Almost all the names defined by the library
  51. begin with the prefix 'mp_', so it should be easy to keep them from
  52. clashing with your program's namespace (he says, glibly, knowing full
  53. well there are always pathological cases).
  54. There are a few things you may want to configure about the library.
  55. By default, the MPI library uses an unsigned short for its digit type,
  56. and an unsigned int for its word type.  The word type must be big
  57. enough to contain at least two digits, for the primitive arithmetic to
  58. work out.  On my machine, a short is 2 bytes and an int is 4 bytes --
  59. but if you have 64-bit ints, you might want to use a 4-byte digit and
  60. an 8-byte word.  I have tested the library using 1-byte digits and
  61. 2-byte words, as well.  Whatever you choose to do, the things you need
  62. to change are:
  63. (1) The type definitions for mp_digit and mp_word.
  64. (2) The macro DIGIT_FMT which tells mp_print() how to display a
  65.     single digit.  This is just a printf() format string, so you
  66.     can adjust it appropriately.
  67. (3) The macros DIGIT_MAX and MP_WORD_MAX, which specify the 
  68.     largest value expressible in an mp_digit and an mp_word,
  69.     respectively.
  70. Both the mp_digit and mp_word should be UNSIGNED integer types.  The
  71. code relies on having the full positive precision of the type used for
  72. digits and words.
  73. The remaining type definitions should be left alone, for the most
  74. part.  The code in the library does not make any significant
  75. assumptions about the sizes of things, but there is little if any
  76. reason to change the other parameters, so I would recommend you leave
  77. them as you found them.
  78. The library comes with a Perl script, 'types.pl', which will scan your
  79. current Makefile settings, and attempt to find good definitions for
  80. these types.  It relies on a Unix sort of build environment, so it
  81. probably won't work under MacOS or Windows, but it can be convenient
  82. if you're porting to a new flavour of Unix.  Just run 'types.pl' at
  83. the command line, and it will spit out its results to the standard
  84. output.
  85. Conventions
  86. -----------
  87. Most functions in the library return a value of type mp_err.  This
  88. permits the library to communicate success or various kinds of failure
  89. to the calling program.  The return values currently defined are:
  90.         MP_OKAY         - okay, operation succeeded, all's well
  91.         MP_YES          - okay, the answer is yes (same as MP_OKAY)
  92.         MP_NO           - okay, but answer is no (not MP_OKAY)
  93.         MP_MEM          - operation ran out of memory
  94.         MP_RANGE        - input parameter was out of range
  95.         MP_BADARG       - an invalid input parameter was provided
  96.         MP_UNDEF        - no output value is defined for this input
  97. The only function which currently uses MP_UNDEF is mp_invmod().
  98. Division by zero is undefined, but the division functions will return
  99. MP_RANGE for a zero divisor.  MP_BADARG usually means you passed a
  100. bogus mp_int structure to the function.  MP_YES and MP_NO are not used
  101. by the library itself; they're defined so you can use them in your own
  102. extensions.
  103. If you need a readable interpretation of these error codes in your
  104. program, you may also use the mp_strerror() function.  This function
  105. takes an mp_err as input, and returns a pointer to a human-readable
  106. string describing the meaning of the error.  These strings are stored
  107. as constants within the library, so the caller should not attempt to
  108. modify or free the memory associated with these strings.
  109. The library represents values in signed-magnitude format.  Values
  110. strictly less than zero are negative, all others are considered
  111. positive (zero is positive by fiat).  You can access the 'sign' member
  112. of the mp_int structure directly, but better is to use the mp_cmp_z()
  113. function, to find out which side of zero the value lies on.
  114. Most arithmetic functions have a single-digit variant, as well as the
  115. full arbitrary-precision.  An mp_digit is an unsigned value between 0
  116. and DIGIT_MAX inclusive.  The radix is available as RADIX.  The number
  117. of bits in a given digit is given as DIGIT_BIT.
  118. Generally, input parameters are given before output parameters.
  119. Unless otherwise specified, any input parameter can be re-used as an
  120. output parameter, without confusing anything.
  121. The basic numeric type defined by the library is an mp_int.  Virtually
  122. all the functions in the library take a pointer to an mp_int as one of
  123. their parameters.  An explanation of how to create and use these
  124. <HR>
  125. <A NAME="p23">
  126. <H3>Problem 23:</H3>
  127. structures follows.  And so, without further ado...
  128. Initialization and Cleanup
  129. --------------------------
  130. The basic numeric type defined by the library is an 'mp_int'.
  131. However, it is not sufficient to simply declare a variable of type
  132. mp_int in your program.  These variables also need to be initialized
  133. before they can be used, to allocate the internal storage they require
  134. for computation.
  135. This is done using one of the following functions:
  136.         mp_init(mp_int *mp);
  137.         mp_init_copy(mp_int *mp, mp_int *from);
  138.         mp_init_size(mp_int *mp, mp_size p);
  139. Each of these requires a pointer to a structure of type mp_int.  The
  140. basic mp_init() simply initializes the mp_int to a default size, and
  141. sets its value to zero.  If you would like to initialize a copy of an
  142. existing mp_int, use mp_init_copy(), where the 'from' parameter is the
  143. mp_int you'd like to make a copy of.  The third function,
  144. mp_init_size(), permits you to specify how many digits of precision
  145. should be preallocated for your mp_int.  This can help the library
  146. avoid unnecessary re-allocations later on.
  147. The default precision used by mp_init() can be retrieved using:
  148.         precision = mp_get_prec();
  149. This returns the number of digits that will be allocated.  You can
  150. change this value by using:
  151.         mp_set_prec(unsigned int prec);
  152. Any positive value is acceptable -- if you pass zero, the default
  153. precision will be re-set to the compiled-in library default (this is
  154. specified in the header file 'mpi-config.h', and typically defaults to
  155. 8 or 16).
  156. Just as you must allocate an mp_int before you can use it, you must
  157. clean up the structure when you are done with it.  This is performed
  158. using the mp_clear() function.  Remember that any mp_int that you
  159. create as a local variable in a function must be mp_clear()'d before
  160. that function exits, or else the memory allocated to that mp_int will
  161. be orphaned and unrecoverable.
  162. To set an mp_int to a given value, the following functions are given:
  163.         mp_set(mp_int *mp, mp_digit d);
  164.         mp_set_int(mp_int *mp, long z);
  165. The mp_set() function sets the mp_int to a single digit value, while
  166. mp_set_int() sets the mp_int to a signed long integer value.
  167. To set an mp_int to zero, use:
  168.         mp_zero(mp_int *mp);
  169. Copying and Moving
  170. ------------------
  171. If you have two initialized mp_int's, and you want to copy the value
  172. of one into the other, use:
  173.         mp_copy(from, to)
  174. This takes care of clearing the old value of 'to', and copies the new
  175. value into it.  If 'to' is not yet initialized, use mp_init_copy()
  176. instead (see above).
  177. Note:   The library tries, whenever possible, to avoid allocating
  178. ----    new memory.  Thus, mp_copy() tries first to satisfy the needs
  179.         of the copy by re-using the memory already allocated to 'to'.
  180.         Only if this proves insufficient will mp_copy() actually
  181.         allocate new memory.
  182.         For this reason, if you know a priori that 'to' has enough
  183.         available space to hold 'from', you don't need to check the
  184.         return value of mp_copy() for memory failure.  The USED()
  185.         macro tells you how many digits are used by an mp_int, and
  186.         the ALLOC() macro tells you how many are allocated.
  187. If you have two initialized mp_int's, and you want to exchange their
  188. values, use:
  189.         mp_exch(a, b)
  190. This is better than using mp_copy() with a temporary, since it will
  191. not (ever) touch the memory allocator -- it just swaps the exact
  192. contents of the two structures.  The mp_exch() function cannot fail;
  193. if you pass it an invalid structure, it just ignores it, and does
  194. nothing.
  195. Basic Arithmetic
  196. ----------------
  197. Once you have initialized your integers, you can operate on them.  The
  198. basic arithmetic functions on full mp_int values are:
  199. mp_add(a, b, c)         - computes c = a + b
  200. mp_sub(a, b, c)         - computes c = a - b
  201. mp_mul(a, b, c)         - computes c = a * b
  202. mp_sqr(a, b)            - computes b = a * a
  203. mp_div(a, b, q, r)      - computes q, r such that a = bq + r
  204. mp_div_2d(a, d, q, r)   - computes q = a / 2^d, r = a % 2^d
  205. mp_expt(a, b, c)        - computes c = a ** b
  206. mp_2expt(a, k)          - computes a = 2^k
  207. mp_sqrt(a, c)           - computes c = floor(sqrt(a))
  208. The mp_div_2d() function efficiently computes division by powers of
  209. two.  Either the q or r parameter may be NULL, in which case that
  210. portion of the computation will be discarded.
  211. The algorithms used for some of the computations here are described in
  212. the following files which are included with this distribution:
  213. mul.txt         Describes the multiplication algorithm
  214. div.txt         Describes the division algorithm
  215. expt.txt        Describes the exponentiation algorithm
  216. sqrt.txt        Describes the square-root algorithm
  217. square.txt      Describes the squaring algorithm
  218. There are single-digit versions of most of these routines, as well.
  219. In the following prototypes, 'd' is a single mp_digit:
  220. mp_add_d(a, d, c)       - computes c = a + d
  221. mp_sub_d(a, d, c)       - computes c = a - d
  222. mp_mul_d(a, d, c)       - computes c = a * d
  223. mp_mul_2(a, c)          - computes c = a * 2
  224. mp_div_d(a, d, q, r)    - computes q, r such that a = bq + r
  225. mp_div_2(a, c)          - computes c = a / 2
  226. mp_expt_d(a, d, c)      - computes c = a ** d
  227. The mp_mul_2() and mp_div_2() functions take advantage of the internal
  228. representation of an mp_int to do multiplication by two more quickly
  229. than mp_mul_d() would.  Other basic functions of an arithmetic variety
  230. include:
  231. mp_zero(a)              - assign 0 to a
  232. mp_neg(a, c)            - negate a: c = -a
  233. mp_abs(a, c)            - absolute value: c = |a|
  234. Comparisons
  235. -----------
  236. Several comparison functions are provided.  Each of these, unless
  237. otherwise specified, returns zero if the comparands are equal, < 0 if
  238. the first is less than the second, and > 0 if the first is greater
  239. than the second:
  240. mp_cmp_z(a)             - compare a <=> 0
  241. mp_cmp_d(a, d)          - compare a <=> d, d is a single digit
  242. mp_cmp(a, b)            - compare a <=> b
  243. mp_cmp_mag(a, b)        - compare |a| <=> |b|
  244. mp_cmp_int(a, z)        - compare a <=> z, z is a signed long integer
  245. mp_isodd(a)             - return nonzero if odd, zero otherwise
  246. mp_iseven(a)            - return nonzero if even, zero otherwise
  247. Modular Arithmetic
  248. ------------------
  249. Modular variations of the basic arithmetic functions are also
  250. supported.  These are available if the MP_MODARITH parameter in
  251. mpi-config.h is turned on (it is by default).  The modular arithmetic
  252. functions are:
  253. mp_mod(a, m, c)         - compute c = a (mod m), 0 <= c < m
  254. mp_mod_d(a, d, c)       - compute c = a (mod d), 0 <= c < d (see below)
  255. mp_addmod(a, b, m, c)   - compute c = (a + b) mod m
  256. mp_submod(a, b, m, c)   - compute c = (a - b) mod m
  257. mp_mulmod(a, b, m, c)   - compute c = (a * b) mod m
  258. mp_sqrmod(a, m, c)      - compute c = (a * a) mod m
  259. mp_exptmod(a, b, m, c)  - compute c = (a ** b) mod m
  260. mp_exptmod_d(a, d, m, c)- compute c = (a ** d) mod m
  261. The mp_sqr() function squares its input argument.  A call to mp_sqr(a,
  262. c) is identical in meaning to mp_mul(a, a, c); however, if the
  263. MP_SQUARE variable is set true in mpi-config.h (see below), then it
  264. will be implemented with a different algorithm, that is supposed to
  265. take advantage of the redundant computation that takes place during
  266. squaring.  Unfortunately, some compilers result in worse performance
  267. on this code, so you can change the behaviour at will.  There is a
  268. utility program "mulsqr.c" that lets you test which does better on
  269. your system.
  270. The mp_sqrmod() function is analogous to the mp_sqr() function; it
  271. uses the mp_sqr() function rather than mp_mul(), and then performs the
  272. modular reduction.  This probably won't help much unless you are doing
  273. a lot of them.
  274. See the file 'square.txt' for a synopsis of the algorithm used.
  275. Note:   The mp_mod_d() function computes a modular reduction around
  276. ----    a single digit d.  The result is a single digit c.
  277. Because an inverse is defined for a (mod m) if and only if (a, m) = 1
  278. (that is, if a and m are relatively prime), mp_invmod() may not be
  279. able to compute an inverse for the arguments.  In this case, it
  280. returns the value MP_UNDEF, and does not modify c.  If an inverse is
  281. defined, however, it returns MP_OKAY, and sets c to the value of the
  282. inverse (mod m).
  283. See the file 'redux.txt' for a description of the modular reduction
  284. algorithm used by mp_exptmod().
  285. Greatest Common Divisor
  286. -----------------------
  287. If The greates common divisor of two values can be found using one of the
  288. following functions:
  289. mp_gcd(a, b, c)         - compute c = (a, b) using binary algorithm
  290. mp_lcm(a, b, c)         - compute c = [a, b] = ab / (a, b)
  291. mp_xgcd(a, b, g, x, y)  - compute g, x, y so that ax + by = g = (a, b)
  292. Also provided is a function to compute modular inverses, if they
  293. exist:
  294. mp_invmod(a, m, c)      - compute c = a^-1 (mod m), if it exists
  295. The function mp_xgcd() computes the greatest common divisor, and also
  296. returns values of x and y satisfying Bezout's identity.  This is used
  297. by mp_invmod() to find modular inverses.  However, if you do not need
  298. these values, you will find that mp_gcd() is MUCH more efficient,
  299. since it doesn't need all the intermediate values that mp_xgcd()
  300. requires in order to compute x and y. 
  301. The mp_gcd() (and mp_xgcd()) functions use the binary (extended) GCD
  302. algorithm due to Josef Stein.
  303. Input & Output Functions
  304. ------------------------
  305. The following basic I/O routines are provided.  These are present at
  306. all times:
  307. mp_read_radix(mp, str, r)  - convert a string in radix r to an mp_int
  308. mp_read_raw(mp, s, len)    - convert a string of bytes to an mp_int
  309. mp_radix_size(mp, r)       - return length of buffer needed by mp_toradix()
  310. mp_raw_size(mp)            - return length of buffer needed by mp_toraw()
  311. mp_toradix(mp, str, r)     - convert an mp_int to a string of radix r 
  312.                              digits
  313. mp_toraw(mp, str)          - convert an mp_int to a string of bytes
  314. mp_tovalue(ch, r)          - convert ch to its value when taken as
  315.                              a radix r digit, or -1 if invalid
  316. mp_strerror(err)           - get a string describing mp_err value 'err'
  317. If you compile the MPI library with MP_IOFUNC defined, you will also
  318. have access to the following additional I/O function:
  319. mp_print(mp, ofp)       - print an mp_int as text to output stream ofp
  320. Note that mp_radix_size() returns a size in bytes guaranteed to be AT
  321. LEAST big enough for the digits output by mp_toradix().  Because it
  322. uses an approximation technique to figure out how many digits will be
  323. needed, it may return a figure which is larger than necessary.  Thus,
  324. the caller should not rely on the value to determine how many bytes
  325. will actually be written by mp_toradix().  The string mp_toradix()
  326. creates will be NUL terminated, so the standard C library function
  327. strlen() should be able to ascertain this for you, if you need it.
  328. The mp_read_radix() and mp_toradix() functions support bases from 2 to
  329. 64 inclusive.  If you require more general radix conversion facilities
  330. than this, you will need to write them yourself (that's why mp_div_d()
  331. is provided, after all).
  332. Note:   mp_read_radix() will accept as digits either capital or 
  333. ----    lower-case letters.  However, the current implementation of
  334.         mp_toradix() only outputs upper-case letters, when writing
  335.         bases betwee 10 and 36.  The underlying code supports using
  336.         lower-case letters, but the interface stub does not have a
  337.         selector for it.  You can add one yourself if you think it
  338.         is worthwhile -- I do not.  Bases from 36 to 64 use lower-
  339.         case letters as distinct from upper-case.  Bases 63 and
  340.         64 use the characters '+' and '/' as digits.
  341.         Note also that compiling with MP_IOFUNC defined will cause
  342.         inclusion of <stdio.h>, so if you are trying to write code
  343.         which does not depend on the standard C library, you will
  344.         probably want to avoid this option.  This is needed because
  345.         the mp_print() function takes a standard library FILE * as
  346.         one of its parameters, and uses the fprintf() function.
  347. The mp_toraw() function converts the integer to a sequence of bytes,
  348. in big-endian ordering (most-significant byte first).  Assuming your
  349. bytes are 8 bits wide, this corresponds to base 256.  The sign is
  350. encoded as a single leading byte, whose value is 0 for zero or
  351. positive values, or 1 for negative values.  The mp_read_raw() function
  352. reverses this process -- it takes a buffer of bytes, interprets the
  353. first as a sign indicator (0 = zero/positive, nonzero = negative), and
  354. the rest as a sequence of 1-byte digits in big-endian ordering.
  355. The mp_raw_size() function returns the exact number of bytes required
  356. to store the given integer in "raw" format (as described in the
  357. previous paragraph).  Zero is returned in case of error; a valid
  358. integer will require at least three bytes of storage.
  359. In previous versions of the MPI library, an "external representation
  360. format" was supported.  This was removed, however, because I found I
  361. was never using it, it was not as portable as I would have liked, and
  362. I decided it was a waste of space.
  363. Other Functions
  364. ---------------
  365. The files 'mpprime.h' and 'mpprime.c' define some routines which are
  366. useful for divisibility testing and probabilistic primality testing.
  367. The routines defined are:
  368. mpp_divis(a, b)          - is a divisible by b?
  369. mpp_divis_d(a, d)        - is a divisible by digit d?
  370. mpp_random(a)            - set a to random value at current precision
  371. mpp_random_size(a, prec) - set a to random value at given precision
  372. Note:  The mpp_random() and mpp_random_size() functions use the C
  373. ----   library's rand() function to generate random values.  It is
  374.        up to the caller to seed this generator before it is called.
  375.        These functions are not suitable for generating quantities
  376.        requiring cryptographic-quality randomness; they are intended
  377.        primarily for use in primality testing.
  378.        Note too that the MPI library does not call srand(), so your
  379.        application should do this, if you ever want the sequence
  380.        to change.
  381. mpp_divis_vector(a, v, s, w)  - is a divisible by any of the s digits
  382.                                 in v?  If so, let w be the index of 
  383.                                 that digit
  384. mpp_divis_primes(a, np)       - is a divisible by any of the first np
  385.                                 primes?  If so, set np to the prime 
  386.                                 which divided a.
  387. mpp_fermat(a, d)              - test if w^a = w (mod a).  If so, 
  388.                                 returns MP_YES, otherwise MP_NO.
  389. mpp_pprime(a, nt)             - perform nt iterations of the Rabin-
  390.                                 Miller probabilistic primality test
  391.                                 on a.  Returns MP_YES if all tests
  392.                                 passed, or MP_NO if any test fails.
  393. The mpp_fermat() function works based on Fermat's little theorem, a
  394. consequence of which is that if p is a prime, and (w, p) = 1, then:
  395.         w^p = w (mod p)
  396. Put another way, if w^p != w (mod p), then p is not prime.  The test
  397. is expensive to compute, but it helps to quickly eliminate an enormous
  398. class of composite numbers prior to Rabin-Miller testing.
  399. Building the Library
  400. --------------------
  401. The MPI library is designed to be as self-contained as possible.  You
  402. should be able to compile it with your favourite ANSI C compiler, and
  403. link it into your program directly.  If you are on a Unix system using
  404. the GNU C compiler (gcc), the following should work:
  405. % gcc -ansi -pedantic -Wall -O2 -c mpi.c
  406. The file 'mpi-config.h' defines several configurable parameters for
  407. the library, which you can adjust to suit your application.  At the
  408. time of this writing, the available options are:
  409. MP_IOFUNC       - Define true to include the mp_print() function, 
  410.                   which is moderately useful for debugging.  This
  411.                   implicitly includes <stdio.h>.
  412. MP_MODARITH     - Define true to include the modular arithmetic
  413.                   functions.  If you don't need modular arithmetic
  414.                   in your application, you can set this to zero to
  415.                   leave out all the modular routines.
  416. MP_NUMTH        - Define true to include number theoretic functions
  417.                   such as mp_gcd(), mp_lcm(), and mp_invmod().
  418. MP_LOGTAB       - If true, the file "logtab.h" is included, which
  419.                   is basically a static table of base 2 logarithms.
  420.                   These are used to compute how big the buffers for
  421.                   radix conversion need to be.  If you set this false,
  422.                   the library includes <math.h> and uses log().  This
  423.                   typically forces you to link against math libraries.
  424. MP_MEMSET       - If true, use memset() to zero buffers.  If you run
  425.                   into weird alignment related bugs, set this to zero
  426.                   and an explicit loop will be used.
  427. MP_MEMCPY       - If true, use memcpy() to copy buffers.  If you run
  428.                   into weird alignment bugs, set this to zero and an
  429.                   explicit loop will be used.
  430. MP_CRYPTO       - If true, whenever arrays of digits are free'd, they
  431.                   are zeroed first.  This is useful if you're using
  432.                   the library in a cryptographic environment; however,
  433.                   it does add overhead to each free operation.  For
  434.                   performance, if you don't care about zeroing your
  435.                   buffers, set this to false.
  436. MP_ARGCHK       - Set to 0, 1, or 2.  This defines how the argument
  437.                   checking macro, ARGCHK(), gets expanded.  If this 
  438.                   is set to zero, ARGCHK() expands to nothing; no 
  439.                   argument checks are performed.  If this is 1, the
  440.                   ARGCHK() macro expands to code that returns MP_BADARG
  441.                   or similar at runtime.  If it is 2, ARGCHK() expands 
  442.                   to an assert() call that aborts the program on a 
  443.                   bad input.
  444. MP_DEBUG        - Turns on debugging output.  This is probably not at
  445.                   all useful unless you are debugging the library.  It
  446.                   tends to spit out a LOT of output.
  447. MP_DEFPREC      - The default precision of a newly-created mp_int, in
  448.                   digits.  The precision can be changed at runtime by
  449.                   the mp_set_prec() function, but this is its initial
  450.                   value.
  451. MP_SQUARE       - If this is set to a nonzero value, the mp_sqr() 
  452.                   function will use an alternate algorithm that takes
  453.                   advantage of the redundant inner product computation
  454.                   when both multiplicands are identical.  Unfortunately,
  455.                   with some compilers this is actually SLOWER than just
  456.                   calling mp_mul() with the same argument twice.  So
  457.                   if you set MP_SQUARE to zero, mp_sqr() will be expan-
  458.                   ded into a call to mp_mul().  This applies to all 
  459.                   the uses of mp_sqr(), including mp_sqrmod() and the
  460.                   internal calls to s_mp_sqr() inside mpi.c
  461.                   The program 'mulsqr' (mulsqr.c) can be used to test
  462.                   which works best for your configuration.  Set up the
  463.                   CC and CFLAGS variables in the Makefile, then type:
  464.                         make mulsqr
  465.                   Invoke it with arguments similar to the following:
  466.                         mulsqr 25000 1024
  467.                   That is, 25000 products computed on 1024-bit values.
  468.                   The output will compare the two timings, and recommend
  469.                   a setting for MP_SQUARE.  It is off by default.
  470. If you would like to use the mp_print() function (see above), be sure
  471. to define MP_IOFUNC in mpi-config.h.  Many of the test drivers in the
  472. 'tests' subdirectory expect this to be defined (although the test
  473. driver 'mpi-test' doesn't need it)
  474. The Makefile which comes with the library should take care of building
  475. the library for you, if you have set the CC and CFLAGS variables at
  476. the top of the file appropriately.  By default, they are set up to
  477. use the GNU C compiler:
  478. CC=gcc
  479. CFLAGS=-ansi -pedantic -Wall -O2
  480. If all goes well, the library should compile without warnings using
  481. this combination.  You should, of course, make whatever adjustments
  482. you find necessary.  
  483. The MPI library distribution comes with several additional programs
  484. which are intended to demonstrate the use of the library, and provide
  485. a framework for testing it.  There are a handful of test driver
  486. programs, in the files named 'mptest-X.c', where X is a digit.  Also,
  487. there are some simple command-line utilities (in the 'utils'
  488. directory) for manipulating large numbers.  These include:
  489. basecvt.c       A radix-conversion program, supporting bases from
  490.                 2 to 64 inclusive.
  491. bbsrand.c       A BBS (quadratic residue) pseudo-random number 
  492.                 generator.  The file 'bbsrand.c' is just the driver
  493.                 for the program; the real code lives in the files
  494.                 'bbs_rand.h' and 'bbs_rand.c'
  495. dec2hex.c       Converts decimal to hexadecimal
  496. gcd.c           Computes the greatest common divisor of two values.
  497.                 If invoked as 'xgcd', also computes constants x and
  498.                 y such that (a, b) = ax + by, in accordance with
  499.                 Bezout's identity.
  500. hex2dec.c       Converts hexadecimal to decimal
  501. invmod.c        Computes modular inverses
  502. isprime.c       Performs the Rabin-Miller probabilistic primality
  503.                 test on a number.  Values which fail this test are
  504.                 definitely composite, and those which pass are very
  505.                 likely to be prime (although there are no guarantees)
  506. lap.c           Computes the order (least annihilating power) of
  507.                 a value v modulo m.  Very dumb algorithm.
  508. primegen.c      Generates large (probable) primes.
  509. prng.c          A pseudo-random number generator based on the
  510.                 BBS generator code in 'bbs_rand.c'
  511. sieve.c         Implements the Sieve of Eratosthenes, using a big
  512.                 bitmap, to generate a list of prime numbers.
  513. fact.c          Computes the factorial of an arbitrary precision
  514.                 integer (iterative).
  515. exptmod.c       Computes arbitrary precision modular exponentiation
  516.                 from the command line (exptmod a b m -> a^b (mod m))
  517. Most of these can be built from the Makefile that comes with the
  518. library.  Try 'make tools', if your environment supports it.  (If you
  519. are compiling on a Macintosh, I'm afraid you'll have to build them by
  520. hand -- fortunately, this is not difficult -- the library itself
  521. should compile just fine under Metrowerks CodeWarrior).
  522. Testing the Library
  523. -------------------
  524. Automatic test vectors are included, in the form of a program called
  525. 'mpi-test'.  To build this program and run all the tests, simply
  526. invoke the shell script 'all-tests'.  If all the tests pass, you
  527. should see a message:
  528.         All tests passed
  529. If something went wrong, you'll get:
  530.         One or more tests failed.
  531. If this happens, scan back through the preceding lines, to see which
  532. test failed.  Any failure indicates a bug in the library, which needs
  533. to be fixed before it will give accurate results.  If you get any such
  534. thing, please let me know, and I'll try to fix it.  Please let me know
  535. what platform and compiler you were using, as well as which test
  536. failed.  If a reason for failure was given, please send me that text
  537. as well.
  538. If you're on a system such as the Macintosh, where the standard Unix
  539. build tools don't work, you can build the 'mpi-test' program manually,
  540. and run it by hand.  This is tedious and obnoxious, sorry.
  541. Further manual testing can be performed by building the manual testing
  542. programs, whose source is found in the 'tests' subdirectory.  Each
  543. test is in a source file called 'mptest-X.c'.  The Makefile contains a
  544. target to build all of them at once:
  545.         make tests
  546. Read the comments at the top of each source file to see what the
  547. driver is supposed to test.  You probably don't need to do this; these
  548. programs were only written to help me as I was developing the library.
  549. The relevant files are:
  550. mpi-test.c              The source for the test driver
  551. make-test-arrays        A Perl script to generate some of the internal
  552.                         data structures used by mpi-test.c
  553. test-arrays.txt         The source file for make-test-arrays
  554. all-tests               A Bourne shell script which runs all the
  555.                         tests in the mpi-test suite
  556. Running 'make mpi-test' should build the mpi-test program.  If you
  557. cannot use make, here is what needs to be done:
  558. (1) Use 'make-test-arrays' to generate the file 'test-info.c' from
  559.     the 'test-arrays.txt' file.  Since Perl can be found everywhere,
  560.     even on the Macintosh, this should be no trouble.  Under Unix, 
  561.     this looks like:
  562.         make-test-arrays test-arrays.txt > test-info.c
  563. (2) Build the MPI library:
  564.         gcc -ansi -pedantic -Wall -c mpi.c
  565. (3) Build the mpi-test program:
  566.         gcc -ansi -pedantic -Wall -o mpi-test mpi.o mpi-test.c
  567. When you've got mpi-test, you can use 'all-tests' to run all the tests
  568. made available by mpi-test.  If any of them fail, there should be a
  569. diagnostic indicating what went wrong.  These are fairly high-level
  570. diagnostics, and won't really help you debug the problem; they're
  571. simply intended to help you isolate which function caused the problem.
  572. If you encounter a problem of this sort, feel free to e-mail me, and I
  573. will certainly attempt to help you debug it.
  574. Note:   Several of the tests hard-wired into 'mpi-test' operate under
  575. ----    the assumption that you are using at least a 16-bit mp_digit 
  576.         type.  If that is not true, several tests might fail, because 
  577.         of range problems with the maximum digit value.
  578.         If you are using an 8-bit digit, you will also need to 
  579.         modify the code for mp_read_raw(), which assumes that
  580.         multiplication by 256 can be done with mp_mul_d(), a
  581.         fact that fails when DIGIT_MAX is 255.  You can replace
  582.         the call with s_mp_lshd(), which will give you the same
  583.         effect, and without doing as much work. :)
  584. Acknowledgements:
  585. ----------------
  586. The algorithms used in this library were drawn primarily from Volume
  587. 2 of Donald Knuth's magnum opus, _The Art of Computer Programming_, 
  588. "Semi-Numerical Methods".  Barrett's algorithm for modular reduction
  589. came from Menezes, Oorschot, and Vanstone's _Handbook of Applied
  590. Cryptography_, Chapter 14.
  591. Thanks are due to Tom St. Denis, for finding an obnoxious sign-related
  592. bug in mp_read_raw() that made things break on platforms which use
  593. signed chars.
  594. About the Author
  595. ----------------
  596. This software was written by Michael J. Fromberger.  You can contact
  597. the author as follows:
  598. E-mail:   <sting@linguist.dartmouth.edu>
  599. Postal:   8000 Cummings Hall, Thayer School of Engineering
  600.           Dartmouth College, Hanover, New Hampshire, USA
  601. PGP key:  http://linguist.dartmouth.edu/~sting/keys/mjf.html
  602.           9736 188B 5AFA 23D6 D6AA  BE0D 5856 4525 289D 9907
  603. Last updated:  16-Jan-2000