summaryrefslogtreecommitdiff
path: root/load-random-seed.c
diff options
context:
space:
mode:
authorAlex Xu (Hello71) <alex_y_xu@yahoo.ca>2020-07-19 07:39:22 -0400
committerAlex Xu (Hello71) <alex_y_xu@yahoo.ca>2020-07-19 07:39:22 -0400
commit0d8f101483cbc72261514806da2df7c0bfad88f7 (patch)
treef56cef930ca90175a2725922258ea9e868013328 /load-random-seed.c
parent80d98ad93aaf8b02bce80dbbac81b2beed518d3a (diff)
downloadminitramfs-0d8f101483cbc72261514806da2df7c0bfad88f7.tar.xz
minitramfs-0d8f101483cbc72261514806da2df7c0bfad88f7.zip
add load-random-seed
Diffstat (limited to 'load-random-seed.c')
-rw-r--r--load-random-seed.c65
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;
+}