Search code examples
c++crypto++

Declaring variables of same type and reusing them


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?


Solution

  • 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(...)