]>
Commit | Line | Data |
---|---|---|
8efc0c15 | 1 | /* |
bfc9a610 | 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 | */ | |
8efc0c15 | 29 | |
76a8e733 | 30 | #include "config.h" |
31 | ||
8efc0c15 | 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> | |
4c40f834 | 41 | #ifdef HAVE_STDDEF_H |
42 | #include <stddef.h> | |
43 | #endif | |
8efc0c15 | 44 | |
8efc0c15 | 45 | #include "xmalloc.h" |
4cca272e | 46 | #include "ssh.h" |
d7a582ea | 47 | #include "bsd-misc.h" |
bfc9a610 | 48 | #include "entropy.h" |
7b1cc56c | 49 | |
d6f24e45 | 50 | #include <openssl/rand.h> |
51 | ||
fb723d82 | 52 | #ifndef HAVE_ARC4RANDOM |
53 | ||
a408af76 | 54 | typedef struct |
55 | { | |
56 | unsigned int s[256]; | |
57 | int i; | |
58 | int j; | |
59 | } rc4_t; | |
60 | ||
a408af76 | 61 | void rc4_key(rc4_t *r, unsigned char *key, int len); |
62 | void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len); | |
8efc0c15 | 63 | |
64 | static rc4_t *rc4 = NULL; | |
65 | ||
a408af76 | 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 | ||
0183ea1c | 105 | unsigned int arc4random(void) |
8efc0c15 | 106 | { |
0183ea1c | 107 | unsigned int r; |
8efc0c15 | 108 | |
109 | if (rc4 == NULL) | |
110 | arc4random_stir(); | |
111 | ||
0183ea1c | 112 | rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r)); |
8efc0c15 | 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)); | |
bfc9a610 | 123 | |
124 | seed_rng(); | |
125 | RAND_bytes(rand_buf, sizeof(rand_buf)); | |
8efc0c15 | 126 | |
8efc0c15 | 127 | rc4_key(rc4, rand_buf, sizeof(rand_buf)); |
69c76614 | 128 | memset(rand_buf, 0, sizeof(rand_buf)); |
8efc0c15 | 129 | } |
fb723d82 | 130 | #endif /* !HAVE_ARC4RANDOM */ |
8efc0c15 | 131 | |
fb723d82 | 132 | #ifndef HAVE_SETPROCTITLE |
133 | void setproctitle(const char *fmt, ...) | |
134 | { | |
135 | /* FIXME */ | |
136 | } | |
137 | #endif /* !HAVE_SETPROCTITLE */ | |
1647c2b5 | 138 | |
a5c9cd31 | 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) */ |