svn commit: r285549 - in head: share/man/man9 sys/compat/cloudabi sys/dev/random sys/sys
Ed Schouten
ed at FreeBSD.org
Tue Jul 14 18:45:18 UTC 2015
Author: ed
Date: Tue Jul 14 18:45:15 2015
New Revision: 285549
URL: https://svnweb.freebsd.org/changeset/base/285549
Log:
Implement the CloudABI random_get() system call.
The random_get() system call works similar to getentropy()/getrandom()
on OpenBSD/Linux. It fills a buffer with random data.
This change introduces a new function, read_random_uio(), that is used
to implement read() on the random devices. We can call into this
function from within the CloudABI compatibility layer.
Approved by: secteam
Reviewed by: jmg, markm, wblock
Obtained from: https://github.com/NuxiNL/freebsd
Differential Revision: https://reviews.freebsd.org/D3053
Modified:
head/share/man/man9/Makefile
head/share/man/man9/random.9
head/sys/compat/cloudabi/cloudabi_random.c
head/sys/dev/random/randomdev.c
head/sys/sys/random.h
Modified: head/share/man/man9/Makefile
==============================================================================
--- head/share/man/man9/Makefile Tue Jul 14 18:24:05 2015 (r285548)
+++ head/share/man/man9/Makefile Tue Jul 14 18:45:15 2015 (r285549)
@@ -1281,6 +1281,7 @@ MLINKS+=psignal.9 gsignal.9 \
MLINKS+=random.9 arc4rand.9 \
random.9 arc4random.9 \
random.9 read_random.9 \
+ random.9 read_random_uio.9 \
random.9 srandom.9
MLINKS+=refcount.9 refcount_acquire.9 \
refcount.9 refcount_init.9 \
Modified: head/share/man/man9/random.9
==============================================================================
--- head/share/man/man9/random.9 Tue Jul 14 18:24:05 2015 (r285548)
+++ head/share/man/man9/random.9 Tue Jul 14 18:45:15 2015 (r285549)
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\" "
-.Dd June 30, 2015
+.Dd July 14, 2015
.Dt RANDOM 9
.Os
.Sh NAME
@@ -34,6 +34,7 @@
.Nm arc4random ,
.Nm random ,
.Nm read_random ,
+.Nm read_random_uio ,
.Nm srandom
.Nd supply pseudo-random numbers
.Sh SYNOPSIS
@@ -50,6 +51,8 @@
.In sys/random.h
.Ft int
.Fn read_random "void *buffer" "int count"
+.Ft int
+.Fn read_random_uio "struct uio *uio" "bool nonblock"
.Sh DESCRIPTION
The
.Fn random
@@ -117,11 +120,27 @@ necessary to know
that no entropy
has been returned.
.Pp
+The
+.Fn read_random_uio
+function behaves identically to
+.Xr read 2
+on
+.Pa /dev/random .
+The
+.Fa uio
+argument points to a buffer where random data should be stored.
+This function only returns data if the the random device is seeded.
+It blocks if unseeded,
+except when the
+.Fa nonblock
+argument is true.
+.Pp
All the bits returned by
.Fn random ,
-.Fn arc4rand
+.Fn arc4rand ,
+.Fn read_random ,
and
-.Fn read_random
+.Fn read_random_uio
are usable.
For example,
.Sq Li random()&01
@@ -168,6 +187,22 @@ The
function returns
the number of bytes placed in
.Fa buffer .
+.Pp
+.Fn read_random_uio
+returns zero when successful,
+otherwise an error code is returned.
+.Sh ERRORS
+.Fn read_random_uio
+may fail if:
+.Bl -tag -width Er
+.It Bq Er EFAULT
+.Fa uio
+points to an invalid memory region.
+.It Bq Er EWOULDBLOCK
+The random device is unseeded and
+.Fa nonblock
+is true.
+.El
.Sh AUTHORS
.An Dan Moschuk
wrote
Modified: head/sys/compat/cloudabi/cloudabi_random.c
==============================================================================
--- head/sys/compat/cloudabi/cloudabi_random.c Tue Jul 14 18:24:05 2015 (r285548)
+++ head/sys/compat/cloudabi/cloudabi_random.c Tue Jul 14 18:45:15 2015 (r285549)
@@ -26,13 +26,28 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/random.h>
+#include <sys/uio.h>
+
#include <compat/cloudabi/cloudabi_proto.h>
int
cloudabi_sys_random_get(struct thread *td,
struct cloudabi_sys_random_get_args *uap)
{
+ struct iovec iov = {
+ .iov_base = uap->buf,
+ .iov_len = uap->nbyte
+ };
+ struct uio uio = {
+ .uio_iov = &iov,
+ .uio_iovcnt = 1,
+ .uio_resid = iov.iov_len,
+ .uio_segflg = UIO_USERSPACE,
+ .uio_rw = UIO_READ,
+ .uio_td = td
+ };
- /* Not implemented. */
- return (ENOSYS);
+ return (read_random_uio(&uio, false));
}
Modified: head/sys/dev/random/randomdev.c
==============================================================================
--- head/sys/dev/random/randomdev.c Tue Jul 14 18:24:05 2015 (r285548)
+++ head/sys/dev/random/randomdev.c Tue Jul 14 18:45:15 2015 (r285549)
@@ -152,6 +152,13 @@ static struct selinfo rsel;
static int
randomdev_read(struct cdev *dev __unused, struct uio *uio, int flags)
{
+
+ return (read_random_uio(uio, (flags & O_NONBLOCK) != 0));
+}
+
+int
+read_random_uio(struct uio *uio, bool nonblock)
+{
uint8_t *random_buf;
int error;
ssize_t read_len, total_read, c;
Modified: head/sys/sys/random.h
==============================================================================
--- head/sys/sys/random.h Tue Jul 14 18:24:05 2015 (r285548)
+++ head/sys/sys/random.h Tue Jul 14 18:45:15 2015 (r285549)
@@ -31,7 +31,12 @@
#ifdef _KERNEL
+#include <sys/types.h>
+
+struct uio;
+
u_int read_random(void *, u_int);
+int read_random_uio(struct uio *, bool);
/*
* Note: if you add or remove members of random_entropy_source, remember to also update the
More information about the svn-src-all
mailing list