00001 #ifndef CRYPTOPP_DES_H
00002 #define CRYPTOPP_DES_H
00003
00004
00005
00006
00007 #include "seckey.h"
00008 #include "secblock.h"
00009
00010 NAMESPACE_BEGIN(CryptoPP)
00011
00012 class CRYPTOPP_DLL RawDES
00013 {
00014 public:
00015 void RawSetKey(CipherDir direction, const byte *userKey);
00016 void RawProcessBlock(word32 &l, word32 &r) const;
00017
00018 protected:
00019 static const word32 Spbox[8][64];
00020
00021 FixedSizeSecBlock<word32, 32> k;
00022 };
00023
00024
00025 struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
00026 {
00027
00028 static const char * StaticAlgorithmName() {return "DES";}
00029 };
00030
00031
00032
00033
00034
00035
00036 class DES : public DES_Info, public BlockCipherDocumentation
00037 {
00038 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_Info>, public RawDES
00039 {
00040 public:
00041 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms);
00042 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00043 };
00044
00045 public:
00046
00047 static bool CheckKeyParityBits(const byte *key);
00048
00049 static void CorrectKeyParityBits(byte *key);
00050
00051 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
00052 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
00053 };
00054
00055
00056 struct DES_EDE2_Info : public FixedBlockSize<8>, public FixedKeyLength<16>
00057 {
00058 CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE2";}
00059 };
00060
00061
00062 class DES_EDE2 : public DES_EDE2_Info, public BlockCipherDocumentation
00063 {
00064 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE2_Info>
00065 {
00066 public:
00067 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms);
00068 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00069
00070 protected:
00071 RawDES m_des1, m_des2;
00072 };
00073
00074 public:
00075 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
00076 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
00077 };
00078
00079
00080 struct DES_EDE3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
00081 {
00082 CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE3";}
00083 };
00084
00085
00086 class DES_EDE3 : public DES_EDE3_Info, public BlockCipherDocumentation
00087 {
00088 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE3_Info>
00089 {
00090 public:
00091 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms);
00092 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00093
00094 protected:
00095 RawDES m_des1, m_des2, m_des3;
00096 };
00097
00098 public:
00099 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
00100 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
00101 };
00102
00103
00104 struct DES_XEX3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
00105 {
00106 static const char *StaticAlgorithmName() {return "DES-XEX3";}
00107 };
00108
00109
00110 class DES_XEX3 : public DES_XEX3_Info, public BlockCipherDocumentation
00111 {
00112 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_XEX3_Info>
00113 {
00114 public:
00115 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms);
00116 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00117
00118 protected:
00119 FixedSizeSecBlock<byte, BLOCKSIZE> m_x1, m_x3;
00120
00121
00122 value_ptr<DES::Encryption> m_des;
00123 };
00124
00125 public:
00126 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
00127 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
00128 };
00129
00130 typedef DES::Encryption DESEncryption;
00131 typedef DES::Decryption DESDecryption;
00132
00133 typedef DES_EDE2::Encryption DES_EDE2_Encryption;
00134 typedef DES_EDE2::Decryption DES_EDE2_Decryption;
00135
00136 typedef DES_EDE3::Encryption DES_EDE3_Encryption;
00137 typedef DES_EDE3::Decryption DES_EDE3_Decryption;
00138
00139 typedef DES_XEX3::Encryption DES_XEX3_Encryption;
00140 typedef DES_XEX3::Decryption DES_XEX3_Decryption;
00141
00142 NAMESPACE_END
00143
00144 #endif