[securemail] Update Composer dependencies
[friendica-addons.git/.git] / securemail / vendor / phpseclib / phpseclib / phpseclib / Crypt / Blowfish.php
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 }