1 /* TomsFastMath, a fast ISO C bignum library.
3 * This project is meant to fill in where LibTomMath
4 * falls short. That is speed ;-)
6 * This project is public domain and free for all purposes.
8 * Tom St Denis, tomstdenis@gmail.com
10 #include <tfm_private.h>
12 #if FP_GEN_RANDOM_MAX == 0xffffffff
13 #define FP_GEN_RANDOM_SHIFT 32
14 #elif FP_GEN_RANDOM_MAX == 32767
16 #define FP_GEN_RANDOM_SHIFT 15
17 #elif FP_GEN_RANDOM_MAX == 2147483647
19 #define FP_GEN_RANDOM_SHIFT 31
20 #elif !defined(FP_GEN_RANDOM_SHIFT)
21 #error Thou shalt define their own valid FP_GEN_RANDOM_SHIFT
24 /* makes a pseudo-random int of a given size */
25 static fp_digit fp_gen_random(void)
27 fp_digit d = 0, msk = 0;
29 d <<= FP_GEN_RANDOM_SHIFT;
30 d |= ((fp_digit) FP_GEN_RANDOM());
31 msk <<= FP_GEN_RANDOM_SHIFT;
32 msk |= FP_GEN_RANDOM_MAX;
33 } while ((FP_MASK & msk) != FP_MASK);
38 void fp_rand(fp_int *a, int digits)
47 /* first place a random non-zero digit */
54 while (--digits > 0) {
56 fp_add_d (a, fp_gen_random(), a);