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