~darkmuggle-deactivatedaccount/ubuntu/quantal/grub2/fix-872244

« back to all changes in this revision

Viewing changes to grub-core/lib/libgcrypt/cipher/primegen.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson, Colin Watson, Evan Broder, Mario Limonciello
  • Date: 2010-11-24 13:59:55 UTC
  • mfrom: (1.17.6 upstream) (17.6.15 experimental)
  • Revision ID: james.westby@ubuntu.com-20101124135955-r6ii5sepayr7jt53
Tags: 1.99~20101124-1ubuntu1
[ Colin Watson ]
* Resynchronise with Debian experimental.  Remaining changes:
  - Adjust for default Ubuntu boot options ("quiet splash").
  - Default to hiding the menu; holding down Shift at boot will show it.
  - Set a monochromatic theme for Ubuntu.
  - Apply Ubuntu GRUB Legacy changes to legacy update-grub script: title,
    recovery mode, quiet option, tweak how memtest86+ is displayed, and
    use UUIDs where appropriate.
  - Fix backslash-escaping in merge_debconf_into_conf.
  - Remove "GNU/Linux" from default distributor string.
  - Add crashkernel= options if kdump and makedumpfile are available.
  - If other operating systems are installed, then automatically unhide
    the menu.  Otherwise, if GRUB_HIDDEN_TIMEOUT is 0, then use keystatus
    if available to check whether Shift is pressed.  If it is, show the
    menu, otherwise boot immediately.  If keystatus is not available, then
    fall back to a short delay interruptible with Escape.
  - Allow Shift to interrupt 'sleep --interruptible'.
  - Don't display introductory message about line editing unless we're
    actually offering a shell prompt.  Don't clear the screen just before
    booting if we never drew the menu in the first place.
  - Remove some verbose messages printed before reading the configuration
    file.
  - Suppress progress messages as the kernel and initrd load for
    non-recovery kernel menu entries.
  - Change prepare_grub_to_access_device to handle filesystems
    loop-mounted on file images.
  - Ignore devices loop-mounted from files in 10_linux.
  - Show the boot menu if the previous boot failed, that is if it failed
    to get to the end of one of the normal runlevels.
  - Don't generate /boot/grub/device.map during grub-install or
    grub-mkconfig by default.
  - Adjust upgrade version checks for Ubuntu.
  - Don't display "GRUB loading" unless Shift is held down.
  - Adjust versions of grub-doc and grub-legacy-doc conflicts to tolerate
    our backport of the grub-doc split.
  - Fix LVM/RAID probing in the absence of /boot/grub/device.map.
  - Look for .mo files in /usr/share/locale-langpack as well, in
    preference.
  - Make sure GRUB_TIMEOUT isn't quoted unnecessarily.
  - Probe all devices in 'grub-probe --target=drive' if
    /boot/grub/device.map is missing.
  - Build-depend on qemu-kvm rather than qemu-system for grub-pc tests.
  - Use qemu rather than qemu-system-i386.
  - Program vesafb on BIOS systems rather than efifb.
  - Add a grub-rescue-efi-amd64 package containing a rescue CD-ROM image
    for EFI-AMD64.
  - On Wubi, don't ask for an install device, but just update wubildr
    using the diverted grub-install.
  - When embedding the core image in a post-MBR gap, check for and avoid
    sectors matching any of a list of known signatures.
  - Disable video_bochs and video_cirrus on PC BIOS systems, as probing
    PCI space seems to break on some systems.
* Downgrade "ACPI shutdown failed" error to a debug message, since it can
  cause spurious test failures.

[ Evan Broder ]
* Enable lua from grub-extras.
* Incorporate the bitop library into lua.
* Add enum_pci function to grub module in lua.
* Switch back to gfxpayload=keep by default, unless the video hardware
  is known to not support it.

