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 Blowfish.
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/Blowfish_(cipher) Wikipedia description of Blowfish}
13
 *
14
 * Here's a short example of how to use this library:
15
 * <code>
16
 * <?php
17
 *    include 'vendor/autoload.php';
18
 *
19
 *    $blowfish = new \phpseclib\Crypt\Blowfish();
20
 *
21
 *    $blowfish->setKey('12345678901234567890123456789012');
22
 *
23
 *    $plaintext = str_repeat('a', 1024);
24
 *
25
 *    echo $blowfish->decrypt($blowfish->encrypt($plaintext));
26
 * ?>
27
 * </code>
28
 *
29
 * @category  Crypt
30
 * @package   Blowfish
31
 * @author    Jim Wigginton <terrafrost@php.net>
32
 * @author    Hans-Juergen Petrich <petrich@tronic-media.com>
33
 * @copyright 2007 Jim Wigginton
34
 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
35
 * @link      http://phpseclib.sourceforge.net
36
 */
37
 
38
namespace phpseclib\Crypt;
39
 
40
/**
41
 * Pure-PHP implementation of Blowfish.
42
 *
43
 * @package Blowfish
44
 * @author  Jim Wigginton <terrafrost@php.net>
45
 * @author  Hans-Juergen Petrich <petrich@tronic-media.com>
46
 * @access  public
47
 */
