Fix use of MaxDerivedKeyLength (GH #874)

Also fix memcpy with NULL buffer
pull/877/head
Jeffrey Walton 2019-08-16 06:45:30 -04:00
parent 2ba9d3d00f
commit c0a5a06a82
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
3 changed files with 18 additions and 17 deletions

View File

@ -334,12 +334,12 @@ void RandomNumberGenerator::GenerateIntoBufferedTransformation(BufferedTransform
} }
} }
size_t KeyDerivationFunction::MinDerivedLength() const size_t KeyDerivationFunction::MinDerivedKeyLength() const
{ {
return 0; return 0;
} }
size_t KeyDerivationFunction::MaxDerivedLength() const size_t KeyDerivationFunction::MaxDerivedKeyLength() const
{ {
return static_cast<size_t>(-1); return static_cast<size_t>(-1);
} }

View File

@ -1477,11 +1477,11 @@ public:
/// \brief Determine minimum number of bytes /// \brief Determine minimum number of bytes
/// \returns Minimum number of bytes which can be derived /// \returns Minimum number of bytes which can be derived
virtual size_t MinDerivedLength() const; virtual size_t MinDerivedKeyLength() const;
/// \brief Determine maximum number of bytes /// \brief Determine maximum number of bytes
/// \returns Maximum number of bytes which can be derived /// \returns Maximum number of bytes which can be derived
virtual size_t MaxDerivedLength() const; virtual size_t MaxDerivedKeyLength() const;
/// \brief Returns a valid key length for the derivation function /// \brief Returns a valid key length for the derivation function
/// \param keylength the size of the derived key, in bytes /// \param keylength the size of the derived key, in bytes

View File

@ -82,8 +82,8 @@ protected:
template <class T> template <class T>
size_t PKCS5_PBKDF1<T>::GetValidDerivedLength(size_t keylength) const size_t PKCS5_PBKDF1<T>::GetValidDerivedLength(size_t keylength) const
{ {
if (keylength > MaxDerivedLength()) if (keylength > MaxDerivedKeyLength())
return MaxDerivedLength(); return MaxDerivedKeyLength();
return keylength; return keylength;
} }
@ -93,7 +93,7 @@ size_t PKCS5_PBKDF1<T>::DeriveKey(byte *derived, size_t derivedLen,
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0); byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1); unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1);
@ -112,7 +112,7 @@ size_t PKCS5_PBKDF1<T>::DeriveKey(byte *derived, size_t derivedLen, byte purpose
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0); CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
CRYPTOPP_UNUSED(purpose); CRYPTOPP_UNUSED(purpose);
@ -137,7 +137,8 @@ size_t PKCS5_PBKDF1<T>::DeriveKey(byte *derived, size_t derivedLen, byte purpose
for (i=1; i<iterations || (timeInSeconds && (i%128!=0 || timer.ElapsedTimeAsDouble() < timeInSeconds)); i++) for (i=1; i<iterations || (timeInSeconds && (i%128!=0 || timer.ElapsedTimeAsDouble() < timeInSeconds)); i++)
hash.CalculateDigest(buffer, buffer, buffer.size()); hash.CalculateDigest(buffer, buffer, buffer.size());
memcpy(derived, buffer, derivedLen); if (derived)
memcpy(derived, buffer, derivedLen);
return i; return i;
} }
@ -206,8 +207,8 @@ protected:
template <class T> template <class T>
size_t PKCS5_PBKDF2_HMAC<T>::GetValidDerivedLength(size_t keylength) const size_t PKCS5_PBKDF2_HMAC<T>::GetValidDerivedLength(size_t keylength) const
{ {
if (keylength > MaxDerivedLength()) if (keylength > MaxDerivedKeyLength())
return MaxDerivedLength(); return MaxDerivedKeyLength();
return keylength; return keylength;
} }
@ -217,7 +218,7 @@ size_t PKCS5_PBKDF2_HMAC<T>::DeriveKey(byte *derived, size_t derivedLen,
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0); byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1); unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1);
@ -236,7 +237,7 @@ size_t PKCS5_PBKDF2_HMAC<T>::DeriveKey(byte *derived, size_t derivedLen, byte pu
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0); CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
CRYPTOPP_UNUSED(purpose); CRYPTOPP_UNUSED(purpose);
@ -363,8 +364,8 @@ protected:
template <class T> template <class T>
size_t PKCS12_PBKDF<T>::GetValidDerivedLength(size_t keylength) const size_t PKCS12_PBKDF<T>::GetValidDerivedLength(size_t keylength) const
{ {
if (keylength > MaxDerivedLength()) if (keylength > MaxDerivedKeyLength())
return MaxDerivedLength(); return MaxDerivedKeyLength();
return keylength; return keylength;
} }
@ -374,7 +375,7 @@ size_t PKCS12_PBKDF<T>::DeriveKey(byte *derived, size_t derivedLen,
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0); byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1); unsigned int iterations = (unsigned int)params.GetIntValueWithDefault("Iterations", 1);
@ -394,7 +395,7 @@ size_t PKCS12_PBKDF<T>::DeriveKey(byte *derived, size_t derivedLen, byte purpose
{ {
CRYPTOPP_ASSERT(secret /*&& secretLen*/); CRYPTOPP_ASSERT(secret /*&& secretLen*/);
CRYPTOPP_ASSERT(derived && derivedLen); CRYPTOPP_ASSERT(derived && derivedLen);
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength()); CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0); CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
ThrowIfInvalidDerivedLength(derivedLen); ThrowIfInvalidDerivedLength(derivedLen);