mirror of
https://github.com/troglobit/finit.git
synced 2026-10-30 12:50:34 +00:00
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:
1 parent
90a4df8d12
commit
bf4a584e2e
1 file changed
+28
-9
+28
-9
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user