comparison libtommath/bn_mp_rand.c @ 1470:8bba51a55704

Update to libtommath v1.0.1
author Matt Johnston <matt@ucc.asn.au>
date Thu, 08 Feb 2018 23:11:40 +0800
parents 60fc6476e044
children f52919ffd3b1
comparison
equal deleted inserted replaced
1469:51043e868f55 1470:8bba51a55704
13 * guarantee it works. 13 * guarantee it works.
14 * 14 *
15 * Tom St Denis, [email protected], http://libtom.org 15 * Tom St Denis, [email protected], http://libtom.org
16 */ 16 */
17 17
18 #if MP_GEN_RANDOM_MAX == 0xffffffff
19 #define MP_GEN_RANDOM_SHIFT 32
20 #elif MP_GEN_RANDOM_MAX == 32767
21 /* SHRT_MAX */
22 #define MP_GEN_RANDOM_SHIFT 15
23 #elif MP_GEN_RANDOM_MAX == 2147483647
24 /* INT_MAX */
25 #define MP_GEN_RANDOM_SHIFT 31
26 #elif !defined(MP_GEN_RANDOM_SHIFT)
27 #error Thou shalt define their own valid MP_GEN_RANDOM_SHIFT
28 #endif
29
18 /* makes a pseudo-random int of a given size */ 30 /* makes a pseudo-random int of a given size */
31 static mp_digit s_gen_random(void)
32 {
33 mp_digit d = 0, msk = 0;
34 do {
35 d <<= MP_GEN_RANDOM_SHIFT;
36 d |= ((mp_digit) MP_GEN_RANDOM());
37 msk <<= MP_GEN_RANDOM_SHIFT;
38 msk |= (MP_MASK & MP_GEN_RANDOM_MAX);
39 } while ((MP_MASK & msk) != MP_MASK);
40 d &= MP_MASK;
41 return d;
42 }
43
19 int 44 int
20 mp_rand (mp_int * a, int digits) 45 mp_rand (mp_int * a, int digits)
21 { 46 {
22 int res; 47 int res;
23 mp_digit d; 48 mp_digit d;
27 return MP_OKAY; 52 return MP_OKAY;
28 } 53 }
29 54
30 /* first place a random non-zero digit */ 55 /* first place a random non-zero digit */
31 do { 56 do {
32 d = ((mp_digit) abs (MP_GEN_RANDOM())) & MP_MASK; 57 d = s_gen_random();
33 } while (d == 0); 58 } while (d == 0);
34 59
35 if ((res = mp_add_d (a, d, a)) != MP_OKAY) { 60 if ((res = mp_add_d (a, d, a)) != MP_OKAY) {
36 return res; 61 return res;
37 } 62 }
39 while (--digits > 0) { 64 while (--digits > 0) {
40 if ((res = mp_lshd (a, 1)) != MP_OKAY) { 65 if ((res = mp_lshd (a, 1)) != MP_OKAY) {
41 return res; 66 return res;
42 } 67 }
43 68
44 if ((res = mp_add_d (a, ((mp_digit) abs (MP_GEN_RANDOM())), a)) != MP_OKAY) { 69 if ((res = mp_add_d (a, s_gen_random(), a)) != MP_OKAY) {
45 return res; 70 return res;
46 } 71 }
47 } 72 }
48 73
49 return MP_OKAY; 74 return MP_OKAY;
50 } 75 }
51 #endif 76 #endif
52 77
53 /* $Source$ */ 78 /* ref: $Format:%D$ */
54 /* $Revision$ */ 79 /* git commit: $Format:%H$ */
55 /* $Date$ */ 80 /* commit time: $Format:%ai$ */