]> andersk Git - openssh.git/blob - bsd-misc.c
Include all README files
[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 #ifndef HAVE_ARC4RANDOM
51
52 typedef struct
53 {
54         unsigned int s[256];
55         int i;
56         int j;
57 } rc4_t;
58
59 void rc4_key(rc4_t *r, unsigned char *key, int len);
60 void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len);
61
62 static rc4_t *rc4 = NULL;
63
64 void 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
82 void 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
103 unsigned int arc4random(void)
104 {
105         unsigned int r;
106
107         if (rc4 == NULL)
108                 arc4random_stir();
109         
110         rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r));
111         
112         return(r);
113 }
114
115 void arc4random_stir(void)
116 {
117         unsigned char rand_buf[32];
118         
119         if (rc4 == NULL)
120                 rc4 = xmalloc(sizeof(*rc4));
121
122         seed_rng();
123         RAND_bytes(rand_buf, sizeof(rand_buf));
124         
125         rc4_key(rc4, rand_buf, sizeof(rand_buf));
126         memset(rand_buf, 0, sizeof(rand_buf));
127 }
128 #endif /* !HAVE_ARC4RANDOM */
129
130 #ifndef HAVE_SETPROCTITLE
131 void setproctitle(const char *fmt, ...)
132 {
133         /* FIXME */
134 }
135 #endif /* !HAVE_SETPROCTITLE */
136
137 #ifndef HAVE_SETLOGIN
138 int setlogin(const char *name)
139 {
140         return(0);
141 }
142 #endif /* !HAVE_SETLOGIN */
143
144 #ifndef HAVE_INNETGR
145 int 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)
153 int seteuid(uid_t euid)
154 {
155         return(setreuid(-1,euid));
156 }
157 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
This page took 0.138239 seconds and 5 git commands to generate.