blob: 83822cad52d6dfcaa9e4d8b589463894c654ae7c [file] [log] [blame]
Damien Millerd4a8b7e1999-10-27 13:42:43 +10001/*
Damien Miller040f3832000-04-03 14:50:43 +10002 * Copyright (c) 1999-2000 Damien Miller. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
17 *
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.
28 */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100029
Damien Miller6b85a7f2000-01-02 11:45:33 +110030#include "config.h"
31
Damien Millerd4a8b7e1999-10-27 13:42:43 +100032#include <stdio.h>
33#include <stdlib.h>
34#include <string.h>
35#include <errno.h>
36#include <unistd.h>
37
38#include <sys/types.h>
39#include <sys/stat.h>
40#include <fcntl.h>
Damien Miller1fa154b2000-01-23 10:32:03 +110041#ifdef HAVE_STDDEF_H
42#include <stddef.h>
43#endif
Damien Millerd4a8b7e1999-10-27 13:42:43 +100044
Damien Millerd4a8b7e1999-10-27 13:42:43 +100045#include "xmalloc.h"
Damien Millerab18c411999-11-11 10:40:23 +110046#include "ssh.h"
Damien Miller753331e1999-12-30 01:29:35 +110047#include "bsd-misc.h"
Damien Miller040f3832000-04-03 14:50:43 +100048#include "entropy.h"
Damien Miller58fc4731999-11-19 12:05:01 +110049
Damien Millere413cba1999-10-28 14:12:54 +100050#ifndef HAVE_ARC4RANDOM
51
Damien Miller037a0dc1999-12-07 15:38:31 +110052typedef struct
53{
54 unsigned int s[256];
55 int i;
56 int j;
57} rc4_t;
58
Damien Miller037a0dc1999-12-07 15:38:31 +110059void rc4_key(rc4_t *r, unsigned char *key, int len);
60void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100061
62static rc4_t *rc4 = NULL;
63
Damien Miller037a0dc1999-12-07 15:38:31 +110064void rc4_key(rc4_t *r, unsigned char *key, int len)
65{
66 int t;
67
68 for(r->i = 0; r->i < 256; r->i++)
69 r->s[r->i] = r->i;
70
71 r->j = 0;
72 for(r->i = 0; r->i < 256; r->i++)
73 {
74 r->j = (r->j + r->s[r->i] + key[r->i % len]) % 256;
75 t = r->s[r->i];
76 r->s[r->i] = r->s[r->j];
77 r->s[r->j] = t;
78 }
79 r->i = r->j = 0;
80}
81
82void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len)
83{
84 int t;
85 int c;
86
87 c = 0;
88 while(c < len)
89 {
90 r->i = (r->i + 1) % 256;
91 r->j = (r->j + r->s[r->i]) % 256;
92 t = r->s[r->i];
93 r->s[r->i] = r->s[r->j];
94 r->s[r->j] = t;
95
96 t = (r->s[r->i] + r->s[r->j]) % 256;
97
98 buffer[c] = r->s[t];
99 c++;
100 }
101}
102
Damien Miller3d112ef1999-10-28 13:20:30 +1000103unsigned int arc4random(void)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000104{
Damien Miller3d112ef1999-10-28 13:20:30 +1000105 unsigned int r;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000106
107 if (rc4 == NULL)
108 arc4random_stir();
109
Damien Miller3d112ef1999-10-28 13:20:30 +1000110 rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000111
112 return(r);
113}
114
115void arc4random_stir(void)
116{
117 unsigned char rand_buf[32];
118
119 if (rc4 == NULL)
120 rc4 = xmalloc(sizeof(*rc4));
Damien Miller040f3832000-04-03 14:50:43 +1000121
122 seed_rng();
123 RAND_bytes(rand_buf, sizeof(rand_buf));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000124
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000125 rc4_key(rc4, rand_buf, sizeof(rand_buf));
Damien Millerf07390e2000-01-29 20:40:22 +1100126 memset(rand_buf, 0, sizeof(rand_buf));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000127}
Damien Millere413cba1999-10-28 14:12:54 +1000128#endif /* !HAVE_ARC4RANDOM */
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000129
Damien Millere413cba1999-10-28 14:12:54 +1000130#ifndef HAVE_SETPROCTITLE
131void setproctitle(const char *fmt, ...)
132{
133 /* FIXME */
134}
135#endif /* !HAVE_SETPROCTITLE */
Damien Millerd7702521999-11-22 16:11:05 +1100136
Damien Millere72b7af1999-12-30 15:08:44 +1100137#ifndef HAVE_SETLOGIN
138int setlogin(const char *name)
139{
140 return(0);
141}
142#endif /* !HAVE_SETLOGIN */
143
144#ifndef HAVE_INNETGR
145int innetgr(const char *netgroup, const char *host,
146 const char *user, const char *domain)
147{
148 return(0);
149}
150#endif /* HAVE_INNETGR */
151
152#if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
153int seteuid(uid_t euid)
154{
155 return(setreuid(-1,euid));
156}
157#endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */