]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/bn/bn_prime.c
Try skipping over the adding and just picking a new random number.
[thirdparty/openssl.git] / crypto / bn / bn_prime.c
1 /* crypto/bn/bn_prime.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58 /* ====================================================================
59 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112 #include <stdio.h>
113 #include <time.h>
114 #include "cryptlib.h"
115 #include "bn_lcl.h"
116 #include <openssl/rand.h>
117
118 /* NB: these functions have been "upgraded", the deprecated versions (which are
119 * compatibility wrappers using these functions) are in bn_depr.c.
120 * - Geoff
121 */
122
123 /* The quick sieve algorithm approach to weeding out primes is
124 * Philip Zimmermann's, as implemented in PGP. I have had a read of
125 * his comments and implemented my own version.
126 */
127 #include "bn_prime.h"
128
129 static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,
130 const BIGNUM *a1_odd, int k, BN_CTX *ctx, BN_MONT_CTX *mont);
131 static int probable_prime(BIGNUM *rnd, int bits);
132 static int probable_prime_dh_safe(BIGNUM *rnd, int bits,
133 const BIGNUM *add, const BIGNUM *rem, BN_CTX *ctx);
134
135 static int prime_offsets[480] = {
136 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89,
137 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
138 169, 173, 179, 181, 191, 193, 197, 199, 211, 221, 223, 227, 229, 233, 239,
139 241, 247, 251, 257, 263, 269, 271, 277, 281, 283, 289, 293, 299, 307, 311,
140 313, 317, 323, 331, 337, 347, 349, 353, 359, 361, 367, 373, 377, 379, 383,
141 389, 391, 397, 401, 403, 409, 419, 421, 431, 433, 437, 439, 443, 449, 457,
142 461, 463, 467, 479, 481, 487, 491, 493, 499, 503, 509, 521, 523, 527, 529,
143 533, 541, 547, 551, 557, 559, 563, 569, 571, 577, 587, 589, 593, 599, 601,
144 607, 611, 613, 617, 619, 629, 631, 641, 643, 647, 653, 659, 661, 667, 673,
145 677, 683, 689, 691, 697, 701, 703, 709, 713, 719, 727, 731, 733, 739, 743,
146 751, 757, 761, 767, 769, 773, 779, 787, 793, 797, 799, 809, 811, 817, 821,
147 823, 827, 829, 839, 841, 851, 853, 857, 859, 863, 871, 877, 881, 883, 887,
148 893, 899, 901, 907, 911, 919, 923, 929, 937, 941, 943, 947, 949, 953, 961,
149 967, 971, 977, 983, 989, 991, 997, 1003, 1007, 1009, 1013, 1019, 1021, 1027,
150 1031, 1033, 1037, 1039, 1049, 1051, 1061, 1063, 1069, 1073, 1079, 1081,
151 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1121, 1123, 1129, 1139, 1147,
152 1151, 1153, 1157, 1159, 1163, 1171, 1181, 1187, 1189, 1193, 1201, 1207,
153 1213, 1217, 1219, 1223, 1229, 1231, 1237, 1241, 1247, 1249, 1259, 1261,
154 1271, 1273, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1313,
155 1319, 1321, 1327, 1333, 1339, 1343, 1349, 1357, 1361, 1363, 1367, 1369,
156 1373, 1381, 1387, 1391, 1399, 1403, 1409, 1411, 1417, 1423, 1427, 1429,
157 1433, 1439, 1447, 1451, 1453, 1457, 1459, 1469, 1471, 1481, 1483, 1487,
158 1489, 1493, 1499, 1501, 1511, 1513, 1517, 1523, 1531, 1537, 1541, 1543,
159 1549, 1553, 1559, 1567, 1571, 1577, 1579, 1583, 1591, 1597, 1601, 1607,
160 1609, 1613, 1619, 1621, 1627, 1633, 1637, 1643, 1649, 1651, 1657, 1663,
161 1667, 1669, 1679, 1681, 1691, 1693, 1697, 1699, 1703, 1709, 1711, 1717,
162 1721, 1723, 1733, 1739, 1741, 1747, 1751, 1753, 1759, 1763, 1769, 1777,
163 1781, 1783, 1787, 1789, 1801, 1807, 1811, 1817, 1819, 1823, 1829, 1831,
164 1843, 1847, 1849, 1853, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1891,
165 1901, 1907, 1909, 1913, 1919, 1921, 1927, 1931, 1933, 1937, 1943, 1949,
166 1951, 1957, 1961, 1963, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011,
167 2017, 2021, 2027, 2029, 2033, 2039, 2041, 2047, 2053, 2059, 2063, 2069,
168 2071, 2077, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2117, 2119, 2129,
169 2131, 2137, 2141, 2143, 2147, 2153, 2159, 2161, 2171, 2173, 2179, 2183,
170 2197, 2201, 2203, 2207, 2209, 2213, 2221, 2227, 2231, 2237, 2239, 2243,
171 2249, 2251, 2257, 2263, 2267, 2269, 2273, 2279, 2281, 2287, 2291, 2293,
172 2297, 2309, 2311 };
173 static int prime_offset_count = 480;
174 static int prime_multiplier = 2310;
175
176 int BN_GENCB_call(BN_GENCB *cb, int a, int b)
177 {
178 /* No callback means continue */
179 if(!cb) return 1;
180 switch(cb->ver)
181 {
182 case 1:
183 /* Deprecated-style callbacks */
184 if(!cb->cb.cb_1)
185 return 1;
186 cb->cb.cb_1(a, b, cb->arg);
187 return 1;
188 case 2:
189 /* New-style callbacks */
190 return cb->cb.cb_2(a, b, cb);
191 default:
192 break;
193 }
194 /* Unrecognised callback type */
195 return 0;
196 }
197
198 int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,
199 const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb)
200 {
201 BIGNUM *t;
202 int found=0;
203 int i,j,c1=0;
204 BN_CTX *ctx;
205 int checks = BN_prime_checks_for_size(bits);
206
207 if (bits < 2)
208 {
209 /* There are no prime numbers this small. */
210 BNerr(BN_F_BN_GENERATE_PRIME_EX, BN_R_BITS_TOO_SMALL);
211 return 0;
212 }
213 else if (bits == 2 && safe)
214 {
215 /* The smallest safe prime (7) is three bits. */
216 BNerr(BN_F_BN_GENERATE_PRIME_EX, BN_R_BITS_TOO_SMALL);
217 return 0;
218 }
219
220 ctx=BN_CTX_new();
221 if (ctx == NULL) goto err;
222 BN_CTX_start(ctx);
223 t = BN_CTX_get(ctx);
224 if(!t) goto err;
225 loop:
226 /* make a random number and set the top and bottom bits */
227 if (add == NULL)
228 {
229 if (!probable_prime(ret,bits)) goto err;
230 }
231 else
232 {
233 if (safe)
234 {
235 if (!probable_prime_dh_safe(ret,bits,add,rem,ctx))
236 goto err;
237 }
238 else
239 {
240 if (!bn_probable_prime_dh(ret,bits,add,rem,ctx))
241 goto err;
242 }
243 }
244 /* if (BN_mod_word(ret,(BN_ULONG)3) == 1) goto loop; */
245 if(!BN_GENCB_call(cb, 0, c1++))
246 /* aborted */
247 goto err;
248
249 if (!safe)
250 {
251 i=BN_is_prime_fasttest_ex(ret,checks,ctx,0,cb);
252 if (i == -1) goto err;
253 if (i == 0) goto loop;
254 }
255 else
256 {
257 /* for "safe prime" generation,
258 * check that (p-1)/2 is prime.
259 * Since a prime is odd, We just
260 * need to divide by 2 */
261 if (!BN_rshift1(t,ret)) goto err;
262
263 for (i=0; i<checks; i++)
264 {
265 j=BN_is_prime_fasttest_ex(ret,1,ctx,0,cb);
266 if (j == -1) goto err;
267 if (j == 0) goto loop;
268
269 j=BN_is_prime_fasttest_ex(t,1,ctx,0,cb);
270 if (j == -1) goto err;
271 if (j == 0) goto loop;
272
273 if(!BN_GENCB_call(cb, 2, c1-1))
274 goto err;
275 /* We have a safe prime test pass */
276 }
277 }
278 /* we have a prime :-) */
279 found = 1;
280 err:
281 if (ctx != NULL)
282 {
283 BN_CTX_end(ctx);
284 BN_CTX_free(ctx);
285 }
286 bn_check_top(ret);
287 return found;
288 }
289
290 int BN_is_prime_ex(const BIGNUM *a, int checks, BN_CTX *ctx_passed, BN_GENCB *cb)
291 {
292 return BN_is_prime_fasttest_ex(a, checks, ctx_passed, 0, cb);
293 }
294
295 int BN_is_prime_fasttest_ex(const BIGNUM *a, int checks, BN_CTX *ctx_passed,
296 int do_trial_division, BN_GENCB *cb)
297 {
298 int i, j, ret = -1;
299 int k;
300 BN_CTX *ctx = NULL;
301 BIGNUM *A1, *A1_odd, *check; /* taken from ctx */
302 BN_MONT_CTX *mont = NULL;
303 const BIGNUM *A = NULL;
304
305 if (BN_cmp(a, BN_value_one()) <= 0)
306 return 0;
307
308 if (checks == BN_prime_checks)
309 checks = BN_prime_checks_for_size(BN_num_bits(a));
310
311 /* first look for small factors */
312 if (!BN_is_odd(a))
313 /* a is even => a is prime if and only if a == 2 */
314 return BN_is_word(a, 2);
315 if (do_trial_division)
316 {
317 for (i = 1; i < NUMPRIMES; i++)
318 if (BN_mod_word(a, primes[i]) == 0)
319 return 0;
320 if(!BN_GENCB_call(cb, 1, -1))
321 goto err;
322 }
323
324 if (ctx_passed != NULL)
325 ctx = ctx_passed;
326 else
327 if ((ctx=BN_CTX_new()) == NULL)
328 goto err;
329 BN_CTX_start(ctx);
330
331 /* A := abs(a) */
332 if (a->neg)
333 {
334 BIGNUM *t;
335 if ((t = BN_CTX_get(ctx)) == NULL) goto err;
336 BN_copy(t, a);
337 t->neg = 0;
338 A = t;
339 }
340 else
341 A = a;
342 A1 = BN_CTX_get(ctx);
343 A1_odd = BN_CTX_get(ctx);
344 check = BN_CTX_get(ctx);
345 if (check == NULL) goto err;
346
347 /* compute A1 := A - 1 */
348 if (!BN_copy(A1, A))
349 goto err;
350 if (!BN_sub_word(A1, 1))
351 goto err;
352 if (BN_is_zero(A1))
353 {
354 ret = 0;
355 goto err;
356 }
357
358 /* write A1 as A1_odd * 2^k */
359 k = 1;
360 while (!BN_is_bit_set(A1, k))
361 k++;
362 if (!BN_rshift(A1_odd, A1, k))
363 goto err;
364
365 /* Montgomery setup for computations mod A */
366 mont = BN_MONT_CTX_new();
367 if (mont == NULL)
368 goto err;
369 if (!BN_MONT_CTX_set(mont, A, ctx))
370 goto err;
371
372 for (i = 0; i < checks; i++)
373 {
374 if (!BN_pseudo_rand_range(check, A1))
375 goto err;
376 if (!BN_add_word(check, 1))
377 goto err;
378 /* now 1 <= check < A */
379
380 j = witness(check, A, A1, A1_odd, k, ctx, mont);
381 if (j == -1) goto err;
382 if (j)
383 {
384 ret=0;
385 goto err;
386 }
387 if(!BN_GENCB_call(cb, 1, i))
388 goto err;
389 }
390 ret=1;
391 err:
392 if (ctx != NULL)
393 {
394 BN_CTX_end(ctx);
395 if (ctx_passed == NULL)
396 BN_CTX_free(ctx);
397 }
398 if (mont != NULL)
399 BN_MONT_CTX_free(mont);
400
401 return(ret);
402 }
403
404 int bn_probable_prime_dh_retry(BIGNUM *rnd, int bits, BN_CTX *ctx)
405 {
406 int i;
407 BIGNUM *t1;
408 int ret = 0;
409
410 BN_CTX_start(ctx);
411 if ((t1 = BN_CTX_get(ctx)) == NULL) goto err;
412
413 loop:
414 if (!BN_rand(rnd, bits, 0, 1)) goto err;
415
416 /* we now have a random number 'rand' to test. */
417
418 for (i = 1; i < NUMPRIMES; i++)
419 {
420 /* check that rnd is a prime */
421 if (BN_mod_word(rnd, (BN_ULONG)primes[i]) <= 1)
422 {
423 /*if (!BN_add(rnd, rnd, add)) goto err;*/
424 goto loop;
425 }
426 }
427 ret=1;
428
429 err:
430 BN_CTX_end(ctx);
431 bn_check_top(rnd);
432 return(ret);
433 }
434
435 int bn_probable_prime_dh_coprime(BIGNUM *rnd, int bits, BN_CTX *ctx)
436 {
437 int i;
438 BIGNUM *t1;
439 BIGNUM *offset_index;
440 BIGNUM *offset_count;
441 int ret = 0;
442
443 BN_CTX_start(ctx);
444 if ((t1 = BN_CTX_get(ctx)) == NULL) goto err;
445 if ((offset_index = BN_CTX_get(ctx)) == NULL) goto err;
446 if ((offset_count = BN_CTX_get(ctx)) == NULL) goto err;
447
448 BN_add_word(offset_count, prime_offset_count);
449
450 loop:
451 if (!BN_rand(rnd, bits, 0, 1)) goto err;
452 if (!BN_rand_range(offset_index, offset_count)) goto err;
453
454 BN_mul_word(rnd, prime_multiplier);
455 BN_add_word(rnd, prime_offsets[BN_get_word(offset_index)]);
456
457 /* we now have a random number 'rand' to test. */
458
459 /* skip primes 2, 3, 5, 7, 11 */
460 for (i = 5; i < NUMPRIMES; i++)
461 {
462 /* check that rnd is a prime */
463 if (BN_mod_word(rnd, (BN_ULONG)primes[i]) <= 1)
464 {
465 goto loop;
466 }
467 }
468 ret=1;
469
470 err:
471 BN_CTX_end(ctx);
472 bn_check_top(rnd);
473 return(ret);
474 }
475
476 static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,
477 const BIGNUM *a1_odd, int k, BN_CTX *ctx, BN_MONT_CTX *mont)
478 {
479 if (!BN_mod_exp_mont(w, w, a1_odd, a, ctx, mont)) /* w := w^a1_odd mod a */
480 return -1;
481 if (BN_is_one(w))
482 return 0; /* probably prime */
483 if (BN_cmp(w, a1) == 0)
484 return 0; /* w == -1 (mod a), 'a' is probably prime */
485 while (--k)
486 {
487 if (!BN_mod_mul(w, w, w, a, ctx)) /* w := w^2 mod a */
488 return -1;
489 if (BN_is_one(w))
490 return 1; /* 'a' is composite, otherwise a previous 'w' would
491 * have been == -1 (mod 'a') */
492 if (BN_cmp(w, a1) == 0)
493 return 0; /* w == -1 (mod a), 'a' is probably prime */
494 }
495 /* If we get here, 'w' is the (a-1)/2-th power of the original 'w',
496 * and it is neither -1 nor +1 -- so 'a' cannot be prime */
497 bn_check_top(w);
498 return 1;
499 }
500
501 static int probable_prime(BIGNUM *rnd, int bits)
502 {
503 int i;
504 prime_t mods[NUMPRIMES];
505 BN_ULONG delta;
506 BN_ULONG maxdelta = BN_MASK2 - primes[NUMPRIMES-1];
507 char is_single_word = bits <= BN_BITS2;
508
509 again:
510 if (!BN_rand(rnd,bits,1,1)) return(0);
511 /* we now have a random number 'rnd' to test. */
512 for (i=1; i<NUMPRIMES; i++)
513 mods[i]=(prime_t)BN_mod_word(rnd,(BN_ULONG)primes[i]);
514 /* If bits is so small that it fits into a single word then we
515 * additionally don't want to exceed that many bits. */
516 if (is_single_word)
517 {
518 BN_ULONG size_limit = (((BN_ULONG) 1) << bits) - BN_get_word(rnd) - 1;
519 if (size_limit < maxdelta)
520 maxdelta = size_limit;
521 }
522 delta=0;
523 loop:
524 if (is_single_word)
525 {
526 BN_ULONG rnd_word = BN_get_word(rnd);
527
528 /* In the case that the candidate prime is a single word then
529 * we check that:
530 * 1) It's greater than primes[i] because we shouldn't reject
531 * 3 as being a prime number because it's a multiple of
532 * three.
533 * 2) That it's not a multiple of a known prime. We don't
534 * check that rnd-1 is also coprime to all the known
535 * primes because there aren't many small primes where
536 * that's true. */
537 for (i=1; i<NUMPRIMES && primes[i]<rnd_word; i++)
538 {
539 if ((mods[i]+delta)%primes[i] == 0)
540 {
541 delta+=2;
542 if (delta > maxdelta) goto again;
543 goto loop;
544 }
545 }
546 }
547 else
548 {
549 for (i=1; i<NUMPRIMES; i++)
550 {
551 /* check that rnd is not a prime and also
552 * that gcd(rnd-1,primes) == 1 (except for 2) */
553 if (((mods[i]+delta)%primes[i]) <= 1)
554 {
555 delta+=2;
556 if (delta > maxdelta) goto again;
557 goto loop;
558 }
559 }
560 }
561 if (!BN_add_word(rnd,delta)) return(0);
562 if (BN_num_bits(rnd) != bits)
563 goto again;
564 bn_check_top(rnd);
565 return(1);
566 }
567
568 int bn_probable_prime_dh(BIGNUM *rnd, int bits,
569 const BIGNUM *add, const BIGNUM *rem, BN_CTX *ctx)
570 {
571 int i,ret=0;
572 BIGNUM *t1;
573
574 BN_CTX_start(ctx);
575 if ((t1 = BN_CTX_get(ctx)) == NULL) goto err;
576
577 if (!BN_rand(rnd,bits,0,1)) goto err;
578
579 /* we need ((rnd-rem) % add) == 0 */
580
581 if (!BN_mod(t1,rnd,add,ctx)) goto err;
582 if (!BN_sub(rnd,rnd,t1)) goto err;
583 if (rem == NULL)
584 { if (!BN_add_word(rnd,1)) goto err; }
585 else
586 { if (!BN_add(rnd,rnd,rem)) goto err; }
587
588 /* we now have a random number 'rand' to test. */
589
590 loop:
591 for (i=1; i<NUMPRIMES; i++)
592 {
593 /* check that rnd is a prime */
594 if (BN_mod_word(rnd,(BN_ULONG)primes[i]) <= 1)
595 {
596 if (!BN_add(rnd,rnd,add)) goto err;
597 goto loop;
598 }
599 }
600 ret=1;
601
602 err:
603 BN_CTX_end(ctx);
604 bn_check_top(rnd);
605 return(ret);
606 }
607
608 static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd,
609 const BIGNUM *rem, BN_CTX *ctx)
610 {
611 int i,ret=0;
612 BIGNUM *t1,*qadd,*q;
613
614 bits--;
615 BN_CTX_start(ctx);
616 t1 = BN_CTX_get(ctx);
617 q = BN_CTX_get(ctx);
618 qadd = BN_CTX_get(ctx);
619 if (qadd == NULL) goto err;
620
621 if (!BN_rshift1(qadd,padd)) goto err;
622
623 if (!BN_rand(q,bits,0,1)) goto err;
624
625 /* we need ((rnd-rem) % add) == 0 */
626 if (!BN_mod(t1,q,qadd,ctx)) goto err;
627 if (!BN_sub(q,q,t1)) goto err;
628 if (rem == NULL)
629 { if (!BN_add_word(q,1)) goto err; }
630 else
631 {
632 if (!BN_rshift1(t1,rem)) goto err;
633 if (!BN_add(q,q,t1)) goto err;
634 }
635
636 /* we now have a random number 'rand' to test. */
637 if (!BN_lshift1(p,q)) goto err;
638 if (!BN_add_word(p,1)) goto err;
639
640 loop:
641 for (i=1; i<NUMPRIMES; i++)
642 {
643 /* check that p and q are prime */
644 /* check that for p and q
645 * gcd(p-1,primes) == 1 (except for 2) */
646 if ((BN_mod_word(p,(BN_ULONG)primes[i]) == 0) ||
647 (BN_mod_word(q,(BN_ULONG)primes[i]) == 0))
648 {
649 if (!BN_add(p,p,padd)) goto err;
650 if (!BN_add(q,q,qadd)) goto err;
651 goto loop;
652 }
653 }
654 ret=1;
655
656 err:
657 BN_CTX_end(ctx);
658 bn_check_top(p);
659 return(ret);
660 }