00001 #ifndef CRYPTOPP_RC2_H
00002 #define CRYPTOPP_RC2_H
00003
00004
00005
00006
00007 #include "seckey.h"
00008 #include "secblock.h"
00009
00010 NAMESPACE_BEGIN(CryptoPP)
00011
00012
00013 struct RC2_Info : public FixedBlockSize<8>, public VariableKeyLength<16, 1, 128>
00014 {
00015 enum {DEFAULT_EFFECTIVE_KEYLENGTH = 1024, MAX_EFFECTIVE_KEYLENGTH = 1024};
00016 static const char *StaticAlgorithmName() {return "RC2";}
00017 };
00018
00019
00020 class RC2 : public RC2_Info, public BlockCipherDocumentation
00021 {
00022 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<RC2_Info>
00023 {
00024 public:
00025 void UncheckedSetKey(CipherDir direction, const byte *key, unsigned int length, unsigned int effectiveKeyLength);
00026 void SetKeyWithEffectiveKeyLength(const byte *key, unsigned int length, unsigned int effectiveKeyLength);
00027
00028 protected:
00029 template <class T>
00030 static inline void CheckedSetKey(T *obj, CipherDir dir, const byte *key, unsigned int length, const NameValuePairs ¶m)
00031 {
00032 obj->ThrowIfInvalidKeyLength(length);
00033 int effectiveKeyLength = param.GetIntValueWithDefault("EffectiveKeyLength", DEFAULT_EFFECTIVE_KEYLENGTH);
00034 obj->SetKeyWithEffectiveKeyLength(key, length, effectiveKeyLength);
00035 }
00036
00037 FixedSizeSecBlock<word16, 64> K;
00038 };
00039
00040 class CRYPTOPP_NO_VTABLE Enc : public Base
00041 {
00042 public:
00043 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00044 };
00045
00046 class CRYPTOPP_NO_VTABLE Dec : public Base
00047 {
00048 public:
00049 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00050 };
00051
00052 public:
00053 class Encryption : public BlockCipherFinal<ENCRYPTION, Enc>
00054 {
00055 public:
00056 Encryption() {}
00057 Encryption(const byte *key, unsigned int keyLen=DEFAULT_KEYLENGTH, unsigned int effectiveLen=1024)
00058 {SetKeyWithEffectiveKeyLength(key, keyLen, effectiveLen);}
00059 };
00060
00061 class Decryption : public BlockCipherFinal<DECRYPTION, Dec>
00062 {
00063 public:
00064 Decryption() {}
00065 Decryption(const byte *key, unsigned int keyLen=DEFAULT_KEYLENGTH, unsigned int effectiveLen=1024)
00066 {SetKeyWithEffectiveKeyLength(key, keyLen, effectiveLen);}
00067 };
00068 };
00069
00070 typedef RC2::Encryption RC2Encryption;
00071 typedef RC2::Decryption RC2Decryption;
00072
00073 NAMESPACE_END
00074
00075 #endif