From owner-svn-src-head@freebsd.org Fri Apr 19 20:05:50 2019 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E3C48157762E; Fri, 19 Apr 2019 20:05:49 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 85D068FD2D; Fri, 19 Apr 2019 20:05:49 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 73E093490; Fri, 19 Apr 2019 20:05:49 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x3JK5nmY015807; Fri, 19 Apr 2019 20:05:49 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x3JK5mhm015801; Fri, 19 Apr 2019 20:05:48 GMT (envelope-from cem@FreeBSD.org) Message-Id: <201904192005.x3JK5mhm015801@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Fri, 19 Apr 2019 20:05:48 +0000 (UTC) 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 X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: in head: lib/libc/gen share/man/man9 sys/conf sys/libkern sys/sys X-SVN-Commit-Revision: 346410 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 85D068FD2D X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.96 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.96)[-0.962,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US] X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Apr 2019 20:05:50 -0000 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. 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 +#ifdef _KERNEL +#include +#else #include +#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 *));