svn commit: r346410 - in head: lib/libc/gen share/man/man9 sys/conf sys/libkern sys/sys
Conrad Meyer
cem at FreeBSD.org
Fri Apr 19 20:05:50 UTC 2019
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 *));
More information about the svn-src-all
mailing list