// speck.h - written and placed in the public domain by Jeffrey Walton //! \file speck.h //! \brief Classes for the Speck block cipher //! \details Speck is a block cipher designed by Ray Beaulieu, Douglas Shors, Jason Smith, //! Stefan Treatman-Clark, Bryan Weeks and Louis Wingers. //! \sa The SIMON and SPECK Families of //! Lightweight Block Ciphers and //! The Simon and Speck GitHub //! \since Crypto++ 6.0 #ifndef CRYPTOPP_SPECK_H #define CRYPTOPP_SPECK_H #include "config.h" #include "seckey.h" #include "secblock.h" NAMESPACE_BEGIN(CryptoPP) //! \class SPECK_Info //! \brief SPECK block cipher information //! \tparam BS block size of the cipher, in bytes //! \tparam D default key length, in bytes //! \tparam N minimum key length, in bytes //! \tparam M maximum key length, in bytes //! \since Crypto++ 6.0 template struct SPECK_Info : public FixedBlockSize, VariableKeyLength { static const std::string StaticAlgorithmName() { // Format is Cipher-Blocksize(Keylength) return "SPECK-" + IntToString(BS*8); } }; //! \class SPECK_Base //! \brief SPECK block cipher base class //! \tparam BS block size of the cipher, in bytes //! \details User code should use SPECK64 or SPECK128 //! \sa SPECK64, SPECK128, SPECK //! \since Crypto++ 6.0 template struct SPECK_Base { virtual ~SPECK_Base() {} SPECK_Base() : m_kwords(0) {} typedef SecBlock > AlignedSecBlock; mutable AlignedSecBlock m_wspace; // workspace AlignedSecBlock m_rkey; // round keys unsigned int m_kwords; // number of key words }; //! \class SPECK64 //! \brief SPECK 64-bit block cipher //! \details Speck is a block cipher designed by Ray Beaulieu, Douglas Shors, Jason Smith, //! Stefan Treatman-Clark, Bryan Weeks and Louis Wingers. //! \details SPECK64 provides 64-bit block size. The valid key sizes are 96-bit and 128-bit. //! \sa SPECK64, SPECK128, The SIMON and SPECK //! Families of Lightweight Block Ciphers, //! The Simon and Speck GitHub, SPECK on the //! Crypto++ wiki //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE SPECK64 : public SPECK_Info<8, 12, 12, 16>, public BlockCipherDocumentation { public: //! \brief SPECK block cipher transformation functions //! \details Provides implementation common to encryption and decryption //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Base : protected SPECK_Base, public BlockCipherImpl > { public: std::string AlgorithmName() const { return StaticAlgorithmName() + (m_kwords == 0 ? "" : "(" + IntToString(m_kwords*sizeof(word32)*8) + ")"); } protected: void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs ¶ms); }; //! \brief Provides implementation for encryption transformation //! \details Enc provides implementation for encryption transformation. All key //! sizes are supported. //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Enc : public Base { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; }; //! \brief Provides implementation for encryption transformation //! \details Dec provides implementation for decryption transformation. All key //! sizes are supported. //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Dec : public Base { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; }; typedef BlockCipherFinal Encryption; typedef BlockCipherFinal Decryption; }; //! \class SPECK128 //! \brief SPECK 128-bit block cipher //! \details Speck is a block cipher designed by Ray Beaulieu, Douglas Shors, Jason Smith, //! Stefan Treatman-Clark, Bryan Weeks and Louis Wingers. //! \details SPECK128 provides 128-bit block size. The valid key sizes are 128-bit, 192-bit and 256-bit. //! \sa SPECK64, SPECK128, The SIMON and SPECK //! Families of Lightweight Block Ciphers, //! The Simon and Speck GitHub, SPECK on the //! Crypto++ wiki //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE SPECK128 : public SPECK_Info<16, 16, 16, 32>, public BlockCipherDocumentation { public: //! \brief SPECK block cipher transformation functions //! \details Provides implementation common to encryption and decryption //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Base : protected SPECK_Base, public BlockCipherImpl > { public: std::string AlgorithmName() const { return StaticAlgorithmName() + (m_kwords == 0 ? "" : "(" + IntToString(m_kwords*sizeof(word64)*8) + ")"); } protected: void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs ¶ms); }; //! \brief Provides implementation for encryption transformation //! \details Enc provides implementation for encryption transformation. All key //! sizes are supported. //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Enc : public Base { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; }; //! \brief Provides implementation for encryption transformation //! \details Dec provides implementation for decryption transformation. All key //! sizes are supported. //! \since Crypto++ 6.0 class CRYPTOPP_NO_VTABLE Dec : public Base { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; }; typedef BlockCipherFinal Encryption; typedef BlockCipherFinal Decryption; }; NAMESPACE_END #endif // CRYPTOPP_SPECK_H