+/* Seeds RNG based on the SIZE bytes in BUF.
+ At most the first 256 bytes of BUF are used. */
+void
+rng_seed (struct rng *rng, const void *key_, size_t size)
+{
+ const uint8_t *key = key_;
+ size_t key_idx;
+ uint8_t *s;
+ int i, j;
+
+ assert (rng != NULL);
+
+ s = rng->s;
+ rng->i = rng->j = 0;
+ for (i = 0; i < 256; i++)
+ s[i] = i;
+ for (key_idx = 0, i = j = 0; i < 256; i++)
+ {
+ j = (j + s[i] + key[key_idx]) & 255;
+ swap_byte (s + i, s + j);
+ if (++key_idx >= size)
+ key_idx = 0;
+ }
+}