rand_helper
Karel Miko
10 years ago
5 | 5 | PK_PUBLIC_COMPRESSED=2 /* used only when exporting public ECC key */ |
6 | 6 | }; |
7 | 7 | |
8 | typedef struct rand_helper { | |
9 | prng_state *prng; | |
10 | int wprng; | |
11 | } rand_helper_st; | |
12 | ||
13 | int rand_helper(unsigned char *dst, int len, void *dat); | |
8 | 14 | int rand_prime(void *N, long len, prng_state *prng, int wprng); |
9 | 15 | int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng); |
10 | 16 | int rand_bn_range(void *N, void *limit, prng_state *prng, int wprng); |
16 | 16 | |
17 | 17 | #define USE_BBS 1 |
18 | 18 | |
19 | struct rng_data { | |
20 | prng_state *prng; | |
21 | int wprng; | |
22 | }; | |
23 | ||
24 | static int rand_prime_helper(unsigned char *dst, int len, void *dat) | |
19 | int rand_helper(unsigned char *dst, int len, void *dat) | |
25 | 20 | { |
26 | return (int)prng_descriptor[((struct rng_data *)dat)->wprng].read(dst, len, ((struct rng_data *)dat)->prng); | |
21 | return (int)prng_descriptor[((rand_helper_st *)dat)->wprng].read(dst, len, ((rand_helper_st *)dat)->prng); | |
27 | 22 | } |
28 | 23 | |
29 | 24 | int rand_prime(void *N, long len, prng_state *prng, int wprng) |
30 | 25 | { |
31 | 26 | int err, res, type; |
32 | 27 | unsigned char *buf; |
33 | struct rng_data rng; | |
28 | rand_helper_st rng; | |
34 | 29 | |
35 | 30 | LTC_ARGCHK(N != NULL); |
36 | 31 | |
80 | 75 | } |
81 | 76 | |
82 | 77 | /* test */ |
83 | if ((err = mp_prime_is_prime_ex(N, 0, &res, rand_prime_helper, &rng)) != CRYPT_OK) { | |
78 | if ((err = mp_prime_is_prime_ex(N, 0, &res, rand_helper, &rng)) != CRYPT_OK) { | |
84 | 79 | XFREE(buf); |
85 | 80 | return err; |
86 | 81 | } |
16 | 16 | |
17 | 17 | #ifdef LTC_MDSA |
18 | 18 | |
19 | struct rng_data { | |
20 | prng_state *prng; | |
21 | int wprng; | |
22 | }; | |
23 | ||
24 | static int rng_helper(unsigned char *dst, int len, void *dat) | |
25 | { | |
26 | return (int)prng_descriptor[((struct rng_data *)dat)->wprng].read(dst, len, ((struct rng_data *)dat)->prng); | |
27 | } | |
28 | ||
29 | 19 | /** |
30 | 20 | Create DSA parameters |
31 | 21 | @param prng An active PRNG state |
43 | 33 | int err, res, mr_tests_q, mr_tests_p, found_p, found_q, hash; |
44 | 34 | unsigned char *wbuf, *sbuf, digest[MAXBLOCKSIZE]; |
45 | 35 | void *t2L1, *t2N1, *t2q, *t2seedlen, *U, *W, *X, *c, *h, *e, *seedinc; |
46 | struct rng_data rng; | |
36 | rand_helper_st rng; | |
47 | 37 | |
48 | 38 | /* check prng */ |
49 | 39 | if ((err = prng_is_valid(wprng)) != CRYPT_OK) { |
143 | 133 | if ((err = mp_mod(U, t2N1, U)) != CRYPT_OK) { goto cleanup; } |
144 | 134 | if ((err = mp_add(t2N1, U, q)) != CRYPT_OK) { goto cleanup; } |
145 | 135 | if (!mp_isodd(q)) mp_add_d(q, 1, q); |
146 | err = mp_prime_is_prime_ex(q, mr_tests_q, &res, rng_helper, &rng); | |
136 | err = mp_prime_is_prime_ex(q, mr_tests_q, &res, rand_helper, &rng); | |
147 | 137 | if (err != CRYPT_OK) { goto cleanup; } |
148 | 138 | if (res == LTC_MP_YES) found_q = 1; |
149 | 139 | } |
172 | 162 | if ((err = mp_sub(X, p, p)) != CRYPT_OK) { goto cleanup; } |
173 | 163 | if (mp_cmp(p, t2L1) != LTC_MP_LT) { |
174 | 164 | /* p >= 2^(L-1) */ |
175 | err = mp_prime_is_prime_ex(p, mr_tests_p, &res, rng_helper, &rng); | |
165 | err = mp_prime_is_prime_ex(p, mr_tests_p, &res, rand_helper, &rng); | |
176 | 166 | if (err != CRYPT_OK) { goto cleanup; } |
177 | 167 | if (res == LTC_MP_YES) found_p = 1; |
178 | 168 | } |