From 478066c6076934ef50f9cf922cfe55dd96580d12 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Wed, 23 Oct 2019 22:30:44 +0200 Subject: Linux/MacOSX: Add missing JitterEntropy implementation --- src/Core/RandomNumberGenerator.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/Core/RandomNumberGenerator.cpp') diff --git a/src/Core/RandomNumberGenerator.cpp b/src/Core/RandomNumberGenerator.cpp index fffd948a..70c46492 100644 --- a/src/Core/RandomNumberGenerator.cpp +++ b/src/Core/RandomNumberGenerator.cpp @@ -46,6 +46,16 @@ namespace VeraCrypt throw_sys_sub_if (read (random, buffer, buffer.Size()) == -1 && errno != EAGAIN, L"/dev/random"); AddToPool (buffer); + + /* use JitterEntropy library to get good quality random bytes based on CPU timing jitter */ + if (JitterRngCtx) + { + ssize_t rndLen = jent_read_entropy (JitterRngCtx, (char*) buffer.Ptr(), buffer.Size()); + if (rndLen > 0) + { + AddToPool (buffer); + } + } } #endif } @@ -80,6 +90,12 @@ namespace VeraCrypt ScopeLock lock (AccessMutex); size_t bufferLen = buffer.Size(), loopLen; byte* pbBuffer = buffer.Get(); + + // Initialize JitterEntropy RNG for this call + if (0 == jent_entropy_init ()) + { + JitterRngCtx = jent_entropy_collector_alloc (1, 0); + } // Poll system for data AddSystemDataToPool (fast); @@ -127,6 +143,12 @@ namespace VeraCrypt pbBuffer += loopLen; } + + if (JitterRngCtx) + { + jent_entropy_collector_free (JitterRngCtx); + JitterRngCtx = NULL; + } } shared_ptr RandomNumberGenerator::GetHash () @@ -232,4 +254,5 @@ namespace VeraCrypt size_t RandomNumberGenerator::ReadOffset; bool RandomNumberGenerator::Running = false; size_t RandomNumberGenerator::WriteOffset; + struct rand_data *RandomNumberGenerator::JitterRngCtx = NULL; } -- cgit v1.2.3