diff options
| author | Uros Majstorovic <majstor@majstor.org> | 2017-05-23 14:19:26 +0200 | 
|---|---|---|
| committer | Uros Majstorovic <majstor@majstor.org> | 2017-05-23 14:19:26 +0200 | 
| commit | 3ef6719f47b734b12c0b11c725b7f12e3fb3c08a (patch) | |
| tree | a635ac65bfc72d126d97e48e22c38ac33343b4f4 /code/core/crypto/compat/getentropy_freebsd.c | |
| parent | 922e8313f2b3f6157a61b3c867fdc3832bb92a68 (diff) | |
fs layout updated
Diffstat (limited to 'code/core/crypto/compat/getentropy_freebsd.c')
| -rw-r--r-- | code/core/crypto/compat/getentropy_freebsd.c | 62 | 
1 files changed, 62 insertions, 0 deletions
| diff --git a/code/core/crypto/compat/getentropy_freebsd.c b/code/core/crypto/compat/getentropy_freebsd.c new file mode 100644 index 0000000..30cd68e --- /dev/null +++ b/code/core/crypto/compat/getentropy_freebsd.c @@ -0,0 +1,62 @@ +/*	$OpenBSD: getentropy_freebsd.c,v 1.3 2016/08/07 03:27:21 tb Exp $	*/ + +/* + * Copyright (c) 2014 Pawel Jakub Dawidek <pjd@FreeBSD.org> + * Copyright (c) 2014 Brent Cook <bcook@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * 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 <sys/types.h> +#include <sys/sysctl.h> + +#include <errno.h> +#include <stddef.h> + +/* + * Derived from lib/libc/gen/arc4random.c from FreeBSD. + */ +static size_t +getentropy_sysctl(u_char *buf, size_t size) +{ +	int mib[2]; +	size_t len, done; + +	mib[0] = CTL_KERN; +	mib[1] = KERN_ARND; +	done = 0; + +	do { +		len = size; +		if (sysctl(mib, 2, buf, &len, NULL, 0) == -1) +			return (done); +		done += len; +		buf += len; +		size -= len; +	} while (size > 0); + +	return (done); +} + +int +getentropy(void *buf, size_t len) +{ +	if (len <= 256 && getentropy_sysctl(buf, len) == len) +		return (0); + +	errno = EIO; +	return (-1); +} | 