48
class Blowfish extends Base
49
{
50
    /**
51
     * Block Length of the cipher
52
     *
53
     * @see \phpseclib\Crypt\Base::block_size
54
     * @var int
55
     * @access private
56
     */
57
    var $block_size = 8;
58
 
59
    /**
60
     * The mcrypt specific name of the cipher
61
     *
62
     * @see \phpseclib\Crypt\Base::cipher_name_mcrypt
63
     * @var string
64
     * @access private
65
     */
66
    var $cipher_name_mcrypt = 'blowfish';
67
 
68
    /**
69
     * Optimizing value while CFB-encrypting
70
     *
71
     * @see \phpseclib\Crypt\Base::cfb_init_len
72
     * @var int
73
     * @access private
74
     */
75
    var $cfb_init_len = 500;
76
 
77
    /**
78
     * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each
79
     *
80
     * S-Box 0
81
     *
82
     * @access private
83
     * @var    array
84
     */
85
    var $sbox0 = array(
86
        0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
87
        0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
88
        0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
89
        0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
90
        0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
91
        0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
92
        0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
93
        0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
94
        0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
95
        0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
96
        0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
97
        0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
98
        0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
99
        0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
100
        0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
101
        0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
102
        0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
103
        0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
104
        0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
105
        0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
106
        0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
107
        0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
108
        0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
109
        0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
110
        0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
111
        0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
112
        0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
113
        0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
114
        0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
115
        0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
116
        0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
117
        0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
118
    );
119
 
120
    /**
121
     * S-Box 1
122
     *
123
     * @access private
124
     * @var    array
125
     */
126
    var $sbox1 = array(
127
        0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
128
        0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
129
        0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
130
        0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
131
        0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
132
        0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
133
        0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
134
        0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
135
        0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
136
        0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
137
        0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
138
        0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
139
        0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
140
        0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
141
        0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
142
        0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
143
        0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
144
        0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
145
        0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
146
        0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
147
        0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
148
        0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
149
        0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
150
        0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
151
        0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
152
        0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
153
        0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
154
        0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
155
        0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
156
        0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
157
        0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
158
        0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
159
    );
160
 
161
    /**
162
     * S-Box 2
163
     *
164
     * @access private
165
     * @var    array
166
     */
167
    var $sbox2 = array(
168
        0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
169
        0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
170
        0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
171
        0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
172
        0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
173
        0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
174
        0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
175
        0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
176
        0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
177
        0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
178
        0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
179
        0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
180
        0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
181
        0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
182
        0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
183
        0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
184
        0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
185
        0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
186
        0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
187
        0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
188
        0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
189
        0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
190
        0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
191
        0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
192
        0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
193
        0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
194
        0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
195
        0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
196
        0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
197
        0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
198
        0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
199
        0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
200
    );
201
 
202
    /**
203
     * S-Box 3
204
     *
205
     * @access private
206
     * @var    array
207
     */
208
    var $sbox3 = array(
209
        0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
210
        0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
211
        0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
212
        0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
213
        0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
214
        0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
215
        0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
216
        0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
217
        0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
218
        0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
219
        0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
220
        0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
221
        0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
222
        0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
223
        0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
224
        0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
225
        0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
226
        0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
227
        0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
228
        0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
229
        0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
230
        0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
231
        0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
232
        0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
233
        0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
234
        0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
235
        0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
236
        0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
237
        0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
238
        0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
239
        0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
240
        0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
241
    );
242
 
243
    /**
244
     * P-Array consists of 18 32-bit subkeys
245
     *
246
     * @var array
247
     * @access private
248
     */
249
    var $parray = array(
250
        0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
251
        0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
252
        0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
253
    );
254
 
255
    /**
256
     * The BCTX-working Array
257
     *
258
     * Holds the expanded key [p] and the key-depended s-boxes [sb]
259
     *
260
     * @var array
261
     * @access private
262
     */
263
    var $bctx;
264
 
265
    /**
266
     * Holds the last used key
267
     *
268
     * @var array
269
     * @access private
270
     */
271
    var $kl;
272
 
273
    /**
274
     * The Key Length (in bytes)
275
     *
276
     * @see \phpseclib\Crypt\Base::setKeyLength()
277
     * @var int
278
     * @access private
279
     * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16.  Exists in conjunction with $Nk
280
     *    because the encryption / decryption / key schedule creation requires this number and not $key_length.  We could
281
     *    derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
282
     *    of that, we'll just precompute it once.
283
     */
284
    var $key_length = 16;
285
 
286
    /**
287
     * Sets the key length.
288
     *
289
     * Key lengths can be between 32 and 448 bits.
290
     *
291
     * @access public
292
     * @param int $length
293
     */
294
    function setKeyLength($length)
295
    {
296
        if ($length < 32) {
297
            $this->key_length = 7;
298
        } elseif ($length > 448) {
299
            $this->key_length = 56;
300
        } else {
301
            $this->key_length = $length >> 3;
302
        }
303
 
304
        parent::setKeyLength($length);
305
    }
306
 
307
    /**
308
     * Test for engine validity
309
     *
310
     * This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
311
     *
312
     * @see \phpseclib\Crypt\Base::isValidEngine()
313
     * @param int $engine
314
     * @access public
315
     * @return bool
316
     */
317
    function isValidEngine($engine)
318
    {
319
        if ($engine == self::ENGINE_OPENSSL) {
320
            if ($this->key_length != 16) {
321
                return false;
322
            }
323
            $this->cipher_name_openssl_ecb = 'bf-ecb';
324
            $this->cipher_name_openssl = 'bf-' . $this->_openssl_translate_mode();
325
        }
326
 
327
        return parent::isValidEngine($engine);
328
    }
329
 
330
    /**
331
     * Setup the key (expansion)
332
     *
333
     * @see \phpseclib\Crypt\Base::_setupKey()
334
     * @access private
335
     */
336
    function _setupKey()
337
    {
338
        if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
339
            // already expanded
340
            return;
341
        }
342
        $this->kl = array('key' => $this->key);
343
 
344
        /* key-expanding p[] and S-Box building sb[] */
345
        $this->bctx = array(
346
            'p'  => array(),
347
            'sb' => array(
348
                $this->sbox0,
349
                $this->sbox1,
350
                $this->sbox2,
351
                $this->sbox3
352
            )
353
        );
354
 
355
        // unpack binary string in unsigned chars
356
        $key  = array_values(unpack('C*', $this->key));
357
        $keyl = count($key);
358
        for ($j = 0, $i = 0; $i < 18; ++$i) {
359
            // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ...
360
            for ($data = 0, $k = 0; $k < 4; ++$k) {
361
                $data = ($data << 8) | $key[$j];
362
                if (++$j >= $keyl) {
363
                    $j = 0;
364
                }
365
            }
366
            $this->bctx['p'][] = $this->parray[$i] ^ $data;
367
        }
368
 
369
        // encrypt the zero-string, replace P1 and P2 with the encrypted data,
370
        // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys
371
        $data = "\0\0\0\0\0\0\0\0";
372
        for ($i = 0; $i < 18; $i += 2) {
373
            list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
374
            $this->bctx['p'][$i    ] = $l;
375
            $this->bctx['p'][$i + 1] = $r;
376
        }
377
        for ($i = 0; $i < 4; ++$i) {
378
            for ($j = 0; $j < 256; $j += 2) {
379
                list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
380
                $this->bctx['sb'][$i][$j    ] = $l;
381
                $this->bctx['sb'][$i][$j + 1] = $r;
382
            }
383
        }
384
    }