[ Mario Limonciello ]
* Built part_msdos and vfat into bootx64.efi (LP: #677758)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* primegen.c - prime number generator
 
2
 * Copyright (C) 1998, 2000, 2001, 2002, 2003
 
3
 *               2004, 2008 Free Software Foundation, Inc.
 
4
 *
 
5
 * This file is part of Libgcrypt.
 
6
 *
 
7
 * Libgcrypt is free software; you can redistribute it and/or modify
 
8
 * it under the terms of the GNU Lesser general Public License as
 
9
 * published by the Free Software Foundation; either version 2.1 of
 
10
 * the License, or (at your option) any later version.
 
11
 *
 
12
 * Libgcrypt is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
 * GNU Lesser General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Lesser General Public
 
18
 * License along with this program; if not, write to the Free Software
 
19
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
20
 */
 
21
 
 
22
#include <config.h>
 
23
 
 
24
#include <stdio.h>
 
25
#include <stdlib.h>
 
26
#include <string.h>
 
27
#include <errno.h>
 
28
 
 
29
#include "g10lib.h"
 
30
#include "mpi.h"
 
31
#include "cipher.h"
 
32
#include "ath.h"
 
33
 
 
34
static gcry_mpi_t gen_prime (unsigned int nbits, int secret, int randomlevel, 
 
35
                             int (*extra_check)(void *, gcry_mpi_t),
 
36
                             void *extra_check_arg);
 
37
static int check_prime( gcry_mpi_t prime, gcry_mpi_t val_2, int rm_rounds,
 
38
                        gcry_prime_check_func_t cb_func, void *cb_arg );
 
39
static int is_prime (gcry_mpi_t n, int steps, unsigned int *count);
 
40
static void m_out_of_n( char *array, int m, int n );
 
41
 
 
42
static void (*progress_cb) (void *,const char*,int,int, int );
 
43
static void *progress_cb_data;
 
44
 
 
45
/* Note: 2 is not included because it can be tested more easily by
 
46
   looking at bit 0. The last entry in this list is marked by a zero */
 
47
static ushort small_prime_numbers[] = {
 
48
    3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
 
49
    47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,
 
50
    103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
 
51
    157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
 
52
    211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
 
53
    269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
 
54
    331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
 
55
    389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
 
56
    449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
 
57
    509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
 
58
    587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
 
59
    643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
 
60
    709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
 
61
    773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
 
62
    853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
 
63
    919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
 
64
    991, 997, 1009, 1013, 1019, 1021, 1031, 1033,
 
65
    1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
 
66
    1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
 
67
    1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213,
 
68
    1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
 
69
    1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
 
70
    1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
 
71
    1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
 
72
    1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
 
73
    1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559,
 
74
    1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609,
 
75
    1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,
 
76
    1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
 
77
    1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
 
78
    1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
 
79
    1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931,
 
80
    1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
 
81
    1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
 
82
    2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111,
 
83
    2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,
 
84
    2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243,
 
85
    2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297,
 
86
    2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
 
87
    2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411,
 
88
    2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,
 
89
    2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
 
90
    2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633,
 
91
    2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
 
92
    2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
 
93
    2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791,
 
94
    2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851,
 
95
    2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917,
 
96
    2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
 
97
    3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061,
 
98
    3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137,
 
99
    3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
 
100
    3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
 
101
    3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
 
102
    3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391,
 
103
    3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467,
 
104
    3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533,
 
105
    3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583,
 
106
    3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
 
107
    3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
 
108
    3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779,
 
109
    3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851,
 
110
    3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917,
 
111
    3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
 
112
    4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049,
 
113
    4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111,
 
114
    4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
 
115
    4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243,
 
116
    4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
 
117
    4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391,
 
118
    4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,
 
119
    4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519,
 
120
    4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597,
 
121
    4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
 
122
    4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
 
123
    4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799,
 
124
    4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889,
 
125
    4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951,
 
126
    4957, 4967, 4969, 4973, 4987, 4993, 4999,
 
127
    0
 
128
};
 
129
static int no_of_small_prime_numbers = DIM (small_prime_numbers) - 1;
 
130
 
 
131
 
 
132
 
 
133
/* An object and a list to build up a global pool of primes.  See
 
134
   save_pool_prime and get_pool_prime. */
 
135
struct primepool_s 
 
136
{
 
137
  struct primepool_s *next;
 
138
  gcry_mpi_t prime;      /* If this is NULL the entry is not used. */
 
139
  unsigned int nbits;
 
140
  gcry_random_level_t randomlevel;
 
141
};
 
142
struct primepool_s *primepool;
 
143
/* Mutex used to protect access to the primepool.  */
 
144
static ath_mutex_t primepool_lock = ATH_MUTEX_INITIALIZER;
 
145
 
 
146
 
 
147
 
 
148
/* Save PRIME which has been generated at RANDOMLEVEL for later
 
149
   use. Needs to be called while primepool_lock is being hold.  Note
 
150
   that PRIME should be considered released after calling this
 
151
   function. */
 
152
static void
 
153
save_pool_prime (gcry_mpi_t prime, gcry_random_level_t randomlevel)
 
154
{
 
155
  struct primepool_s *item, *item2;
 
156
  size_t n;
 
157
 
 
158
  for (n=0, item = primepool; item; item = item->next, n++)
 
159
    if (!item->prime)
 
160
      break;
 
161
  if (!item && n > 100)
 
162
    {
 
163
      /* Remove some of the entries.  Our strategy is removing
 
164
         the last third from the list. */
 
165
      int i;
 
166
      
 
167
      for (i=0, item2 = primepool; item2; item2 = item2->next)
 
168
        {
 
169
          if (i >= n/3*2)
 
170
            {
 
171
              gcry_mpi_release (item2->prime);
 
172
              item2->prime = NULL;
 
173
              if (!item)
 
174
                item = item2;
 
175
            }
 
176
        }
 
177
    }
 
178
  if (!item)
 
179
    {
 
180
      item = gcry_calloc (1, sizeof *item);
 
181
      if (!item)
 
182
        {
 
183
          /* Out of memory.  Silently giving up. */
 
184
          gcry_mpi_release (prime);
 
185
          return; 
 
186
        }
 
187
      item->next = primepool;
 
188
      primepool = item;
 
189
    }
 
190
  item->prime = prime;
 
191
  item->nbits = mpi_get_nbits (prime);
 
192
  item->randomlevel = randomlevel;
 
193
}
 
194
 
 
195
 
 
196
/* Return a prime for the prime pool or NULL if none has been found.
 
197
   The prime needs to match NBITS and randomlevel. This function needs
 
198
   to be called why the primepool_look is being hold. */
 
199
static gcry_mpi_t
 
200
get_pool_prime (unsigned int nbits, gcry_random_level_t randomlevel)
 
201
{
 
202
  struct primepool_s *item;
 
203
 
 
204
  for (item = primepool; item; item = item->next)
 
205
    if (item->prime
 
206
        && item->nbits == nbits && item->randomlevel == randomlevel)
 
207
      {
 
208
        gcry_mpi_t prime = item->prime;
 
209
        item->prime = NULL;
 
210
        gcry_assert (nbits == mpi_get_nbits (prime));
 
211
        return prime;
 
212
      }
 
213
  return NULL;
 
214
}
 
215
 
 
216
 
 
217
 
 
218
 
 
219
 
 
220
 
 
221
void
 
222
_gcry_register_primegen_progress ( void (*cb)(void *,const char*,int,int,int),
 
223
                                   void *cb_data )
 
224
{
 
225
  progress_cb = cb;
 
226
  progress_cb_data = cb_data;
 
227
}
 
228
 
 
229
 
 
230
static void
 
231
progress( int c )
 
232
{
 
233
  if ( progress_cb )
 
234
    progress_cb ( progress_cb_data, "primegen", c, 0, 0 );
 
235
}
 
236
 
 
237
 
 
238
/****************
 
239
 * Generate a prime number (stored in secure memory)
 
240
 */
 
241
gcry_mpi_t
 
242
_gcry_generate_secret_prime (unsigned int nbits,
 
243
                             gcry_random_level_t random_level,
 
244
                             int (*extra_check)(void*, gcry_mpi_t),
 
245
                             void *extra_check_arg)
 
246
{
 
247
  gcry_mpi_t prime;
 
248
 
 
249
  prime = gen_prime (nbits, 1, random_level, extra_check, extra_check_arg);
 
250
  progress('\n');
 
251
  return prime;
 
252
}
 
253
 
 
254
 
 
255
/* Generate a prime number which may be public, i.e. not allocated in
 
256
   secure memory.  */
 
257
gcry_mpi_t
 
258
_gcry_generate_public_prime (unsigned int nbits,
 
259
                             gcry_random_level_t random_level,
 
260
                             int (*extra_check)(void*, gcry_mpi_t),
 
261
                             void *extra_check_arg)
 
262
{
 
263
  gcry_mpi_t prime;
 
264
 
 
265
  prime = gen_prime (nbits, 0, random_level, extra_check, extra_check_arg);
 
266
  progress('\n');
 
267
  return prime;
 
268
}
 
269
 
 
270
 
 
271
/* Core prime generation function.  The algorithm used to generate
 
272
   practically save primes is due to Lim and Lee as described in the
 
273
   CRYPTO '97 proceedings (ISBN3540633847) page 260.
 
274
 
 
275
   NEED_Q_FACTOR: If true make sure that at least one factor is of
 
276
                  size qbits.  This is for example required for DSA.
 
277
   PRIME_GENERATED: Adresss of a variable where the resulting prime
 
278
                    number will be stored.
 
279
   PBITS: Requested size of the prime number.  At least 48.
 
280
   QBITS: One factor of the prime needs to be of this size.  Maybe 0
 
281
          if this is not required.  See also MODE.
 
282
   G: If not NULL an MPI which will receive a generator for the prime
 
283
      for use with Elgamal.
 
284
   RET_FACTORS: if not NULL, an array with all factors are stored at
 
285
                that address.
 
286
   ALL_FACTORS: If set to true all factors of prime-1 are returned.
 
287
   RANDOMLEVEL:  How strong should the random numers be.
 
288
   FLAGS: Prime generation bit flags. Currently supported:
 
289
          GCRY_PRIME_FLAG_SECRET - The prime needs to be kept secret.
 
290
   CB_FUNC, CB_ARG:  Callback to be used for extra checks.
 
291
 
 
292
 */
 
293
static gcry_err_code_t
 
294
prime_generate_internal (int need_q_factor,
 
295
                         gcry_mpi_t *prime_generated, unsigned int pbits,
 
296
                         unsigned int qbits, gcry_mpi_t g,
 
297
                         gcry_mpi_t **ret_factors,
 
298
                         gcry_random_level_t randomlevel, unsigned int flags,
 
299
                         int all_factors,
 
300
                         gcry_prime_check_func_t cb_func, void *cb_arg)
 
301
{
 
302
  gcry_err_code_t err = 0;
 
303
  gcry_mpi_t *factors_new = NULL; /* Factors to return to the
 
304
                                     caller.  */
 
305
  gcry_mpi_t *factors = NULL;   /* Current factors.  */
 
306
  gcry_random_level_t poolrandomlevel; /* Random level used for pool primes. */
 
307
  gcry_mpi_t *pool = NULL;      /* Pool of primes.  */
 
308
  int *pool_in_use = NULL;      /* Array with currently used POOL elements. */
 
309
  unsigned char *perms = NULL;  /* Permutations of POOL.  */
 
310
  gcry_mpi_t q_factor = NULL;   /* Used if QBITS is non-zero.  */
 
311
  unsigned int fbits = 0;       /* Length of prime factors.  */
 
312
  unsigned int n = 0;           /* Number of factors.  */
 
313
  unsigned int m = 0;           /* Number of primes in pool.  */
 
314
  gcry_mpi_t q = NULL;          /* First prime factor.  */
 
315
  gcry_mpi_t prime = NULL;      /* Prime candidate.  */
 
316
  unsigned int nprime = 0;      /* Bits of PRIME.  */
 
317
  unsigned int req_qbits;       /* The original QBITS value.  */
 
318
  gcry_mpi_t val_2;             /* For check_prime().  */
 
319
  int is_locked = 0;            /* Flag to help unlocking the primepool. */
 
320
  unsigned int is_secret = (flags & GCRY_PRIME_FLAG_SECRET);
 
321
  unsigned int count1 = 0, count2 = 0;
 
322
  unsigned int i = 0, j = 0;
 
323
 
 
324
  if (pbits < 48)
 
325
    return GPG_ERR_INV_ARG;
 
326
 
 
327
  /* We won't use a too strong random elvel for the pooled subprimes. */
 
328
  poolrandomlevel = (randomlevel > GCRY_STRONG_RANDOM?
 
329
                     GCRY_STRONG_RANDOM : randomlevel);
 
330
 
 
331
 
 
332
  /* If QBITS is not given, assume a reasonable value. */
 
333
  if (!qbits)
 
334
    qbits = pbits / 3;
 
335
 
 
336
  req_qbits = qbits;
 
337
 
 
338
  /* Find number of needed prime factors N.  */
 
339
  for (n = 1; (pbits - qbits - 1) / n  >= qbits; n++)
 
340
    ;
 
341
  n--;
 
342
 
 
343
  val_2 = mpi_alloc_set_ui (2);
 
344
 
 
345
  if ((! n) || ((need_q_factor) && (n < 2)))
 
346
    {
 
347
      err = GPG_ERR_INV_ARG;
 
348
      goto leave;
 
349
    }
 
350
 
 
351
  if (need_q_factor)
 
352
    {
 
353
      n--;  /* Need one factor less because we want a specific Q-FACTOR. */
 
354
      fbits = (pbits - 2 * req_qbits -1) / n;
 
355
      qbits =  pbits - req_qbits - n * fbits;
 
356
    }
 
357
  else
 
358
    {
 
359
      fbits = (pbits - req_qbits -1) / n;
 
360
      qbits = pbits - n * fbits;
 
361
    }
 
362
  
 
363
  if (DBG_CIPHER)
 
364
    log_debug ("gen prime: pbits=%u qbits=%u fbits=%u/%u n=%d\n",
 
365
               pbits, req_qbits, qbits, fbits, n);
 
366
 
 
367
  /* Allocate an integer to old the new prime. */
 
368
  prime = gcry_mpi_new (pbits);
 
369
 
 
370
  /* Generate first prime factor.  */
 
371
  q = gen_prime (qbits, is_secret, randomlevel, NULL, NULL);
 
372
 
 
373
  /* Generate a specific Q-Factor if requested. */
 
374
  if (need_q_factor)
 
375
    q_factor = gen_prime (req_qbits, is_secret, randomlevel, NULL, NULL);
 
376
  
 
377
  /* Allocate an array to hold all factors + 2 for later usage.  */
 
378
  factors = gcry_calloc (n + 2, sizeof (*factors));
 
379
  if (!factors)
 
380
    {
 
381
      err = gpg_err_code_from_errno (errno);
 
382
      goto leave;
 
383
    }
 
384
 
 
385
  /* Allocate an array to track pool usage. */
 
386
  pool_in_use = gcry_malloc (n * sizeof *pool_in_use);
 
387
  if (!pool_in_use)
 
388
    {
 
389
      err = gpg_err_code_from_errno (errno);
 
390
      goto leave;
 
391
    }
 
392
  for (i=0; i < n; i++)
 
393
    pool_in_use[i] = -1;
 
394
      
 
395
  /* Make a pool of 3n+5 primes (this is an arbitrary value).  We
 
396
     require at least 30 primes for are useful selection process. 
 
397
     
 
398
     Fixme: We need to research the best formula for sizing the pool.
 
399
  */
 
400
  m = n * 3 + 5;
 
401
  if (need_q_factor) /* Need some more in this case. */
 
402
    m += 5;
 
403
  if (m < 30)
 
404
    m = 30;
 
405
  pool = gcry_calloc (m , sizeof (*pool));
 
406
  if (! pool)
 
407
    {
 
408
      err = gpg_err_code_from_errno (errno);
 
409
      goto leave;
 
410
    }
 
411
 
 
412
  /* Permutate over the pool of primes until we find a prime of the
 
413
     requested length.  */
 
414
  do
 
415
    {
 
416
    next_try:
 
417
      for (i=0; i < n; i++)
 
418
        pool_in_use[i] = -1;
 
419
 
 
420
      if (!perms)
 
421
        {
 
422
          /* Allocate new primes.  This is done right at the beginning
 
423
             of the loop and if we have later run out of primes. */
 
424
          for (i = 0; i < m; i++)
 
425
            {
 
426
              mpi_free (pool[i]);
 
427
              pool[i] = NULL;
 
428
            }
 
429
 
 
430
          /* Init m_out_of_n().  */
 
431
          perms = gcry_calloc (1, m);
 
432
          if (!perms)
 
433
            {
 
434
              err = gpg_err_code_from_errno (errno);
 
435
              goto leave;
 
436
            }
 
437
 
 
438
          if (ath_mutex_lock (&primepool_lock))
 
439
            {
 
440
              err = GPG_ERR_INTERNAL;
 
441
              goto leave;
 
442
            }
 
443
          is_locked = 1;
 
444
          for (i = 0; i < n; i++)
 
445
            {
 
446
              perms[i] = 1; 
 
447
              /* At a maximum we use strong random for the factors.
 
448
                 This saves us a lot of entropy. Given that Q and
 
449
                 possible Q-factor are also used in the final prime
 
450
                 this should be acceptable.  We also don't allocate in
 
451
                 secure memory to save on that scare resource too.  If
 
452
                 Q has been allocated in secure memory, the final
 
453
                 prime will be saved there anyway.  This is because
 
454
                 our MPI routines take care of that.  GnuPG has worked
 
455
                 this way ever since.  */
 
456
              pool[i] = NULL;
 
457
              if (is_locked)
 
458
                {
 
459
                  pool[i] = get_pool_prime (fbits, poolrandomlevel);
 
460
                  if (!pool[i])
 
461
                    {
 
462
                      if (ath_mutex_unlock (&primepool_lock))
 
463
                        {
 
464
                          err = GPG_ERR_INTERNAL;
 
465
                          goto leave;
 
466
                        }
 
467
                      is_locked = 0;
 
468
                    }
 
469
                }
 
470
              if (!pool[i])
 
471
                pool[i] = gen_prime (fbits, 0, poolrandomlevel, NULL, NULL);
 
472
              pool_in_use[i] = i;
 
473
              factors[i] = pool[i];
 
474
            }
 
475
          if (is_locked && ath_mutex_unlock (&primepool_lock))
 
476
            {
 
477
              err = GPG_ERR_INTERNAL;
 
478
              goto leave;
 
479
            }
 
480
          is_locked = 0;
 
481
        }
 
482
      else
 
483
        {
 
484
          /* Get next permutation. */
 
485
          m_out_of_n ( (char*)perms, n, m);
 
486
          if (ath_mutex_lock (&primepool_lock))
 
487
            {
 
488
              err = GPG_ERR_INTERNAL;
 
489
              goto leave;
 
490
            }
 
491
          is_locked = 1;
 
492
          for (i = j = 0; (i < m) && (j < n); i++)
 
493
            if (perms[i])
 
494
              {
 
495
                /* If the subprime has not yet beed generated do it now. */
 
496
                if (!pool[i] && is_locked)
 
497
                  {
 
498
                    pool[i] = get_pool_prime (fbits, poolrandomlevel);
 
499
                    if (!pool[i])
 
500
                      {
 
501
                        if (ath_mutex_unlock (&primepool_lock))
 
502
                          {
 
503
                            err = GPG_ERR_INTERNAL;
 
504
                            goto leave;
 
505
                          }
 
506
                        is_locked = 0;
 
507
                      }
 
508
                  }
 
509
                if (!pool[i])
 
510
                  pool[i] = gen_prime (fbits, 0, poolrandomlevel, NULL, NULL);
 
511
                pool_in_use[j] = i;
 
512
                factors[j++] = pool[i];
 
513
              }
 
514
          if (is_locked && ath_mutex_unlock (&primepool_lock))
 
515
            {
 
516
              err = GPG_ERR_INTERNAL;
 
517
              goto leave;
 
518
            }
 
519
          is_locked = 0;
 
520
          if (i == n)
 
521
            {
 
522
              /* Ran out of permutations: Allocate new primes.  */
 
523
              gcry_free (perms);
 
524
              perms = NULL;
 
525
              progress ('!');
 
526
              goto next_try;    
 
527
            }
 
528
        }
 
529
 
 
530
        /* Generate next prime candidate:
 
531
           p = 2 * q [ * q_factor] * factor_0 * factor_1 * ... * factor_n + 1. 
 
532
         */
 
533
        mpi_set (prime, q);
 
534
        mpi_mul_ui (prime, prime, 2);
 
535
        if (need_q_factor)
 
536
          mpi_mul (prime, prime, q_factor);
 
537
        for(i = 0; i < n; i++)
 
538
          mpi_mul (prime, prime, factors[i]);
 
539
        mpi_add_ui (prime, prime, 1);
 
540
        nprime = mpi_get_nbits (prime);
 
541
 
 
542
        if (nprime < pbits)
 
543
          {
 
544
            if (++count1 > 20)
 
545
              {
 
546
                count1 = 0;
 
547
                qbits++;
 
548
                progress('>');
 
549
                mpi_free (q);
 
550
                q = gen_prime (qbits, is_secret, randomlevel, NULL, NULL);
 
551
                goto next_try;
 
552
              }
 
553
          }
 
554
        else
 
555
          count1 = 0;
 
556
        
 
557
        if (nprime > pbits)
 
558
          {
 
559
            if (++count2 > 20)
 
560
              {
 
561
                count2 = 0;
 
562
                qbits--;
 
563
                progress('<');
 
564
                mpi_free (q);
 
565
                q = gen_prime (qbits, is_secret, randomlevel, NULL, NULL);
 
566
                goto next_try;
 
567
              }
 
568
          }
 
569
        else
 
570
          count2 = 0;
 
571
    }
 
572
  while (! ((nprime == pbits) && check_prime (prime, val_2, 5,
 
573
                                              cb_func, cb_arg)));
 
574
 
 
575
  if (DBG_CIPHER)
 
576
    {
 
577
      progress ('\n');
 
578
      log_mpidump ("prime    : ", prime);
 
579
      log_mpidump ("factor  q: ", q);
 
580
      if (need_q_factor)
 
581
        log_mpidump ("factor q0: ", q_factor);
 
582
      for (i = 0; i < n; i++)
 
583
        log_mpidump ("factor pi: ", factors[i]);
 
584
      log_debug ("bit sizes: prime=%u, q=%u",
 
585
                 mpi_get_nbits (prime), mpi_get_nbits (q));
 
586
      if (need_q_factor)
 
587
        log_debug (", q0=%u", mpi_get_nbits (q_factor));
 
588
      for (i = 0; i < n; i++)
 
589
        log_debug (", p%d=%u", i, mpi_get_nbits (factors[i]));
 
590
      progress('\n');
 
591
    }
 
592
 
 
593
  if (ret_factors)
 
594
    {
 
595
      /* Caller wants the factors.  */
 
596
      factors_new = gcry_calloc (n + 4, sizeof (*factors_new));
 
597
      if (! factors_new)
 
598
        {
 
599
          err = gpg_err_code_from_errno (errno);
 
600
          goto leave;
 
601
        }
 
602
 
 
603
      if (all_factors)
 
604
        {
 
605
          i = 0;
 
606
          factors_new[i++] = gcry_mpi_set_ui (NULL, 2);
 
607
          factors_new[i++] = mpi_copy (q);
 
608
          if (need_q_factor)
 
609
            factors_new[i++] = mpi_copy (q_factor);
 
610
          for(j=0; j < n; j++)
 
611
            factors_new[i++] = mpi_copy (factors[j]);
 
612
        }
 
613
      else
 
614
        {
 
615
          i = 0;
 
616
          if (need_q_factor)
 
617
            {
 
618
              factors_new[i++] = mpi_copy (q_factor);
 
619
              for (; i <= n; i++)
 
620
                factors_new[i] = mpi_copy (factors[i]);
 
621
            }
 
622
          else
 
623
            for (; i < n; i++ )
 
624
              factors_new[i] = mpi_copy (factors[i]);
 
625
        }
 
626
    }
 
627
  
 
628
  if (g)
 
629
    {
 
630
      /* Create a generator (start with 3).  */
 
631
      gcry_mpi_t tmp = mpi_alloc (mpi_get_nlimbs (prime));
 
632
      gcry_mpi_t b = mpi_alloc (mpi_get_nlimbs (prime));
 
633
      gcry_mpi_t pmin1 = mpi_alloc (mpi_get_nlimbs (prime));
 
634
      
 
635
      if (need_q_factor)
 
636
        err = GPG_ERR_NOT_IMPLEMENTED;
 
637
      else
 
638
        {
 
639
          factors[n] = q;
 
640
          factors[n + 1] = mpi_alloc_set_ui (2);
 
641
          mpi_sub_ui (pmin1, prime, 1);
 
642
          mpi_set_ui (g, 2);
 
643
          do
 
644
            {
 
645
              mpi_add_ui (g, g, 1);
 
646
              if (DBG_CIPHER)
 
647
                {
 
648
                  log_debug ("checking g:");
 
649
                  gcry_mpi_dump (g);
 
650
                  log_printf ("\n");
 
651
                }
 
652
              else
 
653
                progress('^');
 
654
              for (i = 0; i < n + 2; i++)
 
655
                {
 
656
                  mpi_fdiv_q (tmp, pmin1, factors[i]);
 
657
                  /* No mpi_pow(), but it is okay to use this with mod
 
658
                     prime.  */
 
659
                  gcry_mpi_powm (b, g, tmp, prime);
 
660
                  if (! mpi_cmp_ui (b, 1))
 
661
                    break;
 
662
                }
 
663
              if (DBG_CIPHER)
 
664
                progress('\n');
 
665
            } 
 
666
          while (i < n + 2);
 
667
 
 
668
          mpi_free (factors[n+1]);
 
669
          mpi_free (tmp);
 
670
          mpi_free (b);
 
671
          mpi_free (pmin1);
 
672
        }
 
673
    }
 
674
  
 
675
  if (! DBG_CIPHER)
 
676
    progress ('\n');
 
677
 
 
678
 
 
679
 leave:
 
680
  if (pool)
 
681
    {
 
682
      is_locked = !ath_mutex_lock (&primepool_lock);
 
683
      for(i = 0; i < m; i++)
 
684
        {
 
685
          if (pool[i])
 
686
            {
 
687
              for (j=0; j < n; j++)
 
688
                if (pool_in_use[j] == i)
 
689
                  break;
 
690
              if (j == n && is_locked)
 
691
                {
 
692
                  /* This pooled subprime has not been used. */
 
693
                  save_pool_prime (pool[i], poolrandomlevel);
 
694
                }
 
695
              else
 
696
                mpi_free (pool[i]);
 
697
            }
 
698
        }
 
699
      if (is_locked && ath_mutex_unlock (&primepool_lock))
 
700
        err = GPG_ERR_INTERNAL;
 
701
      is_locked = 0;
 
702
      gcry_free (pool);
 
703
    }
 
704
  gcry_free (pool_in_use);
 
705
  if (factors)
 
706
    gcry_free (factors);  /* Factors are shallow copies.  */
 
707
  if (perms)
 
708
    gcry_free (perms);
 
709
 
 
710
  mpi_free (val_2);
 
711
  mpi_free (q);
 
712
  mpi_free (q_factor);
 
713
 
 
714
  if (! err)
 
715
    {
 
716
      *prime_generated = prime;
 
717
      if (ret_factors)
 
718
        *ret_factors = factors_new;
 
719
    }
 
720
  else
 
721
    {
 
722
      if (factors_new)
 
723
        {
 
724
          for (i = 0; factors_new[i]; i++)
 
725
            mpi_free (factors_new[i]);
 
726
          gcry_free (factors_new);
 
727
        }
 
728
      mpi_free (prime);
 
729
    }
 
730
 
 
731
  return err;
 
732
}
 
733
 
 
734
 
 
735
/* Generate a prime used for discrete logarithm algorithms; i.e. this
 
736
   prime will be public and no strong random is required.  */
 
737
gcry_mpi_t
 
738
_gcry_generate_elg_prime (int mode, unsigned pbits, unsigned qbits,
 
739
                          gcry_mpi_t g, gcry_mpi_t **ret_factors)
 
740
{
 
741
  gcry_err_code_t err = GPG_ERR_NO_ERROR;
 
742
  gcry_mpi_t prime = NULL;
 
743
  
 
744
  err = prime_generate_internal ((mode == 1), &prime, pbits, qbits, g,
 
745
                                 ret_factors, GCRY_WEAK_RANDOM, 0, 0,
 
746
                                 NULL, NULL);
 
747
 
 
748
  return prime;
 
749
}
 
750
 
 
751
 
 
752
static gcry_mpi_t
 
753
gen_prime (unsigned int nbits, int secret, int randomlevel, 
 
754
           int (*extra_check)(void *, gcry_mpi_t), void *extra_check_arg)
 
755
{
 
756
  gcry_mpi_t prime, ptest, pminus1, val_2, val_3, result;
 
757
  int i;
 
758
  unsigned int x, step;
 
759
  unsigned int count1, count2;
 
760
  int *mods;
 
761
  
 
762
/*   if (  DBG_CIPHER ) */
 
763
/*     log_debug ("generate a prime of %u bits ", nbits ); */
 
764
 
 
765
  if (nbits < 16)
 
766
    log_fatal ("can't generate a prime with less than %d bits\n", 16);
 
767
 
 
768
  mods = gcry_xmalloc( no_of_small_prime_numbers * sizeof *mods );
 
769
  /* Make nbits fit into gcry_mpi_t implementation. */
 
770
  val_2  = mpi_alloc_set_ui( 2 );
 
771
  val_3 = mpi_alloc_set_ui( 3);
 
772
  prime  = secret? gcry_mpi_snew ( nbits ): gcry_mpi_new ( nbits );
 
773
  result = mpi_alloc_like( prime );
 
774
  pminus1= mpi_alloc_like( prime );
 
775
  ptest  = mpi_alloc_like( prime );
 
776
  count1 = count2 = 0;
 
777
  for (;;)
 
778
    {  /* try forvever */
 
779
      int dotcount=0;
 
780
      
 
781
      /* generate a random number */
 
782
      gcry_mpi_randomize( prime, nbits, randomlevel );
 
783
      
 
784
      /* Set high order bit to 1, set low order bit to 1.  If we are
 
785
         generating a secret prime we are most probably doing that
 
786
         for RSA, to make sure that the modulus does have the
 
787
         requested key size we set the 2 high order bits. */
 
788
      mpi_set_highbit (prime, nbits-1);
 
789
      if (secret)
 
790
        mpi_set_bit (prime, nbits-2);
 
791
      mpi_set_bit(prime, 0);
 
792
      
 
793
      /* Calculate all remainders. */
 
794
      for (i=0; (x = small_prime_numbers[i]); i++ )
 
795
        mods[i] = mpi_fdiv_r_ui(NULL, prime, x);
 
796
      
 
797
      /* Now try some primes starting with prime. */
 
798
      for(step=0; step < 20000; step += 2 ) 
 
799
        {
 
800
          /* Check against all the small primes we have in mods. */
 
801
          count1++;
 
802
          for (i=0; (x = small_prime_numbers[i]); i++ ) 
 
803
            {
 
804
              while ( mods[i] + step >= x )
 
805
                mods[i] -= x;
 
806
              if ( !(mods[i] + step) )
 
807
                break;
 
808
            }
 
809
          if ( x )
 
810
            continue;   /* Found a multiple of an already known prime. */
 
811
          
 
812
          mpi_add_ui( ptest, prime, step );
 
813
 
 
814
          /* Do a fast Fermat test now. */
 
815
          count2++;
 
816
          mpi_sub_ui( pminus1, ptest, 1);
 
817
          gcry_mpi_powm( result, val_2, pminus1, ptest );
 
818
          if ( !mpi_cmp_ui( result, 1 ) )
 
819
            { 
 
820
              /* Not composite, perform stronger tests */
 
821
              if (is_prime(ptest, 5, &count2 ))
 
822
                {
 
823
                  if (!mpi_test_bit( ptest, nbits-1-secret ))
 
824
                    {
 
825
                      progress('\n');
 
826
                      log_debug ("overflow in prime generation\n");
 
827
                      break; /* Stop loop, continue with a new prime. */
 
828
                    }
 
829
 
 
830
                  if (extra_check && extra_check (extra_check_arg, ptest))
 
831
                    { 
 
832
                      /* The extra check told us that this prime is
 
833
                         not of the caller's taste. */
 
834
                      progress ('/');
 
835
                    }
 
836
                  else
 
837
                    { 
 
838
                      /* Got it. */
 
839
                      mpi_free(val_2);
 
840
                      mpi_free(val_3);
 
841
                      mpi_free(result);
 
842
                      mpi_free(pminus1);
 
843
                      mpi_free(prime);
 
844
                      gcry_free(mods);
 
845
                      return ptest; 
 
846
                    }
 
847
                }
 
848
            }
 
849
          if (++dotcount == 10 )
 
850
            {
 
851
              progress('.');
 
852
              dotcount = 0;
 
853
            }
 
854
        }
 
855
      progress(':'); /* restart with a new random value */
 
856
    }
 
857
}
 
858
 
 
859
/****************
 
860
 * Returns: true if this may be a prime
 
861
 * RM_ROUNDS gives the number of Rabin-Miller tests to run.
 
862
 */
 
863
static int
 
864
check_prime( gcry_mpi_t prime, gcry_mpi_t val_2, int rm_rounds,
 
865
             gcry_prime_check_func_t cb_func, void *cb_arg)
 
866
{
 
867
  int i;
 
868
  unsigned int x;
 
869
  unsigned int count=0;
 
870
 
 
871
  /* Check against small primes. */
 
872
  for (i=0; (x = small_prime_numbers[i]); i++ )
 
873
    {
 
874
      if ( mpi_divisible_ui( prime, x ) )
 
875
        return 0;
 
876
    }
 
877
 
 
878
  /* A quick Fermat test. */
 
879
  {
 
880
    gcry_mpi_t result = mpi_alloc_like( prime );
 
881
    gcry_mpi_t pminus1 = mpi_alloc_like( prime );
 
882
    mpi_sub_ui( pminus1, prime, 1);
 
883
    gcry_mpi_powm( result, val_2, pminus1, prime );
 
884
    mpi_free( pminus1 );
 
885
    if ( mpi_cmp_ui( result, 1 ) )
 
886
      { 
 
887
        /* Is composite. */
 
888
        mpi_free( result );
 
889
        progress('.');
 
890
        return 0;
 
891
      }
 
892
    mpi_free( result );
 
893
  }
 
894
 
 
895
  if (!cb_func || cb_func (cb_arg, GCRY_PRIME_CHECK_AT_MAYBE_PRIME, prime))
 
896
    {
 
897
      /* Perform stronger tests. */
 
898
      if ( is_prime( prime, rm_rounds, &count ) )
 
899
        {
 
900
          if (!cb_func
 
901
              || cb_func (cb_arg, GCRY_PRIME_CHECK_AT_GOT_PRIME, prime))
 
902
            return 1; /* Probably a prime. */
 
903
        }
 
904
    }
 
905
  progress('.');
 
906
  return 0;
 
907
}
 
908
 
 
909
 
 
910
/*
 
911
 * Return true if n is probably a prime
 
912
 */
 
913
static int
 
914
is_prime (gcry_mpi_t n, int steps, unsigned int *count)
 
915
{
 
916
  gcry_mpi_t x = mpi_alloc( mpi_get_nlimbs( n ) );
 
917
  gcry_mpi_t y = mpi_alloc( mpi_get_nlimbs( n ) );
 
918
  gcry_mpi_t z = mpi_alloc( mpi_get_nlimbs( n ) );
 
919
  gcry_mpi_t nminus1 = mpi_alloc( mpi_get_nlimbs( n ) );
 
920
  gcry_mpi_t a2 = mpi_alloc_set_ui( 2 );
 
921
  gcry_mpi_t q;
 
922
  unsigned i, j, k;
 
923
  int rc = 0;
 
924
  unsigned nbits = mpi_get_nbits( n );
 
925
 
 
926
  if (steps < 5) /* Make sure that we do at least 5 rounds. */
 
927
    steps = 5; 
 
928
 
 
929
  mpi_sub_ui( nminus1, n, 1 );
 
930
 
 
931
  /* Find q and k, so that n = 1 + 2^k * q . */
 
932
  q = mpi_copy ( nminus1 );
 
933
  k = mpi_trailing_zeros ( q );
 
934
  mpi_tdiv_q_2exp (q, q, k);
 
935
 
 
936
  for (i=0 ; i < steps; i++ )
 
937
    {
 
938
      ++*count;
 
939
      if( !i )
 
940
        {
 
941
          mpi_set_ui( x, 2 );
 
942
        }
 
943
      else
 
944
        {
 
945
          gcry_mpi_randomize( x, nbits, GCRY_WEAK_RANDOM );
 
946
 
 
947
          /* Make sure that the number is smaller than the prime and
 
948
             keep the randomness of the high bit. */
 
949
          if ( mpi_test_bit ( x, nbits-2) )
 
950
            {
 
951
              mpi_set_highbit ( x, nbits-2); /* Clear all higher bits. */
 
952
            }
 
953
          else
 
954
            {
 
955
              mpi_set_highbit( x, nbits-2 );
 
956
              mpi_clear_bit( x, nbits-2 );
 
957
            }
 
958
          gcry_assert (mpi_cmp (x, nminus1) < 0 && mpi_cmp_ui (x, 1) > 0);
 
959
        }
 
960
      gcry_mpi_powm ( y, x, q, n);
 
961
      if ( mpi_cmp_ui(y, 1) && mpi_cmp( y, nminus1 ) )
 
962
        {
 
963
          for ( j=1; j < k && mpi_cmp( y, nminus1 ); j++ )
 
964
            {
 
965
              gcry_mpi_powm(y, y, a2, n);
 
966
              if( !mpi_cmp_ui( y, 1 ) )
 
967
                goto leave; /* Not a prime. */
 
968
            }
 
969
          if (mpi_cmp( y, nminus1 ) )
 
970
            goto leave; /* Not a prime. */
 
971
        }
 
972
      progress('+');
 
973
    }
 
974
  rc = 1; /* May be a prime. */
 
975
 
 
976
 leave:
 
977
  mpi_free( x );
 
978
  mpi_free( y );
 
979
  mpi_free( z );
 
980
  mpi_free( nminus1 );
 
981
  mpi_free( q );
 
982
  mpi_free( a2 );
 
983
 
 
984
  return rc;
 
985
}
 
986
 
 
987
 
 
988
/* Given ARRAY of size N with M elements set to true produce a
 
989
   modified array with the next permutation of M elements.  Note, that
 
990
   ARRAY is used in a one-bit-per-byte approach.  To detected the last
 
991
   permutation it is useful to intialize the array with the first M
 
992
   element set to true and use this test:
 
993
       m_out_of_n (array, m, n);
 
994
       for (i = j = 0; i < n && j < m; i++)
 
995
         if (array[i])
 
996
           j++;
 
997
       if (j == m)
 
998
         goto ready;
 
999
     
 
1000
   This code is based on the algorithm 452 from the "Collected
 
1001
   Algorithms From ACM, Volume II" by C. N. Liu and D. T. Tang.
 
1002
*/
 
1003
static void
 
1004
m_out_of_n ( char *array, int m, int n )
 
1005
{
 
1006
  int i=0, i1=0, j=0, jp=0,  j1=0, k1=0, k2=0;
 
1007
 
 
1008
  if( !m || m >= n )
 
1009
    return;
 
1010
 
 
1011
  /* Need to handle this simple case separately. */
 
1012
  if( m == 1 )
 
1013
    { 
 
1014
      for (i=0; i < n; i++ )
 
1015
        {
 
1016
          if ( array[i] )
 
1017
            {
 
1018
              array[i++] = 0;
 
1019
              if( i >= n )
 
1020
                i = 0;
 
1021
              array[i] = 1;
 
1022
              return;
 
1023
            }
 
1024
        }
 
1025
      BUG();
 
1026
    }
 
1027
 
 
1028
 
 
1029
  for (j=1; j < n; j++ )
 
1030
    {
 
1031
      if ( array[n-1] == array[n-j-1])
 
1032
        continue;
 
1033
      j1 = j;
 
1034
      break;
 
1035
    }
 
1036
 
 
1037
  if ( (m & 1) )
 
1038
    {
 
1039
      /* M is odd. */
 
1040
      if( array[n-1] )
 
1041
        {
 
1042
          if( j1 & 1 )
 
1043
            {
 
1044
              k1 = n - j1;
 
1045
              k2 = k1+2;
 
1046
              if( k2 > n )
 
1047
                k2 = n;
 
1048
              goto leave;
 
1049
            }
 
1050
          goto scan;
 
1051
        }
 
1052
      k2 = n - j1 - 1;
 
1053
      if( k2 == 0 )
 
1054
        {
 
1055
          k1 = i;
 
1056
          k2 = n - j1;
 
1057
        }
 
1058
      else if( array[k2] && array[k2-1] )
 
1059
        k1 = n;
 
1060
      else
 
1061
        k1 = k2 + 1;
 
1062
    }
 
1063
  else 
 
1064
    {
 
1065
      /* M is even. */
 
1066
      if( !array[n-1] )
 
1067
        {
 
1068
          k1 = n - j1;
 
1069
          k2 = k1 + 1;
 
1070
          goto leave;
 
1071
        }
 
1072
        
 
1073
      if( !(j1 & 1) )
 
1074
        {
 
1075
          k1 = n - j1;
 
1076
          k2 = k1+2;
 
1077
          if( k2 > n )
 
1078
            k2 = n;
 
1079
          goto leave;
 
1080
        }
 
1081
    scan:
 
1082
      jp = n - j1 - 1;
 
1083
      for (i=1; i <= jp; i++ ) 
 
1084
        {
 
1085
          i1 = jp + 2 - i;
 
1086
          if( array[i1-1]  )
 
1087
            {
 
1088
              if( array[i1-2] )
 
1089
                {
 
1090
                  k1 = i1 - 1;
 
1091
                  k2 = n - j1;
 
1092
                }
 
1093
              else
 
1094
                {
 
1095
                  k1 = i1 - 1;
 
1096
                  k2 = n + 1 - j1;
 
1097
                }
 
1098
              goto leave;
 
1099
            }
 
1100
        }
 
1101
      k1 = 1;
 
1102
      k2 = n + 1 - m;
 
1103
    }
 
1104
 leave:
 
1105
  /* Now complement the two selected bits. */
 
1106
  array[k1-1] = !array[k1-1];
 
1107
  array[k2-1] = !array[k2-1];
 
1108
}
 
1109
 
 
1110
 
 
1111
/* Generate a new prime number of PRIME_BITS bits and store it in
 
1112
   PRIME.  If FACTOR_BITS is non-zero, one of the prime factors of
 
1113
   (prime - 1) / 2 must be FACTOR_BITS bits long.  If FACTORS is
 
1114
   non-zero, allocate a new, NULL-terminated array holding the prime
 
1115
   factors and store it in FACTORS.  FLAGS might be used to influence
 
1116
   the prime number generation process.  */
 
1117
gcry_error_t
 
1118
gcry_prime_generate (gcry_mpi_t *prime, unsigned int prime_bits,
 
1119
                     unsigned int factor_bits, gcry_mpi_t **factors,
 
1120
                     gcry_prime_check_func_t cb_func, void *cb_arg,
 
1121
                     gcry_random_level_t random_level,
 
1122
                     unsigned int flags)
 
1123
{
 
1124
  gcry_err_code_t err = GPG_ERR_NO_ERROR;
 
1125
  gcry_mpi_t *factors_generated = NULL;
 
1126
  gcry_mpi_t prime_generated = NULL;
 
1127
  unsigned int mode = 0;
 
1128
 
 
1129
  if (!prime)
 
1130
    return gpg_error (GPG_ERR_INV_ARG);
 
1131
  *prime = NULL; 
 
1132
 
 
1133
  if (flags & GCRY_PRIME_FLAG_SPECIAL_FACTOR)
 
1134
    mode = 1;
 
1135
 
 
1136
  /* Generate.  */
 
1137
  err = prime_generate_internal ((mode==1), &prime_generated, prime_bits,
 
1138
                                 factor_bits, NULL,
 
1139
                                 factors? &factors_generated : NULL,
 
1140
                                 random_level, flags, 1,
 
1141
                                 cb_func, cb_arg);
 
1142
 
 
1143
  if (! err)
 
1144
    if (cb_func)
 
1145
      {
 
1146
        /* Additional check. */
 
1147
        if ( !cb_func (cb_arg, GCRY_PRIME_CHECK_AT_FINISH, prime_generated))
 
1148
          {
 
1149
            /* Failed, deallocate resources.  */
 
1150
            unsigned int i;
 
1151
 
 
1152
            mpi_free (prime_generated);
 
1153
            if (factors)
 
1154
              {
 
1155
                for (i = 0; factors_generated[i]; i++)
 
1156
                  mpi_free (factors_generated[i]);
 
1157
                gcry_free (factors_generated);
 
1158
              }
 
1159
            err = GPG_ERR_GENERAL; 
 
1160
          }
 
1161
      }
 
1162
 
 
1163
  if (! err)
 
1164
    {
 
1165
      if (factors)
 
1166
        *factors = factors_generated;
 
1167
      *prime = prime_generated;
 
1168
    }
 
1169
 
 
1170
  return gcry_error (err);
 
1171
}
 
1172
 
 
1173
/* Check wether the number X is prime.  */
 
1174
gcry_error_t
 
1175
gcry_prime_check (gcry_mpi_t x, unsigned int flags)
 
1176
{
 
1177
  gcry_err_code_t err = GPG_ERR_NO_ERROR;
 
1178
  gcry_mpi_t val_2 = mpi_alloc_set_ui (2); /* Used by the Fermat test. */
 
1179
 
 
1180
  (void)flags;
 
1181
 
 
1182
  /* We use 64 rounds because the prime we are going to test is not
 
1183
     guaranteed to be a random one. */
 
1184
  if (! check_prime (x, val_2, 64, NULL, NULL))
 
1185
    err = GPG_ERR_NO_PRIME;
 
1186
 
 
1187
  mpi_free (val_2);
 
1188
 
 
1189
  return gcry_error (err);
 
1190
}
 
1191
 
 
1192
/* Find a generator for PRIME where the factorization of (prime-1) is
 
1193
   in the NULL terminated array FACTORS. Return the generator as a
 
1194
   newly allocated MPI in R_G.  If START_G is not NULL, use this as s
 
1195
   atart for the search. Returns 0 on success.*/
 
1196
gcry_error_t
 
1197
gcry_prime_group_generator (gcry_mpi_t *r_g,
 
1198
                            gcry_mpi_t prime, gcry_mpi_t *factors,
 
1199
                            gcry_mpi_t start_g)
 
1200
{
 
1201
  gcry_mpi_t tmp = gcry_mpi_new (0);
 
1202
  gcry_mpi_t b = gcry_mpi_new (0);
 
1203
  gcry_mpi_t pmin1 = gcry_mpi_new (0);
 
1204
  gcry_mpi_t g = start_g? gcry_mpi_copy (start_g) : gcry_mpi_set_ui (NULL, 3);
 
1205
  int first = 1;
 
1206
  int i, n;
 
1207
 
 
1208
  if (!factors || !r_g || !prime)
 
1209
    return gpg_error (GPG_ERR_INV_ARG);
 
1210
  *r_g = NULL; 
 
1211
 
 
1212
  for (n=0; factors[n]; n++)
 
1213
    ;
 
1214
  if (n < 2)
 
1215
    return gpg_error (GPG_ERR_INV_ARG);
 
1216
 
 
1217
  /* Extra sanity check - usually disabled. */  
 
1218
/*   mpi_set (tmp, factors[0]); */
 
1219
/*   for(i = 1; i < n; i++) */
 
1220
/*     mpi_mul (tmp, tmp, factors[i]); */
 
1221
/*   mpi_add_ui (tmp, tmp, 1); */
 
1222
/*   if (mpi_cmp (prime, tmp)) */
 
1223
/*     return gpg_error (GPG_ERR_INV_ARG); */
 
1224
  
 
1225
  gcry_mpi_sub_ui (pmin1, prime, 1);      
 
1226
  do         
 
1227
    {
 
1228
      if (first)
 
1229
        first = 0;
 
1230
      else
 
1231
        gcry_mpi_add_ui (g, g, 1);
 
1232
      
 
1233
      if (DBG_CIPHER)
 
1234
        {
 
1235
          log_debug ("checking g:");
 
1236
          gcry_mpi_dump (g);
 
1237
          log_debug ("\n");
 
1238
        }
 
1239
      else
 
1240
        progress('^');
 
1241
      
 
1242
      for (i = 0; i < n; i++)
 
1243
        {
 
1244
          mpi_fdiv_q (tmp, pmin1, factors[i]);
 
1245
          gcry_mpi_powm (b, g, tmp, prime);
 
1246
          if (! mpi_cmp_ui (b, 1))
 
1247
            break;
 
1248
        }
 
1249
      if (DBG_CIPHER)
 
1250
        progress('\n');
 
1251
    }
 
1252
  while (i < n);
 
1253
  
 
1254
  gcry_mpi_release (tmp);
 
1255
  gcry_mpi_release (b); 
 
1256
  gcry_mpi_release (pmin1); 
 
1257
  *r_g = g; 
 
1258
 
 
1259
  return 0; 
 
1260
}
 
1261
 
 
1262
/* Convenience function to release the factors array. */
 
1263
void
 
1264
gcry_prime_release_factors (gcry_mpi_t *factors)
 
1265
{
 
1266
  if (factors)
 
1267
    {
 
1268
      int i;
 
1269
      
 
1270
      for (i=0; factors[i]; i++)
 
1271
        mpi_free (factors[i]);
 
1272
      gcry_free (factors);
 
1273
    }
 
1274
}
 
1275
 
 
1276
 
 
1277
 
 
1278
/* Helper for _gcry_derive_x931_prime.  */
 
1279
static gcry_mpi_t
 
1280
find_x931_prime (const gcry_mpi_t pfirst)
 
1281
{
 
1282
  gcry_mpi_t val_2 = mpi_alloc_set_ui (2); 
 
1283
  gcry_mpi_t prime;
 
1284
  
 
1285
  prime = gcry_mpi_copy (pfirst);
 
1286
  /* If P is even add 1.  */ 
 
1287
  mpi_set_bit (prime, 0);
 
1288
 
 
1289
  /* We use 64 Rabin-Miller rounds which is better and thus
 
1290
     sufficient.  We do not have a Lucas test implementaion thus we
 
1291
     can't do it in the X9.31 preferred way of running a few
 
1292
     Rabin-Miller followed by one Lucas test.  */
 
1293
  while ( !check_prime (prime, val_2, 64, NULL, NULL) )
 
1294
    mpi_add_ui (prime, prime, 2);
 
1295
 
 
1296
  mpi_free (val_2);
 
1297
 
 
1298
  return prime;
 
1299
}
 
1300
 
 
1301
 
 
1302
/* Generate a prime using the algorithm from X9.31 appendix B.4. 
 
1303
 
 
1304
   This function requires that the provided public exponent E is odd.
 
1305
   XP, XP1 and XP2 are the seed values.  All values are mandatory.
 
1306
 
 
1307
   On success the prime is returned.  If R_P1 or R_P2 are given the
 
1308
   internal values P1 and P2 are saved at these addresses.  On error
 
1309
   NULL is returned.  */
 
1310
gcry_mpi_t
 
1311
_gcry_derive_x931_prime (const gcry_mpi_t xp, 
 
1312
                         const gcry_mpi_t xp1, const gcry_mpi_t xp2,
 
1313
                         const gcry_mpi_t e,
 
1314
                         gcry_mpi_t *r_p1, gcry_mpi_t *r_p2)
 
1315
{
 
1316
  gcry_mpi_t p1, p2, p1p2, yp0;
 
1317
 
 
1318
  if (!xp || !xp1 || !xp2)
 
1319
    return NULL;
 
1320
  if (!e || !mpi_test_bit (e, 0))
 
1321
    return NULL;  /* We support only odd values for E.  */
 
1322
 
 
1323
  p1 = find_x931_prime (xp1);
 
1324
  p2 = find_x931_prime (xp2);
 
1325
  p1p2 = mpi_alloc_like (xp);
 
1326
  mpi_mul (p1p2, p1, p2);
 
1327
 
 
1328
  {
 
1329
    gcry_mpi_t r1, tmp;
 
1330
  
 
1331
    /* r1 = (p2^{-1} mod p1)p2 - (p1^{-1} mod p2) */
 
1332
    tmp = mpi_alloc_like (p1);
 
1333
    mpi_invm (tmp, p2, p1);
 
1334
    mpi_mul (tmp, tmp, p2);
 
1335
    r1 = tmp;
 
1336
    
 
1337
    tmp = mpi_alloc_like (p2);
 
1338
    mpi_invm (tmp, p1, p2);
 
1339
    mpi_mul (tmp, tmp, p1);
 
1340
    mpi_sub (r1, r1, tmp);
 
1341
 
 
1342
    /* Fixup a negative value.  */
 
1343
    if (mpi_is_neg (r1)) 
 
1344
      mpi_add (r1, r1, p1p2);
 
1345
 
 
1346
    /* yp0 = xp + (r1 - xp mod p1*p2)  */
 
1347
    yp0 = tmp; tmp = NULL;
 
1348
    mpi_subm (yp0, r1, xp, p1p2);
 
1349
    mpi_add (yp0, yp0, xp);
 
1350
    mpi_free (r1);
 
1351
 
 
1352
    /* Fixup a negative value.  */
 
1353
    if (mpi_cmp (yp0, xp) < 0 ) 
 
1354
      mpi_add (yp0, yp0, p1p2);
 
1355
  }
 
1356
 
 
1357
  /* yp0 is now the first integer greater than xp with p1 being a
 
1358
     large prime factor of yp0-1 and p2 a large prime factor of yp0+1.  */
 
1359
 
 
1360
  /* Note that the first example from X9.31 (D.1.1) which uses
 
1361
       (Xq1 #1A5CF72EE770DE50CB09ACCEA9#)
 
1362
       (Xq2 #134E4CAA16D2350A21D775C404#)
 
1363
       (Xq  #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
 
1364
             7C9953388F97DDDC3E1CA19C35CA659EDC2FC325
 
1365
             6D29C2627479C086A699A49C4C9CEE7EF7BD1B34
 
1366
             321DE34A#))))
 
1367
     returns an yp0 of
 
1368
            #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
 
1369
             7C9953388F97DDDC3E1CA19C35CA659EDC2FC4E3
 
1370
             BF20CB896EE37E098A906313271422162CB6C642
 
1371
             75C1201F#
 
1372
     and not
 
1373
            #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
 
1374
             7C9953388F97DDDC3E1CA19C35CA659EDC2FC2E6
 
1375
             C88FE299D52D78BE405A97E01FD71DD7819ECB91
 
1376
             FA85A076#
 
1377
     as stated in the standard.  This seems to be a bug in X9.31.
 
1378
   */
 
1379
 
 
1380
  {
 
1381
    gcry_mpi_t val_2 = mpi_alloc_set_ui (2); 
 
1382
    gcry_mpi_t gcdtmp = mpi_alloc_like (yp0);
 
1383
    int gcdres;
 
1384
  
 
1385
    mpi_sub_ui (p1p2, p1p2, 1); /* Adjust for loop body.  */
 
1386
    mpi_sub_ui (yp0, yp0, 1);   /* Ditto.  */
 
1387
    for (;;)
 
1388
      {
 
1389
        gcdres = gcry_mpi_gcd (gcdtmp, e, yp0);
 
1390
        mpi_add_ui (yp0, yp0, 1);
 
1391
        if (!gcdres)
 
1392
          progress ('/');  /* gcd (e, yp0-1) != 1  */
 
1393
        else if (check_prime (yp0, val_2, 64, NULL, NULL))
 
1394
          break; /* Found.  */
 
1395
        /* We add p1p2-1 because yp0 is incremented after the gcd test.  */
 
1396
        mpi_add (yp0, yp0, p1p2);
 
1397
      }
 
1398
    mpi_free (gcdtmp);
 
1399
    mpi_free (val_2);
 
1400
  }
 
1401
 
 
1402
  mpi_free (p1p2);
 
1403
 
 
1404
  progress('\n');
 
1405
  if (r_p1)
 
1406
    *r_p1 = p1;
 
1407
  else
 
1408
    mpi_free (p1);
 
1409
  if (r_p2)
 
1410
    *r_p2 = p2;
 
1411
  else
 
1412
    mpi_free (p2);
 
1413
  return yp0;
 
1414
}
 
1415
 
 
1416
 
 
1417
 
 
1418
/* Generate the two prime used for DSA using the algorithm specified
 
1419
   in FIPS 186-2.  PBITS is the desired length of the prime P and a
 
1420
   QBITS the length of the prime Q.  If SEED is not supplied and
 
1421
   SEEDLEN is 0 the function generates an appropriate SEED.  On
 
1422
   success the generated primes are stored at R_Q and R_P, the counter
 
1423
   value is stored at R_COUNTER and the seed actually used for
 
1424
   generation is stored at R_SEED and R_SEEDVALUE.  */
 
1425
gpg_err_code_t
 
1426
_gcry_generate_fips186_2_prime (unsigned int pbits, unsigned int qbits,
 
1427
                                const void *seed, size_t seedlen,
 
1428
                                gcry_mpi_t *r_q, gcry_mpi_t *r_p,
 
1429
                                int *r_counter,
 
1430
                                void **r_seed, size_t *r_seedlen)
 
1431
{
 
1432
  gpg_err_code_t ec;
 
1433
  unsigned char seed_help_buffer[160/8];  /* Used to hold a generated SEED. */
 
1434
  unsigned char *seed_plus;     /* Malloced buffer to hold SEED+x.  */
 
1435
  unsigned char digest[160/8];  /* Helper buffer for SHA-1 digest.  */
 
1436
  gcry_mpi_t val_2 = NULL;      /* Helper for the prime test.  */
 
1437
  gcry_mpi_t tmpval = NULL;     /* Helper variable.  */
 
1438
  int i;
 
1439
 
 
1440
  unsigned char value_u[160/8];
 
1441
  int value_n, value_b, value_k;
 
1442
  int counter;
 
1443
  gcry_mpi_t value_w = NULL;
 
1444
  gcry_mpi_t value_x = NULL;
 
1445
  gcry_mpi_t prime_q = NULL;
 
1446
  gcry_mpi_t prime_p = NULL;
 
1447
 
 
1448
  /* FIPS 186-2 allows only for 1024/160 bit.  */
 
1449
  if (pbits != 1024 || qbits != 160)
 
1450
    return GPG_ERR_INV_KEYLEN;
 
1451
 
 
1452
  if (!seed && !seedlen)
 
1453
    ; /* No seed value given:  We are asked to generate it.  */
 
1454
  else if (!seed || seedlen < qbits/8)
 
1455
    return GPG_ERR_INV_ARG;
 
1456
  
 
1457
  /* Allocate a buffer to later compute SEED+some_increment. */
 
1458
  seed_plus = gcry_malloc (seedlen < 20? 20:seedlen);
 
1459
  if (!seed_plus)
 
1460
    {
 
1461
      ec = gpg_err_code_from_syserror ();
 
1462
      goto leave;
 
1463
    }
 
1464
 
 
1465
  val_2   = mpi_alloc_set_ui (2);
 
1466
  value_n = (pbits - 1) / qbits;
 
1467
  value_b = (pbits - 1) - value_n * qbits;
 
1468
  value_w = gcry_mpi_new (pbits);
 
1469
  value_x = gcry_mpi_new (pbits);
 
1470
 
 
1471
 restart:  
 
1472
  /* Generate Q.  */
 
1473
  for (;;)
 
1474
    {
 
1475
      /* Step 1: Generate a (new) seed unless one has been supplied.  */
 
1476
      if (!seed)
 
1477
        {
 
1478
          seedlen = sizeof seed_help_buffer;
 
1479
          gcry_create_nonce (seed_help_buffer, seedlen);
 
1480
          seed = seed_help_buffer;
 
1481
        }
 
1482
      
 
1483
      /* Step 2: U = sha1(seed) ^ sha1((seed+1) mod 2^{qbits})  */
 
1484
      memcpy (seed_plus, seed, seedlen);
 
1485
      for (i=seedlen-1; i >= 0; i--)
 
1486
        {
 
1487
          seed_plus[i]++;
 
1488
          if (seed_plus[i])
 
1489
            break;
 
1490
        }
 
1491
      gcry_md_hash_buffer (GCRY_MD_SHA1, value_u, seed, seedlen);
 
1492
      gcry_md_hash_buffer (GCRY_MD_SHA1, digest, seed_plus, seedlen);
 
1493
      for (i=0; i < sizeof value_u; i++)
 
1494
        value_u[i] ^= digest[i];
 
1495
  
 
1496
      /* Step 3:  Form q from U  */
 
1497
      gcry_mpi_release (prime_q); prime_q = NULL;
 
1498
      ec = gpg_err_code (gcry_mpi_scan (&prime_q, GCRYMPI_FMT_USG, 
 
1499
                                        value_u, sizeof value_u, NULL));
 
1500
      if (ec)
 
1501
        goto leave;
 
1502
      mpi_set_highbit (prime_q, qbits-1 );
 
1503
      mpi_set_bit (prime_q, 0);
 
1504
      
 
1505
      /* Step 4:  Test whether Q is prime using 64 round of Rabin-Miller.  */
 
1506
      if (check_prime (prime_q, val_2, 64, NULL, NULL))
 
1507
        break; /* Yes, Q is prime.  */
 
1508
 
 
1509
      /* Step 5.  */
 
1510
      seed = NULL;  /* Force a new seed at Step 1.  */
 
1511
    }
 
1512
  
 
1513
  /* Step 6.  Note that we do no use an explicit offset but increment
 
1514
     SEED_PLUS accordingly.  SEED_PLUS is currently SEED+1.  */
 
1515
  counter = 0;
 
1516
 
 
1517
  /* Generate P. */
 
1518
  prime_p = gcry_mpi_new (pbits);
 
1519
  for (;;)
 
1520
    {
 
1521
      /* Step 7: For k = 0,...n let 
 
1522
                   V_k = sha1(seed+offset+k) mod 2^{qbits}  
 
1523
         Step 8: W = V_0 + V_1*2^160 + 
 
1524
                         ... 
 
1525
                         + V_{n-1}*2^{(n-1)*160}
 
1526
                         + (V_{n} mod 2^b)*2^{n*160}                
 
1527
       */
 
1528
      mpi_set_ui (value_w, 0);
 
1529
      for (value_k=0; value_k <= value_n; value_k++)
 
1530
        {
 
1531
          /* There is no need to have an explicit offset variable:  In
 
1532
             the first round we shall have an offset of 2, this is
 
1533
             achieved by using SEED_PLUS which is already at SEED+1,
 
1534
             thus we just need to increment it once again.  The
 
1535
             requirement for the next round is to update offset by N,
 
1536
             which we implictly did at the end of this loop, and then
 
1537
             to add one; this one is the same as in the first round.  */
 
1538
          for (i=seedlen-1; i >= 0; i--)
 
1539
            {
 
1540
              seed_plus[i]++;
 
1541
              if (seed_plus[i])
 
1542
                break;
 
1543
            }
 
1544
          gcry_md_hash_buffer (GCRY_MD_SHA1, digest, seed_plus, seedlen);
 
1545
          
 
1546
          gcry_mpi_release (tmpval); tmpval = NULL;
 
1547
          ec = gpg_err_code (gcry_mpi_scan (&tmpval, GCRYMPI_FMT_USG,
 
1548
                                            digest, sizeof digest, NULL));
 
1549
          if (ec)
 
1550
            goto leave;
 
1551
          if (value_k == value_n)
 
1552
            mpi_clear_highbit (tmpval, value_b); /* (V_n mod 2^b) */
 
1553
          mpi_lshift (tmpval, tmpval, value_k*qbits);
 
1554
          mpi_add (value_w, value_w, tmpval);
 
1555
        }
 
1556
 
 
1557
      /* Step 8 continued: X = W + 2^{L-1}  */
 
1558
      mpi_set_ui (value_x, 0);
 
1559
      mpi_set_highbit (value_x, pbits-1);
 
1560
      mpi_add (value_x, value_x, value_w);
 
1561
 
 
1562
      /* Step 9:  c = X mod 2q,  p = X - (c - 1)  */
 
1563
      mpi_mul_2exp (tmpval, prime_q, 1);
 
1564
      mpi_mod (tmpval, value_x, tmpval);
 
1565
      mpi_sub_ui (tmpval, tmpval, 1);
 
1566
      mpi_sub (prime_p, value_x, tmpval);
 
1567
 
 
1568
      /* Step 10: If  p < 2^{L-1}  skip the primality test.  */
 
1569
      /* Step 11 and 12: Primality test.  */
 
1570
      if (mpi_get_nbits (prime_p) >= pbits-1
 
1571
          && check_prime (prime_p, val_2, 64, NULL, NULL) )
 
1572
        break; /* Yes, P is prime, continue with Step 15.  */
 
1573
 
 
1574
      /* Step 13: counter = counter + 1, offset = offset + n + 1. */
 
1575
      counter++;
 
1576
 
 
1577
      /* Step 14: If counter >= 2^12  goto Step 1.  */
 
1578
      if (counter >= 4096)
 
1579
        goto restart;
 
1580
    }
 
1581
 
 
1582
  /* Step 15:  Save p, q, counter and seed.  */
 
1583
/*   log_debug ("fips186-2 pbits p=%u q=%u counter=%d\n", */
 
1584
/*              mpi_get_nbits (prime_p), mpi_get_nbits (prime_q), counter); */
 
1585
/*   log_printhex("fips186-2 seed:", seed, seedlen); */
 
1586
/*   log_mpidump ("fips186-2 prime p", prime_p); */
 
1587
/*   log_mpidump ("fips186-2 prime q", prime_q); */
 
1588
  if (r_q)
 
1589
    {
 
1590
      *r_q = prime_q;
 
1591
      prime_q = NULL;
 
1592
    }
 
1593
  if (r_p)
 
1594
    {
 
1595
      *r_p = prime_p;
 
1596
      prime_p = NULL;
 
1597
    }
 
1598
  if (r_counter)
 
1599
    *r_counter = counter;
 
1600
  if (r_seed && r_seedlen)
 
1601
    {
 
1602
      memcpy (seed_plus, seed, seedlen);
 
1603
      *r_seed = seed_plus;
 
1604
      seed_plus = NULL;
 
1605
      *r_seedlen = seedlen;
 
1606
    }
 
1607
 
 
1608
 
 
1609
 leave:
 
1610
  gcry_mpi_release (tmpval);
 
1611
  gcry_mpi_release (value_x);
 
1612
  gcry_mpi_release (value_w);
 
1613
  gcry_mpi_release (prime_p);
 
1614
  gcry_mpi_release (prime_q);
 
1615
  gcry_free (seed_plus);
 
1616
  gcry_mpi_release (val_2);
 
1617
  return ec;
 
1618
}
 
1619
 
 
1620
 
 
1621
 
 
1622
/* WARNING: The code below has not yet been tested!  However, it is
 
1623
   not yet used.  We need to wait for FIPS 186-3 final and for test
 
1624
   vectors.
 
1625
 
 
1626
   Generate the two prime used for DSA using the algorithm specified
 
1627
   in FIPS 186-3, A.1.1.2.  PBITS is the desired length of the prime P
 
1628
   and a QBITS the length of the prime Q.  If SEED is not supplied and
 
1629
   SEEDLEN is 0 the function generates an appropriate SEED.  On
 
1630
   success the generated primes are stored at R_Q and R_P, the counter
 
1631
   value is stored at R_COUNTER and the seed actually used for
 
1632
   generation is stored at R_SEED and R_SEEDVALUE.  The hash algorithm
 
1633
   used is stored at R_HASHALGO.
 
1634
   
 
1635
   Note that this function is very similar to the fips186_2 code.  Due
 
1636
   to the minor differences, other buffer sizes and for documentarion,
 
1637
   we use a separate function.
 
1638
*/
 
1639
gpg_err_code_t
 
1640
_gcry_generate_fips186_3_prime (unsigned int pbits, unsigned int qbits,
 
1641
                                const void *seed, size_t seedlen,
 
1642
                                gcry_mpi_t *r_q, gcry_mpi_t *r_p,
 
1643
                                int *r_counter,
 
1644
                                void **r_seed, size_t *r_seedlen,
 
1645
                                int *r_hashalgo)
 
1646
{
 
1647
  gpg_err_code_t ec;
 
1648
  unsigned char seed_help_buffer[256/8];  /* Used to hold a generated SEED. */
 
1649
  unsigned char *seed_plus;     /* Malloced buffer to hold SEED+x.  */
 
1650
  unsigned char digest[256/8];  /* Helper buffer for SHA-1 digest.  */
 
1651
  gcry_mpi_t val_2 = NULL;      /* Helper for the prime test.  */
 
1652
  gcry_mpi_t tmpval = NULL;     /* Helper variable.  */
 
1653
  int hashalgo;                 /* The id of the Approved Hash Function.  */
 
1654
  int i;
 
1655
  
 
1656
  unsigned char value_u[256/8];
 
1657
  int value_n, value_b, value_j;
 
1658
  int counter;
 
1659
  gcry_mpi_t value_w = NULL;
 
1660
  gcry_mpi_t value_x = NULL;
 
1661
  gcry_mpi_t prime_q = NULL;
 
1662
  gcry_mpi_t prime_p = NULL;
 
1663
 
 
1664
  gcry_assert (sizeof seed_help_buffer == sizeof digest
 
1665
               && sizeof seed_help_buffer == sizeof value_u);
 
1666
 
 
1667
  /* Step 1:  Check the requested prime lengths.  */
 
1668
  /* Note that due to the size of our buffers QBITS is limited to 256.  */
 
1669
  if (pbits == 1024 && qbits == 160)
 
1670
    hashalgo = GCRY_MD_SHA1;
 
1671
  else if (pbits == 2048 && qbits == 224)
 
1672
    hashalgo = GCRY_MD_SHA224;
 
1673
  else if (pbits == 2048 && qbits == 256)
 
1674
    hashalgo = GCRY_MD_SHA256;
 
1675
  else if (pbits == 3072 && qbits == 256)
 
1676
    hashalgo = GCRY_MD_SHA256;
 
1677
  else
 
1678
    return GPG_ERR_INV_KEYLEN;
 
1679
 
 
1680
  /* Also check that the hash algorithm is available.  */
 
1681
  ec = gpg_err_code (gcry_md_test_algo (hashalgo));
 
1682
  if (ec)
 
1683
    return ec;
 
1684
  gcry_assert (qbits/8 <= sizeof digest);
 
1685
  gcry_assert (gcry_md_get_algo_dlen (hashalgo) == qbits/8);
 
1686
 
 
1687
 
 
1688
  /* Step 2:  Check seedlen.  */
 
1689
  if (!seed && !seedlen)
 
1690
    ; /* No seed value given:  We are asked to generate it.  */
 
1691
  else if (!seed || seedlen < qbits/8)
 
1692
    return GPG_ERR_INV_ARG;
 
1693
  
 
1694
  /* Allocate a buffer to later compute SEED+some_increment and a few
 
1695
     helper variables.  */
 
1696
  seed_plus = gcry_malloc (seedlen < sizeof seed_help_buffer? 
 
1697
                           sizeof seed_help_buffer : seedlen);
 
1698
  if (!seed_plus)
 
1699
    {
 
1700
      ec = gpg_err_code_from_syserror ();
 
1701
      goto leave;
 
1702
    }
 
1703
  val_2   = mpi_alloc_set_ui (2);
 
1704
  value_w = gcry_mpi_new (pbits);
 
1705
  value_x = gcry_mpi_new (pbits);
 
1706
 
 
1707
  /* Step 3: n = \lceil L / outlen \rceil - 1  */
 
1708
  value_n = (pbits + qbits - 1) / qbits - 1;
 
1709
  /* Step 4: b = L - 1 - (n * outlen)  */
 
1710
  value_b = pbits - 1 - (value_n * qbits);
 
1711
 
 
1712
 restart:  
 
1713
  /* Generate Q.  */
 
1714
  for (;;)
 
1715
    {
 
1716
      /* Step 5:  Generate a (new) seed unless one has been supplied.  */
 
1717
      if (!seed)
 
1718
        {
 
1719
          seedlen = qbits/8;
 
1720
          gcry_assert (seedlen <= sizeof seed_help_buffer);
 
1721
          gcry_create_nonce (seed_help_buffer, seedlen);
 
1722
          seed = seed_help_buffer;
 
1723
        }
 
1724
      
 
1725
      /* Step 6:  U = hash(seed)  */
 
1726
      gcry_md_hash_buffer (hashalgo, value_u, seed, seedlen);
 
1727
 
 
1728
      /* Step 7:  q = 2^{N-1} + U + 1 - (U mod 2)  */
 
1729
      if ( !(value_u[qbits/8-1] & 0x01) )
 
1730
        {
 
1731
          for (i=qbits/8-1; i >= 0; i--)
 
1732
            {
 
1733
              value_u[i]++;
 
1734
              if (value_u[i])
 
1735
                break;
 
1736
            }
 
1737
        }
 
1738
      gcry_mpi_release (prime_q); prime_q = NULL;
 
1739
      ec = gpg_err_code (gcry_mpi_scan (&prime_q, GCRYMPI_FMT_USG, 
 
1740
                                        value_u, sizeof value_u, NULL));
 
1741
      if (ec)
 
1742
        goto leave;
 
1743
      mpi_set_highbit (prime_q, qbits-1 );
 
1744
      
 
1745
      /* Step 8:  Test whether Q is prime using 64 round of Rabin-Miller.
 
1746
                  According to table C.1 this is sufficient for all
 
1747
                  supported prime sizes (i.e. up 3072/256).  */
 
1748
      if (check_prime (prime_q, val_2, 64, NULL, NULL))
 
1749
        break; /* Yes, Q is prime.  */
 
1750
 
 
1751
      /* Step 8.  */
 
1752
      seed = NULL;  /* Force a new seed at Step 5.  */
 
1753
    }
 
1754
  
 
1755
  /* Step 11.  Note that we do no use an explicit offset but increment
 
1756
     SEED_PLUS accordingly.  */
 
1757
  memcpy (seed_plus, seed, seedlen);
 
1758
  counter = 0;
 
1759
 
 
1760
  /* Generate P. */
 
1761
  prime_p = gcry_mpi_new (pbits);
 
1762
  for (;;)
 
1763
    {
 
1764
      /* Step 11.1: For j = 0,...n let 
 
1765
                      V_j = hash(seed+offset+j)  
 
1766
         Step 11.2: W = V_0 + V_1*2^outlen + 
 
1767
                            ... 
 
1768
                            + V_{n-1}*2^{(n-1)*outlen}
 
1769
                            + (V_{n} mod 2^b)*2^{n*outlen}                
 
1770
       */
 
1771
      mpi_set_ui (value_w, 0);
 
1772
      for (value_j=0; value_j <= value_n; value_j++)
 
1773
        {
 
1774
          /* There is no need to have an explicit offset variable: In
 
1775
             the first round we shall have an offset of 1 and a j of
 
1776
             0.  This is achieved by incrementing SEED_PLUS here.  For
 
1777
             the next round offset is implicitly updated by using
 
1778
             SEED_PLUS again.  */
 
1779
          for (i=seedlen-1; i >= 0; i--)
 
1780
            {
 
1781
              seed_plus[i]++;
 
1782
              if (seed_plus[i])
 
1783
                break;
 
1784
            }
 
1785
          gcry_md_hash_buffer (GCRY_MD_SHA1, digest, seed_plus, seedlen);
 
1786
          
 
1787
          gcry_mpi_release (tmpval); tmpval = NULL;
 
1788
          ec = gpg_err_code (gcry_mpi_scan (&tmpval, GCRYMPI_FMT_USG,
 
1789
                                            digest, sizeof digest, NULL));
 
1790
          if (ec)
 
1791
            goto leave;
 
1792
          if (value_j == value_n)
 
1793
            mpi_clear_highbit (tmpval, value_b); /* (V_n mod 2^b) */
 
1794
          mpi_lshift (tmpval, tmpval, value_j*qbits);
 
1795
          mpi_add (value_w, value_w, tmpval);
 
1796
        }
 
1797
 
 
1798
      /* Step 11.3: X = W + 2^{L-1}  */
 
1799
      mpi_set_ui (value_x, 0);
 
1800
      mpi_set_highbit (value_x, pbits-1);
 
1801
      mpi_add (value_x, value_x, value_w);
 
1802
 
 
1803
      /* Step 11.4:  c = X mod 2q  */
 
1804
      mpi_mul_2exp (tmpval, prime_q, 1);
 
1805
      mpi_mod (tmpval, value_x, tmpval);
 
1806
 
 
1807
      /* Step 11.5:  p = X - (c - 1)  */
 
1808
      mpi_sub_ui (tmpval, tmpval, 1);
 
1809
      mpi_sub (prime_p, value_x, tmpval);
 
1810
 
 
1811
      /* Step 11.6: If  p < 2^{L-1}  skip the primality test.  */
 
1812
      /* Step 11.7 and 11.8: Primality test.  */
 
1813
      if (mpi_get_nbits (prime_p) >= pbits-1
 
1814
          && check_prime (prime_p, val_2, 64, NULL, NULL) )
 
1815
        break; /* Yes, P is prime, continue with Step 15.  */
 
1816
      
 
1817
      /* Step 11.9: counter = counter + 1, offset = offset + n + 1.
 
1818
                    If counter >= 4L  goto Step 5.  */
 
1819
      counter++;
 
1820
      if (counter >= 4*pbits)
 
1821
        goto restart;
 
1822
    }
 
1823
 
 
1824
  /* Step 12:  Save p, q, counter and seed.  */
 
1825
  log_debug ("fips186-3 pbits p=%u q=%u counter=%d\n",
 
1826
             mpi_get_nbits (prime_p), mpi_get_nbits (prime_q), counter);
 
1827
  log_printhex("fips186-3 seed:", seed, seedlen);
 
1828
  log_mpidump ("fips186-3 prime p", prime_p);
 
1829
  log_mpidump ("fips186-3 prime q", prime_q);
 
1830
  if (r_q)
 
1831
    {
 
1832
      *r_q = prime_q;
 
1833
      prime_q = NULL;
 
1834
    }
 
1835
  if (r_p)
 
1836
    {
 
1837
      *r_p = prime_p;
 
1838
      prime_p = NULL;
 
1839
    }
 
1840
  if (r_counter)
 
1841
    *r_counter = counter;
 
1842
  if (r_seed && r_seedlen)
 
1843
    {
 
1844
      memcpy (seed_plus, seed, seedlen);
 
1845
      *r_seed = seed_plus;
 
1846
      seed_plus = NULL;
 
1847
      *r_seedlen = seedlen;
 
1848
    }
 
1849
  if (r_hashalgo)
 
1850
    *r_hashalgo = hashalgo;
 
1851
 
 
1852
 leave:
 
1853
  gcry_mpi_release (tmpval);
 
1854
  gcry_mpi_release (value_x);
 
1855
  gcry_mpi_release (value_w);
 
1856
  gcry_mpi_release (prime_p);
 
1857
  gcry_mpi_release (prime_q);
 
1858
  gcry_free (seed_plus);
 
1859
  gcry_mpi_release (val_2);
 
1860
  return ec;
 
1861
}
 
1862