summaryrefslogtreecommitdiff
path: root/bsd-arc4random.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsd-arc4random.c')
-rw-r--r--bsd-arc4random.c15
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
36static int rc4_ready = 0; 42static int rc4_ready = 0;
37static RC4_KEY rc4; 43static 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
51void arc4random_stir(void) 59void 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 */