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:
parent
02d131ad11
commit
707d98fe2f
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user