385
 
386
    /**
387
     * Encrypts a block
388
     *
389
     * @access private
390
     * @param string $in
391
     * @return string
392
     */
393
    function _encryptBlock($in)
394
    {
395
        $p = $this->bctx["p"];
396
        // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower
397
        $sb_0 = $this->bctx["sb"][0];
398
        $sb_1 = $this->bctx["sb"][1];
399
        $sb_2 = $this->bctx["sb"][2];
400
        $sb_3 = $this->bctx["sb"][3];
401
 
402
        $in = unpack("N*", $in);
403
        $l = $in[1];
404
        $r = $in[2];
405
 
406
        for ($i = 0; $i < 16; $i+= 2) {
407
            $l^= $p[$i];
408
            $r^= ($sb_0[$l >> 24 & 0xff]  +
409
                  $sb_1[$l >> 16 & 0xff]  ^
410
                  $sb_2[$l >>  8 & 0xff]) +
411
                  $sb_3[$l       & 0xff];
412
 
413
            $r^= $p[$i + 1];
414
            $l^= ($sb_0[$r >> 24 & 0xff]  +
415
                  $sb_1[$r >> 16 & 0xff]  ^
416
                  $sb_2[$r >>  8 & 0xff]) +
417
                  $sb_3[$r       & 0xff];
418
        }
419
        return pack("N*", $r ^ $p[17], $l ^ $p[16]);
420
    }
421
 
422
    /**
423
     * Decrypts a block
424
     *
425
     * @access private
426
     * @param string $in
427
     * @return string
428
     */
429
    function _decryptBlock($in)
430
    {
431
        $p = $this->bctx["p"];
432
        $sb_0 = $this->bctx["sb"][0];
433
        $sb_1 = $this->bctx["sb"][1];
434
        $sb_2 = $this->bctx["sb"][2];
435
        $sb_3 = $this->bctx["sb"][3];
436
 
437
        $in = unpack("N*", $in);
438
        $l = $in[1];
439
        $r = $in[2];
440
 
441
        for ($i = 17; $i > 2; $i-= 2) {
442
            $l^= $p[$i];
443
            $r^= ($sb_0[$l >> 24 & 0xff]  +
444
                  $sb_1[$l >> 16 & 0xff]  ^
445
                  $sb_2[$l >>  8 & 0xff]) +
446
                  $sb_3[$l       & 0xff];
447
 
448
            $r^= $p[$i - 1];
449
            $l^= ($sb_0[$r >> 24 & 0xff]  +
450
                  $sb_1[$r >> 16 & 0xff]  ^
451
                  $sb_2[$r >>  8 & 0xff]) +
452
                  $sb_3[$r       & 0xff];
453
        }
454
        return pack("N*", $r ^ $p[0], $l ^ $p[1]);
455
    }
456
 
457
    /**
458
     * Setup the performance-optimized function for de/encrypt()
459
     *
460
     * @see \phpseclib\Crypt\Base::_setupInlineCrypt()
461
     * @access private
462
     */
463
    function _setupInlineCrypt()
