Crypto++

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

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