diff options
| author | Cy Schubert <cy@FreeBSD.org> | 2019-12-28 05:27:06 +0000 | 
|---|---|---|
| committer | Cy Schubert <cy@FreeBSD.org> | 2019-12-28 05:27:06 +0000 | 
| commit | e2fe726866d062155f6b1aae749375475ef19191 (patch) | |
| tree | fe6b00611d5c987d2c12c32063891ae19295ffeb /compat/getentropy_solaris.c | |
| parent | 366b94c4a9552acfb560d3234aea0955ebc1eb8e (diff) | |
Diffstat (limited to 'compat/getentropy_solaris.c')
| -rw-r--r-- | compat/getentropy_solaris.c | 70 | 
1 files changed, 29 insertions, 41 deletions
diff --git a/compat/getentropy_solaris.c b/compat/getentropy_solaris.c index 810098a8d8e4..0a03046d4681 100644 --- a/compat/getentropy_solaris.c +++ b/compat/getentropy_solaris.c @@ -1,4 +1,4 @@ -/*	$OpenBSD: getentropy_solaris.c,v 1.3 2014/07/12 14:46:31 deraadt Exp $	*/ +/*	$OpenBSD: getentropy_solaris.c,v 1.13 2018/11/20 08:04:28 deraadt Exp $	*/  /*   * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> @@ -15,9 +15,12 @@   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Emulation of getentropy(2) as documented at: + * http://man.openbsd.org/getentropy.2   */ -#include "config.h" +#include "config.h"  #include <sys/types.h>  #include <sys/param.h>  #include <sys/ioctl.h> @@ -34,6 +37,7 @@  #include <stdint.h>  #endif  #include <stdio.h> +#include <link.h>  #include <termios.h>  #include <fcntl.h>  #include <signal.h> @@ -67,17 +71,14 @@  #define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))  #define HD(x)	 (SHA512_Update(&ctx, (char *)&(x), sizeof (x))) -#define HF(x)	 (SHA512_Update(&ctx, (char *)&(x), sizeof (void*))) +#define HF(x)    (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))  int	getentropy(void *buf, size_t len); -#ifdef CAN_REFERENCE_MAIN -extern int main(int, char *argv[]); -#endif -static int gotdata(char *buf, size_t len);  static int getentropy_urandom(void *buf, size_t len, const char *path,      int devfscheck);  static int getentropy_fallback(void *buf, size_t len); +static int getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data);  int  getentropy(void *buf, size_t len) @@ -86,7 +87,7 @@ getentropy(void *buf, size_t len)  	if (len > 256) {  		errno = EIO; -		return -1; +		return (-1);  	}  	/* @@ -153,22 +154,6 @@ getentropy(void *buf, size_t len)  	return (ret);  } -/* - * Basic sanity checking; wish we could do better. - */ -static int -gotdata(char *buf, size_t len) -{ -	char	any_set = 0; -	size_t	i; - -	for (i = 0; i < len; ++i) -		any_set |= buf[i]; -	if (any_set == 0) -		return -1; -	return 0; -} -  static int  getentropy_urandom(void *buf, size_t len, const char *path, int devfscheck)  { @@ -204,7 +189,7 @@ start:  	}  	for (i = 0; i < len; ) {  		size_t wanted = len - i; -		ssize_t ret = read(fd, (char*)buf + i, wanted); +		ssize_t ret = read(fd, (char *)buf + i, wanted);  		if (ret == -1) {  			if (errno == EAGAIN || errno == EINTR) @@ -215,13 +200,11 @@ start:  		i += ret;  	}  	close(fd); -	if (gotdata(buf, len) == 0) { -		errno = save_errno; -		return 0;		/* satisfied */ -	} +	errno = save_errno; +	return (0);		/* satisfied */  nodevrandom:  	errno = EIO; -	return -1; +	return (-1);  }  static const int cl[] = { @@ -250,6 +233,15 @@ static const int cl[] = {  };  static int +getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data) +{ +	SHA512_CTX *ctx = data; + +	SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr)); +	return (0); +} + +static int  getentropy_fallback(void *buf, size_t len)  {  	uint8_t results[SHA512_DIGEST_LENGTH]; @@ -286,6 +278,8 @@ getentropy_fallback(void *buf, size_t len)  				cnt += (int)tv.tv_usec;  			} +			dl_iterate_phdr(getentropy_phdr, &ctx); +  			for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); ii++)  				HX(clock_gettime(cl[ii], &ts) == -1, ts); @@ -306,9 +300,6 @@ getentropy_fallback(void *buf, size_t len)  			HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,  			    sigset); -#ifdef CAN_REFERENCE_MAIN -			HF(main);		/* an addr in program */ -#endif  			HF(getentropy);	/* an addr in this library */  			HF(printf);		/* an addr in libc */  			p = (char *)&p; @@ -428,14 +419,11 @@ getentropy_fallback(void *buf, size_t len)  			HD(cnt);  		}  		SHA512_Final(results, &ctx); -		memcpy((char*)buf + i, results, min(sizeof(results), len - i)); +		memcpy((char *)buf + i, results, min(sizeof(results), len - i));  		i += min(sizeof(results), len - i);  	} -	memset(results, 0, sizeof results); -	if (gotdata(buf, len) == 0) { -		errno = save_errno; -		return 0;		/* satisfied */ -	} -	errno = EIO; -	return -1; +	explicit_bzero(&ctx, sizeof ctx); +	explicit_bzero(results, sizeof results); +	errno = save_errno; +	return (0);		/* satisfied */  }  | 
