Crypto++ 8.9 Free C++ class library of cryptographic schemes

des.h
Go to the documentation of this file.
1 // des.h - originally 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 /// \brief DES block cipher base class
15 /// \since Crypto++ 1.0
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
25 FixedSizeSecBlock<word32, 32> k;
26 };
27
28 /// \brief DES block cipher information
29 /// \since Crypto++ 1.0
30 struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
31 {
32 // disable DES in DLL version by not exporting this function
33 CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() {return "DES";}
34 };
35
36 /// \brief DES block cipher
37 /// \details The DES implementation in Crypto++ ignores the parity bits
38 /// (the least significant bits of each byte) in the key. However you can use CheckKeyParityBits()
39 /// and CorrectKeyParityBits() to check or correct the parity bits if you wish.
40 /// \sa <a href="http://www.cryptopp.com/wiki/TripleDES">DES</a>
41 /// \since Crypto++ 1.0
42 class DES : public DES_Info, public BlockCipherDocumentation
43 {
44 /// \brief DES block cipher default operation
45 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_Info>, public RawDES
46 {
47 public:
48 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
49 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
50 };
51
52 public:
53 /// check DES key parity bits
54 static bool CheckKeyParityBits(const byte *key);
55 /// correct DES key parity bits
56 static void CorrectKeyParityBits(byte *key);
57
58 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
59 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
60 };
61
62 /// \brief 2-key TripleDES block cipher information
63 /// \since Crypto++ 1.0
64 struct DES_EDE2_Info : public FixedBlockSize<8>, public FixedKeyLength<16>
65 {
66 CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE2";}
67 };
68
69 /// \brief 2-key TripleDES block cipher
70 /// \sa <a href="http://www.cryptopp.com/wiki/TripleDES">DES-EDE2</a>
71 /// \since Crypto++ 1.0
72 class DES_EDE2 : public DES_EDE2_Info, public BlockCipherDocumentation
73 {
74 /// \brief DES_EDE2 block cipher default operation
75 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE2_Info>
76 {
77 public:
78 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
79 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
80
81 protected:
82 RawDES m_des1, m_des2;
83 };
84
85 public:
86 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
87 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
88 };
89
90 /// \brief 3-key TripleDES block cipher information
91 /// \since Crypto++ 1.0
92 struct DES_EDE3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
93 {
94 CRYPTOPP_DLL static const char * CRYPTOPP_API StaticAlgorithmName() {return "DES-EDE3";}
95 };
96
97 /// \brief 3-key TripleDES block cipher
98 /// \sa <a href="http://www.cryptopp.com/wiki/TripleDES">DES-EDE3</a>
99 /// \since Crypto++ 1.0
100 class DES_EDE3 : public DES_EDE3_Info, public BlockCipherDocumentation
101 {
102 /// \brief DES_EDE3 block cipher default operation
103 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_EDE3_Info>
104 {
105 public:
106 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
107 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
108
109 protected:
110 RawDES m_des1, m_des2, m_des3;
111 };
112
113 public:
114 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
115 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
116 };
117
118 /// \brief DESX block cipher information
119 /// \since Crypto++ 3.2
120 struct DES_XEX3_Info : public FixedBlockSize<8>, public FixedKeyLength<24>
121 {
122 CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() {return "DES-XEX3";}
123 };
124
125 /// \brief DESX block cipher
126 /// \sa <a href="http://www.cryptopp.com/wiki/TripleDES">DES-XEX3</a>, AKA DESX
127 /// \since Crypto++ 3.2
128 class DES_XEX3 : public DES_XEX3_Info, public BlockCipherDocumentation
129 {
130 /// \brief DES_XEX3 block cipher default operation
131 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_XEX3_Info>
132 {
133 public:
134 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params);
135 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
136
137 protected:
138 FixedSizeSecBlock<byte, BLOCKSIZE> m_x1, m_x3;
139 // VS2005 workaround: calling modules compiled with /clr gets unresolved external symbol DES::Base::ProcessAndXorBlock
140 // if we use DES::Encryption here directly without value_ptr.
141 value_ptr<DES::Encryption> m_des;
142 };
143
144 public:
145 typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
146 typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
147 };
148
149 typedef DES::Encryption DESEncryption;
150 typedef DES::Decryption DESDecryption;
151
152 typedef DES_EDE2::Encryption DES_EDE2_Encryption;
153 typedef DES_EDE2::Decryption DES_EDE2_Decryption;
154
155 typedef DES_EDE3::Encryption DES_EDE3_Encryption;
156 typedef DES_EDE3::Decryption DES_EDE3_Decryption;
157
158 typedef DES_XEX3::Encryption DES_XEX3_Encryption;
159 typedef DES_XEX3::Decryption DES_XEX3_Decryption;
160
161 NAMESPACE_END
162
163 #endif
BlockCipherFinal
Provides class member functions to key a block cipher.
Definition: seckey.h:318
BlockCipherImpl
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:306
DES_EDE2
2-key TripleDES block cipher
Definition: des.h:73
DES_EDE3
3-key TripleDES block cipher
Definition: des.h:101
DES_XEX3
DESX block cipher.
Definition: des.h:129
DES
DES block cipher.
Definition: des.h:43
DES::CheckKeyParityBits
static bool CheckKeyParityBits(const byte *key)
check DES key parity bits
Definition: des.cpp:420
DES::CorrectKeyParityBits
static void CorrectKeyParityBits(byte *key)
correct DES key parity bits
Definition: des.cpp:428
FixedBlockSize
Inherited by algorithms with fixed block size.
Definition: seckey.h:41
FixedKeyLength
Inherited by keyed algorithms with fixed key length.
Definition: seckey.h:125
FixedSizeSecBlock< word32, 32 >
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:327
RawDES
DES block cipher base class.
Definition: des.h:17
value_ptr
Value pointer.
Definition: smartptr.h:77
CRYPTOPP_API
#define CRYPTOPP_API
Win32 calling convention.
Definition: config_dll.h:119
word32
unsigned int word32
32-bit unsigned datatype
Definition: config_int.h:72
CipherDir
CipherDir
Specifies a direction for a cipher to operate.
Definition: cryptlib.h:128
CryptoPP
Crypto++ library namespace.
secblock.h
Classes and functions for secure memory allocations.
seckey.h
Classes and functions for implementing secret key algorithms.
BlockCipherDocumentation
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher.
Definition: seckey.h:399
DES_EDE2_Info
2-key TripleDES block cipher information
Definition: des.h:65
DES_EDE3_Info
3-key TripleDES block cipher information
Definition: des.h:93
DES_Info
DES block cipher information.
Definition: des.h:31
DES_XEX3_Info
DESX block cipher information.
Definition: des.h:121