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
This commit is contained in:
Ed Schouten 2015-07-14 18:45:15 +00:00
parent 02d131ad11
commit 707d98fe2f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=285549
5 changed files with 68 additions and 5 deletions

View File

@ -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 \

View File

@ -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

View File

@ -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));
}

View File

@ -151,6 +151,13 @@ static struct selinfo rsel;
/* ARGSUSED */
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;

View File

@ -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