Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jul 2015 18:45:15 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285549 - in head: share/man/man9 sys/compat/cloudabi sys/dev/random sys/sys
Message-ID:  <201507141845.t6EIjFGh067539@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507141845.t6EIjFGh067539>