blob: 6d77759de6ced2645ee2544f4313c198eaf42899 [file] [log] [blame]
Damien Millerd4a8b7e1999-10-27 13:42:43 +10001/*
2**
3** OpenBSD emulation routines
4**
5** Damien Miller <djm@ibs.com.au>
6**
7** Copyright 1999 Internet Business Solutions
8**
9** Permission is hereby granted, free of charge, to any person
10** obtaining a copy of this software and associated documentation
11** files (the "Software"), to deal in the Software without
12** restriction, including without limitation the rights to use, copy,
13** modify, merge, publish, distribute, sublicense, and/or sell copies
14** of the Software, and to permit persons to whom the Software is
15** furnished to do so, subject to the following conditions:
16**
17** The above copyright notice and this permission notice shall be
18** included in all copies or substantial portions of the Software.
19**
20** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
21** KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
22** WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
23** AND NONINFRINGEMENT. IN NO EVENT SHALL DAMIEN MILLER OR INTERNET
24** BUSINESS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
27** OR OTHER DEALINGS IN THE SOFTWARE.
28**
29** Except as contained in this notice, the name of Internet Business
30** Solutions shall not be used in advertising or otherwise to promote
31** the sale, use or other dealings in this Software without prior
32** written authorization from Internet Business Solutions.
33**
34*/
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <string.h>
39#include <errno.h>
40#include <unistd.h>
41
42#include <sys/types.h>
43#include <sys/stat.h>
44#include <fcntl.h>
45
46#include "rc4.h"
47#include "xmalloc.h"
Damien Millerab18c411999-11-11 10:40:23 +110048#include "ssh.h"
Damien Millere413cba1999-10-28 14:12:54 +100049#include "config.h"
Damien Millerd4a8b7e1999-10-27 13:42:43 +100050#include "helper.h"
51
Damien Millere413cba1999-10-28 14:12:54 +100052#ifndef HAVE_ARC4RANDOM
53
Damien Millerd4a8b7e1999-10-27 13:42:43 +100054void get_random_bytes(unsigned char *buf, int len);
55
56static rc4_t *rc4 = NULL;
57
Damien Miller3d112ef1999-10-28 13:20:30 +100058unsigned int arc4random(void)
Damien Millerd4a8b7e1999-10-27 13:42:43 +100059{
Damien Miller3d112ef1999-10-28 13:20:30 +100060 unsigned int r;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100061
62 if (rc4 == NULL)
63 arc4random_stir();
64
Damien Miller3d112ef1999-10-28 13:20:30 +100065 rc4_getbytes(rc4, (unsigned char *)&r, sizeof(r));
Damien Millerd4a8b7e1999-10-27 13:42:43 +100066
67 return(r);
68}
69
70void arc4random_stir(void)
71{
72 unsigned char rand_buf[32];
73
74 if (rc4 == NULL)
75 rc4 = xmalloc(sizeof(*rc4));
76
77 get_random_bytes(rand_buf, sizeof(rand_buf));
78 rc4_key(rc4, rand_buf, sizeof(rand_buf));
79}
80
81void get_random_bytes(unsigned char *buf, int len)
82{
Damien Millerab18c411999-11-11 10:40:23 +110083 int random_pool;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100084 int c;
Damien Millerab18c411999-11-11 10:40:23 +110085#ifdef HAVE_EGD
86 char egd_message[2] = { 0x02, 0x00 };
87#endif /* HAVE_EGD */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100088
Damien Millerab18c411999-11-11 10:40:23 +110089 random_pool = open(RANDOM_POOL, O_RDONLY);
90 if (random_pool == -1)
91 fatal("Couldn't open random pool \"%s\": %s", RANDOM_POOL, strerror(errno));
Damien Millerd4a8b7e1999-10-27 13:42:43 +100092
Damien Millerab18c411999-11-11 10:40:23 +110093#ifdef HAVE_EGD
94 if (len > 255)
95 fatal("Too many bytes to read from EGD");
96
97 /* Send blocking read request to EGD */
98 egd_message[1] = len;
99 c = write(random_pool, egd_message, sizeof(egd_message));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000100 if (c == -1)
Damien Millerab18c411999-11-11 10:40:23 +1100101 fatal("Couldn't write to EGD socket \"%s\": %s", RANDOM_POOL, strerror(errno));
102#endif /* HAVE_EGD */
103
104 c = read(random_pool, buf, len);
105 if (c == -1)
106 fatal("Couldn't read from random pool \"%s\": %s", RANDOM_POOL, strerror(errno));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000107
108 if (c != len)
Damien Millerab18c411999-11-11 10:40:23 +1100109 fatal("Short read from random pool \"%s\"", RANDOM_POOL);
110
111 close(random_pool);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000112}
Damien Millere413cba1999-10-28 14:12:54 +1000113#endif /* !HAVE_ARC4RANDOM */
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000114
Damien Millere413cba1999-10-28 14:12:54 +1000115#ifndef HAVE_SETPROCTITLE
116void setproctitle(const char *fmt, ...)
117{
118 /* FIXME */
119}
120#endif /* !HAVE_SETPROCTITLE */