From: Alan T. DeKok Date: Thu, 28 Dec 2017 14:28:04 +0000 (-0500) Subject: added fr_rand_buffer() to fill a buffer with random bytes X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=391af1f58013d62be1e041660fd744ba15365b64;p=thirdparty%2Ffreeradius-server.git added fr_rand_buffer() to fill a buffer with random bytes --- diff --git a/src/include/libradius.h b/src/include/libradius.h index d5ec4ab825a..f86b885522f 100644 --- a/src/include/libradius.h +++ b/src/include/libradius.h @@ -223,6 +223,7 @@ typedef struct fr_randctx { void fr_isaac(fr_randctx *ctx); void fr_randinit(fr_randctx *ctx, int flag); uint32_t fr_rand(void); /* like rand(), but better. */ +void fr_rand_buffer(void *start, size_t length) CC_HINT(nonnull); void fr_rand_seed(void const *, size_t ); /* seed the random pool */ diff --git a/src/lib/util/mem.c b/src/lib/util/mem.c index 975affaab1f..98076d4a06d 100644 --- a/src/lib/util/mem.c +++ b/src/lib/util/mem.c @@ -45,20 +45,8 @@ RADIUS_PACKET *fr_radius_alloc(TALLOC_CTX *ctx, bool new_vector) rp->id = -1; if (new_vector) { - int i; - uint32_t hash, base; - - /* - * Don't expose the actual contents of the random - * pool. - */ - base = fr_rand(); - for (i = 0; i < AUTH_VECTOR_LEN; i += sizeof(uint32_t)) { - hash = fr_rand() ^ base; - memcpy(rp->vector + i, &hash, sizeof(hash)); - } + fr_rand_buffer(rp->vector, sizeof(rp->vector)); } - fr_rand(); /* stir the pool again */ return rp; } diff --git a/src/lib/util/rand.c b/src/lib/util/rand.c index 5ac904d1934..c719d007b0e 100644 --- a/src/lib/util/rand.c +++ b/src/lib/util/rand.c @@ -108,3 +108,32 @@ uint32_t fr_rand(void) return num; } + +void fr_rand_buffer(void *start, size_t length) +{ + uint32_t x; + uint8_t *buffer = start; + size_t buflen = length; + + if (buflen > 4) { + size_t i; + + for (i = 0; i < buflen; i += 4) { + x = fr_rand(); + memcpy(buffer + i, &x, sizeof(x)); + } + + /* + * Keep only the last bytes in the word. + */ + i = buflen & ~0x03; + buffer += i; + buflen &= 0x03; + } + + if (!buflen) return; + + x = fr_rand(); + + memcpy(buffer, &x, buflen); +}