From a6d58714ac9a958ada186a181fc866ca81a22cd5 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 21 May 2016 08:45:05 -0400 Subject: [PATCH] Avoid Valgrind uninitialized warning by defering checks and using asserts --- blake2.cpp | 72 ++++++++++++++++++++++++++++++++++++++++-------------- blake2.h | 4 +-- 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/blake2.cpp b/blake2.cpp index ece4479a..e8d39fea 100644 --- a/blake2.cpp +++ b/blake2.cpp @@ -204,38 +204,72 @@ BLAKE2_ParameterBlock::BLAKE2_ParameterBlock(size_t digestLen, size_t key const byte* salt, size_t saltLen, const byte* personalization, size_t personalizationLen) { - ThrowIfInvalidSalt(saltLen); - ThrowIfInvalidPersonalization(personalizationLen); + static const size_t head = sizeof(*this) - sizeof(this->personalization) - sizeof(this->salt); + memset(this, 0x00, head); - memset(this, 0x00, sizeof(*this)); this->digestLength = (byte)digestLen; this->keyLength = (byte)keyLen; fanout = depth = 1; 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) - 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::BLAKE2_ParameterBlock(size_t digestLen, size_t keyLen, const byte* salt, size_t saltLen, const byte* personalization, size_t personalizationLen) { - ThrowIfInvalidSalt(saltLen); - ThrowIfInvalidPersonalization(personalizationLen); + static const size_t head = sizeof(*this) - sizeof(this->personalization) - sizeof(this->salt); + memset(this, 0x00, head); - memset(this, 0x00, sizeof(*this)); this->digestLength = (byte)digestLen; this->keyLength = (byte)keyLen; fanout = depth = 1; 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) - 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 @@ -297,16 +331,18 @@ void BLAKE2_Base::UncheckedSetKey(const byte *key, unsigned int leng } template -BLAKE2_Base::BLAKE2_Base() : m_digestSize(DIGESTSIZE), m_treeMode(false) +BLAKE2_Base::BLAKE2_Base() : m_state(), m_block(), m_digestSize(DIGESTSIZE), m_treeMode(false) { + assert(digestSize <= DIGESTSIZE); + UncheckedSetKey(NULL, 0, g_nullNameValuePairs); Restart(); } template -BLAKE2_Base::BLAKE2_Base(bool treeMode, unsigned int digestSize) : m_digestSize(digestSize), m_treeMode(treeMode) +BLAKE2_Base::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); Restart(); @@ -315,12 +351,12 @@ BLAKE2_Base::BLAKE2_Base(bool treeMode, unsigned int digestSize) : m template BLAKE2_Base::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) - : m_digestSize(digestSize), m_treeMode(treeMode) + : m_state(), m_block(), m_digestSize(digestSize), m_treeMode(treeMode) { - this->ThrowIfInvalidKeyLength(keyLength); - this->ThrowIfInvalidTruncatedSize(digestSize); - ThrowIfInvalidSalt(saltLength); - ThrowIfInvalidPersonalization(personalizationLength); + assert(keyLength <= MAX_KEYLENGTH); + assert(digestSize <= DIGESTSIZE); + assert(saltLength <= SALTSIZE); + assert(personalizationLength <= PERSONALIZATIONSIZE); UncheckedSetKey(key, static_cast(keyLength), MakeParameters(Name::DigestSize(),(int)digestSize)(Name::TreeMode(),treeMode, false) (Name::Salt(), ConstByteArrayParameter(salt, saltLength))(Name::Personalization(), ConstByteArrayParameter(personalization, personalizationLength))); diff --git a/blake2.h b/blake2.h index 568cb50d..6e96320f 100644 --- a/blake2.h +++ b/blake2.h @@ -221,8 +221,8 @@ protected: void UncheckedSetKey(const byte* key, unsigned int length, const CryptoPP::NameValuePairs& params); private: - FixedSizeAlignedSecBlock m_state; - FixedSizeAlignedSecBlock m_block; + FixedSizeAlignedSecBlock m_state; + FixedSizeAlignedSecBlock m_block; AlignedSecByteBlock m_key; word32 m_digestSize; bool m_treeMode;