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 */
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;
}
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);
+}