skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

commit 4e75b40d8a96c5d51490ddea43566fe8e6d4168c
parent 1fedaae65b56b8548cdf2d8c26e2becece5fec07
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Sat,  9 Apr 2022 02:28:05 +0000

 Prepare for 2.12.0.0. librandom revamp.

Signed-off-by: Laurent Bercot <ska@appnovation.com>

Diffstat:
MAUTHORS | 3++-
MCOPYING | 2+-
MNEWS | 10++++++++++
Mdoc/index.html | 2+-
Mdoc/license.html | 2+-
Mdoc/upgrade.html | 11+++++++++++
Mpackage/deps.mak | 25++++++++++---------------
Mpackage/info | 2+-
Msrc/include/skalibs/functypes.h | 6++++++
Msrc/include/skalibs/random.h | 28++++++++++++++++++----------
Msrc/libposixplz/mkfiletemp.c | 4++--
Msrc/librandom/autosurf.c | 48+++++++++++++++++++++++++++++++++++++++++++++---
Dsrc/librandom/autosurf_name.c | 10----------
Msrc/librandom/random-internal.h | 10++++------
Asrc/librandom/random_buf.c | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/librandom/random_buf_early.c | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/librandom/random_char.c | 10----------
Asrc/librandom/random_devurandom.c | 22++++++++++++++++++++++
Dsrc/librandom/random_finish.c | 45---------------------------------------------
Dsrc/librandom/random_init.c | 72------------------------------------------------------------------------
Dsrc/librandom/random_makeseed.c | 43-------------------------------------------
Dsrc/librandom/random_name.c | 10----------
Asrc/librandom/random_name_from.c | 11+++++++++++
Dsrc/librandom/random_oklist.c | 6------
Dsrc/librandom/random_sauniquename.c | 21---------------------
Asrc/librandom/random_sauniquename_from.c | 21+++++++++++++++++++++
Dsrc/librandom/random_string.c | 60------------------------------------------------------------
Dsrc/librandom/random_uint32.c | 37-------------------------------------
Asrc/librandom/random_uint32_from.c | 20++++++++++++++++++++
Dsrc/librandom/random_unsort.c | 17-----------------
Asrc/librandom/random_unsort_from.c | 18++++++++++++++++++
31 files changed, 313 insertions(+), 372 deletions(-)

