|
|
1.1 root 1: /* keygen.c - C source code for RSA key generation routines - 17 Mar 87
2: Last revised 2 Jun 91 by PRZ
3:
4: (c) Copyright 1986 by Philip Zimmermann. All rights reserved.
5: The author assumes no liability for damages resulting from the use
6: of this software, even if the damage results from defects in this
7: software. No warranty is expressed or implied.
8: */
9:
10:
11: /* Define some error status returns for keygen... */
12: #define KEYFAILED -15 /* key failed final test */
13: #define NOPRIMEFOUND -14 /* slowtest probably failed */
14: #define NOSUSPECTS -13 /* fastsieve probably failed */
15:
16:
17: #ifdef DEBUG
18: #include <conio.h> /* DEBUG mode: for kbhit() */
19: #define poll_for_break() {while (kbhit()) getch();}
20: #define SHOWPROGRESS
21: #else
22: #define poll_for_break() /* stub */
23: #endif /* not DEBUG */
24:
25: #ifdef EMBEDDED /* compiling for embedded target */
26: #define _NOMALLOC /* defined if no malloc is available. */
27: #endif /* EMBEDDED */
28:
29: /* Decide whether malloc is available. Some embedded systems lack it. */
30: #ifndef _NOMALLOC /* malloc library routine available */
31: #include <stdlib.h> /* ANSI C library - for malloc() and free() */
32: /* #include <alloc.h> */ /* Borland Turbo C has malloc in <alloc.h> */
33: #endif /* malloc available */
34:
35: #include "rsalib.h"
36:
37: #ifdef STEWART_KEY /* using Stewart's modmult algorithm */
38: #ifdef MERRITT_KEY
39: #undef MERRITT_KEY
40: #endif
41: #endif /* STEWART_KEY */
42: #ifdef MERRITT_KEY /* using Merritt's modmult algorithm */
43: #ifdef STEWART_KEY
44: #undef STEWART_KEY
45: #endif
46: #endif /* MERRITT_KEY */
47:
48: /* if PSEUDORANDOM is defined, it disables truly random numbers in random.h */
49: /* #define PSEUDORANDOM */
50: #include "random.h"
51:
52: /* #define STRONGPRIMES */ /* if defined, generate "strong" primes for key */
53: /* "Strong" primes may no longer be advantageous, due to the new
54: elliptical curve method of factoring. Randomly selected primes
55: are as good as any. See "Factoring", by Duncan A. Buell, Journal
56: of Supercomputing 1 (1987), pages 191-216.
57: This justifies disabling the lengthy search for strong primes.
58: */
59:
60: #ifdef DEBUG
61: #define DEBUGprintf1(x) printf(x)
62: #define DEBUGprintf2(x,y) printf(x,y)
63: #define DEBUGprintf3(x,y,z) printf(x,y,z)
64: #else
65: #define DEBUGprintf1(x)
66: #define DEBUGprintf2(x,y)
67: #define DEBUGprintf3(x,y,z)
68: #endif
69:
70:
71: /* primetable is a table of 16-bit prime numbers used for sieving
72: and for other aspects of RSA key generation */
73:
74: word16 primetable[] = {
75: 2, 3, 5, 7, 11, 13, 17, 19,
76: 23, 29, 31, 37, 41, 43, 47, 53,
77: 59, 61, 67, 71, 73, 79, 83, 89,
78: 97, 101, 103, 107, 109, 113, 127, 131,
79: 137, 139, 149, 151, 157, 163, 167, 173,
80: 179, 181, 191, 193, 197, 199, 211, 223,
81: 227, 229, 233, 239, 241, 251, 257, 263,
82: 269, 271, 277, 281, 283, 293, 307, 311,
83: #ifndef EMBEDDED /* not embedded, use larger table */
84: 313, 317, 331, 337, 347, 349, 353, 359,
85: 367, 373, 379, 383, 389, 397, 401, 409,
86: 419, 421, 431, 433, 439, 443, 449, 457,
87: 461, 463, 467, 479, 487, 491, 499, 503,
88: 509, 521, 523, 541, 547, 557, 563, 569,
89: 571, 577, 587, 593, 599, 601, 607, 613,
90: 617, 619, 631, 641, 643, 647, 653, 659,
91: 661, 673, 677, 683, 691, 701, 709, 719,
92: 727, 733, 739, 743, 751, 757, 761, 769,
93: 773, 787, 797, 809, 811, 821, 823, 827,
94: 829, 839, 853, 857, 859, 863, 877, 881,
95: 883, 887, 907, 911, 919, 929, 937, 941,
96: 947, 953, 967, 971, 977, 983, 991, 997,
97: 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049,
98: 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
99: 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163,
100: 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
101: 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
102: 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,
103: 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423,
104: 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459,
105: 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,
106: 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571,
107: 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619,
108: 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,
109: 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747,
110: 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811,
111: 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877,
112: 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949,
113: 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003,
114: 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069,
115: 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
116: 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203,
117: 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267,
118: 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311,
119: 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377,
120: 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
121: 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503,
122: 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579,
123: 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657,
124: 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,
125: 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
126: 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801,
127: 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861,
128: 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939,
129: 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011,
130: 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
131: 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167,
132: 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221,
133: 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301,
134: 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347,
135: 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
136: 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491,
137: 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541,
138: 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607,
139: 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671,
140: 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
141: 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797,
142: 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863,
143: 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923,
144: 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003,
145: 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
146: 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129,
147: 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211,
148: 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259,
149: 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337,
150: 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
151: 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481,
152: 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547,
153: 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621,
154: 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673,
155: 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751,
156: 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813,
157: 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909,
158: 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967,
159: 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011,
160: 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
161: 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167,
162: 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233,
163: 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309,
164: 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399,
165: 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
166: 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507,
167: 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573,
168: 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653,
169: 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711,
170: 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
171: 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849,
172: 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897,
173: 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007,
174: 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073,
175: 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
176: 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211,
177: 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271,
178: 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329,
179: 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379,
180: 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
181: 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563,
182: 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637,
183: 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701,
184: 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779,
185: 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
186: 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907,
187: 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971,
188: 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027,
189: 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121,
190: 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
191: 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253,
192: 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349,
193: 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457,
194: 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517,
195: 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561,
196: 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621,
197: 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691,
198: 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757,
199: 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853,
200: 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,
201: 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009,
202: 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087,
203: 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161,
204: 8167, 8171, 8179, 8191,
205: #endif /* not EMBEDDED, use larger table */
206: 0 } ; /* null-terminated list, with only one null at end */
207:
208:
209:
210: #ifdef UNIT8
211: static word16 bottom16(unitptr r)
212: /* Called from nextprime and primetest. Returns low 16 bits of r. */
213: { make_lsbptr(r,(global_precision-((2/BYTES_PER_UNIT)-1)));
214: return( *((word16 *)(r)) );
215: } /* bottom16 */
216: #else /* UNIT16 or UNIT32 */
217: #define bottom16(r) ((word16) lsunit(r))
218: /* or UNIT32 could mask off lower 16 bits, instead of typecasting it. */
219: #endif /* UNIT16 or UNIT32 */
220:
221:
222: #ifndef FALSEKEYTEST
223:
224: static boolean slowtest(unitptr p)
225: /* This routine tests p for primality by applying Fermat's theorem:
226: For any x, if ((x**(p-1)) mod p) != 1, then p is not prime.
227: By trying a few values for x, we can determine if p is "probably" prime.
228:
229: Because this test is so slow, it is recommended that p be sieved first
230: to weed out numbers that are obviously not prime.
231:
232: Contrary to what you may have read in the literature, empirical evidence
233: shows this test weeds out a LOT more than 50% of the composite candidates
234: for each trial x. Each test catches nearly all the composites.
235: */
236: { unit x[MAX_UNIT_PRECISION], is_one[MAX_UNIT_PRECISION];
237: unit pminus1[MAX_UNIT_PRECISION];
238: short i;
239:
240: mp_move(pminus1,p);
241: mp_dec(pminus1);
242:
243: for (i=0; i<4; i++) /* Just do a few tests. */
244: { poll_for_break(); /* polls keyboard, allows ctrl-C to abort program */
245: mp_init(x,primetable[i]); /* Use any old random trial x */
246: /* if ((x**(p-1)) mod p) != 1, then p is not prime */
247: if (mp_modexp(is_one,x,pminus1,p) < 0) /* modexp error? */
248: return(FALSE); /* error means return not prime status */
249: if (testne(is_one,1)) /* then p is not prime */
250: return(FALSE); /* return not prime status */
251: #ifdef SHOWPROGRESS
252: printf("+"); /* let user see how we are progressing */
253: #endif /* SHOWPROGRESS */
254: }
255:
256: /* If it gets to this point, it's very likely that p is prime */
257: mp_burn(x); /* burn the evidence on the stack...*/
258: mp_burn(is_one);
259: mp_burn(pminus1);
260: return(TRUE);
261: } /* slowtest -- fermattest */
262:
263: #else /* FALSEKEYTEST */
264:
265: static boolean slowtest(unitptr p)
266: /* This routine tests p for primality by generating a "false" RSA key.
267: By setting the other prime q to 3, then generating phi = (p-1)*(q-1),
268: and n=p*q, we can easily test if 2**phi mod n = 1.
269: This test needs improvement, to test more q values to build confidence.
270: Because this test is so slow, it is recommended that p be sieved first
271: to weed out numbers that are obviously not prime.
272: */
273: { unit two[MAX_UNIT_PRECISION], temp[MAX_UNIT_PRECISION];
274: unit phi[MAX_UNIT_PRECISION], n[MAX_UNIT_PRECISION];
275: boolean isprime;
276:
277: poll_for_break(); /* polls keyboard, allows ctrl-C to abort program */
278:
279: /* compute phi = (p-1)*2 */
280: mp_move(phi,p); mp_dec(phi); mp_shift_left(phi);
281:
282: /* compute n = p*3 */
283: mp_move(n,p); mp_shift_left(n); mp_add(n,p);
284:
285: /* test if (2**phi mod n) == 1 */
286: mp_init(two,2);
287: if (mp_modexp(temp,two,phi,n) < 0) /* modexp error? */
288: return(FALSE); /* then return not prime status */
289: isprime = testeq(temp,1);
290:
291: mp_burn(temp); /* burn the evidence on the stack...*/
292: mp_burn(phi);
293: mp_burn(n);
294: return(isprime);
295: } /* slowtest -- falsekeytest */
296:
297: #endif /* FALSEKEYTEST */
298:
299:
300: boolean primetest(unitptr p)
301: /* Returns TRUE iff p is a prime.
302: If p doesn't pass through the sieve, then p is definitely NOT a prime.
303: If p is small enough for the sieve to prove primality or not,
304: and p passes through the sieve, then p is definitely a prime.
305: If p is large and p passes through the sieve and may be a prime,
306: then p is further tested for primality with a slower test.
307: */
308: { short i;
309: static word16 lastprime = 0; /* last prime in primetable */
310: word16 sqrt_p; /* to limit sieving past sqrt(p), for small p's */
311:
312: if (!lastprime) /* lastprime still undefined. So define it. */
313: { /* executes this code only once, then skips it next time */
314: for (i=0; primetable[i]; i++)
315: ; /* seek end of primetable */
316: lastprime = primetable[i-1]; /* get last prime in table */
317: }
318:
319: if (significance(p) <= (2/BYTES_PER_UNIT)) /* if p <= 16 bits */
320: /* p may be in primetable. Search it. */
321: if (bottom16(p) <= lastprime)
322: for (i=0; primetable[i]; i++) /* scan until null-terminator */
323: { if (primetable[i] == bottom16(p))
324: return(TRUE); /* yep, definitely a prime. */
325: if (primetable[i] > bottom16(p)) /* we missed. */
326: return(FALSE); /* definitely NOT a prime. */
327: } /* We got past the whole primetable without a hit. */
328: /* p is bigger than any prime in primetable, so let's sieve. */
329:
330: if (!(lsunit(p) & 1)) /* if least significant bit is 0... */
331: return(FALSE); /* divisible by 2, not prime */
332:
333: if (mp_tstminus(p)) /* error if p<0 */
334: return(FALSE); /* not prime if p<0 */
335:
336: /* Optimization for small (32 bits or less) p's.
337: If p is small, compute sqrt_p = sqrt(p), or else
338: if p is >32 bits then just set sqrt_p to something
339: at least as big as the largest primetable entry.
340: */
341: if (significance(p) <= (4/BYTES_PER_UNIT)) /* if p <= 32 bits */
342: { unit sqrtp[MAX_UNIT_PRECISION];
343: /* Just sieve up to sqrt(p) */
344: if (mp_sqrt(sqrtp,p) == 0) /* 0 means p is a perfect square */
345: return(FALSE); /* perfect square is not a prime */
346: /* we know that sqrtp <= 16 bits because p <= 32 bits */
347: sqrt_p = bottom16(sqrtp);
348: } /* if p <= 32 bits */
349: else /* p > 32 bits, so obviate sqrt(p) test. */
350: sqrt_p = lastprime; /* ensures that we do ENTIRE sieve. */
351:
352: for (i=1; primetable[i]; i++) /* p is assumed odd, so begin sieve at 3 */
353: { /* Compute p mod (primetable[i]). If it divides evenly...*/
354: if (mp_shortmod(p,primetable[i]) == 0)
355: return(FALSE); /* then p is definitely NOT prime */
356: if (primetable[i] > sqrt_p) /* fully sieved p? */
357: return(TRUE); /* yep, fully passed sieve, definitely a prime. */
358: }
359: /* It passed the sieve, so p is a suspected prime. */
360:
361: /* Now try slow complex primality test on suspected prime. */
362: return(slowtest(p)); /* returns TRUE or FALSE */
363: } /* primetest */
364:
365:
366: static void buildsieve(unitptr p, word16 remainders[])
367: /* Used in conjunction with fastsieve. Builds a table of remainders
368: relative to the random starting point p, so that fastsieve can
369: sequentially sieve for suspected primes quickly. Call buildsieve
370: once, then call fastsieve for consecutive prime candidates.
371: Note that p must be odd, because the sieve begins at 3.
372: */
373: { short i;
374: for (i=1; primetable[i]; i++)
375: { remainders[i] = mp_shortmod(p,primetable[i]);
376: }
377: } /* buildsieve */
378:
379: /*
380: Fast prime sieving algorithm by Philip Zimmermann.
381: This is the fastest algorithm I know of for quickly sieving for
382: large (hundreds of bits in length) "random" probable primes, because
383: it uses only single-precision (16-bit) arithmetic. Because rigorous
384: prime testing algorithms are very slow, it is recommended that
385: potential prime candidates be quickly passed through this fast
386: sieving algorithm first to weed out numbers that are obviously not
387: prime.
388:
389: This algorithm is optimized to search sequentially for a large prime
390: from a random starting point. For generalized nonsequential prime
391: testing, the slower conventional sieve should be used, as given
392: in primetest(p).
393:
394: This algorithm requires a fixed table (called primetable) of the
395: first hundred or so small prime numbers.
396: First we select a random odd starting point (p) for our prime
397: search. Then we build a table of 16-bit remainders calculated
398: from that initial p. This table of 16-bit remainders is exactly
399: the same length as the table of small 16-bit primes. Each
400: remainders table entry contains the remainder of p divided by the
401: corresponding primetable entry. Then we begin sequentially testing
402: all odd integers, starting from the initial odd random p. The
403: distance we have searched from the huge random starting point p is
404: a small 16-bit number, pdelta. If pdelta plus a remainders table
405: entry is evenly divisible by the corresponding primetable entry,
406: then p+pdelta is factorable by that primetable entry, which means
407: p+pdelta is not prime.
408: */
409:
410: static boolean fastsieve(word16 pdelta, word16 remainders[])
411: /* Fastsieve is used for searching sequentially from a random starting
412: point for a suspected prime. Requires that buildsieve be called
413: first, to build a table of remainders relative to the random starting
414: point p.
415: Returns true iff pdelta passes through the sieve and thus p+pdelta
416: may be a prime. Note that p must be odd, because the sieve begins
417: at 3.
418: */
419: { short i;
420: for (i=1; primetable[i]; i++)
421: { /* If pdelta plus a remainders table entry is evenly
422: divisible by the corresponding primetable entry,
423: then p+pdelta is factorable by that primetable entry,
424: which means p+pdelta is not prime.
425: */
426: if (( (pdelta + remainders[i]) % primetable[i] ) == 0)
427: return(FALSE); /* then p+pdelta is not prime */
428: }
429: /* It passed the sieve. It is now a suspected prime. */
430: return(TRUE);
431: } /* fastsieve */
432:
433:
434: #define numberof(x) (sizeof(x)/sizeof(x[0])) /* number of table entries */
435:
436:
437: int nextprime(unitptr p)
438: /* Find next higher prime starting at p, returning result in p.
439: Uses fast prime sieving algorithm to search sequentially.
440: Returns 0 for normal completion status, < 0 for failure status.
441: */
442: { word16 pdelta, range;
443: short oldprecision;
444: short i, suspects;
445:
446: /* start search at candidate p */
447: mp_inc(p); /* remember, it's the NEXT prime from p, noninclusive. */
448: if (significance(p) <= 1)
449: { /* p might be smaller than the largest prime in primetable.
450: We can't sieve for primes that are already in primetable.
451: We will have to directly search the table.
452: */
453: for (i=0; primetable[i]; i++) /* scan until null-terminator */
454: { if (primetable[i] >= lsunit(p))
455: { mp_init(p,primetable[i]);
456: return(0); /* return next higher prime from primetable */
457: }
458: } /* We got past the whole primetable without a hit. */
459: } /* p is bigger than any prime in primetable, so let's sieve. */
460:
461: if (mp_tstminus(p)) /* error if p<0 */
462: { mp_init(p,2); /* next prime >0 is 2 */
463: return(0); /* normal completion status */
464: }
465:
466: lsunit(p) |= 1; /* set candidate's lsb - make it odd */
467:
468: /* Adjust the global_precision downward to the optimum size for p...*/
469: oldprecision = global_precision; /* save global_precision */
470: /* We will need 2-3 extra bits of precision for the falsekeytest. */
471: set_precision(bits2units(countbits(p)+4+SLOP_BITS));
472: /* Rescale p to global_precision we just defined */
473: rescale(p,oldprecision,global_precision);
474:
475: {
476: #ifdef _NOMALLOC /* No malloc and free functions available. Use stack. */
477: word16 remainders[numberof(primetable)];
478: #else /* malloc available, we can conserve stack space. */
479: word16 *remainders;
480: /* Allocate some memory for the table of remainders: */
481: remainders = (word16 *) malloc(sizeof(primetable));
482: #endif /* malloc available */
483:
484: /* Build remainders table relative to initial p: */
485: buildsieve(p,remainders);
486: pdelta = 0; /* offset from initial random p */
487: /* Sieve preparation complete. Now for some fast fast sieving...*/
488: /* slowtest will not be called unless fastsieve is true */
489:
490: /* range is how far to search before giving up. */
491: range = 4 * units2bits(global_precision);
492: suspects = 0; /* number of suspected primes and slowtest trials */
493: while (TRUE)
494: {
495: /* equivalent to: if (primetest(p)) break; */
496: if (fastsieve(pdelta,remainders)) /* found suspected prime */
497: { suspects++; /* tally for statistical purposes */
498: #ifdef SHOWPROGRESS
499: printf("."); /* let user see how we are progressing */
500: #endif /* SHOWPROGRESS */
501: if (slowtest(p))
502: break; /* found a prime */
503: }
504: pdelta += 2; /* try next odd number */
505: mp_inc(p); mp_inc(p);
506:
507: if (pdelta > range) /* searched too many candidates? */
508: break; /* something must be wrong--bail out of search */
509:
510: } /* while (TRUE) */
511:
512: #ifdef SHOWPROGRESS
513: printf(" "); /* let user see how we are progressing */
514: #endif /* SHOWPROGRESS */
515:
516: for (i=0; primetable[i]; i++) /* scan until null-terminator */
517: remainders[i] = 0; /* don't leave remainders exposed in RAM */
518: #ifndef _NOMALLOC
519: free(remainders); /* free allocated memory */
520: #endif /* not _NOMALLOC */
521: }
522:
523: set_precision(oldprecision); /* restore precision */
524:
525: if (pdelta > range) /* searched too many candidates? */
526: { if (suspects < 1) /* unreasonable to have found no suspects */
527: return(NOSUSPECTS); /* fastsieve failed, probably */
528: return(NOPRIMEFOUND); /* return error status */
529: }
530: return(0); /* return normal completion status */
531:
532: } /* nextprime */
533:
534:
535: /* We will need a series of truly random bits for key generation.
536: In most implementations, our random number supply is derived from
537: random keyboard delays rather than a hardware random number
538: chip. So we will have to ensure we have a large enough pool of
539: accumulated random numbers from the keyboard. Later, randombyte
540: will return bytes one at a time from the accumulated pool of
541: random numbers. For ergonomic reasons, we may want to prefill
542: this random pool all at once initially. Subroutine randaccum prefills
543: a pool of random bits.
544: */
545:
546: static unit randomunit(void)
547: /* Fills 1 unit with random bytes, and returns unit. */
548: { unit u = 0;
549: byte i;
550: i = BYTES_PER_UNIT;
551: do
552: u = (u << 8) + randombyte();
553: while (--i);
554: return(u);
555: } /* randomunit */
556:
557:
558: void randombits(unitptr p, short nbits)
559: /* Make a random unit array p with nbits of precision. Used mainly to
560: generate large random numbers to search for primes.
561: */
562: { /* Fill a unit array with exactly nbits of random bits... */
563: short nunits; /* units of precision */
564: mp_init(p,0);
565: nunits = bits2units(nbits); /* round up to units */
566: make_lsbptr(p,global_precision);
567: *p = randomunit();
568: while (--nunits)
569: { *pre_higherunit(p) = randomunit();
570: nbits -= UNITSIZE;
571: }
572: *p &= (power_of_2(nbits)-1); /* clear the top unused bits remaining */
573: } /* randombits */
574:
575:
576: int randomprime(unitptr p,short nbits)
577: /* Makes a "random" prime p with nbits significant bits of precision.
578: Since these primes are used to compute a modulus of a guaranteed
579: length, the top 2 bits of the prime are set to 1, so that the
580: product of 2 primes (the modulus) is of a deterministic length.
581: Returns 0 for normal completion status, < 0 for failure status.
582: */
583: { DEBUGprintf2("\nGenerating a %d-bit random prime. ",nbits);
584: /* Get an initial random candidate p to start search. */
585: randombits(p,nbits-2); /* 2 less random bits for nonrandom top bits */
586: /* To guarantee exactly nbits of significance, set the top 2 bits to 1 */
587: mp_setbit(p,nbits-1); /* highest bit is nonrandom */
588: mp_setbit(p,nbits-2); /* next highest bit is also nonrandom */
589: return(nextprime(p)); /* search for next higher prime from starting point p */
590: } /* randomprime */
591:
592:
593: #ifdef STRONGPRIMES /* generate "strong" primes for keys */
594:
595: #define log_1stprime 6 /* log base 2 of firstprime */
596: #define firstprime (1<<log_1stprime) /* 1st primetable entry used by tryprime */
597:
598: static boolean tryprime(unitptr p,unitptr p1,short maxbits)
599: /* This routine attempts to generate a prime p such that p-1 has prime p1
600: as its largest factor. Prime p will have no more than maxbits bits of
601: significance. Prime p1 must be less than maxbits-log_1stprime in length.
602: This routine is called only from goodprime.
603: */
604: { int i;
605: unit i2[MAX_UNIT_PRECISION];
606: /* Generate p such that p = (i*2*p1)+1, for i=1,2,3,5,7,11,13,17...
607: and test p for primality for each small prime i.
608: It's better to start i at firstprime rather than at 1,
609: because then p grows slower in significance.
610: Start looking for small primes that are > firstprime...
611: */
612: if ((countbits(p1)+log_1stprime)>=maxbits)
613: { DEBUGprintf1("\007[Error: overconstrained prime]");
614: return(FALSE); /* failed to make a good prime */
615: }
616: for (i=0; primetable[i]; i++)
617: { if (primetable[i]<firstprime)
618: continue;
619: /* note that mp_init doesn't extend sign bit for >32767 */
620: mp_init(i2,primetable[i]<<1);
621: mp_mult(p,p1,i2); mp_inc(p);
622: if (countbits(p)>maxbits) break;
623: DEBUGprintf1(".");
624: if (primetest(p))
625: return(TRUE);
626: }
627: return(FALSE); /* failed to make a good prime */
628: } /* tryprime */
629:
630:
631: int goodprime(unitptr p,short maxbits,short minbits)
632: /* Make a "strong" prime p with at most maxbits and at least minbits of
633: significant bits of precision. This algorithm is called to generate
634: a high-quality prime p for key generation purposes. It must have
635: special characteristics for making a modulus n that is hard to factor.
636: Returns 0 for normal completion status, < 0 for failure status.
637: */
638: { unit p1[MAX_UNIT_PRECISION];
639: short oldprecision,midbits;
640: int status;
641: mp_init(p,0);
642: /* Adjust the global_precision downward to the optimum size for p...*/
643: oldprecision = global_precision; /* save global_precision */
644: /* We will need 2-3 extra bits of precision for the falsekeytest. */
645: set_precision(bits2units(maxbits+4+SLOP_BITS));
646: /* rescale p to global_precision we just defined */
647: rescale(p,oldprecision,global_precision);
648:
649: minbits -= 2 * log_1stprime; /* length of p" */
650: midbits = (maxbits+minbits)/2; /* length of p' */
651: DEBUGprintf3("\nGenerating a %d-%d bit refined prime. ",
652: minbits+2*log_1stprime,maxbits);
653: do
654: { do
655: { status = randomprime(p,minbits-1);
656: if (status < 0)
657: return(status); /* failed to find a random prime */
658: DEBUGprintf2("\n(p\042=%d bits)",countbits(p));
659: } while (!tryprime(p1,p,midbits));
660: DEBUGprintf2("(p'=%d bits)",countbits(p1));
661: } while (!tryprime(p,p1,maxbits));
662: DEBUGprintf2("\n\007(p=%d bits) ",countbits(p));
663: mp_burn(p1); /* burn the evidence on the stack */
664: set_precision(oldprecision); /* restore precision */
665: return(0); /* normal completion status */
666: } /* goodprime */
667:
668: #endif /* STRONGPRIMES */
669:
670:
671: #define iplus1 ( i==2 ? 0 : i+1 ) /* used by Euclid algorithms */
672: #define iminus1 ( i==0 ? 2 : i-1 ) /* used by Euclid algorithms */
673:
674: void gcd(unitptr result,unitptr a,unitptr n)
675: /* Computes greatest common divisor via Euclid's algorithm. */
676: { short i;
677: unit gcopies[3][MAX_UNIT_PRECISION];
678: #define g(i) ( &(gcopies[i][0]) )
679: mp_move(g(0),n);
680: mp_move(g(1),a);
681:
682: i=1;
683: while (testne(g(i),0))
684: { mp_mod( g(iplus1),g(iminus1),g(i) );
685: i = iplus1;
686: }
687: mp_move(result,g(iminus1));
688: mp_burn(g(iminus1)); /* burn the evidence on the stack...*/
689: mp_burn(g(iplus1));
690: #undef g
691: } /* gcd */
692:
693:
694: void inv(unitptr x,unitptr a,unitptr n)
695: /* Euclid's algorithm extended to compute multiplicative inverse.
696: Computes x such that a*x mod n = 1, where 0<a<n */
697: {
698: /* The variable u is unnecessary for the algorithm, but is
699: included in comments for mathematical clarity.
700: */
701: short i;
702: unit y[MAX_UNIT_PRECISION], temp[MAX_UNIT_PRECISION];
703: unit gcopies[3][MAX_UNIT_PRECISION], vcopies[3][MAX_UNIT_PRECISION];
704: #define g(i) ( &(gcopies[i][0]) )
705: #define v(i) ( &(vcopies[i][0]) )
706: /* unit ucopies[3][MAX_UNIT_PRECISION]; */
707: /* #define u(i) ( &(ucopies[i][0]) ) */
708: mp_move(g(0),n); mp_move(g(1),a);
709: /* mp_init(u(0),1); mp_init(u(1),0); */
710: mp_init(v(0),0); mp_init(v(1),1);
711: i=1;
712: while (testne(g(i),0))
713: { /* we know that at this point, g(i) = u(i)*n + v(i)*a */
714: mp_udiv( g(iplus1), y, g(iminus1), g(i) );
715: mp_mult(temp,y,v(i)); mp_move(v(iplus1),v(iminus1)); mp_sub(v(iplus1),temp);
716: /* mp_mult(temp,y,u(i)); mp_move(u(iplus1),u(iminus1)); mp_sub(u(iplus1),temp); */
717: i = iplus1;
718: }
719: mp_move(x,v(iminus1));
720: if (mp_tstminus(x))
721: mp_add(x,n);
722: mp_burn(g(iminus1)); /* burn the evidence on the stack...*/
723: mp_burn(g(iplus1));
724: mp_burn(v(0));
725: mp_burn(v(1));
726: mp_burn(v(2));
727: mp_burn(y);
728: mp_burn(temp);
729: #undef g
730: #undef v
731: } /* inv */
732:
733:
734: #define swap(p,q) { unitptr t; t = p; p = q; q = t; }
735:
736:
737: void derivekeys(unitptr n,unitptr e,unitptr d,
738: unitptr p,unitptr q,unitptr u,short ebits)
739: /* Given primes p and q, derive key components n, e, d, and u.
740: The global_precision must have already been set large enough for n.
741: Note that p must be < q.
742: Primes p and q must have been previously generated elsewhere.
743: The bit precision of e will be >= ebits. The search for a usable
744: exponent e will begin with an ebits-sized number. The recommended
745: value for ebits is 5, for efficiency's sake. This could yield
746: an e as small as 17.
747: */
748: { unit F[MAX_UNIT_PRECISION];
749: unitptr ptemp, qtemp, phi, G; /* scratchpads */
750:
751: /* For strong prime generation only, latitude is the amount
752: which the modulus may differ from the desired bit precision.
753: It must be big enough to allow primes to be generated by
754: goodprime reasonably fast.
755: */
756: #define latitude(bits) (max(min(bits/16,12),4)) /* between 4 and 12 bits */
757:
758: ptemp = d; /* use d for temporary scratchpad array */
759: qtemp = u; /* use u for temporary scratchpad array */
760: phi = n; /* use n for temporary scratchpad array */
761: G = F; /* use F for both G and F */
762:
763: if (mp_compare(p,q) >= 0) /* ensure that p<q for computing u */
764: swap(p,q); /* swap the pointers p and q */
765:
766: /* phi(n) is the Euler totient function of n, or the number of
767: positive integers less than n that are relatively prime to n.
768: G is the number of "spare key sets" for a given modulus n.
769: The smaller G is, the better. The smallest G can get is 2.
770: */
771: mp_move(ptemp,p); mp_move(qtemp,q);
772: mp_dec(ptemp); mp_dec(qtemp);
773: mp_mult(phi,ptemp,qtemp); /* phi(n) = (p-1)*(q-1) */
774: gcd(G,ptemp,qtemp); /* G(n) = gcd(p-1,q-1) */
775: #ifdef DEBUG
776: if (countbits(G) > 12) /* G shouldn't get really big. */
777: mp_display("\aG = ",G); /* Worry the user. */
778: #endif /* DEBUG */
779: mp_udiv(ptemp,qtemp,phi,G); /* F(n) = phi(n)/G(n) */
780: mp_move(F,qtemp);
781:
782: /* We now have phi and F. Next, compute e...
783: Strictly speaking, we might get slightly faster results by
784: testing all small prime e's greater than 2 until we hit a
785: good e. But we can do just about as well by testing all
786: odd e's greater than 2.
787: We could begin searching for a candidate e anywhere, perhaps
788: using a random 16-bit starting point value for e, or even
789: larger values. But the most efficient value for e would be 3,
790: if it satisfied the gcd test with phi.
791: Parameter ebits specifies the number of significant bits e
792: should have to begin search for a workable e.
793: Make e at least 2 bits long, and no longer than one bit
794: shorter than the length of phi.
795: */
796: ebits = min(ebits,countbits(phi)-1);
797: if (ebits==0) ebits=5; /* default is 5 bits long */
798: ebits = max(ebits,2);
799: mp_init(e,0);
800: mp_setbit(e,ebits-1);
801: lsunit(e) |= 1; /* set e candidate's lsb - make it odd */
802: mp_dec(e); mp_dec(e); /* precompensate for preincrements of e */
803: do
804: { mp_inc(e); mp_inc(e); /* try odd e's until we get it. */
805: gcd(ptemp,e,phi); /* look for e such that gcd(e,phi(n)) = 1 */
806: } while (testne(ptemp,1));
807:
808: /* Now we have e. Next, compute d, then u, then n.
809: d is the multiplicative inverse of e, mod F(n).
810: u is the multiplicative inverse of p, mod q, if p<q.
811: n is the public modulus p*q.
812: */
813: inv(d,e,F); /* compute d such that (e*d) mod F(n) = 1 */
814: inv(u,p,q); /* (p*u) mod q = 1, assuming p<q */
815: mp_mult(n,p,q); /* n = p*q */
816: mp_burn(F); /* burn the evidence on the stack */
817: } /* derivekeys */
818:
819:
820: int keygen(unitptr n,unitptr e,unitptr d,
821: unitptr p,unitptr q,unitptr u,short keybits,short ebits)
822: /* Generate key components p, q, n, e, d, and u.
823: This routine sets the global_precision appropriate for n,
824: where keybits is desired precision of modulus n.
825: The precision of exponent e will be >= ebits.
826: It will generate a p that is < q.
827: Returns 0 for succcessful keygen, negative status otherwise.
828: */
829: { short pbits,qbits,separation;
830: boolean too_close_together; /* TRUE iff p and q are too close */
831: int status;
832: int slop;
833:
834: /* Don't let keybits get any smaller than 2 units, because
835: some parts of the math package require at least 2 units
836: for global_precision.
837: Nor any smaller than the 32 bits of preblocking overhead.
838: Nor any bigger than MAX_BIT_PRECISION - SLOP_BITS.
839: Also, if generating "strong" primes, don't let keybits get
840: any smaller than 64 bits, because of the search latitude.
841: */
842: slop = max(SLOP_BITS,1); /* allow at least 1 slop bit for sign bit */
843: keybits = min(keybits,(MAX_BIT_PRECISION-slop));
844: keybits = max(keybits,UNITSIZE*2);
845: keybits = max(keybits,32); /* minimum preblocking overhead */
846: #ifdef STRONGPRIMES
847: keybits = max(keybits,64); /* for strong prime search latitude */
848: #endif /* STRONGPRIMES */
849: #ifdef STEWART_KEY /* using Stewart's modmult algorithm */
850: /* Stewart's modmult algorithm requires that both primes and
851: the modulus are an exact multiple of UNITSIZE bits long,
852: in other words, they completely fill the most significant
853: unit. So we will "round up" keybits to the next multiple
854: of UNITSIZE*2.
855: */
856: #define roundup(x,m) (((x)+(m)-1)/(m))*(m)
857: keybits = roundup(keybits,UNITSIZE*2);
858: if (keybits==MAX_BIT_PRECISION) /* allow head room for sign bit */
859: keybits -= UNITSIZE*2;
860: #endif /* STEWART_KEY */
861:
862: set_precision(bits2units(keybits + slop));
863:
864: /* We will need a series of truly random bits to generate the
865: primes. We need enough random bits for keybits, plus two
866: random units for combined discarded bit losses in randombits.
867: Since we now know how many random bits we will need,
868: this is the place to prefill the pool of random bits.
869: */
870: randflush(); /* ensure recycled random pool is empty */
871: randaccum(keybits+2*UNITSIZE); /* get this many raw random bits ready */
872:
873: /* separation is the minimum number bits of difference in the
874: sizes of p and q.
875: */
876: #ifdef STEWART_KEY /* using Stewart's modmult algorithm */
877: separation = 0;
878: #else
879: separation = 2;
880: #endif /* STEWART_KEY */
881: pbits = (keybits-separation)/2;
882: qbits = keybits - pbits;
883:
884: /* During decrypt, the primes p and q's bit length should
885: not be an exact multiple of UNITSIZE, because Merritt's
886: modmult algorithm performs slowest in that case, wasting
887: an extra unit of precision for overflow.
888: Other modmult algorithms perform differently.
889: Stewart's modmult actually performs fastest when the
890: modulus and primes p and q exactly fill the MS unit.
891: */
892: #ifdef MERRITT_KEY
893: { short qtrim;
894: qtrim = (qbits % UNITSIZE)+1; /* how many bits to trim from q */
895: if (qtrim <= (separation/2))
896: pbits += qtrim; /* allows qbits to be a bit shorter */
897: }
898: if ((pbits % UNITSIZE)==0) /* inefficient to exactly fill a word */
899: pbits -= 1; /* one bit shorter speeds up modmult a lot. */
900: #endif /* MERRITT_KEY */
901:
902: randload(pbits); /* get fresh load of raw random bits for p */
903: #ifdef STRONGPRIMES /* make a good strong prime for the key */
904: status = goodprime(p,pbits,pbits-latitude(pbits));
905: if (status < 0)
906: return(status); /* failed to find a suitable prime */
907: #else /* just any random prime will suffice for the key */
908: status = randomprime(p,pbits);
909: if (status < 0)
910: return(status); /* failed to find a random prime */
911: #endif /* else not STRONGPRIMES */
912:
913: /* We now have prime p. Now generate q such that q>p... */
914:
915: qbits = keybits - countbits(p);
916:
917: #ifdef MERRITT_KEY
918: if ((qbits % UNITSIZE)==0) /* inefficient to exactly fill a word */
919: qbits -= 1; /* one bit shorter speeds up modmult a lot. */
920: #endif /* MERRITT_KEY */
921:
922: randload(qbits); /* get fresh load of raw random bits for q */
923: /* This load of random bits will be stirred and recycled until
924: a good q is generated. */
925:
926: do /* Generate a q until we get one that isn't too close to p. */
927: {
928: #ifdef STRONGPRIMES /* make a good strong prime for the key */
929: status = goodprime(q,qbits,qbits-latitude(qbits));
930: if (status < 0)
931: return(status); /* failed to find a suitable prime */
932: #else /* just any random prime will suffice for the key */
933: status = randomprime(q,qbits);
934: if (status < 0)
935: return(status); /* failed to find a random prime */
936: #endif /* else not STRONGPRIMES */
937:
938: /* Note that at this point we can't be sure that q>p. */
939: /* See if p and q are far enough apart. Is q-p big enough? */
940: mp_move(u,q); /* use u as scratchpad */
941: mp_sub(u,p); /* compute q-p */
942: if (mp_tstminus(u)) /* p is bigger */
943: { mp_neg(u);
944: too_close_together = (countbits(u) < (countbits(p)-7));
945: }
946: else /* q is bigger */
947: too_close_together = (countbits(u) < (countbits(q)-7));
948:
949: /* Keep trying q's until we get one far enough from p... */
950: } while (too_close_together);
951:
952: /* In case sizes went awry in making p and q... */
953: if (mp_compare(p,q) >= 0) /* ensure that p<q for computing u */
954: { mp_move(u,p);
955: mp_move(p,q);
956: mp_move(q,u);
957: }
958:
959: derivekeys(n,e,d,p,q,u,ebits);
960: randflush(); /* ensure recycled random pool is destroyed */
961:
962: /* Now test key just to make sure --this had better work! */
963: { unit M[MAX_UNIT_PRECISION];
964: unit C[MAX_UNIT_PRECISION];
965: mp_init(M,0x1234); /* material to be signed */
966: mp_init(C,0);
967: status = rsa_decrypt(C,M,d,p,q,u); /* create signature C first */
968: if (status < 0) /* modexp error? */
969: return(status); /* return error status */
970: mp_init(M,0); /* ensure test pattern M is destroyed */
971: status = mp_modexp(M,C,e,n); /* check signature C */
972: if (status < 0) /* modexp error? */
973: return(status); /* return error status */
974: if (testne(M,0x1234)) /* test pattern M recovered? */
975: return(KEYFAILED); /* error return, bad key or bad math library */
976: }
977: return(0); /* normal return */
978: } /* keygen */
979:
980: /*------------------- End of keygen.c -----------------------------*/
981:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.