Mercurial > dropbear
comparison libtommath/bn_mp_prime_random_ex.c @ 1437:871b18fd7065 fuzz
merge from main (libtommath/libtomcrypt/curve25510-donna updates)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 24 Jun 2017 22:51:45 +0800 |
parents | 60fc6476e044 |
children | 8bba51a55704 |
comparison
equal
deleted
inserted
replaced
1432:41dca1e5ea34 | 1437:871b18fd7065 |
---|---|
1 #include <tommath.h> | 1 #include <tommath_private.h> |
2 #ifdef BN_MP_PRIME_RANDOM_EX_C | 2 #ifdef BN_MP_PRIME_RANDOM_EX_C |
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis | 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis |
4 * | 4 * |
5 * LibTomMath is a library that provides multiple-precision | 5 * LibTomMath is a library that provides multiple-precision |
6 * integer arithmetic as well as number theoretic functionality. | 6 * integer arithmetic as well as number theoretic functionality. |
10 * additional optimizations in place. | 10 * additional optimizations in place. |
11 * | 11 * |
12 * The library is free for all purposes without any express | 12 * The library is free for all purposes without any express |
13 * guarantee it works. | 13 * guarantee it works. |
14 * | 14 * |
15 * Tom St Denis, [email protected], http://math.libtomcrypt.com | 15 * Tom St Denis, [email protected], http://libtom.org |
16 */ | 16 */ |
17 | 17 |
18 /* makes a truly random prime of a given size (bits), | 18 /* makes a truly random prime of a given size (bits), |
19 * | 19 * |
20 * Flags are as follows: | 20 * Flags are as follows: |
21 * | 21 * |
22 * LTM_PRIME_BBS - make prime congruent to 3 mod 4 | 22 * LTM_PRIME_BBS - make prime congruent to 3 mod 4 |
23 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) | 23 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) |
24 * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero | |
25 * LTM_PRIME_2MSB_ON - make the 2nd highest bit one | 24 * LTM_PRIME_2MSB_ON - make the 2nd highest bit one |
26 * | 25 * |
27 * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can | 26 * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can |
28 * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself | 27 * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself |
29 * so it can be NULL | 28 * so it can be NULL |
35 { | 34 { |
36 unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; | 35 unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; |
37 int res, err, bsize, maskOR_msb_offset; | 36 int res, err, bsize, maskOR_msb_offset; |
38 | 37 |
39 /* sanity check the input */ | 38 /* sanity check the input */ |
40 if (size <= 1 || t <= 0) { | 39 if ((size <= 1) || (t <= 0)) { |
41 return MP_VAL; | 40 return MP_VAL; |
42 } | 41 } |
43 | 42 |
44 /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ | 43 /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ |
45 if (flags & LTM_PRIME_SAFE) { | 44 if ((flags & LTM_PRIME_SAFE) != 0) { |
46 flags |= LTM_PRIME_BBS; | 45 flags |= LTM_PRIME_BBS; |
47 } | 46 } |
48 | 47 |
49 /* calc the byte size */ | 48 /* calc the byte size */ |
50 bsize = (size>>3) + ((size&7)?1:0); | 49 bsize = (size>>3) + ((size&7)?1:0); |
59 maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); | 58 maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); |
60 | 59 |
61 /* calc the maskOR_msb */ | 60 /* calc the maskOR_msb */ |
62 maskOR_msb = 0; | 61 maskOR_msb = 0; |
63 maskOR_msb_offset = ((size & 7) == 1) ? 1 : 0; | 62 maskOR_msb_offset = ((size & 7) == 1) ? 1 : 0; |
64 if (flags & LTM_PRIME_2MSB_ON) { | 63 if ((flags & LTM_PRIME_2MSB_ON) != 0) { |
65 maskOR_msb |= 0x80 >> ((9 - size) & 7); | 64 maskOR_msb |= 0x80 >> ((9 - size) & 7); |
66 } | 65 } |
67 | 66 |
68 /* get the maskOR_lsb */ | 67 /* get the maskOR_lsb */ |
69 maskOR_lsb = 1; | 68 maskOR_lsb = 1; |
70 if (flags & LTM_PRIME_BBS) { | 69 if ((flags & LTM_PRIME_BBS) != 0) { |
71 maskOR_lsb |= 3; | 70 maskOR_lsb |= 3; |
72 } | 71 } |
73 | 72 |
74 do { | 73 do { |
75 /* read the bytes */ | 74 /* read the bytes */ |
93 if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } | 92 if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } |
94 if (res == MP_NO) { | 93 if (res == MP_NO) { |
95 continue; | 94 continue; |
96 } | 95 } |
97 | 96 |
98 if (flags & LTM_PRIME_SAFE) { | 97 if ((flags & LTM_PRIME_SAFE) != 0) { |
99 /* see if (a-1)/2 is prime */ | 98 /* see if (a-1)/2 is prime */ |
100 if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } | 99 if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } |
101 if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } | 100 if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } |
102 | 101 |
103 /* is it prime? */ | 102 /* is it prime? */ |
104 if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } | 103 if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } |
105 } | 104 } |
106 } while (res == MP_NO); | 105 } while (res == MP_NO); |
107 | 106 |
108 if (flags & LTM_PRIME_SAFE) { | 107 if ((flags & LTM_PRIME_SAFE) != 0) { |
109 /* restore a to the original value */ | 108 /* restore a to the original value */ |
110 if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } | 109 if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } |
111 if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } | 110 if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } |
112 } | 111 } |
113 | 112 |
118 } | 117 } |
119 | 118 |
120 | 119 |
121 #endif | 120 #endif |
122 | 121 |
123 /* $Source: /cvs/libtom/libtommath/bn_mp_prime_random_ex.c,v $ */ | 122 /* $Source$ */ |
124 /* $Revision: 1.4 $ */ | 123 /* $Revision$ */ |
125 /* $Date: 2006/03/31 14:18:44 $ */ | 124 /* $Date$ */ |