Crypto++
des.h
Go to the documentation of this file.
00001 #ifndef CRYPTOPP_DES_H
00002 #define CRYPTOPP_DES_H
00003 
00004 /** \file
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     // disable DES in DLL version by not exporting this function
00028     static const char * StaticAlgorithmName() {return "DES";}
00029 };
00030 
00031 /// <a href="http://www.weidai.com/scan-mirror/cs.html#DES">DES</a>
00032 /*! The DES implementation in Crypto++ ignores the parity bits
00033     (the least significant bits of each byte) in the key. However
00034     you can use CheckKeyParityBits() and CorrectKeyParityBits() to
00035     check or correct the parity bits if you wish. */
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 &params);
00042         void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00043     };
00044 
00045 public:
00046     //! check DES key parity bits
00047     static bool CheckKeyParityBits(const byte *key);
00048     //! correct DES key parity bits
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 /// <a href="http://www.weidai.com/scan-mirror/cs.html#DESede">DES-EDE2</a>
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 &params);
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 /// <a href="http://www.weidai.com/scan-mirror/cs.html#DESede">DES-EDE3</a>
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 &params);
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 /// <a href="http://www.weidai.com/scan-mirror/cs.html#DESX">DES-XEX3</a>, AKA DESX
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 &params);
00116         void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00117 
00118     protected:
00119         FixedSizeSecBlock<byte, BLOCKSIZE> m_x1, m_x3;
00120         // VS2005 workaround: calling modules compiled with /clr gets unresolved external symbol DES::Base::ProcessAndXorBlock
00121         // if we use DES::Encryption here directly without value_ptr.
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