Skip to content

Commit c0a5a06

Browse files
committed
Fix use of MaxDerivedKeyLength (GH #874)
Also fix memcpy with NULL buffer
1 parent 2ba9d3d commit c0a5a06

3 files changed

Lines changed: 18 additions & 17 deletions

File tree

‎cryptlib.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,12 +334,12 @@ void RandomNumberGenerator::GenerateIntoBufferedTransformation(BufferedTransform
334334
}
335335
}
336336

337-
size_t KeyDerivationFunction::MinDerivedLength() const
337+
size_t KeyDerivationFunction::MinDerivedKeyLength() const
338338
{
339339
return 0;
340340
}
341341

342-
size_t KeyDerivationFunction::MaxDerivedLength() const
342+
size_t KeyDerivationFunction::MaxDerivedKeyLength() const
343343
{
344344
return static_cast<size_t>(-1);
345345
}

‎cryptlib.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,11 +1477,11 @@ class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE KeyDerivationFunction : public Algorithm
14771477

14781478
/// \brief Determine minimum number of bytes
14791479
/// \returns Minimum number of bytes which can be derived
1480-
virtual size_t MinDerivedLength() const;
1480+
virtual size_t MinDerivedKeyLength() const;
14811481

14821482
/// \brief Determine maximum number of bytes
14831483
/// \returns Maximum number of bytes which can be derived
1484-
virtual size_t MaxDerivedLength() const;
1484+
virtual size_t MaxDerivedKeyLength() const;
14851485

14861486
/// \brief Returns a valid key length for the derivation function
14871487
/// \param keylength the size of the derived key, in bytes

‎pwdbased.h‎

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ class PKCS5_PBKDF1 : public PasswordBasedKeyDerivationFunction
8282
template <class T>
8383
size_t PKCS5_PBKDF1<T>::GetValidDerivedLength(size_t keylength) const
8484
{
85-
if (keylength > MaxDerivedLength())
86-
return MaxDerivedLength();
85+
if (keylength > MaxDerivedKeyLength())
86+
return MaxDerivedKeyLength();
8787
return keylength;
8888
}
8989

@@ -93,7 +93,7 @@ size_t PKCS5_PBKDF1<T>::DeriveKey(byte *derived, size_t derivedLen,
9393
{
9494
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
9595
CRYPTOPP_ASSERT(derived && derivedLen);
96-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
96+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
9797

9898
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
9999
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
112112
{
113113
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
114114
CRYPTOPP_ASSERT(derived && derivedLen);
115-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
115+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
116116
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
117117
CRYPTOPP_UNUSED(purpose);
118118

@@ -137,7 +137,8 @@ size_t PKCS5_PBKDF1<T>::DeriveKey(byte *derived, size_t derivedLen, byte purpose
137137
for (i=1; i<iterations || (timeInSeconds && (i%128!=0 || timer.ElapsedTimeAsDouble() < timeInSeconds)); i++)
138138
hash.CalculateDigest(buffer, buffer, buffer.size());
139139

140-
memcpy(derived, buffer, derivedLen);
140+
if (derived)
141+
memcpy(derived, buffer, derivedLen);
141142
return i;
142143
}
143144

@@ -206,8 +207,8 @@ class PKCS5_PBKDF2_HMAC : public PasswordBasedKeyDerivationFunction
206207
template <class T>
207208
size_t PKCS5_PBKDF2_HMAC<T>::GetValidDerivedLength(size_t keylength) const
208209
{
209-
if (keylength > MaxDerivedLength())
210-
return MaxDerivedLength();
210+
if (keylength > MaxDerivedKeyLength())
211+
return MaxDerivedKeyLength();
211212
return keylength;
212213
}
213214

@@ -217,7 +218,7 @@ size_t PKCS5_PBKDF2_HMAC<T>::DeriveKey(byte *derived, size_t derivedLen,
217218
{
218219
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
219220
CRYPTOPP_ASSERT(derived && derivedLen);
220-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
221+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
221222

222223
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
223224
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
236237
{
237238
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
238239
CRYPTOPP_ASSERT(derived && derivedLen);
239-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
240+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
240241
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
241242
CRYPTOPP_UNUSED(purpose);
242243

@@ -363,8 +364,8 @@ class PKCS12_PBKDF : public PasswordBasedKeyDerivationFunction
363364
template <class T>
364365
size_t PKCS12_PBKDF<T>::GetValidDerivedLength(size_t keylength) const
365366
{
366-
if (keylength > MaxDerivedLength())
367-
return MaxDerivedLength();
367+
if (keylength > MaxDerivedKeyLength())
368+
return MaxDerivedKeyLength();
368369
return keylength;
369370
}
370371

@@ -374,7 +375,7 @@ size_t PKCS12_PBKDF<T>::DeriveKey(byte *derived, size_t derivedLen,
374375
{
375376
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
376377
CRYPTOPP_ASSERT(derived && derivedLen);
377-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
378+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
378379

379380
byte purpose = (byte)params.GetIntValueWithDefault("Purpose", 0);
380381
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
394395
{
395396
CRYPTOPP_ASSERT(secret /*&& secretLen*/);
396397
CRYPTOPP_ASSERT(derived && derivedLen);
397-
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedLength());
398+
CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength());
398399
CRYPTOPP_ASSERT(iterations > 0 || timeInSeconds > 0);
399400

400401
ThrowIfInvalidDerivedLength(derivedLen);

0 commit comments

Comments
 (0)