]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
added fr_rand_buffer() to fill a buffer with random bytes
authorAlan T. DeKok <aland@freeradius.org>
Thu, 28 Dec 2017 14:28:04 +0000 (09:28 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 28 Dec 2017 14:28:04 +0000 (09:28 -0500)
src/include/libradius.h
src/lib/util/mem.c
src/lib/util/rand.c

index d5ec4ab825a0aa33b6e4ce64e9da4bf0ac22da13..f86b885522f4fb2f71d3f30c61dd9e8c715d5616 100644 (file)
@@ -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 */
 
 
index 975affaab1ffd6b0eda6b2e3b9f1cb671349c424..98076d4a06dbe8452612700993ecd51ab9486a23 100644 (file)
@@ -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;
 }
index 5ac904d1934888ee11f711f7b4e9bc384e43d0f0..c719d007b0e318b72b898f92aa36826b4ab1edf4 100644 (file)
@@ -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);
+}