diff options
Diffstat (limited to 'load-random-seed.c')
-rw-r--r-- | load-random-seed.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/load-random-seed.c b/load-random-seed.c new file mode 100644 index 0000000..491afba --- /dev/null +++ b/load-random-seed.c @@ -0,0 +1,65 @@ +#include <fcntl.h> +#include <limits.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/ioctl.h> +#include <unistd.h> + +// musl forbids include/linux +#define RNDADDENTROPY _IOW( 'R', 0x03, int [2] ) + +#define RAND_POOL_SIZE 512 + +int main(int argc, char *argv[]) { + if (argc != 2) { + fputs("usage: load-random-seed FILE\n", stderr); + exit(1); + } + + int seed_fd = open(argv[1], O_RDONLY); + if (seed_fd == -1) { + perror("error opening seed file"); + exit(1); + } + struct { + int entropy_count; + int buf_size; + char buf[RAND_POOL_SIZE]; + } rpi = { + .entropy_count = RAND_POOL_SIZE * CHAR_BIT, + .buf_size = RAND_POOL_SIZE + }; + size_t sz = 0; + do { + ssize_t r = read(seed_fd, &rpi.buf[sz], RAND_POOL_SIZE - sz); + if (r == -1) { + perror("error reading seed file"); + exit(1); + } + sz += r; + } while (sz < RAND_POOL_SIZE); + + if (close(seed_fd) == -1) { + perror("error closing seed file"); + exit(1); + } + + int urandom_fd = open("/dev/urandom", O_RDWR); + if (urandom_fd == -1) { + perror("error opening /dev/urandom"); + exit(1); + } + if (ioctl(urandom_fd, RNDADDENTROPY, &rpi) == -1) { + perror("error adding entropy"); + exit(1); + } + if (close(urandom_fd) == -1) { + perror("error closing /dev/urandom"); + exit(1); + } + + return 0; +} |