I have the following scenario and was wondering if there is a good solution for it.
I am using Crypto++ and declare the following:
if (_HashType == SHA1)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA256)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA384)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA512)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
pbkdf.DeriveKey(...)
}
what I would like to do is something like this:
PKCS5_PBKDF2_HMAC<?> pbkdf;
if (_HashType == SHA1)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
else if (_HashType == SHA256)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
else if (_HashType == SHA384)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
else if (_HashType == SHA512)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
pbkdf.DeriveKey(...)
Any advice?
The common base class for PKCS5_PBKDF2_HMAC<>
is PasswordBasedKeyDerivationFunction
, so what you can do is:
PasswordBasedKeyDerivationFunction* pbkdf;
if (_HashType == SHA1)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>();
else if (_HashType == SHA256)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>();
else if (_HashType == SHA384)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>();
else if (_HashType == SHA512)
pbkdf = PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>();
pbkdf->DeriveKey(...)
//...
delete pbkdf;
If you are using C++11 or later, you can use smart pointers and don't have to worry about memory management:
std::unique_ptr<PasswordBasedKeyDerivationFunction> pbkdf;
if (_HashType == SHA1)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>());
else if (_HashType == SHA256)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>());
else if (_HashType == SHA384)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>());
else if (_HashType == SHA512)
pbkdf.reset(PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>());
pbkdf->DeriveKey(...)