Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Apr 2019 20:05:48 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r346410 - in head: lib/libc/gen share/man/man9 sys/conf sys/libkern sys/sys
Message-ID:  <201904192005.x3JK5mhm015801@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Fri Apr 19 20:05:47 2019
New Revision: 346410
URL: https://svnweb.freebsd.org/changeset/base/346410

Log:
  libkern: Bring in arc4random_uniform(9) from libc
  
  It is a useful arc4random wrapper in the kernel for much the same reasons as
  in userspace.  Move the source to libkern (because kernel build is
  restricted to sys/, but userspace can include any file it likes) and build
  kernel and libc versions from the same source file.
  
  Copy the documentation from arc4random_uniform(3) to the section 9 page.
  
  While here, add missing arc4random_buf(9) symlink.
  
  Sponsored by:	Dell EMC Isilon

Added:
  head/sys/libkern/arc4random_uniform.c
     - copied, changed from r346409, head/lib/libc/gen/arc4random_uniform.c
Deleted:
  head/lib/libc/gen/arc4random_uniform.c
Modified:
  head/lib/libc/gen/Makefile.inc
  head/share/man/man9/Makefile
  head/share/man/man9/random.9
  head/sys/conf/files
  head/sys/sys/libkern.h

Modified: head/lib/libc/gen/Makefile.inc
==============================================================================
--- head/lib/libc/gen/Makefile.inc	Fri Apr 19 19:45:19 2019	(r346409)
+++ head/lib/libc/gen/Makefile.inc	Fri Apr 19 20:05:47 2019	(r346410)
@@ -3,6 +3,7 @@
 
 # machine-independent gen sources
 .PATH: ${LIBC_SRCTOP}/${LIBC_ARCH}/gen ${LIBC_SRCTOP}/gen
+.PATH: ${SRCTOP}/sys/libkern
 
 CONFS=	shells
 

Modified: head/share/man/man9/Makefile
==============================================================================
--- head/share/man/man9/Makefile	Fri Apr 19 19:45:19 2019	(r346409)
+++ head/share/man/man9/Makefile	Fri Apr 19 20:05:47 2019	(r346410)
@@ -1668,6 +1668,8 @@ MLINKS+=psignal.9 gsignal.9 \
 	psignal.9 tdsignal.9
 MLINKS+=random.9 arc4rand.9 \
 	random.9 arc4random.9 \
+	random.9 arc4random_buf.9 \
+	random.9 arc4random_uniform.9 \
 	random.9 is_random_seeded.9 \
 	random.9 read_random.9 \
 	random.9 read_random_uio.9 \

Modified: head/share/man/man9/random.9
==============================================================================
--- head/share/man/man9/random.9	Fri Apr 19 19:45:19 2019	(r346409)
+++ head/share/man/man9/random.9	Fri Apr 19 20:05:47 2019	(r346410)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\" "
-.Dd April 16, 2019
+.Dd April 19, 2019
 .Dt RANDOM 9
 .Os
 .Sh NAME
@@ -45,6 +45,8 @@
 .Fn arc4random "void"
 .Ft void
 .Fn arc4random_buf "void *ptr" "size_t len"
+.Ft uint32_t
+.Fn arc4random_uniform "uint32_t upper_bound"
 .Ft void
 .Fn arc4rand "void *ptr" "u_int length" "int reseed"
 .Pp
@@ -79,6 +81,15 @@ fills
 with
 .Fa len
 bytes of random data.
+.Pp
+.Fn arc4random_uniform
+will return a single 32-bit value, uniformly distributed but less than
+.Fa upper_bound .
+This is recommended over constructions like
+.Dq Li arc4random() % upper_bound
+as it avoids "modulo bias" when the upper bound is not a power of two.
+In the worst case, this function may consume multiple iterations
+to ensure uniformity.
 .Pp
 The
 .Fn arc4rand

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Fri Apr 19 19:45:19 2019	(r346409)
+++ head/sys/conf/files	Fri Apr 19 20:05:47 2019	(r346410)
@@ -3985,6 +3985,7 @@ kgssapi/gsstest.c		optional kgssapi_debug
 # the file should be moved to conf/files.<arch> from here.
 #
 libkern/arc4random.c		standard
+libkern/arc4random_uniform.c	standard
 crypto/chacha20/chacha.c	standard
 libkern/asprintf.c		standard
 libkern/bcd.c			standard

Copied and modified: head/sys/libkern/arc4random_uniform.c (from r346409, head/lib/libc/gen/arc4random_uniform.c)
==============================================================================
--- head/lib/libc/gen/arc4random_uniform.c	Fri Apr 19 19:45:19 2019	(r346409, copy source)
+++ head/sys/libkern/arc4random_uniform.c	Fri Apr 19 20:05:47 2019	(r346410)
@@ -19,7 +19,11 @@
  */
 
 #include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/libkern.h>
+#else
 #include <stdlib.h>
+#endif
 
 /*
  * Calculate a uniformly distributed random number less than upper_bound

Modified: head/sys/sys/libkern.h
==============================================================================
--- head/sys/sys/libkern.h	Fri Apr 19 19:45:19 2019	(r346409)
+++ head/sys/sys/libkern.h	Fri Apr 19 20:05:47 2019	(r346410)
@@ -128,6 +128,7 @@ struct malloc_type;
 uint32_t arc4random(void);
 void	 arc4random_buf(void *, size_t);
 void	 arc4rand(void *, u_int, int);
+uint32_t arc4random_uniform(uint32_t);
 int	 timingsafe_bcmp(const void *, const void *, size_t);
 void	*bsearch(const void *, const void *, size_t,
 	    size_t, int (*)(const void *, const void *));



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