1 // rc5.h - originally written and placed in the public domain by Wei Dai 2 3 /// \file rc5.h 4 /// \brief Classes for the RC5 block cipher 5 6 #ifndef CRYPTOPP_RC5_H 7 #define CRYPTOPP_RC5_H 8 9 #include "seckey.h" 10 #include "secblock.h" 11 12 NAMESPACE_BEGIN(CryptoPP) 13 14 /// \brief RC5 block cipher information 15 /// \since Crypto++ 1.0 16 struct RC5_Info : public FixedBlockSize<8>, public VariableKeyLength<16, 0, 255>, public VariableRounds<16> 17 { StaticAlgorithmNameRC5_Info18 CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() {return "RC5";} 19 typedef word32 RC5_WORD; 20 }; 21 22 /// \brief RC5 block cipher 23 /// \sa <a href="http://www.cryptopp.com/wiki/RC5">RC5</a> 24 /// \since Crypto++ 1.0 25 class RC5 : public RC5_Info, public BlockCipherDocumentation 26 { 27 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<RC5_Info> 28 { 29 public: 30 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms); 31 32 protected: 33 unsigned int r; // number of rounds 34 SecBlock<RC5_WORD> sTable; // expanded key table 35 }; 36 37 class CRYPTOPP_NO_VTABLE Enc : public Base 38 { 39 public: 40 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 41 }; 42 43 class CRYPTOPP_NO_VTABLE Dec : public Base 44 { 45 public: 46 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 47 }; 48 49 public: 50 typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption; 51 typedef BlockCipherFinal<DECRYPTION, Dec> Decryption; 52 }; 53 54 typedef RC5::Encryption RC5Encryption; 55 typedef RC5::Decryption RC5Decryption; 56 57 NAMESPACE_END 58 59 #endif 60