]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - libratbox/src/arc4random.c
strip_colour(): strip ASCII 29 (mIRC 7 italics).
[irc/rqf/shadowircd.git] / libratbox / src / arc4random.c
index 534d2237194a538bd9cb78f3503908d6208f8eb1..e508cee1ede2d4482052c4d8f4cbfef6f4076de4 100644 (file)
@@ -1,4 +1,3 @@
-/* $Id: arc4random.c 25705 2008-07-11 18:21:57Z 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 $ */
 
 
 
-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 +60,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 +71,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 +92,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 +160,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 +192,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 +203,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 +211,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
-