Switch to SaturatingSubtract to guard against wrap on user parameters
parent
4a86ad67bf
commit
a9c5c56d21
38
blake2.cpp
38
blake2.cpp
|
|
@ -152,7 +152,6 @@ BLAKE2_ParameterBlock<false>::BLAKE2_ParameterBlock(size_t digestLen, size_t key
|
||||||
const byte* saltStr, size_t saltLen,
|
const byte* saltStr, size_t saltLen,
|
||||||
const byte* personalizationStr, size_t personalizationLen)
|
const byte* personalizationStr, size_t personalizationLen)
|
||||||
{
|
{
|
||||||
// Avoid Coverity finding SIZEOF_MISMATCH/suspicious_sizeof
|
|
||||||
digestLength = (byte)digestLen;
|
digestLength = (byte)digestLen;
|
||||||
keyLength = (byte)keyLen;
|
keyLength = (byte)keyLen;
|
||||||
fanout = depth = 1;
|
fanout = depth = 1;
|
||||||
|
|
@ -164,8 +163,8 @@ BLAKE2_ParameterBlock<false>::BLAKE2_ParameterBlock(size_t digestLen, size_t key
|
||||||
if (saltStr && saltLen)
|
if (saltStr && saltLen)
|
||||||
{
|
{
|
||||||
memcpy_s(salt, COUNTOF(salt), saltStr, saltLen);
|
memcpy_s(salt, COUNTOF(salt), saltStr, saltLen);
|
||||||
const size_t rem = COUNTOF(salt) - saltLen;
|
size_t rem = SaturatingSubtract(COUNTOF(salt), saltLen);
|
||||||
const size_t off = COUNTOF(salt) - rem;
|
size_t off = COUNTOF(salt) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(salt+off, 0x00, rem);
|
std::memset(salt+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -177,8 +176,8 @@ BLAKE2_ParameterBlock<false>::BLAKE2_ParameterBlock(size_t digestLen, size_t key
|
||||||
if (personalizationStr && personalizationLen)
|
if (personalizationStr && personalizationLen)
|
||||||
{
|
{
|
||||||
memcpy_s(personalization, COUNTOF(personalization), personalizationStr, personalizationLen);
|
memcpy_s(personalization, COUNTOF(personalization), personalizationStr, personalizationLen);
|
||||||
const size_t rem = COUNTOF(personalization) - personalizationLen;
|
size_t rem = SaturatingSubtract(COUNTOF(personalization), personalizationLen);
|
||||||
const size_t off = COUNTOF(personalization) - rem;
|
size_t off = COUNTOF(personalization) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(personalization+off, 0x00, rem);
|
std::memset(personalization+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -192,7 +191,6 @@ BLAKE2_ParameterBlock<true>::BLAKE2_ParameterBlock(size_t digestLen, size_t keyL
|
||||||
const byte* saltStr, size_t saltLen,
|
const byte* saltStr, size_t saltLen,
|
||||||
const byte* personalizationStr, size_t personalizationLen)
|
const byte* personalizationStr, size_t personalizationLen)
|
||||||
{
|
{
|
||||||
// Avoid Coverity finding SIZEOF_MISMATCH/suspicious_sizeof
|
|
||||||
digestLength = (byte)digestLen;
|
digestLength = (byte)digestLen;
|
||||||
keyLength = (byte)keyLen;
|
keyLength = (byte)keyLen;
|
||||||
fanout = depth = 1;
|
fanout = depth = 1;
|
||||||
|
|
@ -205,8 +203,8 @@ BLAKE2_ParameterBlock<true>::BLAKE2_ParameterBlock(size_t digestLen, size_t keyL
|
||||||
if (saltStr && saltLen)
|
if (saltStr && saltLen)
|
||||||
{
|
{
|
||||||
memcpy_s(salt, COUNTOF(salt), saltStr, saltLen);
|
memcpy_s(salt, COUNTOF(salt), saltStr, saltLen);
|
||||||
const size_t rem = COUNTOF(salt) - saltLen;
|
size_t rem = SaturatingSubtract(COUNTOF(salt), saltLen);
|
||||||
const size_t off = COUNTOF(salt) - rem;
|
size_t off = COUNTOF(salt) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(salt+off, 0x00, rem);
|
std::memset(salt+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -218,8 +216,8 @@ BLAKE2_ParameterBlock<true>::BLAKE2_ParameterBlock(size_t digestLen, size_t keyL
|
||||||
if (personalizationStr && personalizationLen)
|
if (personalizationStr && personalizationLen)
|
||||||
{
|
{
|
||||||
memcpy_s(personalization, COUNTOF(personalization), personalizationStr, personalizationLen);
|
memcpy_s(personalization, COUNTOF(personalization), personalizationStr, personalizationLen);
|
||||||
const size_t rem = COUNTOF(personalization) - personalizationLen;
|
size_t rem = SaturatingSubtract(COUNTOF(personalization), personalizationLen);
|
||||||
const size_t off = COUNTOF(personalization) - rem;
|
size_t off = COUNTOF(personalization) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(personalization+off, 0x00, rem);
|
std::memset(personalization+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -237,7 +235,7 @@ void BLAKE2_Base<word32, false>::UncheckedSetKey(const byte *key, unsigned int l
|
||||||
AlignedSecByteBlock temp(BLOCKSIZE);
|
AlignedSecByteBlock temp(BLOCKSIZE);
|
||||||
memcpy_s(temp, BLOCKSIZE, key, length);
|
memcpy_s(temp, BLOCKSIZE, key, length);
|
||||||
|
|
||||||
const size_t rem = BLOCKSIZE - length;
|
size_t rem = SaturatingSubtract(BLOCKSIZE, length);
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(temp+length, 0x00, rem);
|
std::memset(temp+length, 0x00, rem);
|
||||||
|
|
||||||
|
|
@ -261,8 +259,8 @@ void BLAKE2_Base<word32, false>::UncheckedSetKey(const byte *key, unsigned int l
|
||||||
if (params.GetValue(Name::Salt(), t) && t.begin() && t.size())
|
if (params.GetValue(Name::Salt(), t) && t.begin() && t.size())
|
||||||
{
|
{
|
||||||
memcpy_s(block.salt, COUNTOF(block.salt), t.begin(), t.size());
|
memcpy_s(block.salt, COUNTOF(block.salt), t.begin(), t.size());
|
||||||
const size_t rem = COUNTOF(block.salt) - t.size();
|
size_t rem = SaturatingSubtract(COUNTOF(block.salt), t.size());
|
||||||
const size_t off = COUNTOF(block.salt) - rem;
|
size_t off = COUNTOF(block.salt) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(block.salt+off, 0x00, rem);
|
std::memset(block.salt+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -274,8 +272,8 @@ void BLAKE2_Base<word32, false>::UncheckedSetKey(const byte *key, unsigned int l
|
||||||
if (params.GetValue(Name::Personalization(), t) && t.begin() && t.size())
|
if (params.GetValue(Name::Personalization(), t) && t.begin() && t.size())
|
||||||
{
|
{
|
||||||
memcpy_s(block.personalization, COUNTOF(block.personalization), t.begin(), t.size());
|
memcpy_s(block.personalization, COUNTOF(block.personalization), t.begin(), t.size());
|
||||||
const size_t rem = COUNTOF(block.personalization) - t.size();
|
size_t rem = SaturatingSubtract(COUNTOF(block.personalization), t.size());
|
||||||
const size_t off = COUNTOF(block.personalization) - rem;
|
size_t off = COUNTOF(block.personalization) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(block.personalization+off, 0x00, rem);
|
std::memset(block.personalization+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -293,7 +291,7 @@ void BLAKE2_Base<word64, true>::UncheckedSetKey(const byte *key, unsigned int le
|
||||||
AlignedSecByteBlock temp(BLOCKSIZE);
|
AlignedSecByteBlock temp(BLOCKSIZE);
|
||||||
memcpy_s(temp, BLOCKSIZE, key, length);
|
memcpy_s(temp, BLOCKSIZE, key, length);
|
||||||
|
|
||||||
const size_t rem = BLOCKSIZE - length;
|
size_t rem = SaturatingSubtract(BLOCKSIZE, length);
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(temp+length, 0x00, rem);
|
std::memset(temp+length, 0x00, rem);
|
||||||
|
|
||||||
|
|
@ -318,8 +316,8 @@ void BLAKE2_Base<word64, true>::UncheckedSetKey(const byte *key, unsigned int le
|
||||||
if (params.GetValue(Name::Salt(), t) && t.begin() && t.size())
|
if (params.GetValue(Name::Salt(), t) && t.begin() && t.size())
|
||||||
{
|
{
|
||||||
memcpy_s(block.salt, COUNTOF(block.salt), t.begin(), t.size());
|
memcpy_s(block.salt, COUNTOF(block.salt), t.begin(), t.size());
|
||||||
const size_t rem = COUNTOF(block.salt) - t.size();
|
size_t rem = SaturatingSubtract(COUNTOF(block.salt), t.size());
|
||||||
const size_t off = COUNTOF(block.salt) - rem;
|
size_t off = COUNTOF(block.salt) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(block.salt+off, 0x00, rem);
|
std::memset(block.salt+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
@ -331,8 +329,8 @@ void BLAKE2_Base<word64, true>::UncheckedSetKey(const byte *key, unsigned int le
|
||||||
if (params.GetValue(Name::Personalization(), t) && t.begin() && t.size())
|
if (params.GetValue(Name::Personalization(), t) && t.begin() && t.size())
|
||||||
{
|
{
|
||||||
memcpy_s(block.personalization, COUNTOF(block.personalization), t.begin(), t.size());
|
memcpy_s(block.personalization, COUNTOF(block.personalization), t.begin(), t.size());
|
||||||
const size_t rem = COUNTOF(block.personalization) - t.size();
|
size_t rem = SaturatingSubtract(COUNTOF(block.personalization), t.size());
|
||||||
const size_t off = COUNTOF(block.personalization) - rem;
|
size_t off = COUNTOF(block.personalization) - rem;
|
||||||
if (rem)
|
if (rem)
|
||||||
std::memset(block.personalization+off, 0x00, rem);
|
std::memset(block.personalization+off, 0x00, rem);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue