/src/nettle/bignum-random-prime.c
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /* bignum-random-prime.c  | 
2  |  |  | 
3  |  |    Generation of random provable primes.  | 
4  |  |  | 
5  |  |    Copyright (C) 2010, 2013 Niels Möller  | 
6  |  |  | 
7  |  |    This file is part of GNU Nettle.  | 
8  |  |  | 
9  |  |    GNU Nettle is free software: you can redistribute it and/or  | 
10  |  |    modify it under the terms of either:  | 
11  |  |  | 
12  |  |      * the GNU Lesser General Public License as published by the Free  | 
13  |  |        Software Foundation; either version 3 of the License, or (at your  | 
14  |  |        option) any later version.  | 
15  |  |  | 
16  |  |    or  | 
17  |  |  | 
18  |  |      * the GNU General Public License as published by the Free  | 
19  |  |        Software Foundation; either version 2 of the License, or (at your  | 
20  |  |        option) any later version.  | 
21  |  |  | 
22  |  |    or both in parallel, as here.  | 
23  |  |  | 
24  |  |    GNU Nettle is distributed in the hope that it will be useful,  | 
25  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
26  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  | 
27  |  |    General Public License for more details.  | 
28  |  |  | 
29  |  |    You should have received copies of the GNU General Public License and  | 
30  |  |    the GNU Lesser General Public License along with this program.  If  | 
31  |  |    not, see http://www.gnu.org/licenses/.  | 
32  |  | */  | 
33  |  |  | 
34  |  | #if HAVE_CONFIG_H  | 
35  |  | # include "config.h"  | 
36  |  | #endif  | 
37  |  |  | 
38  |  | #ifndef RANDOM_PRIME_VERBOSE  | 
39  |  | #define RANDOM_PRIME_VERBOSE 0  | 
40  |  | #endif  | 
41  |  |  | 
42  |  | #include <assert.h>  | 
43  |  | #include <stdlib.h>  | 
44  |  |  | 
45  |  | #if RANDOM_PRIME_VERBOSE  | 
46  |  | #include <stdio.h>  | 
47  |  | #define VERBOSE(x) (fputs((x), stderr))  | 
48  |  | #else  | 
49  |  | #define VERBOSE(x)  | 
50  |  | #endif  | 
51  |  |  | 
52  |  | #include "bignum.h"  | 
53  |  | #include "hogweed-internal.h"  | 
54  |  | #include "macros.h"  | 
55  |  |  | 
56  |  | /* Use a table of p_2 = 3 to p_{172} = 1021, used for sieving numbers | 
57  |  |    of up to 20 bits. */  | 
58  |  |  | 
59  |  | #define NPRIMES 171  | 
60  | 0  | #define TRIAL_DIV_BITS 20  | 
61  | 0  | #define TRIAL_DIV_MASK ((1 << TRIAL_DIV_BITS) - 1)  | 
62  |  |  | 
63  |  | /* A 20-bit number x is divisible by p iff  | 
64  |  |  | 
65  |  |      ((x * inverse) & TRIAL_DIV_MASK) <= limit  | 
66  |  | */  | 
67  |  | struct trial_div_info { | 
68  |  |   uint32_t inverse; /* p^{-1} (mod 2^20) */ | 
69  |  |   uint32_t limit;   /* floor( (2^20 - 1) / p) */  | 
70  |  | };  | 
71  |  |  | 
72  |  | static const uint16_t  | 
73  |  | primes[NPRIMES] = { | 
74  |  |   3,5,7,11,13,17,19,23,  | 
75  |  |   29,31,37,41,43,47,53,59,  | 
76  |  |   61,67,71,73,79,83,89,97,  | 
77  |  |   101,103,107,109,113,127,131,137,  | 
78  |  |   139,149,151,157,163,167,173,179,  | 
79  |  |   181,191,193,197,199,211,223,227,  | 
80  |  |   229,233,239,241,251,257,263,269,  | 
81  |  |   271,277,281,283,293,307,311,313,  | 
82  |  |   317,331,337,347,349,353,359,367,  | 
83  |  |   373,379,383,389,397,401,409,419,  | 
84  |  |   421,431,433,439,443,449,457,461,  | 
85  |  |   463,467,479,487,491,499,503,509,  | 
86  |  |   521,523,541,547,557,563,569,571,  | 
87  |  |   577,587,593,599,601,607,613,617,  | 
88  |  |   619,631,641,643,647,653,659,661,  | 
89  |  |   673,677,683,691,701,709,719,727,  | 
90  |  |   733,739,743,751,757,761,769,773,  | 
91  |  |   787,797,809,811,821,823,827,829,  | 
92  |  |   839,853,857,859,863,877,881,883,  | 
93  |  |   887,907,911,919,929,937,941,947,  | 
94  |  |   953,967,971,977,983,991,997,1009,  | 
95  |  |   1013,1019,1021,  | 
96  |  | };  | 
97  |  |  | 
98  |  | static const uint32_t  | 
99  |  | prime_square[NPRIMES+1] = { | 
100  |  |   9,25,49,121,169,289,361,529,  | 
101  |  |   841,961,1369,1681,1849,2209,2809,3481,  | 
102  |  |   3721,4489,5041,5329,6241,6889,7921,9409,  | 
103  |  |   10201,10609,11449,11881,12769,16129,17161,18769,  | 
104  |  |   19321,22201,22801,24649,26569,27889,29929,32041,  | 
105  |  |   32761,36481,37249,38809,39601,44521,49729,51529,  | 
106  |  |   52441,54289,57121,58081,63001,66049,69169,72361,  | 
107  |  |   73441,76729,78961,80089,85849,94249,96721,97969,  | 
108  |  |   100489,109561,113569,120409,121801,124609,128881,134689,  | 
109  |  |   139129,143641,146689,151321,157609,160801,167281,175561,  | 
110  |  |   177241,185761,187489,192721,196249,201601,208849,212521,  | 
111  |  |   214369,218089,229441,237169,241081,249001,253009,259081,  | 
112  |  |   271441,273529,292681,299209,310249,316969,323761,326041,  | 
113  |  |   332929,344569,351649,358801,361201,368449,375769,380689,  | 
114  |  |   383161,398161,410881,413449,418609,426409,434281,436921,  | 
115  |  |   452929,458329,466489,477481,491401,502681,516961,528529,  | 
116  |  |   537289,546121,552049,564001,573049,579121,591361,597529,  | 
117  |  |   619369,635209,654481,657721,674041,677329,683929,687241,  | 
118  |  |   703921,727609,734449,737881,744769,769129,776161,779689,  | 
119  |  |   786769,822649,829921,844561,863041,877969,885481,896809,  | 
120  |  |   908209,935089,942841,954529,966289,982081,994009,1018081,  | 
121  |  |   1026169,1038361,1042441,1L<<20  | 
122  |  | };  | 
123  |  |  | 
124  |  | static const struct trial_div_info  | 
125  |  | trial_div_table[NPRIMES] = { | 
126  |  |   {699051,349525},{838861,209715},{748983,149796},{953251,95325}, | 
127  |  |   {806597,80659},{61681,61680},{772635,55188},{866215,45590}, | 
128  |  |   {180789,36157},{1014751,33825},{793517,28339},{1023001,25575}, | 
129  |  |   {48771,24385},{870095,22310},{217629,19784},{710899,17772}, | 
130  |  |   {825109,17189},{281707,15650},{502135,14768},{258553,14364}, | 
131  |  |   {464559,13273},{934875,12633},{1001449,11781},{172961,10810}, | 
132  |  |   {176493,10381},{203607,10180},{568387,9799},{788837,9619}, | 
133  |  |   {770193,9279},{1032063,8256},{544299,8004},{619961,7653}, | 
134  |  |   {550691,7543},{182973,7037},{229159,6944},{427445,6678}, | 
135  |  |   {701195,6432},{370455,6278},{90917,6061},{175739,5857}, | 
136  |  |   {585117,5793},{225087,5489},{298817,5433},{228877,5322}, | 
137  |  |   {442615,5269},{546651,4969},{244511,4702},{83147,4619}, | 
138  |  |   {769261,4578},{841561,4500},{732687,4387},{978961,4350}, | 
139  |  |   {133683,4177},{65281,4080},{629943,3986},{374213,3898}, | 
140  |  |   {708079,3869},{280125,3785},{641833,3731},{618771,3705}, | 
141  |  |   {930477,3578},{778747,3415},{623751,3371},{40201,3350}, | 
142  |  |   {122389,3307},{950371,3167},{1042353,3111},{18131,3021}, | 
143  |  |   {285429,3004},{549537,2970},{166487,2920},{294287,2857}, | 
144  |  |   {919261,2811},{636339,2766},{900735,2737},{118605,2695}, | 
145  |  |   {10565,2641},{188273,2614},{115369,2563},{735755,2502}, | 
146  |  |   {458285,2490},{914767,2432},{370513,2421},{1027079,2388}, | 
147  |  |   {629619,2366},{462401,2335},{649337,2294},{316165,2274}, | 
148  |  |   {484655,2264},{65115,2245},{326175,2189},{1016279,2153}, | 
149  |  |   {990915,2135},{556859,2101},{462791,2084},{844629,2060}, | 
150  |  |   {404537,2012},{457123,2004},{577589,1938},{638347,1916}, | 
151  |  |   {892325,1882},{182523,1862},{1002505,1842},{624371,1836}, | 
152  |  |   {69057,1817},{210787,1786},{558769,1768},{395623,1750}, | 
153  |  |   {992745,1744},{317855,1727},{384877,1710},{372185,1699}, | 
154  |  |   {105027,1693},{423751,1661},{408961,1635},{908331,1630}, | 
155  |  |   {74551,1620},{36933,1605},{617371,1591},{506045,1586}, | 
156  |  |   {24929,1558},{529709,1548},{1042435,1535},{31867,1517}, | 
157  |  |   {166037,1495},{928781,1478},{508975,1458},{4327,1442}, | 
158  |  |   {779637,1430},{742091,1418},{258263,1411},{879631,1396}, | 
159  |  |   {72029,1385},{728905,1377},{589057,1363},{348621,1356}, | 
160  |  |   {671515,1332},{710453,1315},{84249,1296},{959363,1292}, | 
161  |  |   {685853,1277},{467591,1274},{646643,1267},{683029,1264}, | 
162  |  |   {439927,1249},{254461,1229},{660713,1223},{554195,1220}, | 
163  |  |   {202911,1215},{753253,1195},{941457,1190},{776635,1187}, | 
164  |  |   {509511,1182},{986147,1156},{768879,1151},{699431,1140}, | 
165  |  |   {696417,1128},{86169,1119},{808997,1114},{25467,1107}, | 
166  |  |   {201353,1100},{708087,1084},{1018339,1079},{341297,1073}, | 
167  |  |   {434151,1066},{96287,1058},{950765,1051},{298257,1039}, | 
168  |  |   {675933,1035},{167731,1029},{815445,1027}, | 
169  |  | };  | 
170  |  |  | 
171  |  | /* Element j gives the index of the first prime of size 3+j bits */  | 
172  |  | static uint8_t  | 
173  |  | prime_by_size[9] = { | 
174  |  |   1,3,5,10,17,30,53,96,171  | 
175  |  | };  | 
176  |  |  | 
177  |  | /* Combined Miller-Rabin test to the base a, and checking the  | 
178  |  |    conditions from Pocklington's theorem, nm1dq holds (n-1)/q, with q  | 
179  |  |    prime. */  | 
180  |  | static int  | 
181  |  | miller_rabin_pocklington(mpz_t n, mpz_t nm1, mpz_t nm1dq, mpz_t a)  | 
182  | 0  | { | 
183  | 0  |   mpz_t r;  | 
184  | 0  |   mpz_t y;  | 
185  | 0  |   int is_prime = 0;  | 
186  |  |  | 
187  |  |   /* Avoid the mp_bitcnt_t type for compatibility with older GMP  | 
188  |  |      versions. */  | 
189  | 0  |   unsigned k;  | 
190  | 0  |   unsigned j;  | 
191  |  | 
  | 
192  | 0  |   VERBOSE("."); | 
193  |  | 
  | 
194  | 0  |   if (mpz_even_p(n) || mpz_cmp_ui(n, 3) < 0)  | 
195  | 0  |     return 0;  | 
196  |  |  | 
197  | 0  |   mpz_init(r);  | 
198  | 0  |   mpz_init(y);  | 
199  |  | 
  | 
200  | 0  |   k = mpz_scan1(nm1, 0);  | 
201  | 0  |   assert(k > 0);  | 
202  |  |  | 
203  | 0  |   mpz_fdiv_q_2exp (r, nm1, k);  | 
204  |  | 
  | 
205  | 0  |   mpz_powm(y, a, r, n);  | 
206  |  | 
  | 
207  | 0  |   if (mpz_cmp_ui(y, 1) == 0 || mpz_cmp(y, nm1) == 0)  | 
208  | 0  |     goto passed_miller_rabin;  | 
209  |  |       | 
210  | 0  |   for (j = 1; j < k; j++)  | 
211  | 0  |     { | 
212  | 0  |       mpz_powm_ui (y, y, 2, n);  | 
213  |  | 
  | 
214  | 0  |       if (mpz_cmp_ui (y, 1) == 0)  | 
215  | 0  |   break;  | 
216  |  |  | 
217  | 0  |       if (mpz_cmp (y, nm1) == 0)  | 
218  | 0  |   { | 
219  | 0  |   passed_miller_rabin:  | 
220  |  |     /* We know that a^{n-1} = 1 (mod n) | 
221  |  |  | 
222  |  |        Remains to check that gcd(a^{(n-1)/q} - 1, n) == 1 */       | 
223  | 0  |     VERBOSE("x"); | 
224  |  | 
  | 
225  | 0  |     mpz_powm(y, a, nm1dq, n);  | 
226  | 0  |     mpz_sub_ui(y, y, 1);  | 
227  | 0  |     mpz_gcd(y, y, n);  | 
228  | 0  |     is_prime = mpz_cmp_ui (y, 1) == 0;  | 
229  | 0  |     VERBOSE(is_prime ? "\n" : "");  | 
230  | 0  |     break;  | 
231  | 0  |   }  | 
232  |  | 
  | 
233  | 0  |     }  | 
234  |  |  | 
235  | 0  |   mpz_clear(r);  | 
236  | 0  |   mpz_clear(y);  | 
237  |  | 
  | 
238  | 0  |   return is_prime;  | 
239  | 0  | }  | 
240  |  |  | 
241  |  | /* The most basic variant of Pocklingtons theorem:  | 
242  |  |  | 
243  |  |    Assume that q^e | (n-1), with q prime. If we can find an a such that  | 
244  |  |  | 
245  |  |      a^{n-1} = 1 (mod n) | 
246  |  |      gcd(a^{(n-1)/q} - 1, n) = 1 | 
247  |  |  | 
248  |  |    then any prime divisor p of n satisfies p = 1 (mod q^e).  | 
249  |  |  | 
250  |  |    Proof (Cohen, 8.3.2): Assume p is a prime factor of n. The central  | 
251  |  |    idea of the proof is to consider the order, modulo p, of a. Denote  | 
252  |  |    this by d.  | 
253  |  |  | 
254  |  |    a^{n-1} = 1 (mod n) implies a^{n-1} = 1 (mod p), hence d | (n-1). | 
255  |  |    Next, the condition gcd(a^{(n-1)/q} - 1, n) = 1 implies that | 
256  |  |    a^{(n-1)/q} != 1, hence d does not divide (n-1)/q. Since q is | 
257  |  |    prime, this means that q^e | d.  | 
258  |  |  | 
259  |  |    Finally, we have a^{p-1} = 1 (mod p), hence d | (p-1). So q^e | d | | 
260  |  |    (p-1), which gives the desired result: p = 1 (mod q^e).  | 
261  |  |  | 
262  |  |  | 
263  |  |    * Variant, slightly stronger than Fact 4.59, HAC:  | 
264  |  |  | 
265  |  |    Assume n = 1 + 2rq, q an odd prime, r <= 2q, and   | 
266  |  |  | 
267  |  |      a^{n-1} = 1 (mod n) | 
268  |  |      gcd(a^{(n-1)/q} - 1, n) = 1 | 
269  |  |  | 
270  |  |    Then n is prime.  | 
271  |  |  | 
272  |  |    Proof: By Pocklington's theorem, any prime factor p satisfies p = 1  | 
273  |  |    (mod q). Neither 1 or q+1 are primes, hence p >= 1 + 2q. If n is  | 
274  |  |    composite, we have n >= (1+2q)^2. But the assumption r <= 2q  | 
275  |  |    implies n <= 1 + 4q^2, a contradiction.  | 
276  |  |  | 
277  |  |    In bits, the requirement is that #n <= 2 #q, then  | 
278  |  |  | 
279  |  |      r = (n-1)/2q < 2^{#n - #q} <= 2^#q = 2 2^{#q-1}< 2 q | 
280  |  |  | 
281  |  |  | 
282  |  |    * Another variant with an extra test (Variant of Fact 4.42, HAC):  | 
283  |  |  | 
284  |  |    Assume n = 1 + 2rq, n odd, q an odd prime, 8 q^3 >= n  | 
285  |  |  | 
286  |  |      a^{n-1} = 1 (mod n) | 
287  |  |      gcd(a^{(n-1)/q} - 1, n) = 1 | 
288  |  |  | 
289  |  |    Also let x = floor(r / 2q), y = r mod 2q,   | 
290  |  |  | 
291  |  |    If y^2 - 4x is not a square, then n is prime.  | 
292  |  |  | 
293  |  |    Proof (adapted from Maurer, Journal of Cryptology, 8 (1995)):  | 
294  |  |  | 
295  |  |    Assume n is composite. There are at most two factors, both odd,  | 
296  |  |  | 
297  |  |      n = (1+2m_1 q)(1+2m_2 q) = 1 + 4 m_1 m_2 q^2 + 2 (m_1 + m_2) q  | 
298  |  |        | 
299  |  |    where we can assume m_1 >= m_2. Then the bound n <= 8 q^3 implies m_1  | 
300  |  |    m_2 < 2q, restricting (m_1, m_2) to the domain 0 < m_2 <  | 
301  |  |    sqrt(2q), 0 < m_1 < 2q / m_2.  | 
302  |  |  | 
303  |  |    We have the bound  | 
304  |  |  | 
305  |  |      m_1 + m_2 < 2q / m_2 + m_2 <= 2q + 1 (maximum value for m_2 = 1)  | 
306  |  |  | 
307  |  |    And the case m_1 = 2q, m_2 = 1 can be excluded, because it gives n  | 
308  |  |    > 8q^3. So in fact, m_1 + m_2 < 2q.  | 
309  |  |  | 
310  |  |    Next, write r = (n-1)/2q = 2 m_1 m_2 q + m_1 + m_2.  | 
311  |  |      | 
312  |  |    If follows that m_1 + m_2 = y and m_1 m_2 = x. m_1 and m_2 are  | 
313  |  |    thus the roots of the equation  | 
314  |  |  | 
315  |  |      m^2 - y m + x = 0  | 
316  |  |  | 
317  |  |    which has integer roots iff y^2 - 4 x is the square of an integer.  | 
318  |  |  | 
319  |  |    In bits, the requirement is that #n <= 3 #q, then  | 
320  |  |  | 
321  |  |      n < 2^#n <= 2^{3 #q} = 8 2^{3 (#q-1)} < 8 q^3 | 
322  |  | */  | 
323  |  |  | 
324  |  | /* Generate a prime number p of size bits with 2 p0q dividing (p-1).  | 
325  |  |    p0 must be of size >= ceil(bits/3). The extra factor q can be  | 
326  |  |    omitted (then p0 and p0q should be equal). If top_bits_set is one,  | 
327  |  |    the topmost two bits are set to one, suitable for RSA primes. Also  | 
328  |  |    returns r = (p-1)/p0q. */  | 
329  |  | void  | 
330  |  | _nettle_generate_pocklington_prime (mpz_t p, mpz_t r,  | 
331  |  |             unsigned bits, int top_bits_set,   | 
332  |  |             void *ctx, nettle_random_func *random,   | 
333  |  |             const mpz_t p0,  | 
334  |  |             const mpz_t q,  | 
335  |  |             const mpz_t p0q)  | 
336  | 0  | { | 
337  | 0  |   mpz_t r_min, r_range, pm1, a, e;  | 
338  | 0  |   int need_square_test;  | 
339  | 0  |   unsigned p0_bits;  | 
340  | 0  |   mpz_t x, y, p04;  | 
341  |  | 
  | 
342  | 0  |   p0_bits = mpz_sizeinbase (p0, 2);  | 
343  |  | 
  | 
344  | 0  |   assert (bits <= 3*p0_bits);  | 
345  | 0  |   assert (bits > p0_bits);  | 
346  |  |  | 
347  | 0  |   need_square_test = (bits > 2 * p0_bits);  | 
348  |  | 
  | 
349  | 0  |   mpz_init (r_min);  | 
350  | 0  |   mpz_init (r_range);  | 
351  | 0  |   mpz_init (pm1);  | 
352  | 0  |   mpz_init (a);  | 
353  |  | 
  | 
354  | 0  |   if (need_square_test)  | 
355  | 0  |     { | 
356  | 0  |       mpz_init (x);  | 
357  | 0  |       mpz_init (y);  | 
358  | 0  |       mpz_init (p04);  | 
359  | 0  |       mpz_mul_2exp (p04, p0, 2);  | 
360  | 0  |     }  | 
361  |  | 
  | 
362  | 0  |   if (q)  | 
363  | 0  |     mpz_init (e);  | 
364  |  | 
  | 
365  | 0  |   if (top_bits_set)  | 
366  | 0  |     { | 
367  |  |       /* i = floor (2^{bits-3} / p0q), then 3I + 3 <= r <= 4I, with I | 
368  |  |    - 2 possible values. */  | 
369  | 0  |       mpz_set_ui (r_min, 1);  | 
370  | 0  |       mpz_mul_2exp (r_min, r_min, bits-3);  | 
371  | 0  |       mpz_fdiv_q (r_min, r_min, p0q);  | 
372  | 0  |       mpz_sub_ui (r_range, r_min, 2);  | 
373  | 0  |       mpz_mul_ui (r_min, r_min, 3);  | 
374  | 0  |       mpz_add_ui (r_min, r_min, 3);  | 
375  | 0  |     }  | 
376  | 0  |   else  | 
377  | 0  |     { | 
378  |  |       /* i = floor (2^{bits-2} / p0q), I + 1 <= r <= 2I */ | 
379  | 0  |       mpz_set_ui (r_range, 1);  | 
380  | 0  |       mpz_mul_2exp (r_range, r_range, bits-2);  | 
381  | 0  |       mpz_fdiv_q (r_range, r_range, p0q);  | 
382  | 0  |       mpz_add_ui (r_min, r_range, 1);  | 
383  | 0  |     }  | 
384  |  | 
  | 
385  | 0  |   for (;;)  | 
386  | 0  |     { | 
387  | 0  |       uint8_t buf[1];  | 
388  |  | 
  | 
389  | 0  |       nettle_mpz_random (r, ctx, random, r_range);  | 
390  | 0  |       mpz_add (r, r, r_min);  | 
391  |  |  | 
392  |  |       /* Set p = 2*r*p0q + 1 */  | 
393  | 0  |       mpz_mul_2exp(r, r, 1);  | 
394  | 0  |       mpz_mul (pm1, r, p0q);  | 
395  | 0  |       mpz_add_ui (p, pm1, 1);  | 
396  |  | 
  | 
397  | 0  |       assert(mpz_sizeinbase(p, 2) == bits);  | 
398  |  |  | 
399  |  |       /* Should use GMP trial division interface when that  | 
400  |  |    materializes, we don't need any testing beyond trial  | 
401  |  |    division. */  | 
402  | 0  |       if (!mpz_probab_prime_p (p, 1))  | 
403  | 0  |   continue;  | 
404  |  |  | 
405  | 0  |       random(ctx, sizeof(buf), buf);  | 
406  |  |       | 
407  | 0  |       mpz_set_ui (a, buf[0] + 2);  | 
408  |  | 
  | 
409  | 0  |       if (q)  | 
410  | 0  |   { | 
411  | 0  |     mpz_mul (e, r, q);  | 
412  | 0  |     if (!miller_rabin_pocklington(p, pm1, e, a))  | 
413  | 0  |       continue;  | 
414  |  |  | 
415  | 0  |     if (need_square_test)  | 
416  | 0  |       { | 
417  |  |         /* Our e corresponds to 2r in the theorem */  | 
418  | 0  |         mpz_tdiv_qr (x, y, e, p04);  | 
419  | 0  |         goto square_test;  | 
420  | 0  |       }  | 
421  | 0  |   }  | 
422  | 0  |       else  | 
423  | 0  |   { | 
424  | 0  |     if (!miller_rabin_pocklington(p, pm1, r, a))  | 
425  | 0  |       continue;  | 
426  | 0  |     if (need_square_test)  | 
427  | 0  |       { | 
428  | 0  |         mpz_tdiv_qr (x, y, r, p04);  | 
429  | 0  |       square_test:  | 
430  |  |         /* We have r' = 2r, x = floor (r/2q) = floor(r'/2q),  | 
431  |  |      and y' = r' - x 4q = 2 (r - x 2q) = 2y.  | 
432  |  |  | 
433  |  |      Then y^2 - 4x is a square iff y'^2 - 16 x is a  | 
434  |  |      square. */  | 
435  |  |        | 
436  | 0  |         mpz_mul (y, y, y);  | 
437  | 0  |         mpz_submul_ui (y, x, 16);  | 
438  | 0  |         if (mpz_perfect_square_p (y))  | 
439  | 0  |     continue;  | 
440  | 0  |       }  | 
441  | 0  |   }  | 
442  |  |  | 
443  |  |       /* If we passed all the tests, we have found a prime. */  | 
444  | 0  |       break;  | 
445  | 0  |     }  | 
446  | 0  |   mpz_clear (r_min);  | 
447  | 0  |   mpz_clear (r_range);  | 
448  | 0  |   mpz_clear (pm1);  | 
449  | 0  |   mpz_clear (a);  | 
450  |  | 
  | 
451  | 0  |   if (need_square_test)  | 
452  | 0  |     { | 
453  | 0  |       mpz_clear (x);  | 
454  | 0  |       mpz_clear (y);  | 
455  | 0  |       mpz_clear (p04);  | 
456  | 0  |     }  | 
457  | 0  |   if (q)  | 
458  | 0  |     mpz_clear (e);  | 
459  | 0  | }  | 
460  |  |  | 
461  |  | /* Generate random prime of a given size. Maurer's algorithm (Alg.  | 
462  |  |    6.42 Handbook of applied cryptography), but with ratio = 1/2 (like  | 
463  |  |    the variant in fips186-3). */  | 
464  |  | void  | 
465  |  | nettle_random_prime(mpz_t p, unsigned bits, int top_bits_set,  | 
466  |  |         void *random_ctx, nettle_random_func *random,  | 
467  |  |         void *progress_ctx, nettle_progress_func *progress)  | 
468  | 0  | { | 
469  | 0  |   assert (bits >= 3);  | 
470  | 0  |   if (bits <= 10)  | 
471  | 0  |     { | 
472  | 0  |       unsigned first;  | 
473  | 0  |       unsigned choices;  | 
474  | 0  |       uint8_t buf;  | 
475  |  | 
  | 
476  | 0  |       assert (!top_bits_set);  | 
477  |  |  | 
478  | 0  |       random (random_ctx, sizeof(buf), &buf);  | 
479  |  | 
  | 
480  | 0  |       first = prime_by_size[bits-3];  | 
481  | 0  |       choices = prime_by_size[bits-2] - first;  | 
482  |  |         | 
483  | 0  |       mpz_set_ui (p, primes[first + buf % choices]);  | 
484  | 0  |     }  | 
485  | 0  |   else if (bits <= 20)  | 
486  | 0  |     { | 
487  | 0  |       unsigned long highbit;  | 
488  | 0  |       uint8_t buf[3];  | 
489  | 0  |       unsigned long x;  | 
490  | 0  |       unsigned j;  | 
491  |  |         | 
492  | 0  |       assert (!top_bits_set);  | 
493  |  |  | 
494  | 0  |       highbit = 1L << (bits - 1);  | 
495  |  | 
  | 
496  | 0  |     again:  | 
497  | 0  |       random (random_ctx, sizeof(buf), buf);  | 
498  | 0  |       x = READ_UINT24(buf);  | 
499  | 0  |       x &= (highbit - 1);  | 
500  | 0  |       x |= highbit | 1;  | 
501  |  | 
  | 
502  | 0  |       for (j = 0; prime_square[j] <= x; j++)  | 
503  | 0  |   { | 
504  | 0  |     unsigned q = x * trial_div_table[j].inverse & TRIAL_DIV_MASK;  | 
505  | 0  |     if (q <= trial_div_table[j].limit)  | 
506  | 0  |       goto again;  | 
507  | 0  |   }  | 
508  | 0  |       mpz_set_ui (p, x);  | 
509  | 0  |     }  | 
510  | 0  |   else  | 
511  | 0  |     { | 
512  | 0  |       mpz_t q, r;  | 
513  |  | 
  | 
514  | 0  |       mpz_init (q);  | 
515  | 0  |       mpz_init (r);  | 
516  |  |  | 
517  |  |      /* Bit size ceil(k/2) + 1, slightly larger than used in Alg. 4.62  | 
518  |  |   in Handbook of Applied Cryptography (which seems to be  | 
519  |  |   incorrect for odd k). */  | 
520  | 0  |       nettle_random_prime (q, (bits+3)/2, 0, random_ctx, random,  | 
521  | 0  |          progress_ctx, progress);  | 
522  |  | 
  | 
523  | 0  |       _nettle_generate_pocklington_prime (p, r, bits, top_bits_set,  | 
524  | 0  |             random_ctx, random,  | 
525  | 0  |             q, NULL, q);  | 
526  |  |         | 
527  | 0  |       if (progress)  | 
528  | 0  |   progress (progress_ctx, 'x');  | 
529  |  | 
  | 
530  | 0  |       mpz_clear (q);  | 
531  | 0  |       mpz_clear (r);  | 
532  | 0  |     }  | 
533  | 0  | }  |