diff options
Diffstat (limited to 'bsd-arc4random.c')
-rw-r--r-- | bsd-arc4random.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/bsd-arc4random.c b/bsd-arc4random.c index 4c2f0854f..a1f515461 100644 --- a/bsd-arc4random.c +++ b/bsd-arc4random.c | |||
@@ -33,6 +33,12 @@ | |||
33 | 33 | ||
34 | #ifndef HAVE_ARC4RANDOM | 34 | #ifndef HAVE_ARC4RANDOM |
35 | 35 | ||
36 | /* Size of key to use */ | ||
37 | #define SEED_SIZE 20 | ||
38 | |||
39 | /* Number of bytes to reseed after */ | ||
40 | #define REKEY_BYTES (1 >> 18) | ||
41 | |||
36 | static int rc4_ready = 0; | 42 | static int rc4_ready = 0; |
37 | static RC4_KEY rc4; | 43 | static RC4_KEY rc4; |
38 | 44 | ||
@@ -40,27 +46,30 @@ unsigned int arc4random(void) | |||
40 | { | 46 | { |
41 | unsigned int r = 0; | 47 | unsigned int r = 0; |
42 | 48 | ||
43 | if (!rc4_ready) | 49 | if (rc4_ready <= 0) |
44 | arc4random_stir(); | 50 | arc4random_stir(); |
45 | 51 | ||
46 | RC4(&rc4, sizeof(r), (unsigned char *)&r, (unsigned char *)&r); | 52 | RC4(&rc4, sizeof(r), (unsigned char *)&r, (unsigned char *)&r); |
53 | |||
54 | rc4_ready -= sizeof(r); | ||
47 | 55 | ||
48 | return(r); | 56 | return(r); |
49 | } | 57 | } |
50 | 58 | ||
51 | void arc4random_stir(void) | 59 | void arc4random_stir(void) |
52 | { | 60 | { |
53 | unsigned char rand_buf[32]; | 61 | unsigned char rand_buf[SEED_SIZE]; |
54 | 62 | ||
55 | memset(&rc4, 0, sizeof(rc4)); | 63 | memset(&rc4, 0, sizeof(rc4)); |
56 | 64 | ||
57 | seed_rng(); | 65 | seed_rng(); |
66 | |||
58 | RAND_bytes(rand_buf, sizeof(rand_buf)); | 67 | RAND_bytes(rand_buf, sizeof(rand_buf)); |
59 | 68 | ||
60 | RC4_set_key(&rc4, sizeof(rand_buf), rand_buf); | 69 | RC4_set_key(&rc4, sizeof(rand_buf), rand_buf); |
61 | 70 | ||
62 | memset(rand_buf, 0, sizeof(rand_buf)); | 71 | memset(rand_buf, 0, sizeof(rand_buf)); |
63 | 72 | ||
64 | rc4_ready = 1; | 73 | rc4_ready = REKEY_BYTES; |
65 | } | 74 | } |
66 | #endif /* !HAVE_ARC4RANDOM */ | 75 | #endif /* !HAVE_ARC4RANDOM */ |