Annotation of pgp/src/genprime.c, revision 1.1.1.8

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.