diff options
author | Damien Miller <djm@mindrot.org> | 1999-10-27 13:42:43 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 1999-10-27 13:42:43 +1000 |
commit | d4a8b7e34dd619a4debf9a206c81db26d1402ea6 (patch) | |
tree | a47d770a2f790f40d18b0982d4e55fa7cfb1fa3b /helper.c |
Initial revision
Diffstat (limited to 'helper.c')
-rw-r--r-- | helper.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/helper.c b/helper.c new file mode 100644 index 000000000..3b0402ecf --- /dev/null +++ b/helper.c | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
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" | ||
48 | |||
49 | #include "helper.h" | ||
50 | |||
51 | void get_random_bytes(unsigned char *buf, int len); | ||
52 | |||
53 | static rc4_t *rc4 = NULL; | ||
54 | |||
55 | void setproctitle(const char *fmt, ...) | ||
56 | { | ||
57 | /* FIXME */ | ||
58 | } | ||
59 | |||
60 | unsigned char arc4random(void) | ||
61 | { | ||
62 | unsigned char r; | ||
63 | |||
64 | if (rc4 == NULL) | ||
65 | arc4random_stir(); | ||
66 | |||
67 | rc4_getbytes(rc4, &r, 1); | ||
68 | |||
69 | return(r); | ||
70 | } | ||
71 | |||
72 | void arc4random_stir(void) | ||
73 | { | ||
74 | unsigned char rand_buf[32]; | ||
75 | |||
76 | if (rc4 == NULL) | ||
77 | rc4 = xmalloc(sizeof(*rc4)); | ||
78 | |||
79 | get_random_bytes(rand_buf, sizeof(rand_buf)); | ||
80 | rc4_key(rc4, rand_buf, sizeof(rand_buf)); | ||
81 | } | ||
82 | |||
83 | void get_random_bytes(unsigned char *buf, int len) | ||
84 | { | ||
85 | int urandom; | ||
86 | int c; | ||
87 | |||
88 | urandom = open("/dev/urandom", O_RDONLY); | ||
89 | if (urandom == -1) | ||
90 | { | ||
91 | fprintf(stderr, "Couldn't open /dev/urandom: %s", strerror(errno)); | ||
92 | exit(1); | ||
93 | } | ||
94 | |||
95 | c = read(urandom, buf, len); | ||
96 | if (c == -1) | ||
97 | { | ||
98 | fprintf(stderr, "Couldn't read from /dev/urandom: %s", strerror(errno)); | ||
99 | exit(1); | ||
100 | } | ||
101 | |||
102 | if (c != len) | ||
103 | { | ||
104 | fprintf(stderr, "Short read from /dev/urandom"); | ||
105 | exit(1); | ||
106 | } | ||
107 | } | ||
108 | |||