PluginProbe ʕ •ᴥ•ʔ
JetBackup – Backup, Restore & Migrate / trunk
JetBackup – Backup, Restore & Migrate vtrunk
3.1.22.4 3.1.22.3 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.8.1 1.4.9 1.5.0 1.5.1 1.5.1.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.10 1.6.11 1.6.12 1.6.13 1.6.15 1.6.5.1 1.6.8.8 1.6.9 1.6.9.1 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7.5 2.0.8.7 2.0.9.11 2.0.9.14 2.0.9.15 2.0.9.6 2.0.9.7 2.0.9.9 3.1.10.7 3.1.11.1 3.1.12.3 3.1.13.4 3.1.14.17 3.1.15.4 3.1.16.1 3.1.17.5 3.1.18.10 3.1.18.8 3.1.18.9 3.1.19.8 3.1.20.3 3.1.21.3 3.1.7.9 3.1.9.2 trunk 1.1.90 1.1.91 1.2.0 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt / DES.php
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt Last commit date
Common 1 year ago DH 1 year ago DSA 1 year ago EC 1 year ago RSA 1 year ago .htaccess 1 year ago AES.php 1 year ago Blowfish.php 1 year ago ChaCha20.php 1 year ago DES.php 1 year ago DH.php 1 year ago DSA.php 1 year ago EC.php 1 year ago Hash.php 1 year ago PublicKeyLoader.php 1 year ago RC2.php 1 year ago RC4.php 1 year ago RSA.php 1 year ago Random.php 1 year ago Rijndael.php 1 year ago Salsa20.php 1 year ago TripleDES.php 1 year ago Twofish.php 1 year ago index.html 1 year ago web.config 1 year ago
DES.php
1370 lines
1 <?php
2
3 /**
4 * Pure-PHP implementation of DES.
5 *
6 * Uses OpenSSL, if available/possible, and an internal implementation, otherwise
7 *
8 * PHP version 5
9 *
10 * Useful resources are as follows:
11 *
12 * - {@link http://en.wikipedia.org/wiki/DES_supplementary_material Wikipedia: DES supplementary material}
13 * - {@link http://www.itl.nist.gov/fipspubs/fip46-2.htm FIPS 46-2 - (DES), Data Encryption Standard}
14 * - {@link http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-DES.html JavaScript DES Example}
15 *
16 * Here's a short example of how to use this library:
17 * <code>
18 * <?php
19 * include 'vendor/autoload.php';
20 *
21 * $des = new \phpseclib3\Crypt\DES('ctr');
22 *
23 * $des->setKey('abcdefgh');
24 *
25 * $size = 10 * 1024;
26 * $plaintext = '';
27 * for ($i = 0; $i < $size; $i++) {
28 * $plaintext.= 'a';
29 * }
30 *
31 * echo $des->decrypt($des->encrypt($plaintext));
32 * ?>
33 * </code>
34 *
35 * @author Jim Wigginton <terrafrost@php.net>
36 * @copyright 2007 Jim Wigginton
37 * @license http://www.opensource.org/licenses/mit-license.html MIT License
38 * @link http://phpseclib.sourceforge.net
39 */
40
41 declare(strict_types=1);
42
43 namespace phpseclib3\Crypt;
44
45 use phpseclib3\Crypt\Common\BlockCipher;
46 use phpseclib3\Exception\BadModeException;
47 use phpseclib3\Exception\LengthException;
48
49 /**
50 * Pure-PHP implementation of DES.
51 *
52 * @author Jim Wigginton <terrafrost@php.net>
53 */
54 class DES extends BlockCipher
55 {
56 /**
57 * Contains $keys[self::ENCRYPT]
58 *
59 * @see \phpseclib3\Crypt\DES::setupKey()
60 * @see \phpseclib3\Crypt\DES::processBlock()
61 */
62 public const ENCRYPT = 0;
63 /**
64 * Contains $keys[self::DECRYPT]
65 *
66 * @see \phpseclib3\Crypt\DES::setupKey()
67 * @see \phpseclib3\Crypt\DES::processBlock()
68 */
69 public const DECRYPT = 1;
70
71 /**
72 * Block Length of the cipher
73 *
74 * @see \phpseclib3\Crypt\Common\SymmetricKey::block_size
75 * @var int
76 */
77 protected $block_size = 8;
78
79 /**
80 * Key Length (in bytes)
81 *
82 * @see \phpseclib3\Crypt\Common\SymmetricKey::setKeyLength()
83 * @var int
84 */
85 protected $key_length = 8;
86
87 /**
88 * The OpenSSL names of the cipher / modes
89 *
90 * @see \phpseclib3\Crypt\Common\SymmetricKey::openssl_mode_names
91 * @var array
92 */
93 protected $openssl_mode_names = [
94 self::MODE_ECB => 'des-ecb',
95 self::MODE_CBC => 'des-cbc',
96 self::MODE_CFB => 'des-cfb',
97 self::MODE_OFB => 'des-ofb',
98 // self::MODE_CTR is undefined for DES
99 ];
100
101 /**
102 * Switch for DES/3DES encryption
103 *
104 * Used only if $engine == self::ENGINE_INTERNAL
105 *
106 * @see self::setupKey()
107 * @see self::processBlock()
108 * @var int
109 */
110 protected $des_rounds = 1;
111
112 /**
113 * max possible size of $key
114 *
115 * @see self::setKey()
116 * @var string
117 */
118 protected $key_length_max = 8;
119
120 /**
121 * The Key Schedule
122 *
123 * @see self::setupKey()
124 * @var array
125 */
126 private $keys;
127
128 /**
129 * Key Cache "key"
130 *
131 * @see self::setupKey()
132 * @var array
133 */
134 private $kl;
135
136 /**
137 * Shuffle table.
138 *
139 * For each byte value index, the entry holds an 8-byte string
140 * with each byte containing all bits in the same state as the
141 * corresponding bit in the index value.
142 *
143 * @see self::processBlock()
144 * @see self::setupKey()
145 * @var array
146 */
147 protected static $shuffle = [
148 "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF",
149 "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF",
150 "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF",
151 "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF",
152 "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF",
153 "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF",
154 "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF",
155 "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF",
156 "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF",
157 "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF",
158 "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF",
159 "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF",
160 "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF",
161 "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF",
162 "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF",
163 "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF",
164 "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF",
165 "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF",
166 "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF",
167 "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF",
168 "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF",
169 "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF",
170 "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF",
171 "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF",
172 "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF",
173 "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF",
174 "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF",
175 "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF",
176 "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF",
177 "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF",
178 "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF",
179 "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF",
180 "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF",
181 "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF",
182 "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF",
183 "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF",
184 "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF",
185 "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF",
186 "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF",
187 "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF",
188 "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF",
189 "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF",
190 "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF",
191 "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF",
192 "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF",
193 "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF",
194 "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF",
195 "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF",
196 "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF",
197 "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF",
198 "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF",
199 "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF",
200 "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF",
201 "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF",
202 "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF",
203 "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF",
204 "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF",
205 "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF",
206 "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF",
207 "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF",
208 "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF",
209 "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF",
210 "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF",
211 "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
212 "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF",
213 "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF",
214 "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF",
215 "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF",
216 "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF",
217 "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF",
218 "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF",
219 "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF",
220 "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF",
221 "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF",
222 "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF",
223 "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF",
224 "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF",
225 "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF",
226 "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF",
227 "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF",
228 "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF",
229 "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF",
230 "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF",
231 "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF",
232 "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF",
233 "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF",
234 "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF",
235 "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF",
236 "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF",
237 "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF",
238 "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF",
239 "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF",
240 "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF",
241 "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF",
242 "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF",
243 "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF",
244 "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF",
245 "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF",
246 "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF",
247 "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF",
248 "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF",
249 "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF",
250 "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF",
251 "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF",
252 "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF",
253 "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF",
254 "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF",
255 "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF",
256 "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF",
257 "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF",
258 "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF",
259 "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF",
260 "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF",
261 "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF",
262 "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF",
263 "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF",
264 "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF",
265 "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF",
266 "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF",
267 "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF",
268 "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF",
269 "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF",
270 "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF",
271 "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF",
272 "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF",
273 "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF",
274 "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF",
275 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
276 ];
277
278 /**
279 * IP mapping helper table.
280 *
281 * Indexing this table with each source byte performs the initial bit permutation.
282 *
283 * @var array
284 */
285 protected static $ipmap = [
286 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31,
287 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33,
288 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71,
289 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73,
290 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35,
291 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37,
292 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75,
293 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77,
294 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1,
295 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3,
296 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1,
297 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3,
298 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5,
299 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7,
300 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5,
301 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7,
302 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39,
303 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B,
304 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79,
305 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B,
306 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D,
307 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
308 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D,
309 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
310 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9,
311 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB,
312 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9,
313 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB,
314 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD,
315 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF,
316 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD,
317 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF,
318 ];
319
320 /**
321 * Inverse IP mapping helper table.
322 * Indexing this table with a byte value reverses the bit order.
323 *
324 * @var array
325 */
326 protected static $invipmap = [
327 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
328 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
329 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
330 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
331 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
332 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
333 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
334 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
335 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
336 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
337 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
338 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
339 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
340 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
341 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
342 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
343 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
344 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
345 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
346 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
347 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
348 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
349 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
350 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
351 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
352 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
353 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
354 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
355 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
356 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
357 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
358 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF,
359 ];
360
361 /**
362 * Pre-permuted S-box1
363 *
364 * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the
365 * P table: concatenation can then be replaced by exclusive ORs.
366 *
367 * @var array
368 */
369 protected static $sbox1 = [
370 0x00808200, 0x00000000, 0x00008000, 0x00808202,
371 0x00808002, 0x00008202, 0x00000002, 0x00008000,
372 0x00000200, 0x00808200, 0x00808202, 0x00000200,
373 0x00800202, 0x00808002, 0x00800000, 0x00000002,
374 0x00000202, 0x00800200, 0x00800200, 0x00008200,
375 0x00008200, 0x00808000, 0x00808000, 0x00800202,
376 0x00008002, 0x00800002, 0x00800002, 0x00008002,
377 0x00000000, 0x00000202, 0x00008202, 0x00800000,
378 0x00008000, 0x00808202, 0x00000002, 0x00808000,
379 0x00808200, 0x00800000, 0x00800000, 0x00000200,
380 0x00808002, 0x00008000, 0x00008200, 0x00800002,
381 0x00000200, 0x00000002, 0x00800202, 0x00008202,
382 0x00808202, 0x00008002, 0x00808000, 0x00800202,
383 0x00800002, 0x00000202, 0x00008202, 0x00808200,
384 0x00000202, 0x00800200, 0x00800200, 0x00000000,
385 0x00008002, 0x00008200, 0x00000000, 0x00808002,
386 ];
387
388 /**
389 * Pre-permuted S-box2
390 *
391 * @var array
392 */
393 protected static $sbox2 = [
394 0x40084010, 0x40004000, 0x00004000, 0x00084010,
395 0x00080000, 0x00000010, 0x40080010, 0x40004010,
396 0x40000010, 0x40084010, 0x40084000, 0x40000000,
397 0x40004000, 0x00080000, 0x00000010, 0x40080010,
398 0x00084000, 0x00080010, 0x40004010, 0x00000000,
399 0x40000000, 0x00004000, 0x00084010, 0x40080000,
400 0x00080010, 0x40000010, 0x00000000, 0x00084000,
401 0x00004010, 0x40084000, 0x40080000, 0x00004010,
402 0x00000000, 0x00084010, 0x40080010, 0x00080000,
403 0x40004010, 0x40080000, 0x40084000, 0x00004000,
404 0x40080000, 0x40004000, 0x00000010, 0x40084010,
405 0x00084010, 0x00000010, 0x00004000, 0x40000000,
406 0x00004010, 0x40084000, 0x00080000, 0x40000010,
407 0x00080010, 0x40004010, 0x40000010, 0x00080010,
408 0x00084000, 0x00000000, 0x40004000, 0x00004010,
409 0x40000000, 0x40080010, 0x40084010, 0x00084000,
410 ];
411
412 /**
413 * Pre-permuted S-box3
414 *
415 * @var array
416 */
417 protected static $sbox3 = [
418 0x00000104, 0x04010100, 0x00000000, 0x04010004,
419 0x04000100, 0x00000000, 0x00010104, 0x04000100,
420 0x00010004, 0x04000004, 0x04000004, 0x00010000,
421 0x04010104, 0x00010004, 0x04010000, 0x00000104,
422 0x04000000, 0x00000004, 0x04010100, 0x00000100,
423 0x00010100, 0x04010000, 0x04010004, 0x00010104,
424 0x04000104, 0x00010100, 0x00010000, 0x04000104,
425 0x00000004, 0x04010104, 0x00000100, 0x04000000,
426 0x04010100, 0x04000000, 0x00010004, 0x00000104,
427 0x00010000, 0x04010100, 0x04000100, 0x00000000,
428 0x00000100, 0x00010004, 0x04010104, 0x04000100,
429 0x04000004, 0x00000100, 0x00000000, 0x04010004,
430 0x04000104, 0x00010000, 0x04000000, 0x04010104,
431 0x00000004, 0x00010104, 0x00010100, 0x04000004,
432 0x04010000, 0x04000104, 0x00000104, 0x04010000,
433 0x00010104, 0x00000004, 0x04010004, 0x00010100,
434 ];
435
436 /**
437 * Pre-permuted S-box4
438 *
439 * @var array
440 */
441 protected static $sbox4 = [
442 0x80401000, 0x80001040, 0x80001040, 0x00000040,
443 0x00401040, 0x80400040, 0x80400000, 0x80001000,
444 0x00000000, 0x00401000, 0x00401000, 0x80401040,
445 0x80000040, 0x00000000, 0x00400040, 0x80400000,
446 0x80000000, 0x00001000, 0x00400000, 0x80401000,
447 0x00000040, 0x00400000, 0x80001000, 0x00001040,
448 0x80400040, 0x80000000, 0x00001040, 0x00400040,
449 0x00001000, 0x00401040, 0x80401040, 0x80000040,
450 0x00400040, 0x80400000, 0x00401000, 0x80401040,
451 0x80000040, 0x00000000, 0x00000000, 0x00401000,
452 0x00001040, 0x00400040, 0x80400040, 0x80000000,
453 0x80401000, 0x80001040, 0x80001040, 0x00000040,
454 0x80401040, 0x80000040, 0x80000000, 0x00001000,
455 0x80400000, 0x80001000, 0x00401040, 0x80400040,
456 0x80001000, 0x00001040, 0x00400000, 0x80401000,
457 0x00000040, 0x00400000, 0x00001000, 0x00401040,
458 ];
459
460 /**
461 * Pre-permuted S-box5
462 *
463 * @var array
464 */
465 protected static $sbox5 = [
466 0x00000080, 0x01040080, 0x01040000, 0x21000080,
467 0x00040000, 0x00000080, 0x20000000, 0x01040000,
468 0x20040080, 0x00040000, 0x01000080, 0x20040080,
469 0x21000080, 0x21040000, 0x00040080, 0x20000000,
470 0x01000000, 0x20040000, 0x20040000, 0x00000000,
471 0x20000080, 0x21040080, 0x21040080, 0x01000080,
472 0x21040000, 0x20000080, 0x00000000, 0x21000000,
473 0x01040080, 0x01000000, 0x21000000, 0x00040080,
474 0x00040000, 0x21000080, 0x00000080, 0x01000000,
475 0x20000000, 0x01040000, 0x21000080, 0x20040080,
476 0x01000080, 0x20000000, 0x21040000, 0x01040080,
477 0x20040080, 0x00000080, 0x01000000, 0x21040000,
478 0x21040080, 0x00040080, 0x21000000, 0x21040080,
479 0x01040000, 0x00000000, 0x20040000, 0x21000000,
480 0x00040080, 0x01000080, 0x20000080, 0x00040000,
481 0x00000000, 0x20040000, 0x01040080, 0x20000080,
482 ];
483
484 /**
485 * Pre-permuted S-box6
486 *
487 * @var array
488 */
489 protected static $sbox6 = [
490 0x10000008, 0x10200000, 0x00002000, 0x10202008,
491 0x10200000, 0x00000008, 0x10202008, 0x00200000,
492 0x10002000, 0x00202008, 0x00200000, 0x10000008,
493 0x00200008, 0x10002000, 0x10000000, 0x00002008,
494 0x00000000, 0x00200008, 0x10002008, 0x00002000,
495 0x00202000, 0x10002008, 0x00000008, 0x10200008,
496 0x10200008, 0x00000000, 0x00202008, 0x10202000,
497 0x00002008, 0x00202000, 0x10202000, 0x10000000,
498 0x10002000, 0x00000008, 0x10200008, 0x00202000,
499 0x10202008, 0x00200000, 0x00002008, 0x10000008,
500 0x00200000, 0x10002000, 0x10000000, 0x00002008,
501 0x10000008, 0x10202008, 0x00202000, 0x10200000,
502 0x00202008, 0x10202000, 0x00000000, 0x10200008,
503 0x00000008, 0x00002000, 0x10200000, 0x00202008,
504 0x00002000, 0x00200008, 0x10002008, 0x00000000,
505 0x10202000, 0x10000000, 0x00200008, 0x10002008,
506 ];
507
508 /**
509 * Pre-permuted S-box7
510 *
511 * @var array
512 */
513 protected static $sbox7 = [
514 0x00100000, 0x02100001, 0x02000401, 0x00000000,
515 0x00000400, 0x02000401, 0x00100401, 0x02100400,
516 0x02100401, 0x00100000, 0x00000000, 0x02000001,
517 0x00000001, 0x02000000, 0x02100001, 0x00000401,
518 0x02000400, 0x00100401, 0x00100001, 0x02000400,
519 0x02000001, 0x02100000, 0x02100400, 0x00100001,
520 0x02100000, 0x00000400, 0x00000401, 0x02100401,
521 0x00100400, 0x00000001, 0x02000000, 0x00100400,
522 0x02000000, 0x00100400, 0x00100000, 0x02000401,
523 0x02000401, 0x02100001, 0x02100001, 0x00000001,
524 0x00100001, 0x02000000, 0x02000400, 0x00100000,
525 0x02100400, 0x00000401, 0x00100401, 0x02100400,
526 0x00000401, 0x02000001, 0x02100401, 0x02100000,
527 0x00100400, 0x00000000, 0x00000001, 0x02100401,
528 0x00000000, 0x00100401, 0x02100000, 0x00000400,
529 0x02000001, 0x02000400, 0x00000400, 0x00100001,
530 ];
531
532 /**
533 * Pre-permuted S-box8
534 *
535 * @var array
536 */
537 protected static $sbox8 = [
538 0x08000820, 0x00000800, 0x00020000, 0x08020820,
539 0x08000000, 0x08000820, 0x00000020, 0x08000000,
540 0x00020020, 0x08020000, 0x08020820, 0x00020800,
541 0x08020800, 0x00020820, 0x00000800, 0x00000020,
542 0x08020000, 0x08000020, 0x08000800, 0x00000820,
543 0x00020800, 0x00020020, 0x08020020, 0x08020800,
544 0x00000820, 0x00000000, 0x00000000, 0x08020020,
545 0x08000020, 0x08000800, 0x00020820, 0x00020000,
546 0x00020820, 0x00020000, 0x08020800, 0x00000800,
547 0x00000020, 0x08020020, 0x00000800, 0x00020820,
548 0x08000800, 0x00000020, 0x08000020, 0x08020000,
549 0x08020020, 0x08000000, 0x00020000, 0x08000820,
550 0x00000000, 0x08020820, 0x00020020, 0x08000020,
551 0x08020000, 0x08000800, 0x08000820, 0x00000000,
552 0x08020820, 0x00020800, 0x00020800, 0x00000820,
553 0x00000820, 0x00020020, 0x08000000, 0x08020800,
554 ];
555
556 /**
557 * Default Constructor.
558 *
559 * @throws BadModeException if an invalid / unsupported mode is provided
560 */
561 public function __construct(string $mode)
562 {
563 parent::__construct($mode);
564
565 if ($this->mode == self::MODE_STREAM) {
566 throw new BadModeException('Block ciphers cannot be ran in stream mode');
567 }
568 }
569
570 /**
571 * Test for engine validity
572 *
573 * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine()
574 *
575 * @see \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine()
576 */
577 protected function isValidEngineHelper(int $engine): bool
578 {
579 if ($this->key_length_max == 8) {
580 if ($engine == self::ENGINE_OPENSSL) {
581 // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1
582 // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider"
583 // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not
584 if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) {
585 return false;
586 }
587 $this->cipher_name_openssl_ecb = 'des-ecb';
588 $this->cipher_name_openssl = 'des-' . $this->openssl_translate_mode();
589 }
590 }
591
592 return parent::isValidEngineHelper($engine);
593 }
594
595 /**
596 * Sets the key.
597 *
598 * Keys must be 64-bits long or 8 bytes long.
599 *
600 * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
601 *
602 * @see \phpseclib3\Crypt\Common\SymmetricKey::setKey()
603 */
604 public function setKey(string $key): void
605 {
606 if (!($this instanceof TripleDES) && strlen($key) != 8) {
607 throw new LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of size 8 are supported');
608 }
609
610 // Sets the key
611 parent::setKey($key);
612 }
613
614 /**
615 * Encrypts a block
616 *
617 * @see self::encrypt()
618 * @see \phpseclib3\Crypt\Common\SymmetricKey::encryptBlock()
619 * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt()
620 */
621 protected function encryptBlock(string $in): string
622 {
623 return $this->processBlock($in, self::ENCRYPT);
624 }
625
626 /**
627 * Decrypts a block
628 *
629 * @see self::decrypt()
630 * @see \phpseclib3\Crypt\Common\SymmetricKey::decryptBlock()
631 * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt()
632 */
633 protected function decryptBlock(string $in): string
634 {
635 return $this->processBlock($in, self::DECRYPT);
636 }
637
638 /**
639 * Encrypts or decrypts a 64-bit block
640 *
641 * $mode should be either self::ENCRYPT or self::DECRYPT. See
642 * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general
643 * idea of what this function does.
644 *
645 * @return string
646 * @see self::decryptBlock()
647 * @see self::encryptBlock()
648 */
649 private function processBlock(string $block, int $mode)
650 {
651 static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
652 if (!$sbox1) {
653 $sbox1 = array_map('intval', self::$sbox1);
654 $sbox2 = array_map('intval', self::$sbox2);
655 $sbox3 = array_map('intval', self::$sbox3);
656 $sbox4 = array_map('intval', self::$sbox4);
657 $sbox5 = array_map('intval', self::$sbox5);
658 $sbox6 = array_map('intval', self::$sbox6);
659 $sbox7 = array_map('intval', self::$sbox7);
660 $sbox8 = array_map('intval', self::$sbox8);
661 /* Merge $shuffle with $[inv]ipmap */
662 for ($i = 0; $i < 256; ++$i) {
663 $shuffleip[] = self::$shuffle[self::$ipmap[$i]];
664 $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]];
665 }
666 }
667
668 $keys = $this->keys[$mode];
669 $ki = -1;
670
671 // Do the initial IP permutation.
672 $t = unpack('Nl/Nr', $block);
673 [$l, $r] = [$t['l'], $t['r']];
674 $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
675 ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
676 ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
677 ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
678 ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
679 ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
680 ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
681 ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
682
683 // Extract L0 and R0.
684 $t = unpack('Nl/Nr', $block);
685 [$l, $r] = [$t['l'], $t['r']];
686
687 for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
688 // Perform the 16 steps.
689 for ($i = 0; $i < 16; $i++) {
690 // start of "the Feistel (F) function" - see the following URL:
691 // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
692 // Merge key schedule.
693 $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki];
694 $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki];
695
696 // S-box indexing.
697 $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
698 $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
699 $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
700 $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l;
701 // end of "the Feistel (F) function"
702
703 $l = $r;
704 $r = $t;
705 }
706
707 // Last step should not permute L & R.
708 $t = $l;
709 $l = $r;
710 $r = $t;
711 }
712
713 // Perform the inverse IP permutation.
714 return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
715 ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
716 ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
717 ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
718 ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
719 ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
720 ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
721 ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
722 }
723
724 /**
725 * Creates the key schedule
726 *
727 * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey()
728 */
729 protected function setupKey(): void
730 {
731 if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) {
732 // already expanded
733 return;
734 }
735 $this->kl = ['key' => $this->key, 'des_rounds' => $this->des_rounds];
736
737 static $shifts = [ // number of key bits shifted per round
738 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
739 ];
740
741 static $pc1map = [
742 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C,
743 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E,
744 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C,
745 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E,
746 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C,
747 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E,
748 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C,
749 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E,
750 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C,
751 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E,
752 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C,
753 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E,
754 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C,
755 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E,
756 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C,
757 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E,
758 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C,
759 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E,
760 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C,
761 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E,
762 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC,
763 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE,
764 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC,
765 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE,
766 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC,
767 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE,
768 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC,
769 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE,
770 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC,
771 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE,
772 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC,
773 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE,
774 ];
775
776 // Mapping tables for the PC-2 transformation.
777 static $pc2mapc1 = [
778 0x00000000, 0x00000400, 0x00200000, 0x00200400,
779 0x00000001, 0x00000401, 0x00200001, 0x00200401,
780 0x02000000, 0x02000400, 0x02200000, 0x02200400,
781 0x02000001, 0x02000401, 0x02200001, 0x02200401,
782 ];
783 static $pc2mapc2 = [
784 0x00000000, 0x00000800, 0x08000000, 0x08000800,
785 0x00010000, 0x00010800, 0x08010000, 0x08010800,
786 0x00000000, 0x00000800, 0x08000000, 0x08000800,
787 0x00010000, 0x00010800, 0x08010000, 0x08010800,
788 0x00000100, 0x00000900, 0x08000100, 0x08000900,
789 0x00010100, 0x00010900, 0x08010100, 0x08010900,
790 0x00000100, 0x00000900, 0x08000100, 0x08000900,
791 0x00010100, 0x00010900, 0x08010100, 0x08010900,
792 0x00000010, 0x00000810, 0x08000010, 0x08000810,
793 0x00010010, 0x00010810, 0x08010010, 0x08010810,
794 0x00000010, 0x00000810, 0x08000010, 0x08000810,
795 0x00010010, 0x00010810, 0x08010010, 0x08010810,
796 0x00000110, 0x00000910, 0x08000110, 0x08000910,
797 0x00010110, 0x00010910, 0x08010110, 0x08010910,
798 0x00000110, 0x00000910, 0x08000110, 0x08000910,
799 0x00010110, 0x00010910, 0x08010110, 0x08010910,
800 0x00040000, 0x00040800, 0x08040000, 0x08040800,
801 0x00050000, 0x00050800, 0x08050000, 0x08050800,
802 0x00040000, 0x00040800, 0x08040000, 0x08040800,
803 0x00050000, 0x00050800, 0x08050000, 0x08050800,
804 0x00040100, 0x00040900, 0x08040100, 0x08040900,
805 0x00050100, 0x00050900, 0x08050100, 0x08050900,
806 0x00040100, 0x00040900, 0x08040100, 0x08040900,
807 0x00050100, 0x00050900, 0x08050100, 0x08050900,
808 0x00040010, 0x00040810, 0x08040010, 0x08040810,
809 0x00050010, 0x00050810, 0x08050010, 0x08050810,
810 0x00040010, 0x00040810, 0x08040010, 0x08040810,
811 0x00050010, 0x00050810, 0x08050010, 0x08050810,
812 0x00040110, 0x00040910, 0x08040110, 0x08040910,
813 0x00050110, 0x00050910, 0x08050110, 0x08050910,
814 0x00040110, 0x00040910, 0x08040110, 0x08040910,
815 0x00050110, 0x00050910, 0x08050110, 0x08050910,
816 0x01000000, 0x01000800, 0x09000000, 0x09000800,
817 0x01010000, 0x01010800, 0x09010000, 0x09010800,
818 0x01000000, 0x01000800, 0x09000000, 0x09000800,
819 0x01010000, 0x01010800, 0x09010000, 0x09010800,
820 0x01000100, 0x01000900, 0x09000100, 0x09000900,
821 0x01010100, 0x01010900, 0x09010100, 0x09010900,
822 0x01000100, 0x01000900, 0x09000100, 0x09000900,
823 0x01010100, 0x01010900, 0x09010100, 0x09010900,
824 0x01000010, 0x01000810, 0x09000010, 0x09000810,
825 0x01010010, 0x01010810, 0x09010010, 0x09010810,
826 0x01000010, 0x01000810, 0x09000010, 0x09000810,
827 0x01010010, 0x01010810, 0x09010010, 0x09010810,
828 0x01000110, 0x01000910, 0x09000110, 0x09000910,
829 0x01010110, 0x01010910, 0x09010110, 0x09010910,
830 0x01000110, 0x01000910, 0x09000110, 0x09000910,
831 0x01010110, 0x01010910, 0x09010110, 0x09010910,
832 0x01040000, 0x01040800, 0x09040000, 0x09040800,
833 0x01050000, 0x01050800, 0x09050000, 0x09050800,
834 0x01040000, 0x01040800, 0x09040000, 0x09040800,
835 0x01050000, 0x01050800, 0x09050000, 0x09050800,
836 0x01040100, 0x01040900, 0x09040100, 0x09040900,
837 0x01050100, 0x01050900, 0x09050100, 0x09050900,
838 0x01040100, 0x01040900, 0x09040100, 0x09040900,
839 0x01050100, 0x01050900, 0x09050100, 0x09050900,
840 0x01040010, 0x01040810, 0x09040010, 0x09040810,
841 0x01050010, 0x01050810, 0x09050010, 0x09050810,
842 0x01040010, 0x01040810, 0x09040010, 0x09040810,
843 0x01050010, 0x01050810, 0x09050010, 0x09050810,
844 0x01040110, 0x01040910, 0x09040110, 0x09040910,
845 0x01050110, 0x01050910, 0x09050110, 0x09050910,
846 0x01040110, 0x01040910, 0x09040110, 0x09040910,
847 0x01050110, 0x01050910, 0x09050110, 0x09050910,
848 ];
849 static $pc2mapc3 = [
850 0x00000000, 0x00000004, 0x00001000, 0x00001004,
851 0x00000000, 0x00000004, 0x00001000, 0x00001004,
852 0x10000000, 0x10000004, 0x10001000, 0x10001004,
853 0x10000000, 0x10000004, 0x10001000, 0x10001004,
854 0x00000020, 0x00000024, 0x00001020, 0x00001024,
855 0x00000020, 0x00000024, 0x00001020, 0x00001024,
856 0x10000020, 0x10000024, 0x10001020, 0x10001024,
857 0x10000020, 0x10000024, 0x10001020, 0x10001024,
858 0x00080000, 0x00080004, 0x00081000, 0x00081004,
859 0x00080000, 0x00080004, 0x00081000, 0x00081004,
860 0x10080000, 0x10080004, 0x10081000, 0x10081004,
861 0x10080000, 0x10080004, 0x10081000, 0x10081004,
862 0x00080020, 0x00080024, 0x00081020, 0x00081024,
863 0x00080020, 0x00080024, 0x00081020, 0x00081024,
864 0x10080020, 0x10080024, 0x10081020, 0x10081024,
865 0x10080020, 0x10080024, 0x10081020, 0x10081024,
866 0x20000000, 0x20000004, 0x20001000, 0x20001004,
867 0x20000000, 0x20000004, 0x20001000, 0x20001004,
868 0x30000000, 0x30000004, 0x30001000, 0x30001004,
869 0x30000000, 0x30000004, 0x30001000, 0x30001004,
870 0x20000020, 0x20000024, 0x20001020, 0x20001024,
871 0x20000020, 0x20000024, 0x20001020, 0x20001024,
872 0x30000020, 0x30000024, 0x30001020, 0x30001024,
873 0x30000020, 0x30000024, 0x30001020, 0x30001024,
874 0x20080000, 0x20080004, 0x20081000, 0x20081004,
875 0x20080000, 0x20080004, 0x20081000, 0x20081004,
876 0x30080000, 0x30080004, 0x30081000, 0x30081004,
877 0x30080000, 0x30080004, 0x30081000, 0x30081004,
878 0x20080020, 0x20080024, 0x20081020, 0x20081024,
879 0x20080020, 0x20080024, 0x20081020, 0x20081024,
880 0x30080020, 0x30080024, 0x30081020, 0x30081024,
881 0x30080020, 0x30080024, 0x30081020, 0x30081024,
882 0x00000002, 0x00000006, 0x00001002, 0x00001006,
883 0x00000002, 0x00000006, 0x00001002, 0x00001006,
884 0x10000002, 0x10000006, 0x10001002, 0x10001006,
885 0x10000002, 0x10000006, 0x10001002, 0x10001006,
886 0x00000022, 0x00000026, 0x00001022, 0x00001026,
887 0x00000022, 0x00000026, 0x00001022, 0x00001026,
888 0x10000022, 0x10000026, 0x10001022, 0x10001026,
889 0x10000022, 0x10000026, 0x10001022, 0x10001026,
890 0x00080002, 0x00080006, 0x00081002, 0x00081006,
891 0x00080002, 0x00080006, 0x00081002, 0x00081006,
892 0x10080002, 0x10080006, 0x10081002, 0x10081006,
893 0x10080002, 0x10080006, 0x10081002, 0x10081006,
894 0x00080022, 0x00080026, 0x00081022, 0x00081026,
895 0x00080022, 0x00080026, 0x00081022, 0x00081026,
896 0x10080022, 0x10080026, 0x10081022, 0x10081026,
897 0x10080022, 0x10080026, 0x10081022, 0x10081026,
898 0x20000002, 0x20000006, 0x20001002, 0x20001006,
899 0x20000002, 0x20000006, 0x20001002, 0x20001006,
900 0x30000002, 0x30000006, 0x30001002, 0x30001006,
901 0x30000002, 0x30000006, 0x30001002, 0x30001006,
902 0x20000022, 0x20000026, 0x20001022, 0x20001026,
903 0x20000022, 0x20000026, 0x20001022, 0x20001026,
904 0x30000022, 0x30000026, 0x30001022, 0x30001026,
905 0x30000022, 0x30000026, 0x30001022, 0x30001026,
906 0x20080002, 0x20080006, 0x20081002, 0x20081006,
907 0x20080002, 0x20080006, 0x20081002, 0x20081006,
908 0x30080002, 0x30080006, 0x30081002, 0x30081006,
909 0x30080002, 0x30080006, 0x30081002, 0x30081006,
910 0x20080022, 0x20080026, 0x20081022, 0x20081026,
911 0x20080022, 0x20080026, 0x20081022, 0x20081026,
912 0x30080022, 0x30080026, 0x30081022, 0x30081026,
913 0x30080022, 0x30080026, 0x30081022, 0x30081026,
914 ];
915 static $pc2mapc4 = [
916 0x00000000, 0x00100000, 0x00000008, 0x00100008,
917 0x00000200, 0x00100200, 0x00000208, 0x00100208,
918 0x00000000, 0x00100000, 0x00000008, 0x00100008,
919 0x00000200, 0x00100200, 0x00000208, 0x00100208,
920 0x04000000, 0x04100000, 0x04000008, 0x04100008,
921 0x04000200, 0x04100200, 0x04000208, 0x04100208,
922 0x04000000, 0x04100000, 0x04000008, 0x04100008,
923 0x04000200, 0x04100200, 0x04000208, 0x04100208,
924 0x00002000, 0x00102000, 0x00002008, 0x00102008,
925 0x00002200, 0x00102200, 0x00002208, 0x00102208,
926 0x00002000, 0x00102000, 0x00002008, 0x00102008,
927 0x00002200, 0x00102200, 0x00002208, 0x00102208,
928 0x04002000, 0x04102000, 0x04002008, 0x04102008,
929 0x04002200, 0x04102200, 0x04002208, 0x04102208,
930 0x04002000, 0x04102000, 0x04002008, 0x04102008,
931 0x04002200, 0x04102200, 0x04002208, 0x04102208,
932 0x00000000, 0x00100000, 0x00000008, 0x00100008,
933 0x00000200, 0x00100200, 0x00000208, 0x00100208,
934 0x00000000, 0x00100000, 0x00000008, 0x00100008,
935 0x00000200, 0x00100200, 0x00000208, 0x00100208,
936 0x04000000, 0x04100000, 0x04000008, 0x04100008,
937 0x04000200, 0x04100200, 0x04000208, 0x04100208,
938 0x04000000, 0x04100000, 0x04000008, 0x04100008,
939 0x04000200, 0x04100200, 0x04000208, 0x04100208,
940 0x00002000, 0x00102000, 0x00002008, 0x00102008,
941 0x00002200, 0x00102200, 0x00002208, 0x00102208,
942 0x00002000, 0x00102000, 0x00002008, 0x00102008,
943 0x00002200, 0x00102200, 0x00002208, 0x00102208,
944 0x04002000, 0x04102000, 0x04002008, 0x04102008,
945 0x04002200, 0x04102200, 0x04002208, 0x04102208,
946 0x04002000, 0x04102000, 0x04002008, 0x04102008,
947 0x04002200, 0x04102200, 0x04002208, 0x04102208,
948 0x00020000, 0x00120000, 0x00020008, 0x00120008,
949 0x00020200, 0x00120200, 0x00020208, 0x00120208,
950 0x00020000, 0x00120000, 0x00020008, 0x00120008,
951 0x00020200, 0x00120200, 0x00020208, 0x00120208,
952 0x04020000, 0x04120000, 0x04020008, 0x04120008,
953 0x04020200, 0x04120200, 0x04020208, 0x04120208,
954 0x04020000, 0x04120000, 0x04020008, 0x04120008,
955 0x04020200, 0x04120200, 0x04020208, 0x04120208,
956 0x00022000, 0x00122000, 0x00022008, 0x00122008,
957 0x00022200, 0x00122200, 0x00022208, 0x00122208,
958 0x00022000, 0x00122000, 0x00022008, 0x00122008,
959 0x00022200, 0x00122200, 0x00022208, 0x00122208,
960 0x04022000, 0x04122000, 0x04022008, 0x04122008,
961 0x04022200, 0x04122200, 0x04022208, 0x04122208,
962 0x04022000, 0x04122000, 0x04022008, 0x04122008,
963 0x04022200, 0x04122200, 0x04022208, 0x04122208,
964 0x00020000, 0x00120000, 0x00020008, 0x00120008,
965 0x00020200, 0x00120200, 0x00020208, 0x00120208,
966 0x00020000, 0x00120000, 0x00020008, 0x00120008,
967 0x00020200, 0x00120200, 0x00020208, 0x00120208,
968 0x04020000, 0x04120000, 0x04020008, 0x04120008,
969 0x04020200, 0x04120200, 0x04020208, 0x04120208,
970 0x04020000, 0x04120000, 0x04020008, 0x04120008,
971 0x04020200, 0x04120200, 0x04020208, 0x04120208,
972 0x00022000, 0x00122000, 0x00022008, 0x00122008,
973 0x00022200, 0x00122200, 0x00022208, 0x00122208,
974 0x00022000, 0x00122000, 0x00022008, 0x00122008,
975 0x00022200, 0x00122200, 0x00022208, 0x00122208,
976 0x04022000, 0x04122000, 0x04022008, 0x04122008,
977 0x04022200, 0x04122200, 0x04022208, 0x04122208,
978 0x04022000, 0x04122000, 0x04022008, 0x04122008,
979 0x04022200, 0x04122200, 0x04022208, 0x04122208,
980 ];
981 static $pc2mapd1 = [
982 0x00000000, 0x00000001, 0x08000000, 0x08000001,
983 0x00200000, 0x00200001, 0x08200000, 0x08200001,
984 0x00000002, 0x00000003, 0x08000002, 0x08000003,
985 0x00200002, 0x00200003, 0x08200002, 0x08200003,
986 ];
987 static $pc2mapd2 = [
988 0x00000000, 0x00100000, 0x00000800, 0x00100800,
989 0x00000000, 0x00100000, 0x00000800, 0x00100800,
990 0x04000000, 0x04100000, 0x04000800, 0x04100800,
991 0x04000000, 0x04100000, 0x04000800, 0x04100800,
992 0x00000004, 0x00100004, 0x00000804, 0x00100804,
993 0x00000004, 0x00100004, 0x00000804, 0x00100804,
994 0x04000004, 0x04100004, 0x04000804, 0x04100804,
995 0x04000004, 0x04100004, 0x04000804, 0x04100804,
996 0x00000000, 0x00100000, 0x00000800, 0x00100800,
997 0x00000000, 0x00100000, 0x00000800, 0x00100800,
998 0x04000000, 0x04100000, 0x04000800, 0x04100800,
999 0x04000000, 0x04100000, 0x04000800, 0x04100800,
1000 0x00000004, 0x00100004, 0x00000804, 0x00100804,
1001 0x00000004, 0x00100004, 0x00000804, 0x00100804,
1002 0x04000004, 0x04100004, 0x04000804, 0x04100804,
1003 0x04000004, 0x04100004, 0x04000804, 0x04100804,
1004 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
1005 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
1006 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
1007 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
1008 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
1009 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
1010 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
1011 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
1012 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
1013 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
1014 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
1015 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
1016 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
1017 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
1018 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
1019 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
1020 0x00020000, 0x00120000, 0x00020800, 0x00120800,
1021 0x00020000, 0x00120000, 0x00020800, 0x00120800,
1022 0x04020000, 0x04120000, 0x04020800, 0x04120800,
1023 0x04020000, 0x04120000, 0x04020800, 0x04120800,
1024 0x00020004, 0x00120004, 0x00020804, 0x00120804,
1025 0x00020004, 0x00120004, 0x00020804, 0x00120804,
1026 0x04020004, 0x04120004, 0x04020804, 0x04120804,
1027 0x04020004, 0x04120004, 0x04020804, 0x04120804,
1028 0x00020000, 0x00120000, 0x00020800, 0x00120800,
1029 0x00020000, 0x00120000, 0x00020800, 0x00120800,
1030 0x04020000, 0x04120000, 0x04020800, 0x04120800,
1031 0x04020000, 0x04120000, 0x04020800, 0x04120800,
1032 0x00020004, 0x00120004, 0x00020804, 0x00120804,
1033 0x00020004, 0x00120004, 0x00020804, 0x00120804,
1034 0x04020004, 0x04120004, 0x04020804, 0x04120804,
1035 0x04020004, 0x04120004, 0x04020804, 0x04120804,
1036 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
1037 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
1038 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
1039 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
1040 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
1041 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
1042 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
1043 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
1044 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
1045 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
1046 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
1047 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
1048 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
1049 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
1050 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
1051 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
1052 ];
1053 static $pc2mapd3 = [
1054 0x00000000, 0x00010000, 0x02000000, 0x02010000,
1055 0x00000020, 0x00010020, 0x02000020, 0x02010020,
1056 0x00040000, 0x00050000, 0x02040000, 0x02050000,
1057 0x00040020, 0x00050020, 0x02040020, 0x02050020,
1058 0x00002000, 0x00012000, 0x02002000, 0x02012000,
1059 0x00002020, 0x00012020, 0x02002020, 0x02012020,
1060 0x00042000, 0x00052000, 0x02042000, 0x02052000,
1061 0x00042020, 0x00052020, 0x02042020, 0x02052020,
1062 0x00000000, 0x00010000, 0x02000000, 0x02010000,
1063 0x00000020, 0x00010020, 0x02000020, 0x02010020,
1064 0x00040000, 0x00050000, 0x02040000, 0x02050000,
1065 0x00040020, 0x00050020, 0x02040020, 0x02050020,
1066 0x00002000, 0x00012000, 0x02002000, 0x02012000,
1067 0x00002020, 0x00012020, 0x02002020, 0x02012020,
1068 0x00042000, 0x00052000, 0x02042000, 0x02052000,
1069 0x00042020, 0x00052020, 0x02042020, 0x02052020,
1070 0x00000010, 0x00010010, 0x02000010, 0x02010010,
1071 0x00000030, 0x00010030, 0x02000030, 0x02010030,
1072 0x00040010, 0x00050010, 0x02040010, 0x02050010,
1073 0x00040030, 0x00050030, 0x02040030, 0x02050030,
1074 0x00002010, 0x00012010, 0x02002010, 0x02012010,
1075 0x00002030, 0x00012030, 0x02002030, 0x02012030,
1076 0x00042010, 0x00052010, 0x02042010, 0x02052010,
1077 0x00042030, 0x00052030, 0x02042030, 0x02052030,
1078 0x00000010, 0x00010010, 0x02000010, 0x02010010,
1079 0x00000030, 0x00010030, 0x02000030, 0x02010030,
1080 0x00040010, 0x00050010, 0x02040010, 0x02050010,
1081 0x00040030, 0x00050030, 0x02040030, 0x02050030,
1082 0x00002010, 0x00012010, 0x02002010, 0x02012010,
1083 0x00002030, 0x00012030, 0x02002030, 0x02012030,
1084 0x00042010, 0x00052010, 0x02042010, 0x02052010,
1085 0x00042030, 0x00052030, 0x02042030, 0x02052030,
1086 0x20000000, 0x20010000, 0x22000000, 0x22010000,
1087 0x20000020, 0x20010020, 0x22000020, 0x22010020,
1088 0x20040000, 0x20050000, 0x22040000, 0x22050000,
1089 0x20040020, 0x20050020, 0x22040020, 0x22050020,
1090 0x20002000, 0x20012000, 0x22002000, 0x22012000,
1091 0x20002020, 0x20012020, 0x22002020, 0x22012020,
1092 0x20042000, 0x20052000, 0x22042000, 0x22052000,
1093 0x20042020, 0x20052020, 0x22042020, 0x22052020,
1094 0x20000000, 0x20010000, 0x22000000, 0x22010000,
1095 0x20000020, 0x20010020, 0x22000020, 0x22010020,
1096 0x20040000, 0x20050000, 0x22040000, 0x22050000,
1097 0x20040020, 0x20050020, 0x22040020, 0x22050020,
1098 0x20002000, 0x20012000, 0x22002000, 0x22012000,
1099 0x20002020, 0x20012020, 0x22002020, 0x22012020,
1100 0x20042000, 0x20052000, 0x22042000, 0x22052000,
1101 0x20042020, 0x20052020, 0x22042020, 0x22052020,
1102 0x20000010, 0x20010010, 0x22000010, 0x22010010,
1103 0x20000030, 0x20010030, 0x22000030, 0x22010030,
1104 0x20040010, 0x20050010, 0x22040010, 0x22050010,
1105 0x20040030, 0x20050030, 0x22040030, 0x22050030,
1106 0x20002010, 0x20012010, 0x22002010, 0x22012010,
1107 0x20002030, 0x20012030, 0x22002030, 0x22012030,
1108 0x20042010, 0x20052010, 0x22042010, 0x22052010,
1109 0x20042030, 0x20052030, 0x22042030, 0x22052030,
1110 0x20000010, 0x20010010, 0x22000010, 0x22010010,
1111 0x20000030, 0x20010030, 0x22000030, 0x22010030,
1112 0x20040010, 0x20050010, 0x22040010, 0x22050010,
1113 0x20040030, 0x20050030, 0x22040030, 0x22050030,
1114 0x20002010, 0x20012010, 0x22002010, 0x22012010,
1115 0x20002030, 0x20012030, 0x22002030, 0x22012030,
1116 0x20042010, 0x20052010, 0x22042010, 0x22052010,
1117 0x20042030, 0x20052030, 0x22042030, 0x22052030,
1118 ];
1119 static $pc2mapd4 = [
1120 0x00000000, 0x00000400, 0x01000000, 0x01000400,
1121 0x00000000, 0x00000400, 0x01000000, 0x01000400,
1122 0x00000100, 0x00000500, 0x01000100, 0x01000500,
1123 0x00000100, 0x00000500, 0x01000100, 0x01000500,
1124 0x10000000, 0x10000400, 0x11000000, 0x11000400,
1125 0x10000000, 0x10000400, 0x11000000, 0x11000400,
1126 0x10000100, 0x10000500, 0x11000100, 0x11000500,
1127 0x10000100, 0x10000500, 0x11000100, 0x11000500,
1128 0x00080000, 0x00080400, 0x01080000, 0x01080400,
1129 0x00080000, 0x00080400, 0x01080000, 0x01080400,
1130 0x00080100, 0x00080500, 0x01080100, 0x01080500,
1131 0x00080100, 0x00080500, 0x01080100, 0x01080500,
1132 0x10080000, 0x10080400, 0x11080000, 0x11080400,
1133 0x10080000, 0x10080400, 0x11080000, 0x11080400,
1134 0x10080100, 0x10080500, 0x11080100, 0x11080500,
1135 0x10080100, 0x10080500, 0x11080100, 0x11080500,
1136 0x00000008, 0x00000408, 0x01000008, 0x01000408,
1137 0x00000008, 0x00000408, 0x01000008, 0x01000408,
1138 0x00000108, 0x00000508, 0x01000108, 0x01000508,
1139 0x00000108, 0x00000508, 0x01000108, 0x01000508,
1140 0x10000008, 0x10000408, 0x11000008, 0x11000408,
1141 0x10000008, 0x10000408, 0x11000008, 0x11000408,
1142 0x10000108, 0x10000508, 0x11000108, 0x11000508,
1143 0x10000108, 0x10000508, 0x11000108, 0x11000508,
1144 0x00080008, 0x00080408, 0x01080008, 0x01080408,
1145 0x00080008, 0x00080408, 0x01080008, 0x01080408,
1146 0x00080108, 0x00080508, 0x01080108, 0x01080508,
1147 0x00080108, 0x00080508, 0x01080108, 0x01080508,
1148 0x10080008, 0x10080408, 0x11080008, 0x11080408,
1149 0x10080008, 0x10080408, 0x11080008, 0x11080408,
1150 0x10080108, 0x10080508, 0x11080108, 0x11080508,
1151 0x10080108, 0x10080508, 0x11080108, 0x11080508,
1152 0x00001000, 0x00001400, 0x01001000, 0x01001400,
1153 0x00001000, 0x00001400, 0x01001000, 0x01001400,
1154 0x00001100, 0x00001500, 0x01001100, 0x01001500,
1155 0x00001100, 0x00001500, 0x01001100, 0x01001500,
1156 0x10001000, 0x10001400, 0x11001000, 0x11001400,
1157 0x10001000, 0x10001400, 0x11001000, 0x11001400,
1158 0x10001100, 0x10001500, 0x11001100, 0x11001500,
1159 0x10001100, 0x10001500, 0x11001100, 0x11001500,
1160 0x00081000, 0x00081400, 0x01081000, 0x01081400,
1161 0x00081000, 0x00081400, 0x01081000, 0x01081400,
1162 0x00081100, 0x00081500, 0x01081100, 0x01081500,
1163 0x00081100, 0x00081500, 0x01081100, 0x01081500,
1164 0x10081000, 0x10081400, 0x11081000, 0x11081400,
1165 0x10081000, 0x10081400, 0x11081000, 0x11081400,
1166 0x10081100, 0x10081500, 0x11081100, 0x11081500,
1167 0x10081100, 0x10081500, 0x11081100, 0x11081500,
1168 0x00001008, 0x00001408, 0x01001008, 0x01001408,
1169 0x00001008, 0x00001408, 0x01001008, 0x01001408,
1170 0x00001108, 0x00001508, 0x01001108, 0x01001508,
1171 0x00001108, 0x00001508, 0x01001108, 0x01001508,
1172 0x10001008, 0x10001408, 0x11001008, 0x11001408,
1173 0x10001008, 0x10001408, 0x11001008, 0x11001408,
1174 0x10001108, 0x10001508, 0x11001108, 0x11001508,
1175 0x10001108, 0x10001508, 0x11001108, 0x11001508,
1176 0x00081008, 0x00081408, 0x01081008, 0x01081408,
1177 0x00081008, 0x00081408, 0x01081008, 0x01081408,
1178 0x00081108, 0x00081508, 0x01081108, 0x01081508,
1179 0x00081108, 0x00081508, 0x01081108, 0x01081508,
1180 0x10081008, 0x10081408, 0x11081008, 0x11081408,
1181 0x10081008, 0x10081408, 0x11081008, 0x11081408,
1182 0x10081108, 0x10081508, 0x11081108, 0x11081508,
1183 0x10081108, 0x10081508, 0x11081108, 0x11081508,
1184 ];
1185
1186 $keys = [];
1187 for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
1188 // pad the key and remove extra characters as appropriate.
1189 $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0");
1190
1191 // Perform the PC/1 transformation and compute C and D.
1192 $t = unpack('Nl/Nr', $key);
1193 [$l, $r] = [$t['l'], $t['r']];
1194 $key = (self::$shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") |
1195 (self::$shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") |
1196 (self::$shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") |
1197 (self::$shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") |
1198 (self::$shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") |
1199 (self::$shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") |
1200 (self::$shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") |
1201 (self::$shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00");
1202 $key = unpack('Nc/Nd', $key);
1203 $c = ( $key['c'] >> 4) & 0x0FFFFFFF;
1204 $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F);
1205
1206 $keys[$des_round] = [
1207 self::ENCRYPT => [],
1208 self::DECRYPT => array_fill(0, 32, 0),
1209 ];
1210 for ($i = 0, $ki = 31; $i < 16; ++$i, $ki -= 2) {
1211 $c <<= $shifts[$i];
1212 $c = ($c | ($c >> 28)) & 0x0FFFFFFF;
1213 $d <<= $shifts[$i];
1214 $d = ($d | ($d >> 28)) & 0x0FFFFFFF;
1215
1216 // Perform the PC-2 transformation.
1217 $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] |
1218 $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF];
1219 $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] |
1220 $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF];
1221
1222 // Reorder: odd bytes/even bytes. Push the result in key schedule.
1223 $val1 = ( $cp & intval(0xFF000000)) | (($cp << 8) & 0x00FF0000) |
1224 (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF);
1225 $val2 = (($cp << 8) & intval(0xFF000000)) | (($cp << 16) & 0x00FF0000) |
1226 (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF);
1227 $keys[$des_round][self::ENCRYPT][ ] = $val1;
1228 $keys[$des_round][self::DECRYPT][$ki - 1] = $val1;
1229 $keys[$des_round][self::ENCRYPT][ ] = $val2;
1230 $keys[$des_round][self::DECRYPT][$ki ] = $val2;
1231 }
1232 }
1233
1234 switch ($this->des_rounds) {
1235 case 3: // 3DES keys
1236 $this->keys = [
1237 self::ENCRYPT => array_merge(
1238 $keys[0][self::ENCRYPT],
1239 $keys[1][self::DECRYPT],
1240 $keys[2][self::ENCRYPT]
1241 ),
1242 self::DECRYPT => array_merge(
1243 $keys[2][self::DECRYPT],
1244 $keys[1][self::ENCRYPT],
1245 $keys[0][self::DECRYPT]
1246 ),
1247 ];
1248 break;
1249 // case 1: // DES keys
1250 default:
1251 $this->keys = [
1252 self::ENCRYPT => $keys[0][self::ENCRYPT],
1253 self::DECRYPT => $keys[0][self::DECRYPT],
1254 ];
1255 }
1256 }
1257
1258 /**
1259 * Setup the performance-optimized function for de/encrypt()
1260 *
1261 * @see \phpseclib3\Crypt\Common\SymmetricKey::setupInlineCrypt()
1262 */
1263 protected function setupInlineCrypt(): void
1264 {
1265 // Engine configuration for:
1266 // - DES ($des_rounds == 1) or
1267 // - 3DES ($des_rounds == 3)
1268 $des_rounds = $this->des_rounds;
1269
1270 $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
1271 if (!$sbox1) {
1272 $sbox1 = array_map("intval", self::$sbox1);
1273 $sbox2 = array_map("intval", self::$sbox2);
1274 $sbox3 = array_map("intval", self::$sbox3);
1275 $sbox4 = array_map("intval", self::$sbox4);
1276 $sbox5 = array_map("intval", self::$sbox5);
1277 $sbox6 = array_map("intval", self::$sbox6);
1278 $sbox7 = array_map("intval", self::$sbox7);
1279 $sbox8 = array_map("intval", self::$sbox8);'
1280 /* Merge $shuffle with $[inv]ipmap */ . '
1281 for ($i = 0; $i < 256; ++$i) {
1282 $shuffleip[] = self::$shuffle[self::$ipmap[$i]];
1283 $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]];
1284 }
1285 }
1286 ';
1287
1288 $k = [
1289 self::ENCRYPT => $this->keys[self::ENCRYPT],
1290 self::DECRYPT => $this->keys[self::DECRYPT],
1291 ];
1292 $init_encrypt = '';
1293 $init_decrypt = '';
1294
1295 // Creating code for en- and decryption.
1296 $crypt_block = [];
1297 foreach ([self::ENCRYPT, self::DECRYPT] as $c) {
1298 /* Do the initial IP permutation. */
1299 $crypt_block[$c] = '
1300 $in = unpack("N*", $in);
1301 $l = $in[1];
1302 $r = $in[2];
1303 $in = unpack("N*",
1304 ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
1305 ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
1306 ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
1307 ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
1308 ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
1309 ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
1310 ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
1311 ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01")
1312 );
1313 ' . /* Extract L0 and R0 */ '
1314 $l = $in[1];
1315 $r = $in[2];
1316 ';
1317
1318 $l = '$l';
1319 $r = '$r';
1320
1321 // Perform DES or 3DES.
1322 for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) {
1323 // Perform the 16 steps.
1324 for ($i = 0; $i < 16; ++$i) {
1325 // start of "the Feistel (F) function" - see the following URL:
1326 // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
1327 // Merge key schedule.
1328 $crypt_block[$c] .= '
1329 $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . ';
1330 $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' .
1331 /* S-box indexing. */
1332 $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
1333 $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
1334 $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
1335 $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . ';
1336 ';
1337 // end of "the Feistel (F) function"
1338
1339 // swap L & R
1340 [$l, $r] = [$r, $l];
1341 }
1342 [$l, $r] = [$r, $l];
1343 }
1344
1345 // Perform the inverse IP permutation.
1346 $crypt_block[$c] .= '$in =
1347 ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
1348 ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
1349 ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
1350 ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
1351 ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
1352 ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
1353 ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
1354 ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
1355 ';
1356 }
1357
1358 // Creates the inline-crypt function
1359 $this->inline_crypt = $this->createInlineCryptFunction(
1360 [
1361 'init_crypt' => $init_crypt,
1362 'init_encrypt' => $init_encrypt,
1363 'init_decrypt' => $init_decrypt,
1364 'encrypt_block' => $crypt_block[self::ENCRYPT],
1365 'decrypt_block' => $crypt_block[self::DECRYPT],
1366 ]
1367 );
1368 }
1369 }
1370