Avoid Valgrind uninitialized warning by defering checks and using asserts

pull/174/head
Jeffrey Walton 2016-05-21 08:45:05 -04:00
parent 6a6027c2cd
commit a6d58714ac
2 changed files with 56 additions and 20 deletions

View File

@ -204,38 +204,72 @@ BLAKE2_ParameterBlock<false>::BLAKE2_ParameterBlock(size_t digestLen, size_t key
const byte* salt, size_t saltLen, const byte* salt, size_t saltLen,
const byte* personalization, size_t personalizationLen) const byte* personalization, size_t personalizationLen)
{ {
ThrowIfInvalidSalt<false>(saltLen); static const size_t head = sizeof(*this) - sizeof(this->personalization) - sizeof(this->salt);
ThrowIfInvalidPersonalization<false>(personalizationLen); memset(this, 0x00, head);
memset(this, 0x00, sizeof(*this));
this->digestLength = (byte)digestLen; this->digestLength = (byte)digestLen;
this->keyLength = (byte)keyLen; this->keyLength = (byte)keyLen;
fanout = depth = 1; fanout = depth = 1;
if (salt && saltLen) if (salt && saltLen)
memcpy_s(this->salt, sizeof(this->salt), salt, saltLen); {
memcpy_s(this->salt, sizeof(this->salt), salt, saltLen);
const size_t rem = sizeof(this->salt) - saltLen;
if (rem)
memset(this->salt+rem, 0x00, rem);
}
else
{
memset(this->salt, 0x00, sizeof(this->salt));
}
if (personalization && personalizationLen) if (personalization && personalizationLen)
memcpy_s(this->personalization, sizeof(this->personalization), personalization, personalizationLen); {
memcpy_s(this->personalization, sizeof(this->personalization), personalization, personalizationLen);
const size_t rem = sizeof(this->personalization) - personalizationLen;
if (rem)
memset(this->personalization+rem, 0x00, rem);
}
else
{
memset(this->personalization, 0x00, sizeof(this->personalization));
}
} }
BLAKE2_ParameterBlock<true>::BLAKE2_ParameterBlock(size_t digestLen, size_t keyLen, BLAKE2_ParameterBlock<true>::BLAKE2_ParameterBlock(size_t digestLen, size_t keyLen,
const byte* salt, size_t saltLen, const byte* salt, size_t saltLen,
const byte* personalization, size_t personalizationLen) const byte* personalization, size_t personalizationLen)
{ {
ThrowIfInvalidSalt<true>(saltLen); static const size_t head = sizeof(*this) - sizeof(this->personalization) - sizeof(this->salt);
ThrowIfInvalidPersonalization<true>(personalizationLen); memset(this, 0x00, head);
memset(this, 0x00, sizeof(*this));
this->digestLength = (byte)digestLen; this->digestLength = (byte)digestLen;
this->keyLength = (byte)keyLen; this->keyLength = (byte)keyLen;
fanout = depth = 1; fanout = depth = 1;
if (salt && saltLen) if (salt && saltLen)
memcpy_s(this->salt, sizeof(this->salt), salt, saltLen); {
memcpy_s(this->salt, sizeof(this->salt), salt, saltLen);
const size_t rem = sizeof(this->salt) - saltLen;
if (rem)
memset(this->salt+rem, 0x00, rem);
}
else
{
memset(this->salt, 0x00, sizeof(this->salt));
}
if (personalization && personalizationLen) if (personalization && personalizationLen)
memcpy_s(this->personalization, sizeof(this->personalization), personalization, personalizationLen); {
memcpy_s(this->personalization, sizeof(this->personalization), personalization, personalizationLen);
const size_t rem = sizeof(this->personalization) - personalizationLen;
if (rem)
memset(this->personalization+rem, 0x00, rem);
}
else
{
memset(this->personalization, 0x00, sizeof(this->personalization));
}
} }
template <class W, bool T_64bit> template <class W, bool T_64bit>
@ -297,16 +331,18 @@ void BLAKE2_Base<W, T_64bit>::UncheckedSetKey(const byte *key, unsigned int leng
} }
template <class W, bool T_64bit> template <class W, bool T_64bit>
BLAKE2_Base<W, T_64bit>::BLAKE2_Base() : m_digestSize(DIGESTSIZE), m_treeMode(false) BLAKE2_Base<W, T_64bit>::BLAKE2_Base() : m_state(), m_block(), m_digestSize(DIGESTSIZE), m_treeMode(false)
{ {
assert(digestSize <= DIGESTSIZE);
UncheckedSetKey(NULL, 0, g_nullNameValuePairs); UncheckedSetKey(NULL, 0, g_nullNameValuePairs);
Restart(); Restart();
} }
template <class W, bool T_64bit> template <class W, bool T_64bit>
BLAKE2_Base<W, T_64bit>::BLAKE2_Base(bool treeMode, unsigned int digestSize) : m_digestSize(digestSize), m_treeMode(treeMode) BLAKE2_Base<W, T_64bit>::BLAKE2_Base(bool treeMode, unsigned int digestSize) : m_state(), m_block(), m_digestSize(digestSize), m_treeMode(treeMode)
{ {
this->ThrowIfInvalidTruncatedSize(digestSize); assert(digestSize <= DIGESTSIZE);
UncheckedSetKey(NULL, 0, g_nullNameValuePairs); UncheckedSetKey(NULL, 0, g_nullNameValuePairs);
Restart(); Restart();
@ -315,12 +351,12 @@ BLAKE2_Base<W, T_64bit>::BLAKE2_Base(bool treeMode, unsigned int digestSize) : m
template <class W, bool T_64bit> template <class W, bool T_64bit>
BLAKE2_Base<W, T_64bit>::BLAKE2_Base(const byte *key, size_t keyLength, const byte* salt, size_t saltLength, BLAKE2_Base<W, T_64bit>::BLAKE2_Base(const byte *key, size_t keyLength, const byte* salt, size_t saltLength,
const byte* personalization, size_t personalizationLength, bool treeMode, unsigned int digestSize) const byte* personalization, size_t personalizationLength, bool treeMode, unsigned int digestSize)
: m_digestSize(digestSize), m_treeMode(treeMode) : m_state(), m_block(), m_digestSize(digestSize), m_treeMode(treeMode)
{ {
this->ThrowIfInvalidKeyLength(keyLength); assert(keyLength <= MAX_KEYLENGTH);
this->ThrowIfInvalidTruncatedSize(digestSize); assert(digestSize <= DIGESTSIZE);
ThrowIfInvalidSalt<T_64bit>(saltLength); assert(saltLength <= SALTSIZE);
ThrowIfInvalidPersonalization<T_64bit>(personalizationLength); assert(personalizationLength <= PERSONALIZATIONSIZE);
UncheckedSetKey(key, static_cast<unsigned int>(keyLength), MakeParameters(Name::DigestSize(),(int)digestSize)(Name::TreeMode(),treeMode, false) UncheckedSetKey(key, static_cast<unsigned int>(keyLength), MakeParameters(Name::DigestSize(),(int)digestSize)(Name::TreeMode(),treeMode, false)
(Name::Salt(), ConstByteArrayParameter(salt, saltLength))(Name::Personalization(), ConstByteArrayParameter(personalization, personalizationLength))); (Name::Salt(), ConstByteArrayParameter(salt, saltLength))(Name::Personalization(), ConstByteArrayParameter(personalization, personalizationLength)));

View File

@ -221,8 +221,8 @@ protected:
void UncheckedSetKey(const byte* key, unsigned int length, const CryptoPP::NameValuePairs& params); void UncheckedSetKey(const byte* key, unsigned int length, const CryptoPP::NameValuePairs& params);
private: private:
FixedSizeAlignedSecBlock<State,sizeof(State)> m_state; FixedSizeAlignedSecBlock<State,1> m_state;
FixedSizeAlignedSecBlock<ParameterBlock,sizeof(ParameterBlock)> m_block; FixedSizeAlignedSecBlock<ParameterBlock,1> m_block;
AlignedSecByteBlock m_key; AlignedSecByteBlock m_key;
word32 m_digestSize; word32 m_digestSize;
bool m_treeMode; bool m_treeMode;