Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

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