Crypto++  5.6.4
Free C++ class library of cryptographic schemes
des.h
Go to the documentation of this file.
1 // des.h - written and placed in the public domain by Wei Dai
2 
3 //! \file des.h
4 //! \brief Classes for DES, 2-key Triple-DES, 3-key Triple-DES and DESX
5 
6 #ifndef CRYPTOPP_DES_H
7 #define CRYPTOPP_DES_H
8 
9 #include "seckey.h"
10 #include "secblock.h"
11 
12 NAMESPACE_BEGIN(CryptoPP)
13 
14 //! \class RawDES
15 //! \brief DES block cipher base class
16 class CRYPTOPP_DLL RawDES
17 {
18 public:
19  void RawSetKey(CipherDir direction, const byte *userKey);
20  void RawProcessBlock(word32 &l, word32 &r) const;
21 
22 protected:
23  static const word32 Spbox[8][64];
24 
26 };
27 
28 //! \class DES_Info
29 //! \brief DES block cipher information
30 struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
31 {
32  // disable DES in DLL version by not exporting this function
33  CRYPTOPP_CONSTEXPR static const char *StaticAlgorithmName() {return "DES";}
34 };
35 
36 //! \class DES
37 //! \brief DES block cipher
38 //! \details The DES implementation in Crypto++ ignores the parity bits
39 //! (the least significant bits of each byte) in the key. However you can use CheckKeyParityBits()
40 //! and CorrectKeyParityBits() to check or correct the parity bits if you wish.
41 //! \sa <a href="http://www.weidai.com/scan-mirror/cs.html#DES">DES</a>
42 class DES : public DES_Info, public BlockCipherDocumentation
43 {
44  //! \class Base
45  //! \brief DES block cipher default operation
46  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_Info>, public RawDES
47  {
48  public:
49  void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
50  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
51  };
52 
53 public:
54  //! check DES key parity bits
55  static bool CheckKeyParityBits(const byte *key);
56  //! correct DES key parity bits
57  static void CorrectKeyParityBits(byte *key);
58 
61 };
62 
63 //! \class DES_EDE2_Info
64 //! \brief 2-key TripleDES block cipher information
65 struct DES_EDE2_Info : public FixedBlockSize<8>, public FixedKeyLength<16>
66 {
67  CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE2";}
68 };
69 
70 //! \class DES_EDE2
71 //! \brief 2-key TripleDES block cipher
72 /// \sa <a href="http://www.weidai.com/scan-mirror/cs.html#DESede">DES-EDE2</a>
74 {
75  //! \class Base
76  //! \brief DES_EDE2 block cipher default operation
77  class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE2_Info>
78  {
79  public:
80  void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
81  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
82 
83  protected:
84  RawDES m_des1, m_des2;
85  };
86 
87 public:
90 };
91 
92 //! \class DES_EDE3_Info
93 //! \brief 3-key TripleDES block cipher information
94 struct DES_EDE3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
95 {
96  CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE3";}
97 };
98 
99 //! \class DES_EDE3
100 //! \brief 3-key TripleDES block cipher
101 //! \sa <a href="http://www.weidai.com/scan-mirror/cs.html#DESede">DES-EDE3</a>
103 {
104  //! \class Base
105  //! \brief DES_EDE3 block cipher default operation
106  class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE3_Info>
107  {
108  public:
109  void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
110  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
111 
112  protected:
113  RawDES m_des1, m_des2, m_des3;
114  };
115 
116 public:
119 };
120 
121 //! \class DES_XEX3_Info
122 //! \brief DESX block cipher information
123 struct DES_XEX3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
124 {
125  CRYPTOPP_CONSTEXPR static const char *StaticAlgorithmName() {return "DES-XEX3";}
126 };
127 
128 //! \class DES_XEX3
129 //! \brief DESX block cipher
130 //! \sa <a href="http://www.weidai.com/scan-mirror/cs.html#DESX">DES-XEX3</a>, AKA DESX
132 {
133  //! \class Base
134  //! \brief DES_XEX3 block cipher default operation
135  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_XEX3_Info>
136  {
137  public:
138  void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
139  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
140 
141  protected:
143  // VS2005 workaround: calling modules compiled with /clr gets unresolved external symbol DES::Base::ProcessAndXorBlock
144  // if we use DES::Encryption here directly without value_ptr.
146  };
147 
148 public:
151 };
152 
155 
158 
161 
164 
165 NAMESPACE_END
166 
167 #endif
Inherited by keyed algorithms with fixed key length.
Definition: seckey.h:128
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher...
Definition: seckey.h:423
static void CorrectKeyParityBits(byte *key)
correct DES key parity bits
Definition: des.cpp:416
CipherDir
Specifies a direction for a cipher to operate.
Definition: cryptlib.h:108
DES block cipher base class.
Definition: des.h:16
DES block cipher.
Definition: des.h:42
Classes and functions for secure memory allocations.
Inherited by algorithms with fixed block size.
Definition: seckey.h:34
DESX block cipher.
Definition: des.h:131
3-key TripleDES block cipher
Definition: des.h:102
Classes and functions for implementing secret key algorithms.
2-key TripleDES block cipher information
Definition: des.h:65
Provides class member functions to key a block cipher.
Definition: seckey.h:339
3-key TripleDES block cipher information
Definition: des.h:94
2-key TripleDES block cipher
Definition: des.h:73
DES block cipher information.
Definition: des.h:30
DESX block cipher information.
Definition: des.h:123
static bool CheckKeyParityBits(const byte *key)
check DES key parity bits
Definition: des.cpp:408
Value pointer.
Definition: smartptr.h:79
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:326
Crypto++ library namespace.
Interface for retrieving values given their names.
Definition: cryptlib.h:282