diff --git a/AUTHORS b/AUTHORS @@ -12,7 +12,7 @@ Contributors: John Regan <john@jrjrtech.com> Shengjing Zhu <zhsj@debian.org> Colin Booth <colin@heliocat.net> - Petr Vaněk <arkamar@atlas.cz> + Petr Vanek <arkamar@atlas.cz> Thanks to: Jean Marot <jean.marot@skarnet.org> @@ -41,3 +41,4 @@ Thanks to: Alex Raschi <raschi.alex@gmail.com> Josuah Demangeon <me@josuah.net> Xavier Stonestreet <xstonestreet@gmail.com> + Jason Donenfeld <jason@zx2c4.com> diff --git a/COPYING b/COPYING @@ -1,4 +1,4 @@ -Copyright (c) 2011-2021 Laurent Bercot <ska-skaware@skarnet.org> +Copyright (c) 2011-2022 Laurent Bercot <ska-skaware@skarnet.org> Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/NEWS b/NEWS @@ -1,5 +1,15 @@ Changelog for skalibs. +In 2.12.0.0 +----------- + + - librandom revamped (again). + * random_init() and random_finish() removed. + * random_char() removed. + * random_string() renamed to random_buf(). + * early versions added. + + In 2.11.2.0 ----------- diff --git a/doc/index.html b/doc/index.html @@ -60,7 +60,7 @@ with a standard C development environment </li> <h3> Download </h3> <ul> - <li> The current released version of skalibs is <a href="skalibs-2.11.2.0.tar.gz">2.11.2.0</a>. </li> + <li> The current released version of skalibs is <a href="skalibs-2.12.0.0.tar.gz">2.12.0.0</a>. </li> <li> Alternatively, you can checkout a copy of the <a href="//git.skarnet.org/cgi-bin/cgit.cgi/skalibs/">skalibs git repository</a>: diff --git a/doc/license.html b/doc/license.html @@ -74,7 +74,7 @@ color, or different text font. </li> <p> <em>I am aware that the previous restrictions sound completely ridiculous while the official skalibs documentation is incomplete. -As of 2.11.0.0, I'm not going to enforce those restrictions, but if you're +As of 2.12.0.0, I'm not going to enforce those restrictions, but if you're going to provide documentation for skalibs, don't keep it to yourself, please send it to me instead. :-) </em> </p> diff --git a/doc/upgrade.html b/doc/upgrade.html @@ -16,6 +16,17 @@ <a href="//skarnet.org/">skarnet.org</a> </p> +<h2> in 2.12.0.0 </h2> + +<ul> + <li> <tt>random_init()</tt> and <tt>random_finish()</tt> removed, +as well as <tt>random_char()</tt>. </li> + <li> <tt>random_string()</tt> renamed to <tt>random_buf()</tt>. </li> + <li> random functions now have an <tt>early</tt> version, to use when +randomness is required before the generator can be seeded (i.e. in +programs running in the very early boot). </li> +</ul> + <h2> in 2.11.2.0 </h2> <ul> diff --git a/package/deps.mak b/package/deps.mak @@ -34,7 +34,7 @@ src/include/skalibs/lolstdio.h: src/include/skalibs/bufalloc.h src/include/skali src/include/skalibs/netstring.h: src/include/skalibs/buffer.h src/include/skalibs/stralloc.h src/include/skalibs/posixishard.h: src/include/skalibs/gccattributes.h src/include/skalibs/posixplz.h: src/include/skalibs/functypes.h src/include/skalibs/gccattributes.h -src/include/skalibs/random.h: src/include/skalibs/stralloc.h +src/include/skalibs/random.h: src/include/skalibs/functypes.h src/include/skalibs/stralloc.h src/include/skalibs/setgroups.h: src/include/skalibs/sysdeps.h src/include/skalibs/sha512.h: src/include/skalibs/uint64.h src/include/skalibs/sig.h: src/include/skalibs/gccattributes.h @@ -58,7 +58,6 @@ src/include/skalibs/unixonacid.h: src/include/skalibs/ancil.h src/include/skalib src/libdatastruct/avlnode-internal.h: src/include/skalibs/avlnode.h src/libdatastruct/genqdyn-internal.h: src/include/skalibs/genqdyn.h src/libenvexec/envdir-internal.h: src/include/skalibs/stralloc.h -src/librandom/random-internal.h: src/include/skalibs/surf.h src/libstdcrypto/sha1-internal.h: src/include/skalibs/sha1.h src/libstdcrypto/sha256-internal.h: src/include/skalibs/sha256.h src/libstdcrypto/sha512-internal.h: src/include/skalibs/sha512.h @@ -157,7 +156,7 @@ src/libposixplz/getpeereid.o src/libposixplz/getpeereid.lo: src/libposixplz/getp src/libposixplz/memmem.o src/libposixplz/memmem.lo: src/libposixplz/memmem.c src/include/skalibs/posixplz.h src/include/skalibs/sysdeps.h src/libposixplz/mkbtemp.o src/libposixplz/mkbtemp.lo: src/libposixplz/mkbtemp.c src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h src/libposixplz/mkctemp.o src/libposixplz/mkctemp.lo: src/libposixplz/mkctemp.c src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h -src/libposixplz/mkfiletemp.o src/libposixplz/mkfiletemp.lo: src/libposixplz/mkfiletemp.c src/include/skalibs/posixplz.h src/include/skalibs/surf.h +src/libposixplz/mkfiletemp.o src/libposixplz/mkfiletemp.lo: src/libposixplz/mkfiletemp.c src/include/skalibs/posixplz.h src/include/skalibs/random.h src/libposixplz/mkhtemp.o src/libposixplz/mkhtemp.lo: src/libposixplz/mkhtemp.c src/include/skalibs/posixplz.h src/libposixplz/mklinktemp.o src/libposixplz/mklinktemp.lo: src/libposixplz/mklinktemp.c src/include/skalibs/djbunix.h src/libposixplz/posixplz-internal.h src/include/skalibs/posixplz.h src/libposixplz/mkltemp.o src/libposixplz/mkltemp.lo: src/libposixplz/mkltemp.c src/include/skalibs/posixplz.h @@ -168,18 +167,14 @@ src/libposixplz/setgroups.o src/libposixplz/setgroups.lo: src/libposixplz/setgro src/libposixplz/strnlen.o src/libposixplz/strnlen.lo: src/libposixplz/strnlen.c src/include/skalibs/bytestr.h src/include/skalibs/posixishard.h src/include/skalibs/sysdeps.h src/libposixplz/touch.o src/libposixplz/touch.lo: src/libposixplz/touch.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/posixplz.h src/include/skalibs/sysdeps.h src/libposixplz/unlink_void.o src/libposixplz/unlink_void.lo: src/libposixplz/unlink_void.c src/include/skalibs/posixplz.h -src/librandom/autosurf.o src/librandom/autosurf.lo: src/librandom/autosurf.c src/include/skalibs/random.h src/include/skalibs/surf.h -src/librandom/autosurf_name.o src/librandom/autosurf_name.lo: src/librandom/autosurf_name.c src/librandom/random-internal.h src/include/skalibs/surf.h -src/librandom/random_char.o src/librandom/random_char.lo: src/librandom/random_char.c src/include/skalibs/random.h -src/librandom/random_finish.o src/librandom/random_finish.lo: src/librandom/random_finish.c src/include/skalibs/djbunix.h src/librandom/random-internal.h src/include/skalibs/random.h src/include/skalibs/sysdeps.h -src/librandom/random_init.o src/librandom/random_init.lo: src/librandom/random_init.c src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/librandom/random-internal.h src/include/skalibs/random.h src/include/skalibs/surf.h src/include/skalibs/sysdeps.h -src/librandom/random_makeseed.o src/librandom/random_makeseed.lo: src/librandom/random_makeseed.c src/include/skalibs/sha1.h src/include/skalibs/tai.h src/include/skalibs/uint32.h -src/librandom/random_name.o src/librandom/random_name.lo: src/librandom/random_name.c src/librandom/random-internal.h src/include/skalibs/random.h -src/librandom/random_oklist.o src/librandom/random_oklist.lo: src/librandom/random_oklist.c src/librandom/random-internal.h -src/librandom/random_sauniquename.o src/librandom/random_sauniquename.lo: src/librandom/random_sauniquename.c src/include/skalibs/random.h src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h -src/librandom/random_string.o src/librandom/random_string.lo: src/librandom/random_string.c src/include/skalibs/allreadwrite.h src/include/skalibs/nonposix.h src/librandom/random-internal.h src/include/skalibs/random.h src/include/skalibs/sysdeps.h -src/librandom/random_uint32.o src/librandom/random_uint32.lo: src/librandom/random_uint32.c src/include/skalibs/nonposix.h src/include/skalibs/random.h src/include/skalibs/sysdeps.h src/include/skalibs/uint32.h -src/librandom/random_unsort.o src/librandom/random_unsort.lo: src/librandom/random_unsort.c src/include/skalibs/random.h +src/librandom/autosurf.o src/librandom/autosurf.lo: src/librandom/autosurf.c src/include/skalibs/random.h src/include/skalibs/sha1.h src/include/skalibs/surf.h src/include/skalibs/tai.h src/include/skalibs/uint32.h +src/librandom/random_buf.o src/librandom/random_buf.lo: src/librandom/random_buf.c src/include/skalibs/nonposix.h src/librandom/random-internal.h src/include/skalibs/random.h src/include/skalibs/surf.h src/include/skalibs/sysdeps.h +src/librandom/random_buf_early.o src/librandom/random_buf_early.lo: src/librandom/random_buf_early.c src/include/skalibs/nonposix.h src/librandom/random-internal.h src/include/skalibs/random.h src/include/skalibs/surf.h src/include/skalibs/sysdeps.h +src/librandom/random_devurandom.o src/librandom/random_devurandom.lo: src/librandom/random_devurandom.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/random.h src/include/skalibs/strerr2.h +src/librandom/random_name_from.o src/librandom/random_name_from.lo: src/librandom/random_name_from.c src/include/skalibs/functypes.h src/include/skalibs/random.h +src/librandom/random_sauniquename_from.o src/librandom/random_sauniquename_from.lo: src/librandom/random_sauniquename_from.c src/include/skalibs/random.h src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h +src/librandom/random_uint32_from.o src/librandom/random_uint32_from.lo: src/librandom/random_uint32_from.c src/include/skalibs/functypes.h src/include/skalibs/random.h src/include/skalibs/uint32.h +src/librandom/random_unsort_from.o src/librandom/random_unsort_from.lo: src/librandom/random_unsort_from.c src/include/skalibs/random.h src/librandom/surf.o src/librandom/surf.lo: src/librandom/surf.c src/include/skalibs/surf.h src/include/skalibs/uint32.h src/librandom/surf_init.o src/librandom/surf_init.lo: src/librandom/surf_init.c src/include/skalibs/surf.h src/include/skalibs/uint32.h src/libstdcrypto/sha1_feed.o src/libstdcrypto/sha1_feed.lo: src/libstdcrypto/sha1_feed.c src/include/skalibs/bytestr.h src/libstdcrypto/sha1-internal.h src/include/skalibs/sha1.h diff --git a/package/info b/package/info @@ -1,4 +1,4 @@ package=skalibs -version=2.11.2.0 +version=2.12.0.0 category=prog package_macro_name=SKALIBS diff --git a/src/include/skalibs/functypes.h b/src/include/skalibs/functypes.h @@ -58,4 +58,10 @@ typedef create_func *create_func_ref ; typedef int link_func (char const *, char const *) ; typedef link_func *link_func_ref ; +typedef void randomgen_func (char *, size_t) ; +typedef randomgen_func *randomgen_func_ref ; + +typedef uint32_t uint32_func (uint32_t) ; +typedef uint32_func *uint32_func_ref ; + #endif diff --git a/src/include/skalibs/random.h b/src/include/skalibs/random.h @@ -3,21 +3,29 @@ #ifndef SKALIBS_RANDOM_H #define SKALIBS_RANDOM_H -#include <sys/types.h> +#include <stddef.h> #include <stdint.h> +#include <skalibs/functypes.h> #include <skalibs/stralloc.h> -extern void random_makeseed (char *) ; /* fills 160 bytes */ +extern void random_buf (char *, size_t) ; +extern void random_buf_early (char *, size_t) ; -extern int random_init (void) ; -extern void random_finish (void) ; +extern uint32_t random_uint32_from (uint32_t, randomgen_func_ref) ; +#define random_uint32(n) random_uint32_from((n), &random_buf) +#define random_uint32_early(n) random_uint32_from((n), &random_buf_early) -extern unsigned char random_char (void) ; -extern void random_string (char *, size_t) ; -extern uint32_t random_uint32 (uint32_t) ; -extern void random_name (char *, size_t) ; -extern void random_unsort (char *, size_t, size_t) ; -extern int random_sauniquename (stralloc *, size_t) ; +extern void random_name_from (char *, size_t, randomgen_func_ref) ; +#define random_name(s, n) random_name_from(s, (n), &random_buf) +#define random_name_early(s, n) random_name_from(s, (n), &random_buf_early) + +extern void random_unsort_from (char *, size_t, size_t, randomgen_func_ref) ; +#define random_unsort(s, n, c) random_unsort_from(s, n, (c), &random_buf) +#define random_unsort_early(s, n, c) random_unsort_from(s, n, (c), &random_buf_early) + +extern int random_sauniquename_from (stralloc *, size_t, randomgen_func_ref) ; +#define random_sauniquename(sa, n) random_sauniquename_from(sa, (n), &random_buf) +#define random_sauniquename_early(sa, n) random_sauniquename_from(sa, (n), &random_buf_early) #endif diff --git a/src/libposixplz/mkfiletemp.c b/src/libposixplz/mkfiletemp.c @@ -3,7 +3,7 @@ #include <string.h> #include <errno.h> -#include <skalibs/surf.h> +#include <skalibs/random.h> #include <skalibs/posixplz.h> int mkfiletemp (char *s, create_func_ref f, mode_t mode, void *data) @@ -15,7 +15,7 @@ int mkfiletemp (char *s, create_func_ref f, mode_t mode, void *data) if (xlen < 6) return (errno = EINVAL, -1) ; do { - autosurf_name(s + len - xlen, xlen) ; + random_name_early(s + len - xlen, xlen) ; r = (*f)(s, mode, data) ; } while (r == -1 && errno == EEXIST) ; return r ; diff --git a/src/librandom/autosurf.c b/src/librandom/autosurf.c @@ -1,17 +1,59 @@ /* ISC license. */ +#include <unistd.h> +#include <stdint.h> + +#include <skalibs/uint32.h> +#include <skalibs/tai.h> +#include <skalibs/sha1.h> #include <skalibs/random.h> #include <skalibs/surf.h> +/* + Writes 160 bytes of crap into s. + Certainly not cryptographically secure or 100% unpredictable, + but we're only using this to seed a fallback internal PRNG. +*/ + +static void makeseed (char *s) +{ + SHA1Schedule bak = SHA1_INIT() ; + { + tain now ; + char tmp[256] ; + uint32_t x = getpid() ; + uint32_pack(tmp, x) ; /* if valgrind sends you here, tell it to stfu */ + x = getppid() ; + uint32_pack(tmp + 4, x) ; + tain_now(&now) ; + tain_pack(tmp + 8, &now) ; + sha1_update(&bak, tmp, 8 + TAIN_PACK) ; + gethostname(tmp, 256) ; + sha1_update(&bak, tmp, 256) ; + sha1_final(&bak, tmp) ; + sha1_init(&bak) ; + sha1_update(&bak, tmp, 20) ; + } + { + char i = 0 ; + for (; i < 8 ; i++) + { + SHA1Schedule ctx = bak ; + sha1_update(&ctx, &i, 1) ; + sha1_final(&ctx, s + 20*i) ; + } + } +} + void autosurf (char *s, size_t n) { static SURFSchedule ctx = SURFSCHEDULE_ZERO ; static int need4seed = 1 ; if (need4seed) { - char tmp[160] ; - random_makeseed(tmp) ; - surf_init(&ctx, tmp) ; + char seed[160] ; + makeseed(seed) ; + surf_init(&ctx, seed) ; need4seed = 0 ; } surf(&ctx, s, n) ; diff --git a/src/librandom/autosurf_name.c b/src/librandom/autosurf_name.c @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include <skalibs/surf.h> -#include "random-internal.h" - -void autosurf_name (char *s, size_t n) -{ - autosurf(s, n) ; - while (n--) s[n] = random_oklist[s[n] & 63] ; -} diff --git a/src/librandom/random-internal.h b/src/librandom/random-internal.h @@ -1,12 +1,10 @@ /* ISC license. */ -#ifndef RANDOM_INTERNAL_H -#define RANDOM_INTERNAL_H +#ifndef SKALIBS_RANDOM_INTERNAL_H +#define SKALIBS_RANDOM_INTERNAL_H -#include <skalibs/surf.h> +#include <stddef.h> -extern char const *random_oklist ; -extern int random_fd ; -extern SURFSchedule surf_here ; +extern void random_devurandom (char *, size_t) ; #endif diff --git a/src/librandom/random_buf.c b/src/librandom/random_buf.c @@ -0,0 +1,55 @@ +/* ISC license. */ + +#include <skalibs/sysdeps.h> + +#if defined(SKALIBS_HASARC4RANDOM) + +#include <skalibs/nonposix.h> +#include <stdlib.h> + +#include <skalibs/random.h> + +void random_buf (char *s, size_t n) +{ + arc4random_buf(s, n) ; +} + +#elif defined(SKALIBS_HASGETRANDOM) + +#include <sys/random.h> + +#include <skalibs/random.h> + +void random_buf (char *s, size_t n) +{ + while (n) + { + ssize_t r = getrandom(s, n, 0) ; + if (r >= 0) + { + s += r ; + n -= r ; + } + } +} + +#elif defined(SKALIBS_HASDEVURANDOM) + +#include "random-internal.h" + +void random_buf (char *s, size_t n) +{ + random_devurandom(s, n) ; +} + +#else + +#include <skalibs/surf.h> +#include <skalibs/random.h> + +void random_buf (char *s, size_t n) +{ + autosurf(s, n) ; +} + +#endif diff --git a/src/librandom/random_buf_early.c b/src/librandom/random_buf_early.c @@ -0,0 +1,54 @@ +/* ISC license. */ + +#include <skalibs/sysdeps.h> + +#if defined(SKALIBS_HASARC4RANDOM) + +#include <skalibs/nonposix.h> +#include <stdlib.h> +#include <skalibs/random.h> + +void random_buf_early (char *s, size_t n) +{ + arc4random_buf(s, n) ; +} + +#elif defined(SKALIBS_HASGETRANDOM) && defined(SKALIBS_HASGRNDINSECURE) + +#include <sys/random.h> + +#include <skalibs/random.h> + +void random_buf_early (char *s, size_t n) +{ + while (n) + { + ssize_t r = getrandom(s, n, GRND_INSECURE) ; + if (r >= 0) + { + s += r ; + n -= r ; + } + } +} + +#elif defined(SKALIBS_HASDEVURANDOM) + +#include "random-internal.h" + +void random_buf_early (char *s, size_t n) +{ + random_devurandom(s, n) ; +} + +#else + +#include <skalibs/surf.h> +#include <skalibs/random.h> + +void random_buf_early (char *s, size_t n) +{ + autosurf(s, n) ; +} + +#endif diff --git a/src/librandom/random_char.c b/src/librandom/random_char.c @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include <skalibs/random.h> - -unsigned char random_char (void) -{ - unsigned char c ; - random_string((char *)&c, 1) ; - return c ; -} diff --git a/src/librandom/random_devurandom.c b/src/librandom/random_devurandom.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include <stddef.h> + +#include <skalibs/allreadwrite.h> +#include <skalibs/strerr2.h> +#include <skalibs/djbunix.h> +#include <skalibs/random.h> + +void random_devurandom (char *s, size_t n) +{ + static int random_fd = -1 ; + size_t r ; + if (random_fd < 0) + { + random_fd = openbc_read("/dev/urandom") ; + if (random_fd < 0) + strerr_diefu2sys(111, "open ", "/dev/urandom") ; + } + r = allread(random_fd, s, n) ; + if (r < n) strerr_diefu2sys(111, "read from ", "/dev/urandom") ; +} diff --git a/src/librandom/random_finish.c b/src/librandom/random_finish.c @@ -1,45 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASARC4RANDOM - -#include <skalibs/random.h> - -void random_finish () -{ -} - -#else -#ifdef SKALIBS_HASGETRANDOM - -#include <skalibs/random.h> - -void random_finish () -{ -} - -#else -#ifdef SKALIBS_HASDEVURANDOM - -#include <skalibs/djbunix.h> -#include <skalibs/random.h> -#include "random-internal.h" - -void random_finish () -{ - fd_close(random_fd) ; - random_fd = -1 ; -} - -#else /* default */ - -#include <skalibs/random.h> - -void random_finish () -{ -} - -#endif -#endif -#endif diff --git a/src/librandom/random_init.c b/src/librandom/random_init.c @@ -1,72 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASARC4RANDOM - -#include <skalibs/nonposix.h> -#include <stdlib.h> - -#include <skalibs/random.h> - -int random_init () -{ -#ifdef SKALIBS_HASARC4RANDOM_ADDRANDOM - char seed[160] ; - random_makeseed(seed) ; - arc4random_addrandom((unsigned char *)seed, 160) ; -#endif - return 1 ; -} - -#else -#ifdef SKALIBS_HASGETRANDOM - -#include <skalibs/random.h> - -int random_init () -{ - return 1 ; -} - -#else - -#include <skalibs/surf.h> -#include <skalibs/random.h> -#include "random-internal.h" - -SURFSchedule surf_here = SURFSCHEDULE_ZERO ; - -#ifdef SKALIBS_HASDEVURANDOM - -#include <errno.h> - -#include <skalibs/djbunix.h> - -int random_fd = -1 ; - -int random_init () -{ - if (random_fd >= 0) return 1 ; - random_fd = openc_readb("/dev/urandom") ; - return random_fd >= 0 ; -} - -#else /* default */ - -int random_init () -{ - static int initted = 0 ; - if (!initted) - { - char seed[160] ; - initted = 1 ; - random_makeseed(seed) ; - surf_init(&surf_here, seed) ; - } - return 1 ; -} - -#endif -#endif -#endif diff --git a/src/librandom/random_makeseed.c b/src/librandom/random_makeseed.c @@ -1,43 +0,0 @@ -/* ISC license. */ - -#include <unistd.h> -#include <stdint.h> -#include <skalibs/uint32.h> -#include <skalibs/tai.h> -#include <skalibs/sha1.h> - -/* - Writes 160 bytes of crap into s. - Certainly not cryptographically secure or 100% unpredictable, - but we're only using this to seed an internal PRNG. -*/ - -void random_makeseed (char *s) -{ - SHA1Schedule bak = SHA1_INIT() ; - { - tain now ; - char tmp[256] ; - uint32_t x = getpid() ; - uint32_pack(tmp, x) ; - x = getppid() ; - uint32_pack(tmp + 4, x) ; - tain_now(&now) ; - tain_pack(tmp + 8, &now) ; - sha1_update(&bak, tmp, 8 + TAIN_PACK) ; - gethostname(tmp, 256) ; - sha1_update(&bak, tmp, 256) ; - sha1_final(&bak, tmp) ; - sha1_init(&bak) ; - sha1_update(&bak, tmp, 20) ; - } - { - char i = 0 ; - for (; i < 8 ; i++) - { - SHA1Schedule ctx = bak ; - sha1_update(&ctx, &i, 1) ; - sha1_final(&ctx, s + 20*i) ; - } - } -} diff --git a/src/librandom/random_name.c b/src/librandom/random_name.c @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include <skalibs/random.h> -#include "random-internal.h" - -void random_name (char *s, size_t n) -{ - random_string(s, n) ; - while (n--) s[n] = random_oklist[s[n] & 63] ; -} diff --git a/src/librandom/random_name_from.c b/src/librandom/random_name_from.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include <skalibs/functypes.h> +#include <skalibs/random.h> + +void random_name_from (char *s, size_t n, randomgen_func_ref f) +{ + static char const random_oklist[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz-_0123456789abcdef" ; + (*f)(s, n) ; + while (n--) s[n] = random_oklist[s[n] & 63] ; +} diff --git a/src/librandom/random_oklist.c b/src/librandom/random_oklist.c @@ -1,6 +0,0 @@ -/* ISC license. */ - -#include "random-internal.h" - -static char const random_oklist_[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz-_0123456789abcdef" ; -char const *random_oklist = random_oklist_ ; diff --git a/src/librandom/random_sauniquename.c b/src/librandom/random_sauniquename.c @@ -1,21 +0,0 @@ -/* ISC license. */ - -#include <skalibs/stralloc.h> -#include <skalibs/skamisc.h> -#include <skalibs/random.h> - -int random_sauniquename (stralloc *sa, size_t n) -{ - size_t base = sa->len ; - int wasnull = !sa->s ; - if (!sauniquename(sa)) return 0 ; - if (!stralloc_readyplus(sa, n+1)) goto err ; - stralloc_catb(sa, ":", 1) ; - random_name(sa->s + sa->len, n) ; - sa->len += n ; - return 1 ; - -err: - if (wasnull) stralloc_free(sa) ; else sa->len = base ; - return 0 ; -} diff --git a/src/librandom/random_sauniquename_from.c b/src/librandom/random_sauniquename_from.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include <skalibs/stralloc.h> +#include <skalibs/skamisc.h> +#include <skalibs/random.h> + +int random_sauniquename_from (stralloc *sa, size_t n, randomgen_func_ref f) +{ + size_t base = sa->len ; + int wasnull = !sa->s ; + if (!sauniquename(sa)) return 0 ; + if (!stralloc_readyplus(sa, n+1)) goto err ; + stralloc_catb(sa, ":", 1) ; + random_name_from(sa->s + sa->len, n, f) ; + sa->len += n ; + return 1 ; + +err: + if (wasnull) stralloc_free(sa) ; else sa->len = base ; + return 0 ; +} diff --git a/src/librandom/random_string.c b/src/librandom/random_string.c @@ -1,60 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASARC4RANDOM - -#include <skalibs/nonposix.h> -#include <stdlib.h> -#include <skalibs/random.h> - -void random_string (char *s, size_t n) -{ - arc4random_buf(s, n) ; -} - -#else -#ifdef SKALIBS_HASGETRANDOM - -#include <sys/random.h> -#include <skalibs/random.h> - -void random_string (char *s, size_t n) -{ - while (n) - { - ssize_t r = getrandom(s, n, 0) ; - if (r >= 0) - { - s += r ; - n -= r ; - } - } -} - -#else -#ifdef SKALIBS_HASDEVURANDOM - -#include <skalibs/allreadwrite.h> -#include <skalibs/random.h> -#include "random-internal.h" - -void random_string (char *s, size_t n) -{ - size_t r = allread(random_fd, s, n) ; - if (r < n) surf(&surf_here, s+r, n-r) ; -} - -#else /* default */ - -#include <skalibs/random.h> -#include "random-internal.h" - -void random_string (char *s, size_t n) -{ - surf(&surf_here, s, n) ; -} - -#endif -#endif -#endif diff --git a/src/librandom/random_uint32.c b/src/librandom/random_uint32.c @@ -1,37 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASARC4RANDOM - -#include <skalibs/nonposix.h> -#include <stdint.h> -#include <stdlib.h> -#include <skalibs/random.h> - -uint32_t random_uint32 (uint32_t n) -{ - return arc4random_uniform(n) ; -} - -#else - -#include <skalibs/uint32.h> -#include <skalibs/random.h> - -uint32_t random_uint32 (uint32_t n) -{ - uint32_t min, x ; - if (n < 2) return 0 ; - min = -n % n ; - for (;;) - { - char tmp[4] ; - random_string(tmp, 4) ; - uint32_unpack_big(tmp, &x) ; - if (x >= min) break ; - } - return x % n ; -} - -#endif diff --git a/src/librandom/random_uint32_from.c b/src/librandom/random_uint32_from.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include <skalibs/uint32.h> +#include <skalibs/functypes.h> +#include <skalibs/random.h> + +uint32_t random_uint32_from (uint32_t n, randomgen_func_ref f) +{ + uint32_t min, x ; + if (n < 2) return 0 ; + min = -n % n ; + for (;;) + { + char tmp[4] ; + (*f)(tmp, 4) ; + uint32_unpack_big(tmp, &x) ; + if (x >= min) break ; + } + return x % n ; +} diff --git a/src/librandom/random_unsort.c b/src/librandom/random_unsort.c @@ -1,17 +0,0 @@ -/* ISC license. */ - -#include <stdint.h> -#include <string.h> -#include <skalibs/random.h> - -void random_unsort (char *s, size_t n, size_t chunksize) -{ - char tmp[chunksize] ; - while (n--) - { - uint32_t i = random_uint32(n+1) ; - memcpy(tmp, s + i * chunksize, chunksize) ; - memcpy(s + i * chunksize, s + n * chunksize, chunksize) ; - memcpy(s + n * chunksize, tmp, chunksize) ; - } -} diff --git a/src/librandom/random_unsort_from.c b/src/librandom/random_unsort_from.c @@ -0,0 +1,18 @@ +/* ISC license. */ + +#include <stdint.h> +#include <string.h> + +#include <skalibs/random.h> + +void random_unsort_from (char *s, size_t n, size_t chunksize, randomgen_func_ref f) +{ + char tmp[chunksize] ; + while (n--) + { + uint32_t i = random_uint32_from(n+1, f) ; + memcpy(tmp, s + i * chunksize, chunksize) ; + memcpy(s + i * chunksize, s + n * chunksize, chunksize) ; + memcpy(s + n * chunksize, tmp, chunksize) ; + } +}