summaryrefslogtreecommitdiff
path: root/rng.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2016-01-10 14:25:47 -0500
committerJeffrey Walton <noloader@gmail.com>2016-01-10 14:25:47 -0500
commit76b2f9387d686ea4a880c820b4de0bca7214839c (patch)
tree2d96c998ef3a5a2a7ce09067256b757efe45028f /rng.cpp
parentdce2317195a7d9aa77b159fd1beddaf8358f6243 (diff)
downloadcryptopp-git-76b2f9387d686ea4a880c820b4de0bca7214839c.tar.gz
Cleared Valgrind warnings on uninitialized reads (Issue 105)
Diffstat (limited to 'rng.cpp')
-rw-r--r--rng.cpp56
1 files changed, 32 insertions, 24 deletions
diff --git a/rng.cpp b/rng.cpp
index 354856c4..22141cb7 100644
--- a/rng.cpp
+++ b/rng.cpp
@@ -59,25 +59,33 @@ void LC_RNG::GenerateBlock(byte *output, size_t size)
#ifndef CRYPTOPP_IMPORTS
X917RNG::X917RNG(BlockTransformation *c, const byte *seed, const byte *deterministicTimeVector)
- : cipher(c),
- S(cipher->BlockSize()),
- dtbuf(S),
- randseed(seed, S),
- m_lastBlock(S),
- m_deterministicTimeVector(deterministicTimeVector, deterministicTimeVector ? S : 0)
+ : m_cipher(c),
+ m_size(m_cipher->BlockSize()),
+ m_datetime(m_size),
+ m_randseed(seed, m_size),
+ m_lastBlock(m_size),
+ m_deterministicTimeVector(deterministicTimeVector, deterministicTimeVector ? m_size : 0)
{
+ // Valgrind finding, http://github.com/weidai11/cryptopp/issues/105
+ // Garbage in the tail creates a non-conforming X9.17 or X9.31 generator.
+ if (m_size > 8)
+ {
+ memset(m_datetime, 0x00, m_size);
+ memset(m_lastBlock, 0x00, m_size);
+ }
+
if (!deterministicTimeVector)
{
time_t tstamp1 = time(0);
- xorbuf(dtbuf, (byte *)&tstamp1, UnsignedMin(sizeof(tstamp1), S));
- cipher->ProcessBlock(dtbuf);
+ xorbuf(m_datetime, (byte *)&tstamp1, UnsignedMin(sizeof(tstamp1), m_size));
+ m_cipher->ProcessBlock(m_datetime);
clock_t tstamp2 = clock();
- xorbuf(dtbuf, (byte *)&tstamp2, UnsignedMin(sizeof(tstamp2), S));
- cipher->ProcessBlock(dtbuf);
+ xorbuf(m_datetime, (byte *)&tstamp2, UnsignedMin(sizeof(tstamp2), m_size));
+ m_cipher->ProcessBlock(m_datetime);
}
// for FIPS 140-2
- GenerateBlock(m_lastBlock, S);
+ GenerateBlock(m_lastBlock, m_size);
}
void X917RNG::GenerateIntoBufferedTransformation(BufferedTransformation &target, const std::string &channel, lword size)
@@ -87,35 +95,35 @@ void X917RNG::GenerateIntoBufferedTransformation(BufferedTransformation &target,
// calculate new enciphered timestamp
if (m_deterministicTimeVector.size())
{
- cipher->ProcessBlock(m_deterministicTimeVector, dtbuf);
- IncrementCounterByOne(m_deterministicTimeVector, S);
+ m_cipher->ProcessBlock(m_deterministicTimeVector, m_datetime);
+ IncrementCounterByOne(m_deterministicTimeVector, m_size);
}
else
{
clock_t c = clock();
- xorbuf(dtbuf, (byte *)&c, UnsignedMin(sizeof(c), S));
+ xorbuf(m_datetime, (byte *)&c, UnsignedMin(sizeof(c), m_size));
time_t t = time(NULL);
- xorbuf(dtbuf+S-UnsignedMin(sizeof(t), S), (byte *)&t, UnsignedMin(sizeof(t), S));
- cipher->ProcessBlock(dtbuf);
+ xorbuf(m_datetime+m_size-UnsignedMin(sizeof(t), m_size), (byte *)&t, UnsignedMin(sizeof(t), m_size));
+ m_cipher->ProcessBlock(m_datetime);
}
// combine enciphered timestamp with seed
- xorbuf(randseed, dtbuf, S);
+ xorbuf(m_randseed, m_datetime, m_size);
// generate a new block of random bytes
- cipher->ProcessBlock(randseed);
- if (memcmp(m_lastBlock, randseed, S) == 0)
+ m_cipher->ProcessBlock(m_randseed);
+ if (memcmp(m_lastBlock, m_randseed, m_size) == 0)
throw SelfTestFailure("X917RNG: Continuous random number generator test failed.");
// output random bytes
- size_t len = UnsignedMin(S, size);
- target.ChannelPut(channel, randseed, len);
+ size_t len = UnsignedMin(m_size, size);
+ target.ChannelPut(channel, m_randseed, len);
size -= len;
// compute new seed vector
- memcpy(m_lastBlock, randseed, S);
- xorbuf(randseed, dtbuf, S);
- cipher->ProcessBlock(randseed);
+ memcpy(m_lastBlock, m_randseed, m_size);
+ xorbuf(m_randseed, m_datetime, m_size);
+ m_cipher->ProcessBlock(m_randseed);
}
}