#include #include #include #include #include #include #include #include #include // 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; }