X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/4414eb3c9ec4fbd192992d0e4da42a8940a987ca..36fb4e9a7743326d1a2ca7601bc9bf1c5b9a0bcb:/libratbox/src/arc4random.c diff --git a/libratbox/src/arc4random.c b/libratbox/src/arc4random.c index 534d223..dde356e 100644 --- a/libratbox/src/arc4random.c +++ b/libratbox/src/arc4random.c @@ -1,4 +1,4 @@ -/* $Id: arc4random.c 25705 2008-07-11 18:21:57Z androsyn $ */ +/* $Id: arc4random.c 26092 2008-09-19 15:13:52Z androsyn $ */ /* $$$: arc4random.c 2005/02/08 robert */ /* $NetBSD: arc4random.c,v 1.5.2.1 2004/03/26 22:52:50 jmc Exp $ */ /* $OpenBSD: arc4random.c,v 1.6 2001/06/05 05:05:38 pvalchev Exp $ */ @@ -41,14 +41,15 @@ -struct arc4_stream { +struct arc4_stream +{ uint8_t i; uint8_t j; uint8_t s[256]; }; -static int rs_initialized; +static int rs_initialized; static struct arc4_stream rs; static inline void arc4_init(struct arc4_stream *); @@ -60,9 +61,9 @@ static inline uint32_t arc4_getword(struct arc4_stream *); static inline void arc4_init(struct arc4_stream *as) { - int n; + int n; - for (n = 0; n < 256; n++) + for(n = 0; n < 256; n++) as->s[n] = n; as->i = 0; as->j = 0; @@ -71,11 +72,12 @@ arc4_init(struct arc4_stream *as) static inline void arc4_addrandom(struct arc4_stream *as, uint8_t *dat, int datlen) { - int n; + int n; uint8_t si; as->i--; - for (n = 0; n < 256; n++) { + for(n = 0; n < 256; n++) + { as->i = (as->i + 1); si = as->s[as->i]; as->j = (as->j + si + dat[n % datlen]); @@ -91,45 +93,63 @@ arc4_stir(struct arc4_stream *as) struct timeval tv; pid_t pid; int n; +#ifdef _WIN32 + HMODULE lib; +#endif /* XXX this doesn't support egd sources or similiar */ pid = getpid(); - arc4_addrandom(as, (void *)&pid, sizeof(pid)); + arc4_addrandom(as, (void *)&pid, sizeof(pid)); rb_gettimeofday(&tv, NULL); arc4_addrandom(as, (void *)&tv.tv_sec, sizeof(&tv.tv_sec)); arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec)); rb_gettimeofday(&tv, NULL); arc4_addrandom(as, (void *)&tv.tv_usec, sizeof(&tv.tv_usec)); - + #if defined(HAVE_GETRUSAGE) && RUSAGE_SELF { struct rusage buf; getrusage(RUSAGE_SELF, &buf); arc4_addrandom(as, (void *)&buf, sizeof(buf)); - memset(&buf, 0, sizeof(buf)) - } -#endif + memset(&buf, 0, sizeof(buf))} +#endif -#if !defined(WIN32) +#if !defined(_WIN32) { uint8_t rnd[128]; int fd; fd = open("/dev/urandom", O_RDONLY); - if (fd != -1) + if(fd != -1) { read(fd, rnd, sizeof(rnd)); close(fd); arc4_addrandom(as, (void *)rnd, sizeof(rnd)); + memset(&rnd, 0, sizeof(rnd)); } + } #else { LARGE_INTEGER performanceCount; - if (QueryPerformanceCounter (&performanceCount)) + if(QueryPerformanceCounter(&performanceCount)) { arc4_addrandom(as, (void *)&performanceCount, sizeof(performanceCount)); } + lib = LoadLibrary("ADVAPI32.DLL"); + if(lib) + { + uint8_t rnd[128]; + BOOLEAN(APIENTRY * pfn) (void *, ULONG) = + (BOOLEAN(APIENTRY *) (void *, ULONG))GetProcAddress(lib, + "SystemFunction036"); + if(pfn) + { + if(pfn(rnd, sizeof(rnd)) == TRUE) + arc4_addrandom(as, (void *)rnd, sizeof(rnd)); + memset(&rnd, 0, sizeof(rnd)); + } + } } #endif @@ -141,7 +161,7 @@ arc4_stir(struct arc4_stream *as) * http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps * N = 256 in our case. */ - for (n = 0; n < 256 * 4; n++) + for(n = 0; n < 256 * 4; n++) arc4_getbyte(as); } @@ -173,7 +193,8 @@ arc4_getword(struct arc4_stream *as) void arc4random_stir(void) { - if (!rs_initialized) { + if(!rs_initialized) + { arc4_init(&rs); rs_initialized = 1; } @@ -183,7 +204,7 @@ arc4random_stir(void) void arc4random_addrandom(uint8_t *dat, int datlen) { - if (!rs_initialized) + if(!rs_initialized) arc4random_stir(); arc4_addrandom(&rs, dat, datlen); } @@ -191,10 +212,9 @@ arc4random_addrandom(uint8_t *dat, int datlen) uint32_t arc4random(void) { - if (!rs_initialized) + if(!rs_initialized) arc4random_stir(); return arc4_getword(&rs); } #endif -