2 * Copyright (c) 1999-2000 Damien Miller. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. All advertising materials mentioning features or use of this software
13 * must display the following acknowledgement:
14 * This product includes software developed by Markus Friedl.
15 * 4. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include <sys/types.h>
50 #ifndef HAVE_ARC4RANDOM
59 void rc4_key(rc4_t *r, unsigned char *key, int len);
60 void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len);
62 static rc4_t *rc4 = NULL;
64 void rc4_key(rc4_t *r, unsigned char *key, int len)
68 for(r->i = 0; r->i < 256; r->i++)
72 for(r->i = 0; r->i < 256; r->i++)
74 r->j = (r->j + r->s[r->i] + key[r->i % len]) % 256;
76 r->s[r->i] = r->s[r->j];
82 void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len)
90 r->i = (r->i + 1) % 256;
91 r->j = (r->j + r->s[r->i]) % 256;
93 r->s[r->i] = r->s[r->j];
96 t = (r->s[r->i] + r->s[r->j]) % 256;
103 unsigned int arc4random(void)
110 rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r));
115 void arc4random_stir(void)
117 unsigned char rand_buf[32];
120 rc4 = xmalloc(sizeof(*rc4));
123 RAND_bytes(rand_buf, sizeof(rand_buf));
125 rc4_key(rc4, rand_buf, sizeof(rand_buf));
126 memset(rand_buf, 0, sizeof(rand_buf));
128 #endif /* !HAVE_ARC4RANDOM */
130 #ifndef HAVE_SETPROCTITLE
131 void setproctitle(const char *fmt, ...)
135 #endif /* !HAVE_SETPROCTITLE */
137 #ifndef HAVE_SETLOGIN
138 int setlogin(const char *name)
142 #endif /* !HAVE_SETLOGIN */
145 int innetgr(const char *netgroup, const char *host,
146 const char *user, const char *domain)
150 #endif /* HAVE_INNETGR */
152 #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
153 int seteuid(uid_t euid)
155 return(setreuid(-1,euid));
157 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */