plugins: add support for hwrng and check if seed file is empty

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2024-03-13 12:06:32 +01:00
1 parent 90a4df8d12
commit bf4a584e2e
1 file changed
+28 -9
+28 -9
View File
@@ -47,6 +47,7 @@ static void setup(void *arg)
#ifdef RANDOMSEED #ifdef RANDOMSEED
struct rand_pool_info *rpi; struct rand_pool_info *rpi;
ssize_t len = 0; ssize_t len = 0;
struct stat st;
int rc = -1; int rc = -1;
int fd, err; int fd, err;
@@ -55,7 +56,7 @@ static void setup(void *arg)
return; return;
} }
if (!fexist(RANDOMSEED)) { if (stat(RANDOMSEED, &st) || st.st_size < 512) {
int ret = 1; int ret = 1;
mode_t prev; mode_t prev;
FILE *fp; FILE *fp;
@@ -64,16 +65,34 @@ static void setup(void *arg)
prev = umask(077); prev = umask(077);
fp = fopen(RANDOMSEED, "w"); fp = fopen(RANDOMSEED, "w");
if (fp) { if (fp) {
int iter = 128; const char *hwrng = "/dev/hwrng";
struct timeval tv; FILE *hw;
gettimeofday(&tv, NULL); hw = fopen(hwrng, "r");
srandom(tv.tv_sec % 3600); if (hw) {
while (iter--) { char buf[512];
uint32_t i, prng = random(); size_t len;
for (i = 0; i < sizeof(prng); i++) len = fread(buf, sizeof(buf[0]), sizeof(buf), hw);
fputc((prng >> (i * CHAR_BIT)) & UCHAR_MAX, fp); if (len == 0) {
fclose(hw);
goto no_hwrng;
}
len = fwrite(buf, sizeof(buf[0]), len, fp);
fclose(hw);
} else {
struct timeval tv;
int iter = 128;
no_hwrng:
gettimeofday(&tv, NULL);
srandom(tv.tv_sec % 3600);
while (iter--) {
uint32_t i, prng = random();
for (i = 0; i < sizeof(prng); i++)
fputc((prng >> (i * CHAR_BIT)) & UCHAR_MAX, fp);
}
} }
ret = fclose(fp); ret = fclose(fp);
} }