1 // square.h - originally written and placed in the public domain by Wei Dai 2 3 /// \file square.h 4 /// \brief Classes for the Square block cipher 5 6 #ifndef CRYPTOPP_SQUARE_H 7 #define CRYPTOPP_SQUARE_H 8 9 #include "seckey.h" 10 #include "secblock.h" 11 12 NAMESPACE_BEGIN(CryptoPP) 13 14 /// \brief Square block cipher information 15 /// \since Crypto++ 2.2 16 struct Square_Info : public FixedBlockSize<16>, public FixedKeyLength<16>, FixedRounds<8> 17 { StaticAlgorithmNameSquare_Info18 CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() {return "Square";} 19 }; 20 21 /// \brief Square block cipher 22 /// \sa <a href="http://www.cryptopp.com/wiki/Square">Square</a> 23 /// \since Crypto++ 2.2 24 class Square : public Square_Info, public BlockCipherDocumentation 25 { 26 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<Square_Info> 27 { 28 public: 29 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms); 30 31 protected: 32 FixedSizeSecBlock<word32, 4*(ROUNDS+1)> m_roundkeys; 33 }; 34 35 class CRYPTOPP_NO_VTABLE Enc : public Base 36 { 37 public: 38 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 39 private: 40 static const byte Se[256]; 41 static const word32 Te[4][256]; 42 }; 43 44 class CRYPTOPP_NO_VTABLE Dec : public Base 45 { 46 public: 47 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 48 private: 49 static const byte Sd[256]; 50 static const word32 Td[4][256]; 51 }; 52 53 public: 54 typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption; 55 typedef BlockCipherFinal<DECRYPTION, Dec> Decryption; 56 }; 57 58 typedef Square::Encryption SquareEncryption; 59 typedef Square::Decryption SquareDecryption; 60 61 NAMESPACE_END 62 63 #endif 64