Subversion Repositories oidplus

Rev

Rev 846 | Rev 1042 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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