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