2015-11-05 06:59:46 +00:00
|
|
|
// seckey.h - written and placed in the public domain by Wei Dai
|
|
|
|
|
|
|
|
//! \file
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \brief Classes and functions for implementing secret key algorithms.
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
#ifndef CRYPTOPP_SECKEY_H
|
|
|
|
#define CRYPTOPP_SECKEY_H
|
|
|
|
|
2015-11-19 21:48:56 +00:00
|
|
|
#include "config.h"
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
#if CRYPTOPP_MSC_VERSION
|
2015-12-17 06:39:13 +00:00
|
|
|
# pragma warning(push)
|
|
|
|
# pragma warning(disable: 4189)
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
2015-11-19 21:48:56 +00:00
|
|
|
#include "cryptlib.h"
|
2015-11-05 06:59:46 +00:00
|
|
|
#include "misc.h"
|
|
|
|
#include "simple.h"
|
|
|
|
|
|
|
|
NAMESPACE_BEGIN(CryptoPP)
|
|
|
|
|
|
|
|
//! \brief Inverts the cipher's direction
|
|
|
|
//! \param dir the cipher's direction
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \returns DECRYPTION if \ref CipherDir "dir" is ENCRYPTION, DECRYPTION otherwise
|
2015-11-05 06:59:46 +00:00
|
|
|
inline CipherDir ReverseCipherDir(CipherDir dir)
|
|
|
|
{
|
|
|
|
return (dir == ENCRYPTION) ? DECRYPTION : ENCRYPTION;
|
|
|
|
}
|
|
|
|
|
|
|
|
//! \class FixedBlockSize
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Inherited by algorithms with fixed block size
|
|
|
|
//! \tparam N the blocksize of the algorithm
|
2015-11-05 06:59:46 +00:00
|
|
|
template <unsigned int N>
|
|
|
|
class FixedBlockSize
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The block size of the algorithm provided as a constant.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(BLOCKSIZE = N)
|
|
|
|
};
|
|
|
|
|
|
|
|
// ************** rounds ***************
|
|
|
|
|
|
|
|
//! \class FixedRounds
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Inherited by algorithms with fixed number of rounds
|
|
|
|
//! \tparam R the number of rounds used by the algorithm
|
2015-11-05 06:59:46 +00:00
|
|
|
template <unsigned int R>
|
|
|
|
class FixedRounds
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The number of rounds for the algorithm provided as a constant.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(ROUNDS = R)
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class VariableRounds
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Inherited by algorithms with variable number of rounds
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \tparam D Default number of rounds
|
|
|
|
//! \tparam N Minimum number of rounds
|
|
|
|
//! \tparam D Maximum number of rounds
|
|
|
|
template <unsigned int D, unsigned int N=1, unsigned int M=INT_MAX> // use INT_MAX here because enums are treated as signed ints
|
|
|
|
class VariableRounds
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default number of rounds for the algorithm provided as a constant.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(DEFAULT_ROUNDS = D)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The minimum number of rounds for the algorithm provided as a constant.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MIN_ROUNDS = N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The maximum number of rounds for the algorithm provided as a constant.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MAX_ROUNDS = M)
|
2016-09-05 07:13:45 +00:00
|
|
|
//! \brief The default number of rounds for the algorithm based on key length
|
2015-11-05 06:59:46 +00:00
|
|
|
//! provided by a static function.
|
|
|
|
//! \param keylength the size of the key, in bytes
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details keylength is unused in the default implementation.
|
2016-09-05 07:13:45 +00:00
|
|
|
CRYPTOPP_CONSTEXPR static unsigned int StaticGetDefaultRounds(size_t keylength)
|
2016-09-07 13:32:06 +00:00
|
|
|
{
|
|
|
|
// Comma operator breaks Debug builds with GCC 4.0 - 4.6.
|
|
|
|
// Also see http://github.com/weidai11/cryptopp/issues/255
|
|
|
|
#if defined(CRYPTOPP_CXX11_CONSTEXPR)
|
|
|
|
return CRYPTOPP_UNUSED(keylength), static_cast<unsigned int>(DEFAULT_ROUNDS);
|
|
|
|
#else
|
|
|
|
CRYPTOPP_UNUSED(keylength);
|
|
|
|
return static_cast<unsigned int>(DEFAULT_ROUNDS);
|
|
|
|
#endif
|
|
|
|
}
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
protected:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Validates the number of rounds for an algorithm.
|
2016-09-07 13:32:06 +00:00
|
|
|
//! \param rounds the candidate number of rounds
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \param alg an Algorithm object used if the number of rounds are invalid
|
|
|
|
//! \throws InvalidRounds if the number of rounds are invalid
|
2016-09-05 07:13:45 +00:00
|
|
|
//! \details ThrowIfInvalidRounds() validates the number of rounds and throws if invalid.
|
2015-11-05 06:59:46 +00:00
|
|
|
inline void ThrowIfInvalidRounds(int rounds, const Algorithm *alg)
|
|
|
|
{
|
2016-09-04 12:10:43 +00:00
|
|
|
if (M == INT_MAX) // Coverity and result_independent_of_operands
|
|
|
|
{
|
|
|
|
if (rounds < MIN_ROUNDS)
|
|
|
|
throw InvalidRounds(alg ? alg->AlgorithmName() : std::string("VariableRounds"), rounds);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (rounds < MIN_ROUNDS || rounds > MAX_ROUNDS)
|
|
|
|
throw InvalidRounds(alg ? alg->AlgorithmName() : std::string("VariableRounds"), rounds);
|
|
|
|
}
|
2015-11-05 06:59:46 +00:00
|
|
|
}
|
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Validates the number of rounds for an algorithm
|
2016-09-07 13:32:06 +00:00
|
|
|
//! \param param the candidate number of rounds
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \param alg an Algorithm object used if the number of rounds are invalid
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \returns the number of rounds for the algorithm
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \throws InvalidRounds if the number of rounds are invalid
|
2016-09-05 07:13:45 +00:00
|
|
|
//! \details GetRoundsAndThrowIfInvalid() validates the number of rounds and throws if invalid.
|
2015-11-05 06:59:46 +00:00
|
|
|
inline unsigned int GetRoundsAndThrowIfInvalid(const NameValuePairs ¶m, const Algorithm *alg)
|
|
|
|
{
|
|
|
|
int rounds = param.GetIntValueWithDefault("Rounds", DEFAULT_ROUNDS);
|
|
|
|
ThrowIfInvalidRounds(rounds, alg);
|
|
|
|
return (unsigned int)rounds;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// ************** key length ***************
|
|
|
|
|
|
|
|
//! \class FixedKeyLength
|
|
|
|
//! \brief Inherited by keyed algorithms with fixed key length
|
|
|
|
//! \tparam N Default key length, in bytes
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \tparam IV_REQ the \ref SimpleKeyingInterface::IV_Requirement "IV requirements"
|
|
|
|
//! \tparam IV_L default IV length, in bytes
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \sa SimpleKeyingInterface
|
2015-11-05 06:59:46 +00:00
|
|
|
template <unsigned int N, unsigned int IV_REQ = SimpleKeyingInterface::NOT_RESYNCHRONIZABLE, unsigned int IV_L = 0>
|
|
|
|
class FixedKeyLength
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(KEYLENGTH=N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The minimum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MIN_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MIN_KEYLENGTH=N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The maximum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MAX_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MAX_KEYLENGTH=N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details DEFAULT_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(DEFAULT_KEYLENGTH=N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default IV requirements for the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details The default value is NOT_RESYNCHRONIZABLE. See IV_Requirement
|
2015-11-05 06:59:46 +00:00
|
|
|
//! in cryptlib.h for allowed values.
|
|
|
|
CRYPTOPP_CONSTANT(IV_REQUIREMENT = IV_REQ)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default IV length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details IV_LENGTH is provided in bytes, not bits. The default implementation uses 0.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(IV_LENGTH = IV_L)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length for the algorithm provided by a static function.
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \param keylength the size of the key, in bytes
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details The default implementation returns KEYLENGTH. keylength is unused
|
2015-11-05 06:59:46 +00:00
|
|
|
//! in the default implementation.
|
2016-09-05 07:13:45 +00:00
|
|
|
CRYPTOPP_CONSTEXPR static size_t CRYPTOPP_API StaticGetValidKeyLength(size_t keylength)
|
2016-09-07 13:32:06 +00:00
|
|
|
{
|
|
|
|
// Comma operator breaks Debug builds with GCC 4.0 - 4.6.
|
|
|
|
// Also see http://github.com/weidai11/cryptopp/issues/255
|
|
|
|
#if defined(CRYPTOPP_CXX11_CONSTEXPR)
|
|
|
|
return CRYPTOPP_UNUSED(keylength), static_cast<size_t>(KEYLENGTH);
|
|
|
|
#else
|
|
|
|
CRYPTOPP_UNUSED(keylength);
|
|
|
|
return static_cast<size_t>(KEYLENGTH);
|
|
|
|
#endif
|
|
|
|
}
|
2015-11-05 06:59:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//! \class VariableKeyLength
|
|
|
|
//! \brief Inherited by keyed algorithms with variable key length
|
|
|
|
//! \tparam D Default key length, in bytes
|
|
|
|
//! \tparam N Minimum key length, in bytes
|
|
|
|
//! \tparam M Maximum key length, in bytes
|
|
|
|
//! \tparam M Default key length multiple, in bytes. The default multiple is 1.
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \tparam IV_REQ the \ref SimpleKeyingInterface::IV_Requirement "IV requirements"
|
|
|
|
//! \tparam IV_L default IV length, in bytes. The default length is 0.
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \sa SimpleKeyingInterface
|
2015-11-05 06:59:46 +00:00
|
|
|
template <unsigned int D, unsigned int N, unsigned int M, unsigned int Q = 1, unsigned int IV_REQ = SimpleKeyingInterface::NOT_RESYNCHRONIZABLE, unsigned int IV_L = 0>
|
|
|
|
class VariableKeyLength
|
|
|
|
{
|
|
|
|
// Make these private to avoid Doxygen documenting them in all derived classes
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(Q > 0);
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(N % Q == 0);
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(M % Q == 0);
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(N < M);
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(D >= N);
|
|
|
|
CRYPTOPP_COMPILE_ASSERT(M >= D);
|
|
|
|
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The minimum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MIN_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MIN_KEYLENGTH=N)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The maximum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MAX_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MAX_KEYLENGTH=M)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details DEFAULT_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(DEFAULT_KEYLENGTH=D)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The key length multiple used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MAX_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(KEYLENGTH_MULTIPLE=Q)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default IV requirements for the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details The default value is NOT_RESYNCHRONIZABLE. See IV_Requirement
|
2015-11-05 06:59:46 +00:00
|
|
|
//! in cryptlib.h for allowed values.
|
|
|
|
CRYPTOPP_CONSTANT(IV_REQUIREMENT=IV_REQ)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default initialization vector length for the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details IV_LENGTH is provided in bytes, not bits. The default implementation uses 0.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(IV_LENGTH=IV_L)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Provides a valid key length for the algorithm provided by a static function.
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \param keylength the size of the key, in bytes
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details If keylength is less than MIN_KEYLENGTH, then the function returns
|
|
|
|
//! MIN_KEYLENGTH. If keylength is greater than MAX_KEYLENGTH, then the function
|
|
|
|
//! returns MAX_KEYLENGTH. If keylength is a multiple of KEYLENGTH_MULTIPLE,
|
|
|
|
//! then keylength is returned. Otherwise, the function returns keylength rounded
|
|
|
|
//! \a down to the next smaller multiple of KEYLENGTH_MULTIPLE.
|
|
|
|
//! \details keylength is provided in bytes, not bits.
|
2016-09-05 07:13:45 +00:00
|
|
|
// TODO: Figure out how to make this CRYPTOPP_CONSTEXPR
|
2015-11-05 06:59:46 +00:00
|
|
|
static size_t CRYPTOPP_API StaticGetValidKeyLength(size_t keylength)
|
|
|
|
{
|
2016-09-21 17:47:47 +00:00
|
|
|
if (keylength < (size_t)MIN_KEYLENGTH)
|
2015-11-05 06:59:46 +00:00
|
|
|
return MIN_KEYLENGTH;
|
2016-09-04 11:47:39 +00:00
|
|
|
else if (keylength > (size_t)MAX_KEYLENGTH)
|
2015-11-05 06:59:46 +00:00
|
|
|
return (size_t)MAX_KEYLENGTH;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
keylength += KEYLENGTH_MULTIPLE-1;
|
|
|
|
return keylength - keylength%KEYLENGTH_MULTIPLE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class SameKeyLengthAs
|
|
|
|
//! \brief Provides key lengths based on another class's key length
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \tparam T another FixedKeyLength or VariableKeyLength class
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \tparam IV_REQ the \ref SimpleKeyingInterface::IV_Requirement "IV requirements"
|
|
|
|
//! \tparam IV_L default IV length, in bytes
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \sa SimpleKeyingInterface
|
2015-11-05 06:59:46 +00:00
|
|
|
template <class T, unsigned int IV_REQ = SimpleKeyingInterface::NOT_RESYNCHRONIZABLE, unsigned int IV_L = 0>
|
|
|
|
class SameKeyLengthAs
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The minimum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MIN_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MIN_KEYLENGTH=T::MIN_KEYLENGTH)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The maximum key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MIN_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(MAX_KEYLENGTH=T::MAX_KEYLENGTH)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length used by the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details MIN_KEYLENGTH is provided in bytes, not bits
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(DEFAULT_KEYLENGTH=T::DEFAULT_KEYLENGTH)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default IV requirements for the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details The default value is NOT_RESYNCHRONIZABLE. See IV_Requirement
|
2015-11-05 06:59:46 +00:00
|
|
|
//! in cryptlib.h for allowed values.
|
|
|
|
CRYPTOPP_CONSTANT(IV_REQUIREMENT=IV_REQ)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default initialization vector length for the algorithm provided as a constant
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details IV_LENGTH is provided in bytes, not bits. The default implementation uses 0.
|
2015-11-05 06:59:46 +00:00
|
|
|
CRYPTOPP_CONSTANT(IV_LENGTH=IV_L)
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Provides a valid key length for the algorithm provided by a static function.
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \param keylength the size of the key, in bytes
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details If keylength is less than MIN_KEYLENGTH, then the function returns
|
|
|
|
//! MIN_KEYLENGTH. If keylength is greater than MAX_KEYLENGTH, then the function
|
|
|
|
//! returns MAX_KEYLENGTH. If keylength is a multiple of KEYLENGTH_MULTIPLE,
|
|
|
|
//! then keylength is returned. Otherwise, the function returns keylength rounded
|
|
|
|
//! \a down to the next smaller multiple of KEYLENGTH_MULTIPLE.
|
|
|
|
//! \details keylength is provided in bytes, not bits.
|
2016-09-05 07:13:45 +00:00
|
|
|
CRYPTOPP_CONSTEXPR static size_t CRYPTOPP_API StaticGetValidKeyLength(size_t keylength)
|
2015-11-05 06:59:46 +00:00
|
|
|
{return T::StaticGetValidKeyLength(keylength);}
|
|
|
|
};
|
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
// ************** implementation helper for SimpleKeyingInterface ***************
|
2015-11-05 06:59:46 +00:00
|
|
|
|
|
|
|
//! \class SimpleKeyingInterfaceImpl
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \brief Provides a base implementation of SimpleKeyingInterface
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \tparam BASE a SimpleKeyingInterface derived class
|
|
|
|
//! \tparam INFO a SimpleKeyingInterface derived class
|
2016-09-05 08:36:08 +00:00
|
|
|
//! \details SimpleKeyingInterfaceImpl() provides a default implementation for ciphers providing a keying interface.
|
2016-09-05 17:57:33 +00:00
|
|
|
//! Functions are virtual and not eligible for C++11 <tt>constexpr</tt>-ness.
|
2016-09-05 08:36:08 +00:00
|
|
|
//! \sa Algorithm(), SimpleKeyingInterface()
|
2015-11-05 06:59:46 +00:00
|
|
|
template <class BASE, class INFO = BASE>
|
|
|
|
class CRYPTOPP_NO_VTABLE SimpleKeyingInterfaceImpl : public BASE
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The minimum key length used by the algorithm
|
|
|
|
//! \returns minimum key length used by the algorithm, in bytes
|
2016-09-05 08:36:08 +00:00
|
|
|
size_t MinKeyLength() const
|
2015-11-05 06:59:46 +00:00
|
|
|
{return INFO::MIN_KEYLENGTH;}
|
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The maximum key length used by the algorithm
|
|
|
|
//! \returns maximum key length used by the algorithm, in bytes
|
2016-09-05 08:36:08 +00:00
|
|
|
size_t MaxKeyLength() const
|
2015-11-05 06:59:46 +00:00
|
|
|
{return (size_t)INFO::MAX_KEYLENGTH;}
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default key length used by the algorithm
|
|
|
|
//! \returns default key length used by the algorithm, in bytes
|
2016-09-05 08:36:08 +00:00
|
|
|
size_t DefaultKeyLength() const
|
2015-11-05 06:59:46 +00:00
|
|
|
{return INFO::DEFAULT_KEYLENGTH;}
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief Provides a valid key length for the algorithm
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \param keylength the size of the key, in bytes
|
2016-10-11 23:51:15 +00:00
|
|
|
//! \returns the valid key length, in bytes
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details keylength is provided in bytes, not bits. If keylength is less than MIN_KEYLENGTH,
|
|
|
|
//! then the function returns MIN_KEYLENGTH. If keylength is greater than MAX_KEYLENGTH,
|
|
|
|
//! then the function returns MAX_KEYLENGTH. if If keylength is a multiple of KEYLENGTH_MULTIPLE,
|
|
|
|
//! then keylength is returned. Otherwise, the function returns a \a lower multiple of
|
|
|
|
//! KEYLENGTH_MULTIPLE.
|
2016-09-05 08:36:08 +00:00
|
|
|
size_t GetValidKeyLength(size_t keylength) const {return INFO::StaticGetValidKeyLength(keylength);}
|
2015-11-05 06:59:46 +00:00
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default IV requirements for the algorithm
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details The default value is NOT_RESYNCHRONIZABLE. See IV_Requirement
|
2015-11-05 06:59:46 +00:00
|
|
|
//! in cryptlib.h for allowed values.
|
2016-09-05 08:36:08 +00:00
|
|
|
SimpleKeyingInterface::IV_Requirement IVRequirement() const
|
2015-11-05 06:59:46 +00:00
|
|
|
{return (SimpleKeyingInterface::IV_Requirement)INFO::IV_REQUIREMENT;}
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \brief The default initialization vector length for the algorithm
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details IVSize is provided in bytes, not bits. The default implementation uses IV_LENGTH, which is 0.
|
2016-09-05 08:36:08 +00:00
|
|
|
unsigned int IVSize() const
|
2015-11-05 06:59:46 +00:00
|
|
|
{return INFO::IV_LENGTH;}
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class BlockCipherImpl
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \brief Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \tparam INFO a SimpleKeyingInterface derived class
|
|
|
|
//! \tparam BASE a SimpleKeyingInterface derived class
|
2016-09-05 08:36:08 +00:00
|
|
|
//! \details BlockCipherImpl() provides a default implementation for block ciphers using AlgorithmImpl()
|
2016-09-05 17:57:33 +00:00
|
|
|
//! and SimpleKeyingInterfaceImpl(). Functions are virtual and not eligible for C++11 <tt>constexpr</tt>-ness.
|
2016-09-05 08:36:08 +00:00
|
|
|
//! \sa Algorithm(), SimpleKeyingInterface(), AlgorithmImpl(), SimpleKeyingInterfaceImpl()
|
2015-11-05 06:59:46 +00:00
|
|
|
template <class INFO, class BASE = BlockCipher>
|
|
|
|
class CRYPTOPP_NO_VTABLE BlockCipherImpl : public AlgorithmImpl<SimpleKeyingInterfaceImpl<TwoBases<BASE, INFO> > >
|
|
|
|
{
|
|
|
|
public:
|
2015-12-14 04:53:50 +00:00
|
|
|
//! Provides the block size of the algorithm
|
|
|
|
//! \returns the block size of the algorithm, in bytes
|
2015-11-05 06:59:46 +00:00
|
|
|
unsigned int BlockSize() const {return this->BLOCKSIZE;}
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class BlockCipherFinal
|
|
|
|
//! \brief Provides class member functions to key a block cipher
|
|
|
|
//! \tparam DIR a CipherDir
|
|
|
|
//! \tparam BASE a BlockCipherImpl derived class
|
|
|
|
template <CipherDir DIR, class BASE>
|
|
|
|
class BlockCipherFinal : public ClonableImpl<BlockCipherFinal<DIR, BASE>, BASE>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//! \brief Construct a default BlockCipherFinal
|
|
|
|
//! \details The cipher is not keyed.
|
|
|
|
BlockCipherFinal() {}
|
2015-11-18 20:32:28 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \brief Construct a BlockCipherFinal
|
|
|
|
//! \param key a byte array used to key the cipher
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details key must be at least DEFAULT_KEYLENGTH in length. Internally, the function calls
|
|
|
|
//! SimpleKeyingInterface::SetKey.
|
2015-11-05 06:59:46 +00:00
|
|
|
BlockCipherFinal(const byte *key)
|
|
|
|
{this->SetKey(key, this->DEFAULT_KEYLENGTH);}
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \brief Construct a BlockCipherFinal
|
|
|
|
//! \param key a byte array used to key the cipher
|
|
|
|
//! \param length the length of the byte array
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details key must be at least DEFAULT_KEYLENGTH in length. Internally, the function calls
|
|
|
|
//! SimpleKeyingInterface::SetKey.
|
2015-11-05 06:59:46 +00:00
|
|
|
BlockCipherFinal(const byte *key, size_t length)
|
|
|
|
{this->SetKey(key, length);}
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \brief Construct a BlockCipherFinal
|
|
|
|
//! \param key a byte array used to key the cipher
|
|
|
|
//! \param length the length of the byte array
|
|
|
|
//! \param rounds the number of rounds
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details key must be at least DEFAULT_KEYLENGTH in length. Internally, the function calls
|
|
|
|
//! SimpleKeyingInterface::SetKeyWithRounds.
|
2015-11-05 06:59:46 +00:00
|
|
|
BlockCipherFinal(const byte *key, size_t length, unsigned int rounds)
|
|
|
|
{this->SetKeyWithRounds(key, length, rounds);}
|
|
|
|
|
|
|
|
//! \brief Provides the direction of the cipher
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \returns true if DIR is ENCRYPTION, false otherwise
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \sa GetCipherDirection(), IsPermutation()
|
2016-09-05 08:36:08 +00:00
|
|
|
bool IsForwardTransformation() const {return DIR == ENCRYPTION;}
|
2015-11-05 06:59:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//! \class MessageAuthenticationCodeImpl
|
2015-12-17 06:37:01 +00:00
|
|
|
//! \brief Provides a base implementation of Algorithm and SimpleKeyingInterface for message authentication codes
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \tparam INFO a SimpleKeyingInterface derived class
|
|
|
|
//! \tparam BASE a SimpleKeyingInterface derived class
|
2016-09-05 08:36:08 +00:00
|
|
|
//! \details MessageAuthenticationCodeImpl() provides a default implementation for message authentication codes
|
|
|
|
//! using AlgorithmImpl() and SimpleKeyingInterfaceImpl(). Functions are virtual and not subject to C++11
|
|
|
|
//! <tt>constexpr</tt>.
|
|
|
|
//! \sa Algorithm(), SimpleKeyingInterface(), AlgorithmImpl(), SimpleKeyingInterfaceImpl()
|
2015-11-05 06:59:46 +00:00
|
|
|
template <class BASE, class INFO = BASE>
|
|
|
|
class MessageAuthenticationCodeImpl : public AlgorithmImpl<SimpleKeyingInterfaceImpl<BASE, INFO>, INFO>
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class MessageAuthenticationCodeFinal
|
|
|
|
//! \brief Provides class member functions to key a message authentication code
|
|
|
|
//! \tparam DIR a CipherDir
|
|
|
|
//! \tparam BASE a BlockCipherImpl derived class
|
|
|
|
template <class BASE>
|
|
|
|
class MessageAuthenticationCodeFinal : public ClonableImpl<MessageAuthenticationCodeFinal<BASE>, MessageAuthenticationCodeImpl<BASE> >
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//! \brief Construct a default MessageAuthenticationCodeFinal
|
|
|
|
//! \details The message authentication code is not keyed.
|
|
|
|
MessageAuthenticationCodeFinal() {}
|
|
|
|
//! \brief Construct a BlockCipherFinal
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \param key a byte array used to key the algorithm
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details key must be at least DEFAULT_KEYLENGTH in length. Internally, the function calls
|
|
|
|
//! SimpleKeyingInterface::SetKey.
|
2015-11-05 06:59:46 +00:00
|
|
|
MessageAuthenticationCodeFinal(const byte *key)
|
|
|
|
{this->SetKey(key, this->DEFAULT_KEYLENGTH);}
|
|
|
|
//! \brief Construct a BlockCipherFinal
|
2015-12-14 04:53:50 +00:00
|
|
|
//! \param key a byte array used to key the algorithm
|
2015-11-05 06:59:46 +00:00
|
|
|
//! \param length the length of the byte array
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \details key must be at least DEFAULT_KEYLENGTH in length. Internally, the function calls
|
|
|
|
//! SimpleKeyingInterface::SetKey.
|
2015-11-05 06:59:46 +00:00
|
|
|
MessageAuthenticationCodeFinal(const byte *key, size_t length)
|
|
|
|
{this->SetKey(key, length);}
|
|
|
|
};
|
|
|
|
|
|
|
|
// ************** documentation ***************
|
|
|
|
|
|
|
|
//! \class BlockCipherDocumentation
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \brief Provides Encryption and Decryption typedefs used by derived classes to
|
2015-11-05 06:59:46 +00:00
|
|
|
//! implement a block cipher
|
|
|
|
//! \details These objects usually should not be used directly. See CipherModeDocumentation
|
2016-09-05 07:13:45 +00:00
|
|
|
//! instead. Each class derived from this one defines two types, Encryption and Decryption,
|
2015-11-05 06:59:46 +00:00
|
|
|
//! both of which implement the BlockCipher interface.
|
|
|
|
struct BlockCipherDocumentation
|
|
|
|
{
|
|
|
|
//! implements the BlockCipher interface
|
|
|
|
typedef BlockCipher Encryption;
|
|
|
|
//! implements the BlockCipher interface
|
|
|
|
typedef BlockCipher Decryption;
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class SymmetricCipherDocumentation
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \brief Provides Encryption and Decryption typedefs used by derived classes to
|
2015-11-05 06:59:46 +00:00
|
|
|
//! implement a symmetric cipher
|
2016-09-05 07:13:45 +00:00
|
|
|
//! \details Each class derived from this one defines two types, Encryption and Decryption,
|
2015-11-05 06:59:46 +00:00
|
|
|
//! both of which implement the SymmetricCipher interface. Two types of classes derive
|
|
|
|
//! from this class: stream ciphers and block cipher modes. Stream ciphers can be used
|
|
|
|
//! alone, cipher mode classes need to be used with a block cipher. See CipherModeDocumentation
|
|
|
|
//! for more for information about using cipher modes and block ciphers.
|
|
|
|
struct SymmetricCipherDocumentation
|
|
|
|
{
|
|
|
|
//! implements the SymmetricCipher interface
|
|
|
|
typedef SymmetricCipher Encryption;
|
|
|
|
//! implements the SymmetricCipher interface
|
|
|
|
typedef SymmetricCipher Decryption;
|
|
|
|
};
|
|
|
|
|
|
|
|
//! \class AuthenticatedSymmetricCipherDocumentation
|
2015-11-18 20:32:28 +00:00
|
|
|
//! \brief Provides Encryption and Decryption typedefs used by derived classes to
|
2015-11-05 06:59:46 +00:00
|
|
|
//! implement an authenticated encryption cipher
|
2016-09-05 07:13:45 +00:00
|
|
|
//! \details Each class derived from this one defines two types, Encryption and Decryption,
|
2015-11-05 06:59:46 +00:00
|
|
|
//! both of which implement the AuthenticatedSymmetricCipher interface.
|
|
|
|
struct AuthenticatedSymmetricCipherDocumentation
|
|
|
|
{
|
|
|
|
//! implements the AuthenticatedSymmetricCipher interface
|
|
|
|
typedef AuthenticatedSymmetricCipher Encryption;
|
|
|
|
//! implements the AuthenticatedSymmetricCipher interface
|
|
|
|
typedef AuthenticatedSymmetricCipher Decryption;
|
|
|
|
};
|
|
|
|
|
|
|
|
NAMESPACE_END
|
2016-09-05 07:13:45 +00:00
|
|
|
|
2015-11-05 06:59:46 +00:00
|
|
|
#if CRYPTOPP_MSC_VERSION
|
2015-12-17 06:39:13 +00:00
|
|
|
# pragma warning(pop)
|
2015-11-05 06:59:46 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|