464
    {
465
        $lambda_functions =& self::_getLambdaFunctions();
466
 
467
        // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
468
        // (Currently, for Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit)
469
        // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
470
        $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
471
 
472
        // Generation of a unique hash for our generated code
473
        $code_hash = "Crypt_Blowfish, {$this->mode}";
474
        if ($gen_hi_opt_code) {
475
            $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
476
        }
477
 
478
        if (!isset($lambda_functions[$code_hash])) {
479
            switch (true) {
480
                case $gen_hi_opt_code:
481
                    $p = $this->bctx['p'];
482
                    $init_crypt = '
483
                        static $sb_0, $sb_1, $sb_2, $sb_3;
484
                        if (!$sb_0) {
485
                            $sb_0 = $self->bctx["sb"][0];
486
                            $sb_1 = $self->bctx["sb"][1];
487
                            $sb_2 = $self->bctx["sb"][2];
488
                            $sb_3 = $self->bctx["sb"][3];
489
                        }
490
                    ';
491
                    break;
492
                default:
493
                    $p   = array();
494
                    for ($i = 0; $i < 18; ++$i) {
495
                        $p[] = '$p_' . $i;
496
                    }
497
                    $init_crypt = '
498
                        list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"];
499
                        list(' . implode(',', $p) . ') = $self->bctx["p"];
500
 
501
                    ';
502
            }
503
 
504
            // Generating encrypt code:
505
            $encrypt_block = '
506
                $in = unpack("N*", $in);
507
                $l = $in[1];
508
                $r = $in[2];
509
            ';
510
            for ($i = 0; $i < 16; $i+= 2) {
511
                $encrypt_block.= '
512
                    $l^= ' . $p[$i] . ';
513
                    $r^= ($sb_0[$l >> 24 & 0xff]  +
514
                          $sb_1[$l >> 16 & 0xff]  ^
515
                          $sb_2[$l >>  8 & 0xff]) +
516
                          $sb_3[$l       & 0xff];
517
 
518
                    $r^= ' . $p[$i + 1] . ';
519
                    $l^= ($sb_0[$r >> 24 & 0xff]  +
520
                          $sb_1[$r >> 16 & 0xff]  ^
521
                          $sb_2[$r >>  8 & 0xff]) +
522
                          $sb_3[$r       & 0xff];
523
                ';
524
            }
525
            $encrypt_block.= '
526
                $in = pack("N*",
527
                    $r ^ ' . $p[17] . ',
528
                    $l ^ ' . $p[16] . '
529
                );
530
            ';
531
 
532
            // Generating decrypt code:
533
            $decrypt_block = '
534
                $in = unpack("N*", $in);
535
                $l = $in[1];
536
                $r = $in[2];
537
            ';
538
 
539
            for ($i = 17; $i > 2; $i-= 2) {
540
                $decrypt_block.= '
541
                    $l^= ' . $p[$i] . ';
542
                    $r^= ($sb_0[$l >> 24 & 0xff]  +
543
                          $sb_1[$l >> 16 & 0xff]  ^
544
                          $sb_2[$l >>  8 & 0xff]) +
545
                          $sb_3[$l       & 0xff];
546
 
547
                    $r^= ' . $p[$i - 1] . ';
548
                    $l^= ($sb_0[$r >> 24 & 0xff]  +
549
                          $sb_1[$r >> 16 & 0xff]  ^
550
                          $sb_2[$r >>  8 & 0xff]) +
551
                          $sb_3[$r       & 0xff];
552
                ';
553
            }
554
 
555
            $decrypt_block.= '
556
                $in = pack("N*",
557
                    $r ^ ' . $p[0] . ',
558
                    $l ^ ' . $p[1] . '
559
                );
560
            ';
561
 
562
            $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
563
                array(
564
                   'init_crypt'    => $init_crypt,
565
                   'init_encrypt'  => '',
566
                   'init_decrypt'  => '',
567
                   'encrypt_block' => $encrypt_block,
568
                   'decrypt_block' => $decrypt_block
569
                )
570
            );
571
        }
572
        $this->inline_crypt = $lambda_functions[$code_hash];
573
    }
574
}