aboutsummaryrefslogtreecommitdiff
path: root/util-linux/seedrng.c
diff options
context:
space:
mode:
Diffstat (limited to 'util-linux/seedrng.c')
-rw-r--r--util-linux/seedrng.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/util-linux/seedrng.c b/util-linux/seedrng.c
index 74bf633a7..b79ce6627 100644
--- a/util-linux/seedrng.c
+++ b/util-linux/seedrng.c
@@ -128,7 +128,7 @@ static void seed_rng(uint8_t *seed, size_t len, bool credit)
128 close(random_fd); 128 close(random_fd);
129} 129}
130 130
131static void seed_from_file_if_exists(const char *filename, bool credit, sha256_ctx_t *hash) 131static void seed_from_file_if_exists(const char *filename, int dfd, bool credit, sha256_ctx_t *hash)
132{ 132{
133 uint8_t seed[MAX_SEED_LEN]; 133 uint8_t seed[MAX_SEED_LEN];
134 ssize_t seed_len; 134 ssize_t seed_len;
@@ -141,6 +141,16 @@ static void seed_from_file_if_exists(const char *filename, bool credit, sha256_c
141 } 141 }
142 xunlink(filename); 142 xunlink(filename);
143 if (seed_len != 0) { 143 if (seed_len != 0) {
144 /* We are going to use this data to seed the RNG:
145 * we believe it to genuinely containing entropy.
146 * If this just-unlinked file survives
147 * (e.g. if machine crashes _right now_)
148 * and we reuse it after reboot, this assumption
149 * would be violated. Fsync the directory to
150 * make sure file is gone:
151 */
152 fsync(dfd);
153
144 sha256_hash(hash, &seed_len, sizeof(seed_len)); 154 sha256_hash(hash, &seed_len, sizeof(seed_len));
145 sha256_hash(hash, seed, seed_len); 155 sha256_hash(hash, seed, seed_len);
146 printf("Seeding %u bits %s crediting\n", 156 printf("Seeding %u bits %s crediting\n",
@@ -193,6 +203,7 @@ int seedrng_main(int argc UNUSED_PARAM, char *argv[])
193 203
194 for (int i = 1; i < 3; ++i) { 204 for (int i = 1; i < 3; ++i) {
195 seed_from_file_if_exists(i == 1 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME, 205 seed_from_file_if_exists(i == 1 ? NON_CREDITABLE_SEED_NAME : CREDITABLE_SEED_NAME,
206 dfd,
196 i == 1 ? false : !skip_credit, 207 i == 1 ? false : !skip_credit,
197 &hash); 208 &hash);
198 } 209 }