@@ -47,6 +47,7 @@ static void setup(void *arg)
47
47
#ifdef RANDOMSEED
48
48
struct rand_pool_info * rpi ;
49
49
ssize_t len = 0 ;
50
+ struct stat st ;
50
51
int rc = -1 ;
51
52
int fd , err ;
52
53
@@ -55,7 +56,7 @@ static void setup(void *arg)
55
56
return ;
56
57
}
57
58
58
- if (!fexist (RANDOMSEED ) ) {
59
+ if (!stat (RANDOMSEED , & st ) || st . st_size < 512 ) {
59
60
int ret = 1 ;
60
61
mode_t prev ;
61
62
FILE * fp ;
@@ -64,16 +65,34 @@ static void setup(void *arg)
64
65
prev = umask (077 );
65
66
fp = fopen (RANDOMSEED , "w" );
66
67
if (fp ) {
67
- int iter = 128 ;
68
- struct timeval tv ;
69
-
70
- gettimeofday (& tv , NULL );
71
- srandom (tv .tv_sec % 3600 );
72
- while (iter -- ) {
73
- uint32_t i , prng = random ();
74
-
75
- for (i = 0 ; i < sizeof (prng ); i ++ )
76
- fputc ((prng >> (i * CHAR_BIT )) & UCHAR_MAX , fp );
68
+ const char * hwrng = "/dev/hwrng" ;
69
+ FILE * hw ;
70
+
71
+ hw = fopen (hwrng , "r" );
72
+ if (hw ) {
73
+ char buf [512 ];
74
+ size_t len ;
75
+
76
+ len = fread (buf , sizeof (buf [0 ]), sizeof (buf ), hw );
77
+ if (len == 0 ) {
78
+ fclose (hw );
79
+ goto no_hwrng ;
80
+ }
81
+
82
+ len = fwrite (buf , sizeof (buf [0 ]), len , fp );
83
+ fclose (hw );
84
+ } else {
85
+ struct timeval tv ;
86
+ int iter = 128 ;
87
+ no_hwrng :
88
+ gettimeofday (& tv , NULL );
89
+ srandom (tv .tv_sec % 3600 );
90
+ while (iter -- ) {
91
+ uint32_t i , prng = random ();
92
+
93
+ for (i = 0 ; i < sizeof (prng ); i ++ )
94
+ fputc ((prng >> (i * CHAR_BIT )) & UCHAR_MAX , fp );
95
+ }
77
96
}
78
97
ret = fclose (fp );
79
98
}
0 commit comments