]> andersk Git - openssh.git/blame - bsd-misc.c
doc
[openssh.git] / bsd-misc.c
CommitLineData
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 54typedef struct
55{
56 unsigned int s[256];
57 int i;
58 int j;
59} rc4_t;
60
a408af76 61void rc4_key(rc4_t *r, unsigned char *key, int len);
62void rc4_getbytes(rc4_t *r, unsigned char *buffer, int len);
8efc0c15 63
64static rc4_t *rc4 = NULL;
65
a408af76 66void 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
84void 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 105unsigned 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
117void 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
133void setproctitle(const char *fmt, ...)
134{
135 /* FIXME */
136}
137#endif /* !HAVE_SETPROCTITLE */
1647c2b5 138
a5c9cd31 139#ifndef HAVE_SETLOGIN
140int setlogin(const char *name)
141{
142 return(0);
143}
144#endif /* !HAVE_SETLOGIN */
145
146#ifndef HAVE_INNETGR
147int 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)
155int seteuid(uid_t euid)
156{
157 return(setreuid(-1,euid));
158}
159#endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
This page took 0.174486 seconds and 5 git commands to generate.