From 4e75b40d8a96c5d51490ddea43566fe8e6d4168c Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sat, 9 Apr 2022 02:28:05 +0000 Subject: Prepare for 2.12.0.0. librandom revamp. Signed-off-by: Laurent Bercot --- src/include/skalibs/functypes.h | 6 +++ src/include/skalibs/random.h | 28 ++++++++----- src/libposixplz/mkfiletemp.c | 4 +- src/librandom/autosurf.c | 48 +++++++++++++++++++-- src/librandom/autosurf_name.c | 10 ----- src/librandom/random-internal.h | 10 ++--- src/librandom/random_buf.c | 55 ++++++++++++++++++++++++ src/librandom/random_buf_early.c | 54 ++++++++++++++++++++++++ src/librandom/random_char.c | 10 ----- src/librandom/random_devurandom.c | 22 ++++++++++ src/librandom/random_finish.c | 45 -------------------- src/librandom/random_init.c | 72 -------------------------------- src/librandom/random_makeseed.c | 43 ------------------- src/librandom/random_name.c | 10 ----- src/librandom/random_name_from.c | 11 +++++ src/librandom/random_oklist.c | 6 --- src/librandom/random_sauniquename.c | 21 ---------- src/librandom/random_sauniquename_from.c | 21 ++++++++++ src/librandom/random_string.c | 60 -------------------------- src/librandom/random_uint32.c | 37 ---------------- src/librandom/random_uint32_from.c | 20 +++++++++ src/librandom/random_unsort.c | 17 -------- src/librandom/random_unsort_from.c | 18 ++++++++ 23 files changed, 276 insertions(+), 352 deletions(-) delete mode 100644 src/librandom/autosurf_name.c create mode 100644 src/librandom/random_buf.c create mode 100644 src/librandom/random_buf_early.c delete mode 100644 src/librandom/random_char.c create mode 100644 src/librandom/random_devurandom.c delete mode 100644 src/librandom/random_finish.c delete mode 100644 src/librandom/random_init.c delete mode 100644 src/librandom/random_makeseed.c delete mode 100644 src/librandom/random_name.c create mode 100644 src/librandom/random_name_from.c delete mode 100644 src/librandom/random_oklist.c delete mode 100644 src/librandom/random_sauniquename.c create mode 100644 src/librandom/random_sauniquename_from.c delete mode 100644 src/librandom/random_string.c delete mode 100644 src/librandom/random_uint32.c create mode 100644 src/librandom/random_uint32_from.c delete mode 100644 src/librandom/random_unsort.c create mode 100644 src/librandom/random_unsort_from.c (limited to 'src') diff --git a/src/include/skalibs/functypes.h b/src/include/skalibs/functypes.h index f839877..0c94532 100644 --- 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 index 6c9dee0..0391d21 100644 --- 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 +#include #include +#include #include -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 index ac8426c..9db5d0b 100644 --- a/src/libposixplz/mkfiletemp.c +++ b/src/libposixplz/mkfiletemp.c @@ -3,7 +3,7 @@ #include #include -#include +#include #include 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 index 04a47c2..0a219b8 100644 --- a/src/librandom/autosurf.c +++ b/src/librandom/autosurf.c @@ -1,17 +1,59 @@ /* ISC license. */ +#include +#include + +#include +#include +#include #include #include +/* + 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 deleted file mode 100644 index d80e1f8..0000000 --- a/src/librandom/autosurf_name.c +++ /dev/null @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include -#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 index a8f8be9..136c0d8 100644 --- 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 +#include -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 new file mode 100644 index 0000000..99cce38 --- /dev/null +++ b/src/librandom/random_buf.c @@ -0,0 +1,55 @@ +/* ISC license. */ + +#include + +#if defined(SKALIBS_HASARC4RANDOM) + +#include +#include + +#include + +void random_buf (char *s, size_t n) +{ + arc4random_buf(s, n) ; +} + +#elif defined(SKALIBS_HASGETRANDOM) + +#include + +#include + +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 +#include + +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 new file mode 100644 index 0000000..a306239 --- /dev/null +++ b/src/librandom/random_buf_early.c @@ -0,0 +1,54 @@ +/* ISC license. */ + +#include + +#if defined(SKALIBS_HASARC4RANDOM) + +#include +#include +#include + +void random_buf_early (char *s, size_t n) +{ + arc4random_buf(s, n) ; +} + +#elif defined(SKALIBS_HASGETRANDOM) && defined(SKALIBS_HASGRNDINSECURE) + +#include + +#include + +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 +#include + +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 deleted file mode 100644 index f55443e..0000000 --- a/src/librandom/random_char.c +++ /dev/null @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include - -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 new file mode 100644 index 0000000..0ad752b --- /dev/null +++ b/src/librandom/random_devurandom.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include + +#include +#include +#include +#include + +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 deleted file mode 100644 index bcc42da..0000000 --- a/src/librandom/random_finish.c +++ /dev/null @@ -1,45 +0,0 @@ -/* ISC license. */ - -#include - -#ifdef SKALIBS_HASARC4RANDOM - -#include - -void random_finish () -{ -} - -#else -#ifdef SKALIBS_HASGETRANDOM - -#include - -void random_finish () -{ -} - -#else -#ifdef SKALIBS_HASDEVURANDOM - -#include -#include -#include "random-internal.h" - -void random_finish () -{ - fd_close(random_fd) ; - random_fd = -1 ; -} - -#else /* default */ - -#include - -void random_finish () -{ -} - -#endif -#endif -#endif diff --git a/src/librandom/random_init.c b/src/librandom/random_init.c deleted file mode 100644 index cd880e8..0000000 --- a/src/librandom/random_init.c +++ /dev/null @@ -1,72 +0,0 @@ -/* ISC license. */ - -#include - -#ifdef SKALIBS_HASARC4RANDOM - -#include -#include - -#include - -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 - -int random_init () -{ - return 1 ; -} - -#else - -#include -#include -#include "random-internal.h" - -SURFSchedule surf_here = SURFSCHEDULE_ZERO ; - -#ifdef SKALIBS_HASDEVURANDOM - -#include - -#include - -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 deleted file mode 100644 index 9c518cf..0000000 --- a/src/librandom/random_makeseed.c +++ /dev/null @@ -1,43 +0,0 @@ -/* ISC license. */ - -#include -#include -#include -#include -#include - -/* - 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 deleted file mode 100644 index 057a5db..0000000 --- a/src/librandom/random_name.c +++ /dev/null @@ -1,10 +0,0 @@ -/* ISC license. */ - -#include -#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 new file mode 100644 index 0000000..c9df29e --- /dev/null +++ b/src/librandom/random_name_from.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include +#include + +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 deleted file mode 100644 index d79f745..0000000 --- a/src/librandom/random_oklist.c +++ /dev/null @@ -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 deleted file mode 100644 index e44e7ba..0000000 --- a/src/librandom/random_sauniquename.c +++ /dev/null @@ -1,21 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -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 new file mode 100644 index 0000000..132d303 --- /dev/null +++ b/src/librandom/random_sauniquename_from.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include +#include +#include + +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 deleted file mode 100644 index acdec69..0000000 --- a/src/librandom/random_string.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ISC license. */ - -#include - -#ifdef SKALIBS_HASARC4RANDOM - -#include -#include -#include - -void random_string (char *s, size_t n) -{ - arc4random_buf(s, n) ; -} - -#else -#ifdef SKALIBS_HASGETRANDOM - -#include -#include - -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 -#include -#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 -#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 deleted file mode 100644 index 6700879..0000000 --- a/src/librandom/random_uint32.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ISC license. */ - -#include - -#ifdef SKALIBS_HASARC4RANDOM - -#include -#include -#include -#include - -uint32_t random_uint32 (uint32_t n) -{ - return arc4random_uniform(n) ; -} - -#else - -#include -#include - -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 new file mode 100644 index 0000000..621c438 --- /dev/null +++ b/src/librandom/random_uint32_from.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include +#include +#include + +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 deleted file mode 100644 index 4596136..0000000 --- a/src/librandom/random_unsort.c +++ /dev/null @@ -1,17 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -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 new file mode 100644 index 0000000..179cab9 --- /dev/null +++ b/src/librandom/random_unsort_from.c @@ -0,0 +1,18 @@ +/* ISC license. */ + +#include +#include + +#include + +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) ; + } +} -- cgit v1.2.3