View | Details | Raw Unified | Return to bug 3467 | Differences between
and this patch

Collapse All | Expand All

(-)a/configure.ac (-1 / +2 lines)
Lines 1879-1884 AC_CHECK_FUNCS([ \ Link Here
1879
	futimes \
1879
	futimes \
1880
	getaddrinfo \
1880
	getaddrinfo \
1881
	getcwd \
1881
	getcwd \
1882
	getentropy \
1882
	getgrouplist \
1883
	getgrouplist \
1883
	getline \
1884
	getline \
1884
	getnameinfo \
1885
	getnameinfo \
Lines 2110-2116 AC_CHECK_DECLS([O_NONBLOCK], , , Link Here
2110
#endif
2111
#endif
2111
	])
2112
	])
2112
2113
2113
AC_CHECK_DECLS([ftruncate], , ,
2114
AC_CHECK_DECLS([ftruncate, getentropy], , ,
2114
	[
2115
	[
2115
#include <sys/types.h>
2116
#include <sys/types.h>
2116
#include <unistd.h>
2117
#include <unistd.h>
(-)a/openbsd-compat/Makefile.in (+1 lines)
Lines 70-75 COMPAT= arc4random.o \ Link Here
70
	bsd-cygwin_util.o \
70
	bsd-cygwin_util.o \
71
	bsd-err.o \
71
	bsd-err.o \
72
	bsd-flock.o \
72
	bsd-flock.o \
73
	bsd-getentropy.o \
73
	bsd-getline.o \
74
	bsd-getline.o \
74
	bsd-getpagesize.o \
75
	bsd-getpagesize.o \
75
	bsd-getpeereid.o \
76
	bsd-getpeereid.o \
(-)a/openbsd-compat/arc4random.c (-54 / +2 lines)
Lines 33-51 Link Here
33
#include <string.h>
33
#include <string.h>
34
#include <unistd.h>
34
#include <unistd.h>
35
35
36
#ifdef HAVE_SYS_RANDOM_H
37
# include <sys/random.h>
38
#endif
39
40
#ifndef HAVE_ARC4RANDOM
36
#ifndef HAVE_ARC4RANDOM
41
37
42
#define MINIMUM(a, b)    (((a) < (b)) ? (a) : (b))
38
#define MINIMUM(a, b)    (((a) < (b)) ? (a) : (b))
43
39
44
#ifdef WITH_OPENSSL
45
#include <openssl/rand.h>
46
#include <openssl/err.h>
47
#endif
48
49
#include "log.h"
40
#include "log.h"
50
41
51
#define KEYSTREAM_ONLY
42
#define KEYSTREAM_ONLY
Lines 83-138 _rs_init(u_char *buf, size_t n) Link Here
83
	chacha_ivsetup(&rs, buf + KEYSZ);
74
	chacha_ivsetup(&rs, buf + KEYSZ);
84
}
75
}
85
76
86
#ifndef WITH_OPENSSL
87
# ifndef SSH_RANDOM_DEV
88
#  define SSH_RANDOM_DEV "/dev/urandom"
89
# endif /* SSH_RANDOM_DEV */
90
static void
91
getrnd(u_char *s, size_t len)
92
{
93
	int fd, save_errno;
94
	ssize_t r;
95
	size_t o = 0;
96
97
#ifdef HAVE_GETRANDOM
98
	if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len)
99
		return;
100
#endif /* HAVE_GETRANDOM */
101
102
	if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) {
103
		save_errno = errno;
104
		/* Try egd/prngd before giving up. */
105
		if (seed_from_prngd(s, len) == 0)
106
			return;
107
		fatal("Couldn't open %s: %s", SSH_RANDOM_DEV,
108
		    strerror(save_errno));
109
	}
110
	while (o < len) {
111
		r = read(fd, s + o, len - o);
112
		if (r < 0) {
113
			if (errno == EAGAIN || errno == EINTR ||
114
			    errno == EWOULDBLOCK)
115
				continue;
116
			fatal("read %s: %s", SSH_RANDOM_DEV, strerror(errno));
117
		}
118
		o += r;
119
	}
120
	close(fd);
121
}
122
#endif /* WITH_OPENSSL */
123
124
static void
77
static void
125
_rs_stir(void)
78
_rs_stir(void)
126
{
79
{
127
	u_char rnd[KEYSZ + IVSZ];
80
	u_char rnd[KEYSZ + IVSZ];
128
81
129
#ifdef WITH_OPENSSL
82
	if (getentropy(rnd, sizeof rnd) == -1)
130
	if (RAND_bytes(rnd, sizeof(rnd)) <= 0)
83
		fatal("getentropy failed");
131
		fatal("Couldn't obtain random bytes (error 0x%lx)",
132
		    (unsigned long)ERR_get_error());
133
#else
134
	getrnd(rnd, sizeof(rnd));
135
#endif
136
84
137
	if (!rs_initialized) {
85
	if (!rs_initialized) {
138
		rs_initialized = 1;
86
		rs_initialized = 1;
(-)a/openbsd-compat/bsd-getentropy.c (+82 lines)
Line 0 Link Here
1
/*
2
 * Copyright (c) 1996, David Mazieres <dm@uun.org>
3
 * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
4
 * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include "includes.h"
20
21
#ifndef HAVE_GETENTROPY
22
23
#ifndef SSH_RANDOM_DEV
24
# define SSH_RANDOM_DEV "/dev/urandom"
25
#endif /* SSH_RANDOM_DEV */
26
27
#include <sys/types.h>
28
#ifdef HAVE_SYS_RANDOM_H
29
# include <sys/random.h>
30
#endif
31
32
#include <fcntl.h>
33
#include <stdlib.h>
34
#include <string.h>
35
#include <unistd.h>
36
#ifdef WITH_OPENSSL
37
#include <openssl/rand.h>
38
#include <openssl/err.h>
39
#endif
40
41
#include "log.h"
42
43
int
44
getentropy(void *s, size_t len)
45
{
46
#ifdef WITH_OPENSSL
47
	if (RAND_bytes(s, len) <= 0)
48
		fatal("Couldn't obtain random bytes (error 0x%lx)",
49
		    (unsigned long)ERR_get_error());
50
#else
51
	int fd, save_errno;
52
	ssize_t r;
53
	size_t o = 0;
54
55
#ifdef HAVE_GETRANDOM
56
	if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len)
57
		return 0;
58
#endif /* HAVE_GETRANDOM */
59
60
	if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) {
61
		save_errno = errno;
62
		/* Try egd/prngd before giving up. */
63
		if (seed_from_prngd(s, len) == 0)
64
			return 0;
65
		fatal("Couldn't open %s: %s", SSH_RANDOM_DEV,
66
		    strerror(save_errno));
67
	}
68
	while (o < len) {
69
		r = read(fd, (u_char *)s + o, len - o);
70
		if (r < 0) {
71
			if (errno == EAGAIN || errno == EINTR ||
72
			    errno == EWOULDBLOCK)
73
				continue;
74
			fatal("read %s: %s", SSH_RANDOM_DEV, strerror(errno));
75
		}
76
		o += r;
77
	}
78
	close(fd);
79
#endif /* WITH_OPENSSL */
80
	return 0;
81
}
82
#endif /* WITH_GETENTROPY */
(-)a/openbsd-compat/openbsd-compat.h (+4 lines)
Lines 69-74 void closefrom(int); Link Here
69
int ftruncate(int filedes, off_t length);
69
int ftruncate(int filedes, off_t length);
70
#endif
70
#endif
71
71
72
#if defined(HAVE_DECL_GETENTROPY) && HAVE_DECL_GETENTROPY == 0
73
int getentropy(void *, size_t);
74
#endif
75
72
#ifndef HAVE_GETLINE
76
#ifndef HAVE_GETLINE
73
#include <stdio.h>
77
#include <stdio.h>
74
ssize_t getline(char **, size_t *, FILE *);
78
ssize_t getline(char **, size_t *, FILE *);

Return to bug 3467