From a4c5f03beedf04fcca0ba6fd354d27e66bb3fcf6 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 21 Jun 2020 17:37:11 +0200 Subject: Linux/MacOSX: Read at least 32 bytes from /dev/random before allowing it to fail gracefully --- src/Core/RandomNumberGenerator.cpp | 13 ++++++++++--- src/Core/RandomNumberGenerator.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Core/RandomNumberGenerator.cpp b/src/Core/RandomNumberGenerator.cpp index 6ad46605..38a228ee 100644 --- a/src/Core/RandomNumberGenerator.cpp +++ b/src/Core/RandomNumberGenerator.cpp @@ -44,12 +44,12 @@ namespace VeraCrypt throw_sys_sub_if (random == -1, L"/dev/random"); finally_do_arg (int, random, { close (finally_arg); }); - // ensure that we have read /dev/random successfully at least once before continuing + // ensure that we have read at least 32 bytes from /dev/random before allowing it to fail gracefully while (true) { int rndCount = read (random, buffer, buffer.Size()); - throw_sys_sub_if ((rndCount == -1) && errno != EAGAIN, L"/dev/random"); - if (rndCount == -1 && !DevRandomSucceeded) + throw_sys_sub_if ((rndCount == -1) && errno != EAGAIN && errno != ERESTART && errno != EINTR, L"/dev/random"); + if (rndCount == -1 && (!DevRandomSucceeded || (DevRandomBytesCount < 32))) { // wait 250ms before querying /dev/random again ::usleep (250 * 1000); @@ -57,7 +57,12 @@ namespace VeraCrypt else { if (rndCount != -1) + { + // We count returned bytes untill 32-bytes treshold reached + if (DevRandomBytesCount < 32) + DevRandomBytesCount += rndCount; DevRandomSucceeded = true; + } break; } } @@ -236,6 +241,7 @@ namespace VeraCrypt EnrichedByUser = false; Running = false; DevRandomSucceeded = false; + DevRandomBytesCount = 0; } void RandomNumberGenerator::Test () @@ -274,4 +280,5 @@ namespace VeraCrypt size_t RandomNumberGenerator::WriteOffset; struct rand_data *RandomNumberGenerator::JitterRngCtx = NULL; bool RandomNumberGenerator::DevRandomSucceeded = false; + int RandomNumberGenerator::DevRandomBytesCount = 0; } diff --git a/src/Core/RandomNumberGenerator.h b/src/Core/RandomNumberGenerator.h index 9ef45dfe..8f440630 100644 --- a/src/Core/RandomNumberGenerator.h +++ b/src/Core/RandomNumberGenerator.h @@ -56,6 +56,7 @@ namespace VeraCrypt static size_t WriteOffset; static struct rand_data *JitterRngCtx; static bool DevRandomSucceeded; + static int DevRandomBytesCount; }; } -- cgit v1.2.3