Annotation of pgp/src/keygen.c, revision 1.1

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

unix.superglobalmegacorp.com

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