PluginProbe ʕ •ᴥ•ʔ
JetBackup – Backup, Restore & Migrate / 3.1.13.4
JetBackup – Backup, Restore & Migrate v3.1.13.4
3.1.22.4 3.1.22.3 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.8.1 1.4.9 1.5.0 1.5.1 1.5.1.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.10 1.6.11 1.6.12 1.6.13 1.6.15 1.6.5.1 1.6.8.8 1.6.9 1.6.9.1 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7.5 2.0.8.7 2.0.9.11 2.0.9.14 2.0.9.15 2.0.9.6 2.0.9.7 2.0.9.9 3.1.10.7 3.1.11.1 3.1.12.3 3.1.13.4 3.1.14.17 3.1.15.4 3.1.16.1 3.1.17.5 3.1.18.10 3.1.18.8 3.1.18.9 3.1.19.8 3.1.20.3 3.1.21.3 3.1.7.9 3.1.9.2 trunk 1.1.90 1.1.91 1.2.0 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt / Twofish.php
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt Last commit date
Common 9 months ago DH 9 months ago DSA 9 months ago EC 9 months ago RSA 9 months ago .htaccess 9 months ago AES.php 9 months ago Blowfish.php 9 months ago ChaCha20.php 9 months ago DES.php 9 months ago DH.php 9 months ago DSA.php 9 months ago EC.php 9 months ago Hash.php 9 months ago PublicKeyLoader.php 9 months ago RC2.php 9 months ago RC4.php 9 months ago RSA.php 9 months ago Random.php 9 months ago Rijndael.php 9 months ago Salsa20.php 9 months ago TripleDES.php 9 months ago Twofish.php 9 months ago index.html 9 months ago web.config 9 months ago
Twofish.php
793 lines
1 <?php
2
3 /**
4 * Pure-PHP implementation of Twofish.
5 *
6 * Uses an internal implementation.
7 *
8 * PHP version 5
9 *
10 * Useful resources are as follows:
11 *
12 * - {@link http://en.wikipedia.org/wiki/Twofish Wikipedia description of Twofish}
13 *
14 * Here's a short example of how to use this library:
15 * <code>
16 * <?php
17 * include 'vendor/autoload.php';
18 *
19 * $twofish = new \phpseclib3\Crypt\Twofish('ctr');
20 *
21 * $twofish->setKey('12345678901234567890123456789012');
22 *
23 * $plaintext = str_repeat('a', 1024);
24 *
25 * echo $twofish->decrypt($twofish->encrypt($plaintext));
26 * ?>
27 * </code>
28 *
29 * @author Jim Wigginton <terrafrost@php.net>
30 * @author Hans-Juergen Petrich <petrich@tronic-media.com>
31 * @copyright 2007 Jim Wigginton
32 * @license http://www.opensource.org/licenses/mit-license.html MIT License
33 * @link http://phpseclib.sourceforge.net
34 */
35
36 declare(strict_types=1);
37
38 namespace phpseclib3\Crypt;
39
40 use phpseclib3\Crypt\Common\BlockCipher;
41 use phpseclib3\Exception\BadModeException;
42 use phpseclib3\Exception\LengthException;
43
44 /**
45 * Pure-PHP implementation of Twofish.
46 *
47 * @author Jim Wigginton <terrafrost@php.net>
48 * @author Hans-Juergen Petrich <petrich@tronic-media.com>
49 */
50 class Twofish extends BlockCipher
51 {
52 /**
53 * Q-Table
54 *
55 * @var array
56 */
57 private static $q0 = [
58 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
59 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
60 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
61 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
62 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
63 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
64 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
65 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
66 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
67 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
68 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
69 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
70 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
71 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
72 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
73 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
74 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
75 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
76 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
77 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
78 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
79 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
80 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
81 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
82 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
83 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
84 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
85 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
86 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
87 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
88 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
89 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0,
90 ];
91
92 /**
93 * Q-Table
94 *
95 * @var array
96 */
97 private static $q1 = [
98 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
99 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
100 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
101 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
102 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
103 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
104 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
105 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
106 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
107 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
108 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
109 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
110 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
111 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
112 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
113 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
114 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
115 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
116 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
117 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
118 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
119 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
120 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
121 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
122 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
123 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
124 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
125 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
126 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
127 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
128 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
129 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91,
130 ];
131
132 /**
133 * M-Table
134 *
135 * @var array
136 */
137 private static $m0 = [
138 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8,
139 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B,
140 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1,
141 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F,
142 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D,
143 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5,
144 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3,
145 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51,
146 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796,
147 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C,
148 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70,
149 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8,
150 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC,
151 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2,
152 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9,
153 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17,
154 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3,
155 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E,
156 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149,
157 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9,
158 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01,
159 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48,
160 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519,
161 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64,
162 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5,
163 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969,
164 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E,
165 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC,
166 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB,
167 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9,
168 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2,
169 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91,
170 ];
171
172 /**
173 * M-Table
174 *
175 * @var array
176 */
177 private static $m1 = [
178 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4,
179 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A,
180 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141,
181 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E,
182 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060,
183 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757,
184 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D,
185 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7,
186 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656,
187 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B,
188 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8,
189 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3,
190 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D,
191 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB,
192 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282,
193 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7,
194 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B,
195 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC,
196 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E,
197 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9,
198 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272,
199 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F,
200 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED,
201 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5,
202 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7,
203 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2,
204 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3,
205 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323,
206 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA,
207 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF,
208 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000,
209 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8,
210 ];
211
212 /**
213 * M-Table
214 *
215 * @var array
216 */
217 private static $m2 = [
218 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA,
219 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7,
220 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783,
221 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE,
222 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0,
223 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA,
224 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065,
225 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F,
226 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07,
227 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF,
228 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C,
229 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96,
230 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF,
231 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E,
232 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD,
233 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC,
234 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71,
235 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85,
236 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101,
237 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5,
238 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B,
239 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A,
240 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45,
241 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D,
242 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6,
243 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929,
244 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D,
245 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB,
246 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F,
247 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9,
248 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746,
249 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF,
250 ];
251
252 /**
253 * M-Table
254 *
255 * @var array
256 */
257 private static $m3 = [
258 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF,
259 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836,
260 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77,
261 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A,
262 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5,
263 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216,
264 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63,
265 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123,
266 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7,
267 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197,
268 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB,
269 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C,
270 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20,
271 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137,
272 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE,
273 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730,
274 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252,
275 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4,
276 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F,
277 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A,
278 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB,
279 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D,
280 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0,
281 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8,
282 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6,
283 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38,
284 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA,
285 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439,
286 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6,
287 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D,
288 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000,
289 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8,
290 ];
291
292 /**
293 * The Key Schedule Array
294 *
295 * @var array
296 */
297 private $K = [];
298
299 /**
300 * The Key depended S-Table 0
301 *
302 * @var array
303 */
304 private $S0 = [];
305
306 /**
307 * The Key depended S-Table 1
308 *
309 * @var array
310 */
311 private $S1 = [];
312
313 /**
314 * The Key depended S-Table 2
315 *
316 * @var array
317 */
318 private $S2 = [];
319
320 /**
321 * The Key depended S-Table 3
322 *
323 * @var array
324 */
325 private $S3 = [];
326
327 /**
328 * Holds the last used key
329 *
330 * @var array
331 */
332 private $kl;
333
334 /**
335 * The Key Length (in bytes)
336 *
337 * @var int
338 */
339 protected $key_length = 16;
340
341 /**
342 * Default Constructor.
343 *
344 * @throws BadModeException if an invalid / unsupported mode is provided
345 */
346 public function __construct(string $mode)
347 {
348 parent::__construct($mode);
349
350 if ($this->mode == self::MODE_STREAM) {
351 throw new BadModeException('Block ciphers cannot be ran in stream mode');
352 }
353 }
354
355 /**
356 * Initialize Static Variables
357 */
358 protected static function initialize_static_variables(): void
359 {
360 if (is_float(self::$m3[0])) {
361 self::$m0 = array_map('intval', self::$m0);
362 self::$m1 = array_map('intval', self::$m1);
363 self::$m2 = array_map('intval', self::$m2);
364 self::$m3 = array_map('intval', self::$m3);
365 self::$q0 = array_map('intval', self::$q0);
366 self::$q1 = array_map('intval', self::$q1);
367 }
368
369 parent::initialize_static_variables();
370 }
371
372 /**
373 * Sets the key length.
374 *
375 * Valid key lengths are 128, 192 or 256 bits
376 */
377 public function setKeyLength(int $length): void
378 {
379 switch ($length) {
380 case 128:
381 case 192:
382 case 256:
383 break;
384 default:
385 throw new LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported');
386 }
387
388 parent::setKeyLength($length);
389 }
390
391 /**
392 * Sets the key.
393 *
394 * Rijndael supports five different key lengths
395 *
396 * @throws LengthException if the key length isn't supported
397 * @see setKeyLength()
398 */
399 public function setKey(string $key): void
400 {
401 switch (strlen($key)) {
402 case 16:
403 case 24:
404 case 32:
405 break;
406 default:
407 throw new LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported');
408 }
409
410 parent::setKey($key);
411 }
412
413 /**
414 * Setup the key (expansion)
415 *
416 * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupKey()
417 */
418 protected function setupKey(): void
419 {
420 if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
421 // already expanded
422 return;
423 }
424 $this->kl = ['key' => $this->key];
425
426 /* Key expanding and generating the key-depended s-boxes */
427 $le_longs = unpack('V*', $this->key);
428 $key = unpack('C*', $this->key);
429 $m0 = self::$m0;
430 $m1 = self::$m1;
431 $m2 = self::$m2;
432 $m3 = self::$m3;
433 $q0 = self::$q0;
434 $q1 = self::$q1;
435
436 $K = $S0 = $S1 = $S2 = $S3 = [];
437
438 switch (strlen($this->key)) {
439 case 16:
440 [$s7, $s6, $s5, $s4] = $this->mdsrem($le_longs[1], $le_longs[2]);
441 [$s3, $s2, $s1, $s0] = $this->mdsrem($le_longs[3], $le_longs[4]);
442 for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) {
443 $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^
444 $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^
445 $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^
446 $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]];
447 $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^
448 $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^
449 $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^
450 $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]];
451 $B = ($B << 8) | ($B >> 24 & 0xff);
452 $A += $B;
453 $K[] = $A;
454 $A += $B;
455 $K[] = ($A << 9 | $A >> 23 & 0x1ff);
456 }
457 for ($i = 0; $i < 256; ++$i) {
458 $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0];
459 $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1];
460 $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2];
461 $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3];
462 }
463 break;
464 case 24:
465 [$sb, $sa, $s9, $s8] = $this->mdsrem($le_longs[1], $le_longs[2]);
466 [$s7, $s6, $s5, $s4] = $this->mdsrem($le_longs[3], $le_longs[4]);
467 [$s3, $s2, $s1, $s0] = $this->mdsrem($le_longs[5], $le_longs[6]);
468 for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) {
469 $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
470 $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
471 $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
472 $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]];
473 $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
474 $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
475 $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
476 $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]];
477 $B = ($B << 8) | ($B >> 24 & 0xff);
478 $A += $B;
479 $K[] = $A;
480 $A += $B;
481 $K[] = ($A << 9 | $A >> 23 & 0x1ff);
482 }
483 for ($i = 0; $i < 256; ++$i) {
484 $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0];
485 $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1];
486 $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2];
487 $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3];
488 }
489 break;
490 default: // 32
491 [$sf, $se, $sd, $sc] = $this->mdsrem($le_longs[1], $le_longs[2]);
492 [$sb, $sa, $s9, $s8] = $this->mdsrem($le_longs[3], $le_longs[4]);
493 [$s7, $s6, $s5, $s4] = $this->mdsrem($le_longs[5], $le_longs[6]);
494 [$s3, $s2, $s1, $s0] = $this->mdsrem($le_longs[7], $le_longs[8]);
495 for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) {
496 $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
497 $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
498 $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
499 $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]];
500 $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
501 $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
502 $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
503 $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]];
504 $B = ($B << 8) | ($B >> 24 & 0xff);
505 $A += $B;
506 $K[] = $A;
507 $A += $B;
508 $K[] = ($A << 9 | $A >> 23 & 0x1ff);
509 }
510 for ($i = 0; $i < 256; ++$i) {
511 $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0];
512 $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1];
513 $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2];
514 $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3];
515 }
516 }
517
518 $this->K = $K;
519 $this->S0 = $S0;
520 $this->S1 = $S1;
521 $this->S2 = $S2;
522 $this->S3 = $S3;
523 }
524
525 /**
526 * _mdsrem function using by the twofish cipher algorithm
527 */
528 private function mdsrem(int $A, int $B): array
529 {
530 // No gain by unrolling this loop.
531 for ($i = 0; $i < 8; ++$i) {
532 // Get most significant coefficient.
533 $t = 0xff & ($B >> 24);
534
535 // Shift the others up.
536 $B = ($B << 8) | (0xff & ($A >> 24));
537 $A <<= 8;
538
539 $u = $t << 1;
540
541 // Subtract the modular polynomial on overflow.
542 if ($t & 0x80) {
543 $u ^= 0x14d;
544 }
545
546 // Remove t * (a * x^2 + 1).
547 $B ^= $t ^ ($u << 16);
548
549 // Form u = a*t + t/a = t*(a + 1/a).
550 $u ^= 0x7fffffff & ($t >> 1);
551
552 // Add the modular polynomial on underflow.
553 if ($t & 0x01) {
554 $u ^= 0xa6 ;
555 }
556
557 // Remove t * (a + 1/a) * (x^3 + x).
558 $B ^= ($u << 24) | ($u << 8);
559 }
560
561 return [
562 0xff & $B >> 24,
563 0xff & $B >> 16,
564 0xff & $B >> 8,
565 0xff & $B, ];
566 }
567
568 /**
569 * Encrypts a block
570 */
571 protected function encryptBlock(string $in): string
572 {
573 $S0 = $this->S0;
574 $S1 = $this->S1;
575 $S2 = $this->S2;
576 $S3 = $this->S3;
577 $K = $this->K;
578
579 $in = unpack("V4", $in);
580 $R0 = $K[0] ^ $in[1];
581 $R1 = $K[1] ^ $in[2];
582 $R2 = $K[2] ^ $in[3];
583 $R3 = $K[3] ^ $in[4];
584
585 $ki = 7;
586 while ($ki < 39) {
587 $t0 = $S0[ $R0 & 0xff] ^
588 $S1[($R0 >> 8) & 0xff] ^
589 $S2[($R0 >> 16) & 0xff] ^
590 $S3[($R0 >> 24) & 0xff];
591 $t1 = $S0[($R1 >> 24) & 0xff] ^
592 $S1[ $R1 & 0xff] ^
593 $S2[($R1 >> 8) & 0xff] ^
594 $S3[($R1 >> 16) & 0xff];
595 $R2 ^= $t0 + $t1 + $K[++$ki];
596 $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
597 $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
598
599 $t0 = $S0[ $R2 & 0xff] ^
600 $S1[($R2 >> 8) & 0xff] ^
601 $S2[($R2 >> 16) & 0xff] ^
602 $S3[($R2 >> 24) & 0xff];
603 $t1 = $S0[($R3 >> 24) & 0xff] ^
604 $S1[ $R3 & 0xff] ^
605 $S2[($R3 >> 8) & 0xff] ^
606 $S3[($R3 >> 16) & 0xff];
607 $R0 ^= $t0 + $t1 + $K[++$ki];
608 $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
609 $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
610 }
611
612 // @codingStandardsIgnoreStart
613 return pack(
614 "V4",
615 $K[4] ^ $R2,
616 $K[5] ^ $R3,
617 $K[6] ^ $R0,
618 $K[7] ^ $R1
619 );
620 // @codingStandardsIgnoreEnd
621 }
622
623 /**
624 * Decrypts a block
625 */
626 protected function decryptBlock(string $in): string
627 {
628 $S0 = $this->S0;
629 $S1 = $this->S1;
630 $S2 = $this->S2;
631 $S3 = $this->S3;
632 $K = $this->K;
633
634 $in = unpack("V4", $in);
635 $R0 = $K[4] ^ $in[1];
636 $R1 = $K[5] ^ $in[2];
637 $R2 = $K[6] ^ $in[3];
638 $R3 = $K[7] ^ $in[4];
639
640 $ki = 40;
641 while ($ki > 8) {
642 $t0 = $S0[$R0 & 0xff] ^
643 $S1[$R0 >> 8 & 0xff] ^
644 $S2[$R0 >> 16 & 0xff] ^
645 $S3[$R0 >> 24 & 0xff];
646 $t1 = $S0[$R1 >> 24 & 0xff] ^
647 $S1[$R1 & 0xff] ^
648 $S2[$R1 >> 8 & 0xff] ^
649 $S3[$R1 >> 16 & 0xff];
650 $R3 ^= $t0 + ($t1 << 1) + $K[--$ki];
651 $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
652 $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]);
653
654 $t0 = $S0[$R2 & 0xff] ^
655 $S1[$R2 >> 8 & 0xff] ^
656 $S2[$R2 >> 16 & 0xff] ^
657 $S3[$R2 >> 24 & 0xff];
658 $t1 = $S0[$R3 >> 24 & 0xff] ^
659 $S1[$R3 & 0xff] ^
660 $S2[$R3 >> 8 & 0xff] ^
661 $S3[$R3 >> 16 & 0xff];
662 $R1 ^= $t0 + ($t1 << 1) + $K[--$ki];
663 $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
664 $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]);
665 }
666
667 // @codingStandardsIgnoreStart
668 return pack(
669 "V4",
670 $K[0] ^ $R2,
671 $K[1] ^ $R3,
672 $K[2] ^ $R0,
673 $K[3] ^ $R1
674 );
675 // @codingStandardsIgnoreEnd
676 }
677
678 /**
679 * Setup the performance-optimized function for de/encrypt()
680 *
681 * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupInlineCrypt()
682 */
683 protected function setupInlineCrypt(): void
684 {
685 $K = $this->K;
686 $init_crypt = '
687 static $S0, $S1, $S2, $S3;
688 if (!$S0) {
689 for ($i = 0; $i < 256; ++$i) {
690 $S0[] = (int)$this->S0[$i];
691 $S1[] = (int)$this->S1[$i];
692 $S2[] = (int)$this->S2[$i];
693 $S3[] = (int)$this->S3[$i];
694 }
695 }
696 ';
697
698 // Generating encrypt code:
699 $encrypt_block = '
700 $in = unpack("V4", $in);
701 $R0 = ' . $K[0] . ' ^ $in[1];
702 $R1 = ' . $K[1] . ' ^ $in[2];
703 $R2 = ' . $K[2] . ' ^ $in[3];
704 $R3 = ' . $K[3] . ' ^ $in[4];
705 ';
706 for ($ki = 7, $i = 0; $i < 8; ++$i) {
707 $encrypt_block .= '
708 $t0 = $S0[ $R0 & 0xff] ^
709 $S1[($R0 >> 8) & 0xff] ^
710 $S2[($R0 >> 16) & 0xff] ^
711 $S3[($R0 >> 24) & 0xff];
712 $t1 = $S0[($R1 >> 24) & 0xff] ^
713 $S1[ $R1 & 0xff] ^
714 $S2[($R1 >> 8) & 0xff] ^
715 $S3[($R1 >> 16) & 0xff];
716 $R2^= $t0 + $t1 + ' . $K[++$ki] . ';
717 $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
718 $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + ' . $K[++$ki] . ');
719
720 $t0 = $S0[ $R2 & 0xff] ^
721 $S1[($R2 >> 8) & 0xff] ^
722 $S2[($R2 >> 16) & 0xff] ^
723 $S3[($R2 >> 24) & 0xff];
724 $t1 = $S0[($R3 >> 24) & 0xff] ^
725 $S1[ $R3 & 0xff] ^
726 $S2[($R3 >> 8) & 0xff] ^
727 $S3[($R3 >> 16) & 0xff];
728 $R0^= $t0 + $t1 + ' . $K[++$ki] . ';
729 $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
730 $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + ' . $K[++$ki] . ');
731 ';
732 }
733 $encrypt_block .= '
734 $in = pack("V4", ' . $K[4] . ' ^ $R2,
735 ' . $K[5] . ' ^ $R3,
736 ' . $K[6] . ' ^ $R0,
737 ' . $K[7] . ' ^ $R1);
738 ';
739
740 // Generating decrypt code:
741 $decrypt_block = '
742 $in = unpack("V4", $in);
743 $R0 = ' . $K[4] . ' ^ $in[1];
744 $R1 = ' . $K[5] . ' ^ $in[2];
745 $R2 = ' . $K[6] . ' ^ $in[3];
746 $R3 = ' . $K[7] . ' ^ $in[4];
747 ';
748 for ($ki = 40, $i = 0; $i < 8; ++$i) {
749 $decrypt_block .= '
750 $t0 = $S0[$R0 & 0xff] ^
751 $S1[$R0 >> 8 & 0xff] ^
752 $S2[$R0 >> 16 & 0xff] ^
753 $S3[$R0 >> 24 & 0xff];
754 $t1 = $S0[$R1 >> 24 & 0xff] ^
755 $S1[$R1 & 0xff] ^
756 $S2[$R1 >> 8 & 0xff] ^
757 $S3[$R1 >> 16 & 0xff];
758 $R3^= $t0 + ($t1 << 1) + ' . $K[--$ki] . ';
759 $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
760 $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + ' . $K[--$ki] . ');
761
762 $t0 = $S0[$R2 & 0xff] ^
763 $S1[$R2 >> 8 & 0xff] ^
764 $S2[$R2 >> 16 & 0xff] ^
765 $S3[$R2 >> 24 & 0xff];
766 $t1 = $S0[$R3 >> 24 & 0xff] ^
767 $S1[$R3 & 0xff] ^
768 $S2[$R3 >> 8 & 0xff] ^
769 $S3[$R3 >> 16 & 0xff];
770 $R1^= $t0 + ($t1 << 1) + ' . $K[--$ki] . ';
771 $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
772 $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + ' . $K[--$ki] . ');
773 ';
774 }
775 $decrypt_block .= '
776 $in = pack("V4", ' . $K[0] . ' ^ $R2,
777 ' . $K[1] . ' ^ $R3,
778 ' . $K[2] . ' ^ $R0,
779 ' . $K[3] . ' ^ $R1);
780 ';
781
782 $this->inline_crypt = $this->createInlineCryptFunction(
783 [
784 'init_crypt' => $init_crypt,
785 'init_encrypt' => '',
786 'init_decrypt' => '',
787 'encrypt_block' => $encrypt_block,
788 'decrypt_block' => $decrypt_block,
789 ]
790 );
791 }
792 }
793