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 &params);
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