]> andersk Git - openssh.git/blob - bsd-misc.c
bad checkin mode
[openssh.git] / bsd-misc.c
1 /*
2  * 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  */
29
30 #include "config.h"
31
32 #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>
41 #ifdef HAVE_STDDEF_H
42 #include <stddef.h>
43 #endif
44
45 #include "xmalloc.h"
46 #include "ssh.h"
47 #include "bsd-misc.h"
48 #include "entropy.h"
49
50 #include <openssl/rand.h>
51
52 #ifndef HAVE_ARC4RANDOM
53
54 typedef struct
55 {
56         unsigned int s[256];
57         int i;
58         int j;
59 } rc4_t;
60
61 void rc4_key(rc4_t *r, unsigned char *key, int len);
62 void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len);
63
64 static rc4_t *rc4 = NULL;
65
66 void rc4_key(rc4_t *r, unsigned char *key, int len)
67 {
68         int t;
69         
70         for(r->i = 0; r->i < 256; r->i++)
71                 r->s[r->i] = r->i;
72
73         r->j = 0;
74         for(r->i = 0; r->i < 256; r->i++)
75         {
76                 r->j = (r->j + r->s[r->i] + key[r->i % len]) % 256;
77                 t = r->s[r->i];
78                 r->s[r->i] = r->s[r->j];
79                 r->s[r->j] = t;
80         }
81         r->i = r->j = 0;
82 }
83
84 void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len)
85 {
86         int t;
87         int c;
88
89         c = 0;  
90         while(c < len)
91         {
92                 r->i = (r->i + 1) % 256;
93                 r->j = (r->j + r->s[r->i]) % 256;
94                 t = r->s[r->i];
95                 r->s[r->i] = r->s[r->j];
96                 r->s[r->j] = t;
97
98                 t = (r->s[r->i] + r->s[r->j]) % 256;
99                 
100                 buffer[c] = r->s[t];
101                 c++;
102         }
103 }
104
105 unsigned int arc4random(void)
106 {
107         unsigned int r;
108
109         if (rc4 == NULL)
110                 arc4random_stir();
111         
112         rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r));
113         
114         return(r);
115 }
116
117 void arc4random_stir(void)
118 {
119         unsigned char rand_buf[32];
120         
121         if (rc4 == NULL)
122                 rc4 = xmalloc(sizeof(*rc4));
123
124         seed_rng();
125         RAND_bytes(rand_buf, sizeof(rand_buf));
126         
127         rc4_key(rc4, rand_buf, sizeof(rand_buf));
128         memset(rand_buf, 0, sizeof(rand_buf));
129 }
130 #endif /* !HAVE_ARC4RANDOM */
131
132 #ifndef HAVE_SETPROCTITLE
133 void setproctitle(const char *fmt, ...)
134 {
135         /* FIXME */
136 }
137 #endif /* !HAVE_SETPROCTITLE */
138
139 #ifndef HAVE_SETLOGIN
140 int setlogin(const char *name)
141 {
142         return(0);
143 }
144 #endif /* !HAVE_SETLOGIN */
145
146 #ifndef HAVE_INNETGR
147 int innetgr(const char *netgroup, const char *host, 
148             const char *user, const char *domain)
149 {
150         return(0);
151 }
152 #endif /* HAVE_INNETGR */
153
154 #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
155 int seteuid(uid_t euid)
156 {
157         return(setreuid(-1,euid));
158 }
159 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
This page took 0.046387 seconds and 5 git commands to generate.