Merge tag 'perf-core-for-mingo-5.1-20190311' of git://git.kernel.org/pub/scm/linux...
[sfrench/cifs-2.6.git] / crypto / aes_generic.c
1 /*
2  * Cryptographic API.
3  *
4  * AES Cipher Algorithm.
5  *
6  * Based on Brian Gladman's code.
7  *
8  * Linux developers:
9  *  Alexander Kjeldaas <astor@fast.no>
10  *  Herbert Valerio Riedel <hvr@hvrlab.org>
11  *  Kyle McMartin <kyle@debian.org>
12  *  Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API).
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  *
19  * ---------------------------------------------------------------------------
20  * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
21  * All rights reserved.
22  *
23  * LICENSE TERMS
24  *
25  * The free distribution and use of this software in both source and binary
26  * form is allowed (with or without changes) provided that:
27  *
28  *   1. distributions of this source code include the above copyright
29  *      notice, this list of conditions and the following disclaimer;
30  *
31  *   2. distributions in binary form include the above copyright
32  *      notice, this list of conditions and the following disclaimer
33  *      in the documentation and/or other associated materials;
34  *
35  *   3. the copyright holder's name is not used to endorse products
36  *      built using this software without specific written permission.
37  *
38  * ALTERNATIVELY, provided that this notice is retained in full, this product
39  * may be distributed under the terms of the GNU General Public License (GPL),
40  * in which case the provisions of the GPL apply INSTEAD OF those given above.
41  *
42  * DISCLAIMER
43  *
44  * This software is provided 'as is' with no explicit or implied warranties
45  * in respect of its properties, including, but not limited to, correctness
46  * and/or fitness for purpose.
47  * ---------------------------------------------------------------------------
48  */
49
50 #include <crypto/aes.h>
51 #include <linux/module.h>
52 #include <linux/init.h>
53 #include <linux/types.h>
54 #include <linux/errno.h>
55 #include <linux/crypto.h>
56 #include <asm/byteorder.h>
57 #include <asm/unaligned.h>
58
59 static inline u8 byte(const u32 x, const unsigned n)
60 {
61         return x >> (n << 3);
62 }
63
64 static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
65
66 /* cacheline-aligned to facilitate prefetching into cache */
67 __visible const u32 crypto_ft_tab[4][256] __cacheline_aligned = {
68         {
69                 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
70                 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
71                 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56,
72                 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec,
73                 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
74                 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb,
75                 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45,
76                 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b,
77                 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c,
78                 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
79                 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9,
80                 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a,
81                 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d,
82                 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f,
83                 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
84                 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea,
85                 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34,
86                 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b,
87                 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d,
88                 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
89                 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1,
90                 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6,
91                 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972,
92                 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
93                 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
94                 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511,
95                 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe,
96                 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b,
97                 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05,
98                 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
99                 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142,
100                 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf,
101                 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3,
102                 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e,
103                 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
104                 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6,
105                 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3,
106                 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b,
107                 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428,
108                 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
109                 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14,
110                 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8,
111                 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4,
112                 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2,
113                 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
114                 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949,
115                 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf,
116                 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810,
117                 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c,
118                 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
119                 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e,
120                 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f,
121                 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc,
122                 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c,
123                 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
124                 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27,
125                 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122,
126                 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433,
127                 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9,
128                 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
129                 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a,
130                 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0,
131                 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e,
132                 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c,
133         }, {
134                 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d,
135                 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154,
136                 0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d,
137                 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a,
138                 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87,
139                 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b,
140                 0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea,
141                 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b,
142                 0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a,
143                 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f,
144                 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908,
145                 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f,
146                 0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e,
147                 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5,
148                 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
149                 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f,
150                 0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e,
151                 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb,
152                 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce,
153                 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397,
154                 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c,
155                 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed,
156                 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b,
157                 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a,
158                 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16,
159                 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194,
160                 0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81,
161                 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3,
162                 0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a,
163                 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104,
164                 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263,
165                 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d,
166                 0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f,
167                 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39,
168                 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47,
169                 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695,
170                 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f,
171                 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83,
172                 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c,
173                 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76,
174                 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e,
175                 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4,
176                 0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6,
177                 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b,
178                 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7,
179                 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0,
180                 0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25,
181                 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018,
182                 0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72,
183                 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751,
184                 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21,
185                 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85,
186                 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa,
187                 0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12,
188                 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0,
189                 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9,
190                 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233,
191                 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7,
192                 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920,
193                 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
194                 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17,
195                 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8,
196                 0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11,
197                 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a,
198         }, {
199                 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b,
200                 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5,
201                 0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b,
202                 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76,
203                 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d,
204                 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
205                 0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf,
206                 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0,
207                 0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26,
208                 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
209                 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1,
210                 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15,
211                 0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3,
212                 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a,
213                 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
214                 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75,
215                 0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a,
216                 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0,
217                 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3,
218                 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
219                 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced,
220                 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b,
221                 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39,
222                 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
223                 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb,
224                 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485,
225                 0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f,
226                 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8,
227                 0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f,
228                 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
229                 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321,
230                 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2,
231                 0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec,
232                 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917,
233                 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d,
234                 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573,
235                 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc,
236                 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388,
237                 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14,
238                 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db,
239                 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a,
240                 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c,
241                 0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662,
242                 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79,
243                 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d,
244                 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9,
245                 0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea,
246                 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808,
247                 0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e,
248                 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
249                 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f,
250                 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a,
251                 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66,
252                 0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e,
253                 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9,
254                 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e,
255                 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311,
256                 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794,
257                 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9,
258                 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
259                 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d,
260                 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868,
261                 0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f,
262                 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16,
263         }, {
264                 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b,
265                 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5,
266                 0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b,
267                 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676,
268                 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d,
269                 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
270                 0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf,
271                 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0,
272                 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626,
273                 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
274                 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1,
275                 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515,
276                 0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3,
277                 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a,
278                 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
279                 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575,
280                 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a,
281                 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0,
282                 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3,
283                 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
284                 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded,
285                 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b,
286                 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939,
287                 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
288                 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb,
289                 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585,
290                 0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f,
291                 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8,
292                 0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f,
293                 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
294                 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121,
295                 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2,
296                 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec,
297                 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717,
298                 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d,
299                 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373,
300                 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc,
301                 0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888,
302                 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414,
303                 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
304                 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a,
305                 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c,
306                 0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262,
307                 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979,
308                 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d,
309                 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9,
310                 0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea,
311                 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808,
312                 0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e,
313                 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
314                 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f,
315                 0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a,
316                 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666,
317                 0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e,
318                 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9,
319                 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e,
320                 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111,
321                 0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494,
322                 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9,
323                 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
324                 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d,
325                 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868,
326                 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f,
327                 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616,
328         }
329 };
330
331 __visible const u32 crypto_fl_tab[4][256] __cacheline_aligned = {
332         {
333                 0x00000063, 0x0000007c, 0x00000077, 0x0000007b,
334                 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5,
335                 0x00000030, 0x00000001, 0x00000067, 0x0000002b,
336                 0x000000fe, 0x000000d7, 0x000000ab, 0x00000076,
337                 0x000000ca, 0x00000082, 0x000000c9, 0x0000007d,
338                 0x000000fa, 0x00000059, 0x00000047, 0x000000f0,
339                 0x000000ad, 0x000000d4, 0x000000a2, 0x000000af,
340                 0x0000009c, 0x000000a4, 0x00000072, 0x000000c0,
341                 0x000000b7, 0x000000fd, 0x00000093, 0x00000026,
342                 0x00000036, 0x0000003f, 0x000000f7, 0x000000cc,
343                 0x00000034, 0x000000a5, 0x000000e5, 0x000000f1,
344                 0x00000071, 0x000000d8, 0x00000031, 0x00000015,
345                 0x00000004, 0x000000c7, 0x00000023, 0x000000c3,
346                 0x00000018, 0x00000096, 0x00000005, 0x0000009a,
347                 0x00000007, 0x00000012, 0x00000080, 0x000000e2,
348                 0x000000eb, 0x00000027, 0x000000b2, 0x00000075,
349                 0x00000009, 0x00000083, 0x0000002c, 0x0000001a,
350                 0x0000001b, 0x0000006e, 0x0000005a, 0x000000a0,
351                 0x00000052, 0x0000003b, 0x000000d6, 0x000000b3,
352                 0x00000029, 0x000000e3, 0x0000002f, 0x00000084,
353                 0x00000053, 0x000000d1, 0x00000000, 0x000000ed,
354                 0x00000020, 0x000000fc, 0x000000b1, 0x0000005b,
355                 0x0000006a, 0x000000cb, 0x000000be, 0x00000039,
356                 0x0000004a, 0x0000004c, 0x00000058, 0x000000cf,
357                 0x000000d0, 0x000000ef, 0x000000aa, 0x000000fb,
358                 0x00000043, 0x0000004d, 0x00000033, 0x00000085,
359                 0x00000045, 0x000000f9, 0x00000002, 0x0000007f,
360                 0x00000050, 0x0000003c, 0x0000009f, 0x000000a8,
361                 0x00000051, 0x000000a3, 0x00000040, 0x0000008f,
362                 0x00000092, 0x0000009d, 0x00000038, 0x000000f5,
363                 0x000000bc, 0x000000b6, 0x000000da, 0x00000021,
364                 0x00000010, 0x000000ff, 0x000000f3, 0x000000d2,
365                 0x000000cd, 0x0000000c, 0x00000013, 0x000000ec,
366                 0x0000005f, 0x00000097, 0x00000044, 0x00000017,
367                 0x000000c4, 0x000000a7, 0x0000007e, 0x0000003d,
368                 0x00000064, 0x0000005d, 0x00000019, 0x00000073,
369                 0x00000060, 0x00000081, 0x0000004f, 0x000000dc,
370                 0x00000022, 0x0000002a, 0x00000090, 0x00000088,
371                 0x00000046, 0x000000ee, 0x000000b8, 0x00000014,
372                 0x000000de, 0x0000005e, 0x0000000b, 0x000000db,
373                 0x000000e0, 0x00000032, 0x0000003a, 0x0000000a,
374                 0x00000049, 0x00000006, 0x00000024, 0x0000005c,
375                 0x000000c2, 0x000000d3, 0x000000ac, 0x00000062,
376                 0x00000091, 0x00000095, 0x000000e4, 0x00000079,
377                 0x000000e7, 0x000000c8, 0x00000037, 0x0000006d,
378                 0x0000008d, 0x000000d5, 0x0000004e, 0x000000a9,
379                 0x0000006c, 0x00000056, 0x000000f4, 0x000000ea,
380                 0x00000065, 0x0000007a, 0x000000ae, 0x00000008,
381                 0x000000ba, 0x00000078, 0x00000025, 0x0000002e,
382                 0x0000001c, 0x000000a6, 0x000000b4, 0x000000c6,
383                 0x000000e8, 0x000000dd, 0x00000074, 0x0000001f,
384                 0x0000004b, 0x000000bd, 0x0000008b, 0x0000008a,
385                 0x00000070, 0x0000003e, 0x000000b5, 0x00000066,
386                 0x00000048, 0x00000003, 0x000000f6, 0x0000000e,
387                 0x00000061, 0x00000035, 0x00000057, 0x000000b9,
388                 0x00000086, 0x000000c1, 0x0000001d, 0x0000009e,
389                 0x000000e1, 0x000000f8, 0x00000098, 0x00000011,
390                 0x00000069, 0x000000d9, 0x0000008e, 0x00000094,
391                 0x0000009b, 0x0000001e, 0x00000087, 0x000000e9,
392                 0x000000ce, 0x00000055, 0x00000028, 0x000000df,
393                 0x0000008c, 0x000000a1, 0x00000089, 0x0000000d,
394                 0x000000bf, 0x000000e6, 0x00000042, 0x00000068,
395                 0x00000041, 0x00000099, 0x0000002d, 0x0000000f,
396                 0x000000b0, 0x00000054, 0x000000bb, 0x00000016,
397         }, {
398                 0x00006300, 0x00007c00, 0x00007700, 0x00007b00,
399                 0x0000f200, 0x00006b00, 0x00006f00, 0x0000c500,
400                 0x00003000, 0x00000100, 0x00006700, 0x00002b00,
401                 0x0000fe00, 0x0000d700, 0x0000ab00, 0x00007600,
402                 0x0000ca00, 0x00008200, 0x0000c900, 0x00007d00,
403                 0x0000fa00, 0x00005900, 0x00004700, 0x0000f000,
404                 0x0000ad00, 0x0000d400, 0x0000a200, 0x0000af00,
405                 0x00009c00, 0x0000a400, 0x00007200, 0x0000c000,
406                 0x0000b700, 0x0000fd00, 0x00009300, 0x00002600,
407                 0x00003600, 0x00003f00, 0x0000f700, 0x0000cc00,
408                 0x00003400, 0x0000a500, 0x0000e500, 0x0000f100,
409                 0x00007100, 0x0000d800, 0x00003100, 0x00001500,
410                 0x00000400, 0x0000c700, 0x00002300, 0x0000c300,
411                 0x00001800, 0x00009600, 0x00000500, 0x00009a00,
412                 0x00000700, 0x00001200, 0x00008000, 0x0000e200,
413                 0x0000eb00, 0x00002700, 0x0000b200, 0x00007500,
414                 0x00000900, 0x00008300, 0x00002c00, 0x00001a00,
415                 0x00001b00, 0x00006e00, 0x00005a00, 0x0000a000,
416                 0x00005200, 0x00003b00, 0x0000d600, 0x0000b300,
417                 0x00002900, 0x0000e300, 0x00002f00, 0x00008400,
418                 0x00005300, 0x0000d100, 0x00000000, 0x0000ed00,
419                 0x00002000, 0x0000fc00, 0x0000b100, 0x00005b00,
420                 0x00006a00, 0x0000cb00, 0x0000be00, 0x00003900,
421                 0x00004a00, 0x00004c00, 0x00005800, 0x0000cf00,
422                 0x0000d000, 0x0000ef00, 0x0000aa00, 0x0000fb00,
423                 0x00004300, 0x00004d00, 0x00003300, 0x00008500,
424                 0x00004500, 0x0000f900, 0x00000200, 0x00007f00,
425                 0x00005000, 0x00003c00, 0x00009f00, 0x0000a800,
426                 0x00005100, 0x0000a300, 0x00004000, 0x00008f00,
427                 0x00009200, 0x00009d00, 0x00003800, 0x0000f500,
428                 0x0000bc00, 0x0000b600, 0x0000da00, 0x00002100,
429                 0x00001000, 0x0000ff00, 0x0000f300, 0x0000d200,
430                 0x0000cd00, 0x00000c00, 0x00001300, 0x0000ec00,
431                 0x00005f00, 0x00009700, 0x00004400, 0x00001700,
432                 0x0000c400, 0x0000a700, 0x00007e00, 0x00003d00,
433                 0x00006400, 0x00005d00, 0x00001900, 0x00007300,
434                 0x00006000, 0x00008100, 0x00004f00, 0x0000dc00,
435                 0x00002200, 0x00002a00, 0x00009000, 0x00008800,
436                 0x00004600, 0x0000ee00, 0x0000b800, 0x00001400,
437                 0x0000de00, 0x00005e00, 0x00000b00, 0x0000db00,
438                 0x0000e000, 0x00003200, 0x00003a00, 0x00000a00,
439                 0x00004900, 0x00000600, 0x00002400, 0x00005c00,
440                 0x0000c200, 0x0000d300, 0x0000ac00, 0x00006200,
441                 0x00009100, 0x00009500, 0x0000e400, 0x00007900,
442                 0x0000e700, 0x0000c800, 0x00003700, 0x00006d00,
443                 0x00008d00, 0x0000d500, 0x00004e00, 0x0000a900,
444                 0x00006c00, 0x00005600, 0x0000f400, 0x0000ea00,
445                 0x00006500, 0x00007a00, 0x0000ae00, 0x00000800,
446                 0x0000ba00, 0x00007800, 0x00002500, 0x00002e00,
447                 0x00001c00, 0x0000a600, 0x0000b400, 0x0000c600,
448                 0x0000e800, 0x0000dd00, 0x00007400, 0x00001f00,
449                 0x00004b00, 0x0000bd00, 0x00008b00, 0x00008a00,
450                 0x00007000, 0x00003e00, 0x0000b500, 0x00006600,
451                 0x00004800, 0x00000300, 0x0000f600, 0x00000e00,
452                 0x00006100, 0x00003500, 0x00005700, 0x0000b900,
453                 0x00008600, 0x0000c100, 0x00001d00, 0x00009e00,
454                 0x0000e100, 0x0000f800, 0x00009800, 0x00001100,
455                 0x00006900, 0x0000d900, 0x00008e00, 0x00009400,
456                 0x00009b00, 0x00001e00, 0x00008700, 0x0000e900,
457                 0x0000ce00, 0x00005500, 0x00002800, 0x0000df00,
458                 0x00008c00, 0x0000a100, 0x00008900, 0x00000d00,
459                 0x0000bf00, 0x0000e600, 0x00004200, 0x00006800,
460                 0x00004100, 0x00009900, 0x00002d00, 0x00000f00,
461                 0x0000b000, 0x00005400, 0x0000bb00, 0x00001600,
462         }, {
463                 0x00630000, 0x007c0000, 0x00770000, 0x007b0000,
464                 0x00f20000, 0x006b0000, 0x006f0000, 0x00c50000,
465                 0x00300000, 0x00010000, 0x00670000, 0x002b0000,
466                 0x00fe0000, 0x00d70000, 0x00ab0000, 0x00760000,
467                 0x00ca0000, 0x00820000, 0x00c90000, 0x007d0000,
468                 0x00fa0000, 0x00590000, 0x00470000, 0x00f00000,
469                 0x00ad0000, 0x00d40000, 0x00a20000, 0x00af0000,
470                 0x009c0000, 0x00a40000, 0x00720000, 0x00c00000,
471                 0x00b70000, 0x00fd0000, 0x00930000, 0x00260000,
472                 0x00360000, 0x003f0000, 0x00f70000, 0x00cc0000,
473                 0x00340000, 0x00a50000, 0x00e50000, 0x00f10000,
474                 0x00710000, 0x00d80000, 0x00310000, 0x00150000,
475                 0x00040000, 0x00c70000, 0x00230000, 0x00c30000,
476                 0x00180000, 0x00960000, 0x00050000, 0x009a0000,
477                 0x00070000, 0x00120000, 0x00800000, 0x00e20000,
478                 0x00eb0000, 0x00270000, 0x00b20000, 0x00750000,
479                 0x00090000, 0x00830000, 0x002c0000, 0x001a0000,
480                 0x001b0000, 0x006e0000, 0x005a0000, 0x00a00000,
481                 0x00520000, 0x003b0000, 0x00d60000, 0x00b30000,
482                 0x00290000, 0x00e30000, 0x002f0000, 0x00840000,
483                 0x00530000, 0x00d10000, 0x00000000, 0x00ed0000,
484                 0x00200000, 0x00fc0000, 0x00b10000, 0x005b0000,
485                 0x006a0000, 0x00cb0000, 0x00be0000, 0x00390000,
486                 0x004a0000, 0x004c0000, 0x00580000, 0x00cf0000,
487                 0x00d00000, 0x00ef0000, 0x00aa0000, 0x00fb0000,
488                 0x00430000, 0x004d0000, 0x00330000, 0x00850000,
489                 0x00450000, 0x00f90000, 0x00020000, 0x007f0000,
490                 0x00500000, 0x003c0000, 0x009f0000, 0x00a80000,
491                 0x00510000, 0x00a30000, 0x00400000, 0x008f0000,
492                 0x00920000, 0x009d0000, 0x00380000, 0x00f50000,
493                 0x00bc0000, 0x00b60000, 0x00da0000, 0x00210000,
494                 0x00100000, 0x00ff0000, 0x00f30000, 0x00d20000,
495                 0x00cd0000, 0x000c0000, 0x00130000, 0x00ec0000,
496                 0x005f0000, 0x00970000, 0x00440000, 0x00170000,
497                 0x00c40000, 0x00a70000, 0x007e0000, 0x003d0000,
498                 0x00640000, 0x005d0000, 0x00190000, 0x00730000,
499                 0x00600000, 0x00810000, 0x004f0000, 0x00dc0000,
500                 0x00220000, 0x002a0000, 0x00900000, 0x00880000,
501                 0x00460000, 0x00ee0000, 0x00b80000, 0x00140000,
502                 0x00de0000, 0x005e0000, 0x000b0000, 0x00db0000,
503                 0x00e00000, 0x00320000, 0x003a0000, 0x000a0000,
504                 0x00490000, 0x00060000, 0x00240000, 0x005c0000,
505                 0x00c20000, 0x00d30000, 0x00ac0000, 0x00620000,
506                 0x00910000, 0x00950000, 0x00e40000, 0x00790000,
507                 0x00e70000, 0x00c80000, 0x00370000, 0x006d0000,
508                 0x008d0000, 0x00d50000, 0x004e0000, 0x00a90000,
509                 0x006c0000, 0x00560000, 0x00f40000, 0x00ea0000,
510                 0x00650000, 0x007a0000, 0x00ae0000, 0x00080000,
511                 0x00ba0000, 0x00780000, 0x00250000, 0x002e0000,
512                 0x001c0000, 0x00a60000, 0x00b40000, 0x00c60000,
513                 0x00e80000, 0x00dd0000, 0x00740000, 0x001f0000,
514                 0x004b0000, 0x00bd0000, 0x008b0000, 0x008a0000,
515                 0x00700000, 0x003e0000, 0x00b50000, 0x00660000,
516                 0x00480000, 0x00030000, 0x00f60000, 0x000e0000,
517                 0x00610000, 0x00350000, 0x00570000, 0x00b90000,
518                 0x00860000, 0x00c10000, 0x001d0000, 0x009e0000,
519                 0x00e10000, 0x00f80000, 0x00980000, 0x00110000,
520                 0x00690000, 0x00d90000, 0x008e0000, 0x00940000,
521                 0x009b0000, 0x001e0000, 0x00870000, 0x00e90000,
522                 0x00ce0000, 0x00550000, 0x00280000, 0x00df0000,
523                 0x008c0000, 0x00a10000, 0x00890000, 0x000d0000,
524                 0x00bf0000, 0x00e60000, 0x00420000, 0x00680000,
525                 0x00410000, 0x00990000, 0x002d0000, 0x000f0000,
526                 0x00b00000, 0x00540000, 0x00bb0000, 0x00160000,
527         }, {
528                 0x63000000, 0x7c000000, 0x77000000, 0x7b000000,
529                 0xf2000000, 0x6b000000, 0x6f000000, 0xc5000000,
530                 0x30000000, 0x01000000, 0x67000000, 0x2b000000,
531                 0xfe000000, 0xd7000000, 0xab000000, 0x76000000,
532                 0xca000000, 0x82000000, 0xc9000000, 0x7d000000,
533                 0xfa000000, 0x59000000, 0x47000000, 0xf0000000,
534                 0xad000000, 0xd4000000, 0xa2000000, 0xaf000000,
535                 0x9c000000, 0xa4000000, 0x72000000, 0xc0000000,
536                 0xb7000000, 0xfd000000, 0x93000000, 0x26000000,
537                 0x36000000, 0x3f000000, 0xf7000000, 0xcc000000,
538                 0x34000000, 0xa5000000, 0xe5000000, 0xf1000000,
539                 0x71000000, 0xd8000000, 0x31000000, 0x15000000,
540                 0x04000000, 0xc7000000, 0x23000000, 0xc3000000,
541                 0x18000000, 0x96000000, 0x05000000, 0x9a000000,
542                 0x07000000, 0x12000000, 0x80000000, 0xe2000000,
543                 0xeb000000, 0x27000000, 0xb2000000, 0x75000000,
544                 0x09000000, 0x83000000, 0x2c000000, 0x1a000000,
545                 0x1b000000, 0x6e000000, 0x5a000000, 0xa0000000,
546                 0x52000000, 0x3b000000, 0xd6000000, 0xb3000000,
547                 0x29000000, 0xe3000000, 0x2f000000, 0x84000000,
548                 0x53000000, 0xd1000000, 0x00000000, 0xed000000,
549                 0x20000000, 0xfc000000, 0xb1000000, 0x5b000000,
550                 0x6a000000, 0xcb000000, 0xbe000000, 0x39000000,
551                 0x4a000000, 0x4c000000, 0x58000000, 0xcf000000,
552                 0xd0000000, 0xef000000, 0xaa000000, 0xfb000000,
553                 0x43000000, 0x4d000000, 0x33000000, 0x85000000,
554                 0x45000000, 0xf9000000, 0x02000000, 0x7f000000,
555                 0x50000000, 0x3c000000, 0x9f000000, 0xa8000000,
556                 0x51000000, 0xa3000000, 0x40000000, 0x8f000000,
557                 0x92000000, 0x9d000000, 0x38000000, 0xf5000000,
558                 0xbc000000, 0xb6000000, 0xda000000, 0x21000000,
559                 0x10000000, 0xff000000, 0xf3000000, 0xd2000000,
560                 0xcd000000, 0x0c000000, 0x13000000, 0xec000000,
561                 0x5f000000, 0x97000000, 0x44000000, 0x17000000,
562                 0xc4000000, 0xa7000000, 0x7e000000, 0x3d000000,
563                 0x64000000, 0x5d000000, 0x19000000, 0x73000000,
564                 0x60000000, 0x81000000, 0x4f000000, 0xdc000000,
565                 0x22000000, 0x2a000000, 0x90000000, 0x88000000,
566                 0x46000000, 0xee000000, 0xb8000000, 0x14000000,
567                 0xde000000, 0x5e000000, 0x0b000000, 0xdb000000,
568                 0xe0000000, 0x32000000, 0x3a000000, 0x0a000000,
569                 0x49000000, 0x06000000, 0x24000000, 0x5c000000,
570                 0xc2000000, 0xd3000000, 0xac000000, 0x62000000,
571                 0x91000000, 0x95000000, 0xe4000000, 0x79000000,
572                 0xe7000000, 0xc8000000, 0x37000000, 0x6d000000,
573                 0x8d000000, 0xd5000000, 0x4e000000, 0xa9000000,
574                 0x6c000000, 0x56000000, 0xf4000000, 0xea000000,
575                 0x65000000, 0x7a000000, 0xae000000, 0x08000000,
576                 0xba000000, 0x78000000, 0x25000000, 0x2e000000,
577                 0x1c000000, 0xa6000000, 0xb4000000, 0xc6000000,
578                 0xe8000000, 0xdd000000, 0x74000000, 0x1f000000,
579                 0x4b000000, 0xbd000000, 0x8b000000, 0x8a000000,
580                 0x70000000, 0x3e000000, 0xb5000000, 0x66000000,
581                 0x48000000, 0x03000000, 0xf6000000, 0x0e000000,
582                 0x61000000, 0x35000000, 0x57000000, 0xb9000000,
583                 0x86000000, 0xc1000000, 0x1d000000, 0x9e000000,
584                 0xe1000000, 0xf8000000, 0x98000000, 0x11000000,
585                 0x69000000, 0xd9000000, 0x8e000000, 0x94000000,
586                 0x9b000000, 0x1e000000, 0x87000000, 0xe9000000,
587                 0xce000000, 0x55000000, 0x28000000, 0xdf000000,
588                 0x8c000000, 0xa1000000, 0x89000000, 0x0d000000,
589                 0xbf000000, 0xe6000000, 0x42000000, 0x68000000,
590                 0x41000000, 0x99000000, 0x2d000000, 0x0f000000,
591                 0xb0000000, 0x54000000, 0xbb000000, 0x16000000,
592         }
593 };
594
595 __visible const u32 crypto_it_tab[4][256] __cacheline_aligned = {
596         {
597                 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
598                 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
599                 0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5,
600                 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5,
601                 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
602                 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
603                 0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295,
604                 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e,
605                 0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927,
606                 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
607                 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362,
608                 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9,
609                 0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52,
610                 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566,
611                 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
612                 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed,
613                 0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e,
614                 0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4,
615                 0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4,
616                 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
617                 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d,
618                 0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060,
619                 0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967,
620                 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
621                 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000,
622                 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c,
623                 0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36,
624                 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624,
625                 0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b,
626                 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
627                 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12,
628                 0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14,
629                 0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3,
630                 0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b,
631                 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
632                 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684,
633                 0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7,
634                 0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177,
635                 0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947,
636                 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
637                 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498,
638                 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
639                 0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54,
640                 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382,
641                 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
642                 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb,
643                 0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83,
644                 0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef,
645                 0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029,
646                 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
647                 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733,
648                 0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117,
649                 0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4,
650                 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546,
651                 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
652                 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d,
653                 0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb,
654                 0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a,
655                 0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773,
656                 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
657                 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2,
658                 0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff,
659                 0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664,
660                 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0,
661         }, {
662                 0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96,
663                 0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x03e34b93,
664                 0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525,
665                 0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f,
666                 0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1,
667                 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
668                 0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da,
669                 0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44,
670                 0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd,
671                 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
672                 0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245,
673                 0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994,
674                 0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7,
675                 0xd373ab23, 0x024b72e2, 0x8f1fe357, 0xab55662a,
676                 0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5,
677                 0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c,
678                 0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1,
679                 0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a,
680                 0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475,
681                 0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
682                 0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46,
683                 0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff,
684                 0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777,
685                 0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
686                 0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000,
687                 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e,
688                 0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627,
689                 0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a,
690                 0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e,
691                 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
692                 0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d,
693                 0x0d090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8,
694                 0x19f15785, 0x0775af4c, 0xdd99eebb, 0x607fa3fd,
695                 0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34,
696                 0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863,
697                 0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420,
698                 0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d,
699                 0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0,
700                 0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722,
701                 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
702                 0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836,
703                 0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
704                 0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462,
705                 0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5,
706                 0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3,
707                 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b,
708                 0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8,
709                 0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6,
710                 0x9be7bad9, 0x366f4ace, 0x099fead4, 0x7cb029d6,
711                 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
712                 0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315,
713                 0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f,
714                 0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x0496e4df,
715                 0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f,
716                 0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e,
717                 0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13,
718                 0x61d79a8c, 0x0ca1377a, 0x14f8598e, 0x3c13eb89,
719                 0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c,
720                 0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf,
721                 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
722                 0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f,
723                 0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41,
724                 0x01a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490,
725                 0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042,
726         }, {
727                 0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e,
728                 0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303,
729                 0x302055fa, 0x76adf66d, 0xcc889176, 0x02f5254c,
730                 0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3,
731                 0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0,
732                 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
733                 0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59,
734                 0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8,
735                 0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71,
736                 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
737                 0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f,
738                 0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b,
739                 0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8,
740                 0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab,
741                 0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
742                 0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82,
743                 0xcf8a2b1c, 0x79a792b4, 0x07f3f0f2, 0x694ea1e2,
744                 0xda65cdf4, 0x0506d5be, 0x34d11f62, 0xa6c48afe,
745                 0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb,
746                 0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
747                 0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd,
748                 0x5491b58d, 0xc471055d, 0x06046fd4, 0x5060ff15,
749                 0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e,
750                 0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
751                 0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000,
752                 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72,
753                 0x0efdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739,
754                 0x0f0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e,
755                 0x0a0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91,
756                 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
757                 0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17,
758                 0x090e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9,
759                 0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60,
760                 0x01f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e,
761                 0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1,
762                 0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011,
763                 0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1,
764                 0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3,
765                 0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264,
766                 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
767                 0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b,
768                 0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
769                 0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246,
770                 0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af,
771                 0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312,
772                 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb,
773                 0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a,
774                 0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8,
775                 0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c,
776                 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
777                 0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8,
778                 0x04f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6,
779                 0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04,
780                 0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51,
781                 0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41,
782                 0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347,
783                 0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c,
784                 0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1,
785                 0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37,
786                 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
787                 0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40,
788                 0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0x0dff4195,
789                 0xa8397101, 0x0c08deb3, 0xb4d89ce4, 0x566490c1,
790                 0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257,
791         }, {
792                 0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27,
793                 0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3,
794                 0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02,
795                 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362,
796                 0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe,
797                 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
798                 0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952,
799                 0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9,
800                 0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9,
801                 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
802                 0x63184adf, 0xe582311a, 0x97603351, 0x62457f53,
803                 0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
804                 0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b,
805                 0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55,
806                 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
807                 0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216,
808                 0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269,
809                 0x65cdf4da, 0x06d5be05, 0xd11f6234, 0xc48afea6,
810                 0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6,
811                 0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
812                 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6,
813                 0x91b58d54, 0x71055dc4, 0x046fd406, 0x60ff1550,
814                 0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9,
815                 0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
816                 0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000,
817                 0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a,
818                 0xfdfbff0e, 0x0f563885, 0x3d1ed5ae, 0x3627392d,
819                 0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36,
820                 0x0cb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b,
821                 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
822                 0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b,
823                 0x0e0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e,
824                 0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
825                 0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb,
826                 0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4,
827                 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
828                 0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129,
829                 0x1d4b2f9e, 0xdcf330b2, 0x0dec5286, 0x77d0e3c1,
830                 0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9,
831                 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
832                 0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4,
833                 0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
834                 0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e,
835                 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3,
836                 0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
837                 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b,
838                 0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f,
839                 0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
840                 0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0,
841                 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
842                 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
843                 0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691,
844                 0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496,
845                 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
846                 0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b,
847                 0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6,
848                 0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13,
849                 0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147,
850                 0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7,
851                 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
852                 0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3,
853                 0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d,
854                 0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156,
855                 0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8,
856         }
857 };
858
859 __visible const u32 crypto_il_tab[4][256] __cacheline_aligned = {
860         {
861                 0x00000052, 0x00000009, 0x0000006a, 0x000000d5,
862                 0x00000030, 0x00000036, 0x000000a5, 0x00000038,
863                 0x000000bf, 0x00000040, 0x000000a3, 0x0000009e,
864                 0x00000081, 0x000000f3, 0x000000d7, 0x000000fb,
865                 0x0000007c, 0x000000e3, 0x00000039, 0x00000082,
866                 0x0000009b, 0x0000002f, 0x000000ff, 0x00000087,
867                 0x00000034, 0x0000008e, 0x00000043, 0x00000044,
868                 0x000000c4, 0x000000de, 0x000000e9, 0x000000cb,
869                 0x00000054, 0x0000007b, 0x00000094, 0x00000032,
870                 0x000000a6, 0x000000c2, 0x00000023, 0x0000003d,
871                 0x000000ee, 0x0000004c, 0x00000095, 0x0000000b,
872                 0x00000042, 0x000000fa, 0x000000c3, 0x0000004e,
873                 0x00000008, 0x0000002e, 0x000000a1, 0x00000066,
874                 0x00000028, 0x000000d9, 0x00000024, 0x000000b2,
875                 0x00000076, 0x0000005b, 0x000000a2, 0x00000049,
876                 0x0000006d, 0x0000008b, 0x000000d1, 0x00000025,
877                 0x00000072, 0x000000f8, 0x000000f6, 0x00000064,
878                 0x00000086, 0x00000068, 0x00000098, 0x00000016,
879                 0x000000d4, 0x000000a4, 0x0000005c, 0x000000cc,
880                 0x0000005d, 0x00000065, 0x000000b6, 0x00000092,
881                 0x0000006c, 0x00000070, 0x00000048, 0x00000050,
882                 0x000000fd, 0x000000ed, 0x000000b9, 0x000000da,
883                 0x0000005e, 0x00000015, 0x00000046, 0x00000057,
884                 0x000000a7, 0x0000008d, 0x0000009d, 0x00000084,
885                 0x00000090, 0x000000d8, 0x000000ab, 0x00000000,
886                 0x0000008c, 0x000000bc, 0x000000d3, 0x0000000a,
887                 0x000000f7, 0x000000e4, 0x00000058, 0x00000005,
888                 0x000000b8, 0x000000b3, 0x00000045, 0x00000006,
889                 0x000000d0, 0x0000002c, 0x0000001e, 0x0000008f,
890                 0x000000ca, 0x0000003f, 0x0000000f, 0x00000002,
891                 0x000000c1, 0x000000af, 0x000000bd, 0x00000003,
892                 0x00000001, 0x00000013, 0x0000008a, 0x0000006b,
893                 0x0000003a, 0x00000091, 0x00000011, 0x00000041,
894                 0x0000004f, 0x00000067, 0x000000dc, 0x000000ea,
895                 0x00000097, 0x000000f2, 0x000000cf, 0x000000ce,
896                 0x000000f0, 0x000000b4, 0x000000e6, 0x00000073,
897                 0x00000096, 0x000000ac, 0x00000074, 0x00000022,
898                 0x000000e7, 0x000000ad, 0x00000035, 0x00000085,
899                 0x000000e2, 0x000000f9, 0x00000037, 0x000000e8,
900                 0x0000001c, 0x00000075, 0x000000df, 0x0000006e,
901                 0x00000047, 0x000000f1, 0x0000001a, 0x00000071,
902                 0x0000001d, 0x00000029, 0x000000c5, 0x00000089,
903                 0x0000006f, 0x000000b7, 0x00000062, 0x0000000e,
904                 0x000000aa, 0x00000018, 0x000000be, 0x0000001b,
905                 0x000000fc, 0x00000056, 0x0000003e, 0x0000004b,
906                 0x000000c6, 0x000000d2, 0x00000079, 0x00000020,
907                 0x0000009a, 0x000000db, 0x000000c0, 0x000000fe,
908                 0x00000078, 0x000000cd, 0x0000005a, 0x000000f4,
909                 0x0000001f, 0x000000dd, 0x000000a8, 0x00000033,
910                 0x00000088, 0x00000007, 0x000000c7, 0x00000031,
911                 0x000000b1, 0x00000012, 0x00000010, 0x00000059,
912                 0x00000027, 0x00000080, 0x000000ec, 0x0000005f,
913                 0x00000060, 0x00000051, 0x0000007f, 0x000000a9,
914                 0x00000019, 0x000000b5, 0x0000004a, 0x0000000d,
915                 0x0000002d, 0x000000e5, 0x0000007a, 0x0000009f,
916                 0x00000093, 0x000000c9, 0x0000009c, 0x000000ef,
917                 0x000000a0, 0x000000e0, 0x0000003b, 0x0000004d,
918                 0x000000ae, 0x0000002a, 0x000000f5, 0x000000b0,
919                 0x000000c8, 0x000000eb, 0x000000bb, 0x0000003c,
920                 0x00000083, 0x00000053, 0x00000099, 0x00000061,
921                 0x00000017, 0x0000002b, 0x00000004, 0x0000007e,
922                 0x000000ba, 0x00000077, 0x000000d6, 0x00000026,
923                 0x000000e1, 0x00000069, 0x00000014, 0x00000063,
924                 0x00000055, 0x00000021, 0x0000000c, 0x0000007d,
925         }, {
926                 0x00005200, 0x00000900, 0x00006a00, 0x0000d500,
927                 0x00003000, 0x00003600, 0x0000a500, 0x00003800,
928                 0x0000bf00, 0x00004000, 0x0000a300, 0x00009e00,
929                 0x00008100, 0x0000f300, 0x0000d700, 0x0000fb00,
930                 0x00007c00, 0x0000e300, 0x00003900, 0x00008200,
931                 0x00009b00, 0x00002f00, 0x0000ff00, 0x00008700,
932                 0x00003400, 0x00008e00, 0x00004300, 0x00004400,
933                 0x0000c400, 0x0000de00, 0x0000e900, 0x0000cb00,
934                 0x00005400, 0x00007b00, 0x00009400, 0x00003200,
935                 0x0000a600, 0x0000c200, 0x00002300, 0x00003d00,
936                 0x0000ee00, 0x00004c00, 0x00009500, 0x00000b00,
937                 0x00004200, 0x0000fa00, 0x0000c300, 0x00004e00,
938                 0x00000800, 0x00002e00, 0x0000a100, 0x00006600,
939                 0x00002800, 0x0000d900, 0x00002400, 0x0000b200,
940                 0x00007600, 0x00005b00, 0x0000a200, 0x00004900,
941                 0x00006d00, 0x00008b00, 0x0000d100, 0x00002500,
942                 0x00007200, 0x0000f800, 0x0000f600, 0x00006400,
943                 0x00008600, 0x00006800, 0x00009800, 0x00001600,
944                 0x0000d400, 0x0000a400, 0x00005c00, 0x0000cc00,
945                 0x00005d00, 0x00006500, 0x0000b600, 0x00009200,
946                 0x00006c00, 0x00007000, 0x00004800, 0x00005000,
947                 0x0000fd00, 0x0000ed00, 0x0000b900, 0x0000da00,
948                 0x00005e00, 0x00001500, 0x00004600, 0x00005700,
949                 0x0000a700, 0x00008d00, 0x00009d00, 0x00008400,
950                 0x00009000, 0x0000d800, 0x0000ab00, 0x00000000,
951                 0x00008c00, 0x0000bc00, 0x0000d300, 0x00000a00,
952                 0x0000f700, 0x0000e400, 0x00005800, 0x00000500,
953                 0x0000b800, 0x0000b300, 0x00004500, 0x00000600,
954                 0x0000d000, 0x00002c00, 0x00001e00, 0x00008f00,
955                 0x0000ca00, 0x00003f00, 0x00000f00, 0x00000200,
956                 0x0000c100, 0x0000af00, 0x0000bd00, 0x00000300,
957                 0x00000100, 0x00001300, 0x00008a00, 0x00006b00,
958                 0x00003a00, 0x00009100, 0x00001100, 0x00004100,
959                 0x00004f00, 0x00006700, 0x0000dc00, 0x0000ea00,
960                 0x00009700, 0x0000f200, 0x0000cf00, 0x0000ce00,
961                 0x0000f000, 0x0000b400, 0x0000e600, 0x00007300,
962                 0x00009600, 0x0000ac00, 0x00007400, 0x00002200,
963                 0x0000e700, 0x0000ad00, 0x00003500, 0x00008500,
964                 0x0000e200, 0x0000f900, 0x00003700, 0x0000e800,
965                 0x00001c00, 0x00007500, 0x0000df00, 0x00006e00,
966                 0x00004700, 0x0000f100, 0x00001a00, 0x00007100,
967                 0x00001d00, 0x00002900, 0x0000c500, 0x00008900,
968                 0x00006f00, 0x0000b700, 0x00006200, 0x00000e00,
969                 0x0000aa00, 0x00001800, 0x0000be00, 0x00001b00,
970                 0x0000fc00, 0x00005600, 0x00003e00, 0x00004b00,
971                 0x0000c600, 0x0000d200, 0x00007900, 0x00002000,
972                 0x00009a00, 0x0000db00, 0x0000c000, 0x0000fe00,
973                 0x00007800, 0x0000cd00, 0x00005a00, 0x0000f400,
974                 0x00001f00, 0x0000dd00, 0x0000a800, 0x00003300,
975                 0x00008800, 0x00000700, 0x0000c700, 0x00003100,
976                 0x0000b100, 0x00001200, 0x00001000, 0x00005900,
977                 0x00002700, 0x00008000, 0x0000ec00, 0x00005f00,
978                 0x00006000, 0x00005100, 0x00007f00, 0x0000a900,
979                 0x00001900, 0x0000b500, 0x00004a00, 0x00000d00,
980                 0x00002d00, 0x0000e500, 0x00007a00, 0x00009f00,
981                 0x00009300, 0x0000c900, 0x00009c00, 0x0000ef00,
982                 0x0000a000, 0x0000e000, 0x00003b00, 0x00004d00,
983                 0x0000ae00, 0x00002a00, 0x0000f500, 0x0000b000,
984                 0x0000c800, 0x0000eb00, 0x0000bb00, 0x00003c00,
985                 0x00008300, 0x00005300, 0x00009900, 0x00006100,
986                 0x00001700, 0x00002b00, 0x00000400, 0x00007e00,
987                 0x0000ba00, 0x00007700, 0x0000d600, 0x00002600,
988                 0x0000e100, 0x00006900, 0x00001400, 0x00006300,
989                 0x00005500, 0x00002100, 0x00000c00, 0x00007d00,
990         }, {
991                 0x00520000, 0x00090000, 0x006a0000, 0x00d50000,
992                 0x00300000, 0x00360000, 0x00a50000, 0x00380000,
993                 0x00bf0000, 0x00400000, 0x00a30000, 0x009e0000,
994                 0x00810000, 0x00f30000, 0x00d70000, 0x00fb0000,
995                 0x007c0000, 0x00e30000, 0x00390000, 0x00820000,
996                 0x009b0000, 0x002f0000, 0x00ff0000, 0x00870000,
997                 0x00340000, 0x008e0000, 0x00430000, 0x00440000,
998                 0x00c40000, 0x00de0000, 0x00e90000, 0x00cb0000,
999                 0x00540000, 0x007b0000, 0x00940000, 0x00320000,
1000                 0x00a60000, 0x00c20000, 0x00230000, 0x003d0000,
1001                 0x00ee0000, 0x004c0000, 0x00950000, 0x000b0000,
1002                 0x00420000, 0x00fa0000, 0x00c30000, 0x004e0000,
1003                 0x00080000, 0x002e0000, 0x00a10000, 0x00660000,
1004                 0x00280000, 0x00d90000, 0x00240000, 0x00b20000,
1005                 0x00760000, 0x005b0000, 0x00a20000, 0x00490000,
1006                 0x006d0000, 0x008b0000, 0x00d10000, 0x00250000,
1007                 0x00720000, 0x00f80000, 0x00f60000, 0x00640000,
1008                 0x00860000, 0x00680000, 0x00980000, 0x00160000,
1009                 0x00d40000, 0x00a40000, 0x005c0000, 0x00cc0000,
1010                 0x005d0000, 0x00650000, 0x00b60000, 0x00920000,
1011                 0x006c0000, 0x00700000, 0x00480000, 0x00500000,
1012                 0x00fd0000, 0x00ed0000, 0x00b90000, 0x00da0000,
1013                 0x005e0000, 0x00150000, 0x00460000, 0x00570000,
1014                 0x00a70000, 0x008d0000, 0x009d0000, 0x00840000,
1015                 0x00900000, 0x00d80000, 0x00ab0000, 0x00000000,
1016                 0x008c0000, 0x00bc0000, 0x00d30000, 0x000a0000,
1017                 0x00f70000, 0x00e40000, 0x00580000, 0x00050000,
1018                 0x00b80000, 0x00b30000, 0x00450000, 0x00060000,
1019                 0x00d00000, 0x002c0000, 0x001e0000, 0x008f0000,
1020                 0x00ca0000, 0x003f0000, 0x000f0000, 0x00020000,
1021                 0x00c10000, 0x00af0000, 0x00bd0000, 0x00030000,
1022                 0x00010000, 0x00130000, 0x008a0000, 0x006b0000,
1023                 0x003a0000, 0x00910000, 0x00110000, 0x00410000,
1024                 0x004f0000, 0x00670000, 0x00dc0000, 0x00ea0000,
1025                 0x00970000, 0x00f20000, 0x00cf0000, 0x00ce0000,
1026                 0x00f00000, 0x00b40000, 0x00e60000, 0x00730000,
1027                 0x00960000, 0x00ac0000, 0x00740000, 0x00220000,
1028                 0x00e70000, 0x00ad0000, 0x00350000, 0x00850000,
1029                 0x00e20000, 0x00f90000, 0x00370000, 0x00e80000,
1030                 0x001c0000, 0x00750000, 0x00df0000, 0x006e0000,
1031                 0x00470000, 0x00f10000, 0x001a0000, 0x00710000,
1032                 0x001d0000, 0x00290000, 0x00c50000, 0x00890000,
1033                 0x006f0000, 0x00b70000, 0x00620000, 0x000e0000,
1034                 0x00aa0000, 0x00180000, 0x00be0000, 0x001b0000,
1035                 0x00fc0000, 0x00560000, 0x003e0000, 0x004b0000,
1036                 0x00c60000, 0x00d20000, 0x00790000, 0x00200000,
1037                 0x009a0000, 0x00db0000, 0x00c00000, 0x00fe0000,
1038                 0x00780000, 0x00cd0000, 0x005a0000, 0x00f40000,
1039                 0x001f0000, 0x00dd0000, 0x00a80000, 0x00330000,
1040                 0x00880000, 0x00070000, 0x00c70000, 0x00310000,
1041                 0x00b10000, 0x00120000, 0x00100000, 0x00590000,
1042                 0x00270000, 0x00800000, 0x00ec0000, 0x005f0000,
1043                 0x00600000, 0x00510000, 0x007f0000, 0x00a90000,
1044                 0x00190000, 0x00b50000, 0x004a0000, 0x000d0000,
1045                 0x002d0000, 0x00e50000, 0x007a0000, 0x009f0000,
1046                 0x00930000, 0x00c90000, 0x009c0000, 0x00ef0000,
1047                 0x00a00000, 0x00e00000, 0x003b0000, 0x004d0000,
1048                 0x00ae0000, 0x002a0000, 0x00f50000, 0x00b00000,
1049                 0x00c80000, 0x00eb0000, 0x00bb0000, 0x003c0000,
1050                 0x00830000, 0x00530000, 0x00990000, 0x00610000,
1051                 0x00170000, 0x002b0000, 0x00040000, 0x007e0000,
1052                 0x00ba0000, 0x00770000, 0x00d60000, 0x00260000,
1053                 0x00e10000, 0x00690000, 0x00140000, 0x00630000,
1054                 0x00550000, 0x00210000, 0x000c0000, 0x007d0000,
1055         }, {
1056                 0x52000000, 0x09000000, 0x6a000000, 0xd5000000,
1057                 0x30000000, 0x36000000, 0xa5000000, 0x38000000,
1058                 0xbf000000, 0x40000000, 0xa3000000, 0x9e000000,
1059                 0x81000000, 0xf3000000, 0xd7000000, 0xfb000000,
1060                 0x7c000000, 0xe3000000, 0x39000000, 0x82000000,
1061                 0x9b000000, 0x2f000000, 0xff000000, 0x87000000,
1062                 0x34000000, 0x8e000000, 0x43000000, 0x44000000,
1063                 0xc4000000, 0xde000000, 0xe9000000, 0xcb000000,
1064                 0x54000000, 0x7b000000, 0x94000000, 0x32000000,
1065                 0xa6000000, 0xc2000000, 0x23000000, 0x3d000000,
1066                 0xee000000, 0x4c000000, 0x95000000, 0x0b000000,
1067                 0x42000000, 0xfa000000, 0xc3000000, 0x4e000000,
1068                 0x08000000, 0x2e000000, 0xa1000000, 0x66000000,
1069                 0x28000000, 0xd9000000, 0x24000000, 0xb2000000,
1070                 0x76000000, 0x5b000000, 0xa2000000, 0x49000000,
1071                 0x6d000000, 0x8b000000, 0xd1000000, 0x25000000,
1072                 0x72000000, 0xf8000000, 0xf6000000, 0x64000000,
1073                 0x86000000, 0x68000000, 0x98000000, 0x16000000,
1074                 0xd4000000, 0xa4000000, 0x5c000000, 0xcc000000,
1075                 0x5d000000, 0x65000000, 0xb6000000, 0x92000000,
1076                 0x6c000000, 0x70000000, 0x48000000, 0x50000000,
1077                 0xfd000000, 0xed000000, 0xb9000000, 0xda000000,
1078                 0x5e000000, 0x15000000, 0x46000000, 0x57000000,
1079                 0xa7000000, 0x8d000000, 0x9d000000, 0x84000000,
1080                 0x90000000, 0xd8000000, 0xab000000, 0x00000000,
1081                 0x8c000000, 0xbc000000, 0xd3000000, 0x0a000000,
1082                 0xf7000000, 0xe4000000, 0x58000000, 0x05000000,
1083                 0xb8000000, 0xb3000000, 0x45000000, 0x06000000,
1084                 0xd0000000, 0x2c000000, 0x1e000000, 0x8f000000,
1085                 0xca000000, 0x3f000000, 0x0f000000, 0x02000000,
1086                 0xc1000000, 0xaf000000, 0xbd000000, 0x03000000,
1087                 0x01000000, 0x13000000, 0x8a000000, 0x6b000000,
1088                 0x3a000000, 0x91000000, 0x11000000, 0x41000000,
1089                 0x4f000000, 0x67000000, 0xdc000000, 0xea000000,
1090                 0x97000000, 0xf2000000, 0xcf000000, 0xce000000,
1091                 0xf0000000, 0xb4000000, 0xe6000000, 0x73000000,
1092                 0x96000000, 0xac000000, 0x74000000, 0x22000000,
1093                 0xe7000000, 0xad000000, 0x35000000, 0x85000000,
1094                 0xe2000000, 0xf9000000, 0x37000000, 0xe8000000,
1095                 0x1c000000, 0x75000000, 0xdf000000, 0x6e000000,
1096                 0x47000000, 0xf1000000, 0x1a000000, 0x71000000,
1097                 0x1d000000, 0x29000000, 0xc5000000, 0x89000000,
1098                 0x6f000000, 0xb7000000, 0x62000000, 0x0e000000,
1099                 0xaa000000, 0x18000000, 0xbe000000, 0x1b000000,
1100                 0xfc000000, 0x56000000, 0x3e000000, 0x4b000000,
1101                 0xc6000000, 0xd2000000, 0x79000000, 0x20000000,
1102                 0x9a000000, 0xdb000000, 0xc0000000, 0xfe000000,
1103                 0x78000000, 0xcd000000, 0x5a000000, 0xf4000000,
1104                 0x1f000000, 0xdd000000, 0xa8000000, 0x33000000,
1105                 0x88000000, 0x07000000, 0xc7000000, 0x31000000,
1106                 0xb1000000, 0x12000000, 0x10000000, 0x59000000,
1107                 0x27000000, 0x80000000, 0xec000000, 0x5f000000,
1108                 0x60000000, 0x51000000, 0x7f000000, 0xa9000000,
1109                 0x19000000, 0xb5000000, 0x4a000000, 0x0d000000,
1110                 0x2d000000, 0xe5000000, 0x7a000000, 0x9f000000,
1111                 0x93000000, 0xc9000000, 0x9c000000, 0xef000000,
1112                 0xa0000000, 0xe0000000, 0x3b000000, 0x4d000000,
1113                 0xae000000, 0x2a000000, 0xf5000000, 0xb0000000,
1114                 0xc8000000, 0xeb000000, 0xbb000000, 0x3c000000,
1115                 0x83000000, 0x53000000, 0x99000000, 0x61000000,
1116                 0x17000000, 0x2b000000, 0x04000000, 0x7e000000,
1117                 0xba000000, 0x77000000, 0xd6000000, 0x26000000,
1118                 0xe1000000, 0x69000000, 0x14000000, 0x63000000,
1119                 0x55000000, 0x21000000, 0x0c000000, 0x7d000000,
1120         }
1121 };
1122
1123 EXPORT_SYMBOL_GPL(crypto_ft_tab);
1124 EXPORT_SYMBOL_GPL(crypto_fl_tab);
1125 EXPORT_SYMBOL_GPL(crypto_it_tab);
1126 EXPORT_SYMBOL_GPL(crypto_il_tab);
1127
1128 /* initialise the key schedule from the user supplied key */
1129
1130 #define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b)
1131
1132 #define imix_col(y, x)  do {            \
1133         u       = star_x(x);            \
1134         v       = star_x(u);            \
1135         w       = star_x(v);            \
1136         t       = w ^ (x);              \
1137         (y)     = u ^ v ^ w;            \
1138         (y)     ^= ror32(u ^ t, 8) ^    \
1139                 ror32(v ^ t, 16) ^      \
1140                 ror32(t, 24);           \
1141 } while (0)
1142
1143 #define ls_box(x)               \
1144         crypto_fl_tab[0][byte(x, 0)] ^  \
1145         crypto_fl_tab[1][byte(x, 1)] ^  \
1146         crypto_fl_tab[2][byte(x, 2)] ^  \
1147         crypto_fl_tab[3][byte(x, 3)]
1148
1149 #define loop4(i)        do {            \
1150         t = ror32(t, 8);                \
1151         t = ls_box(t) ^ rco_tab[i];     \
1152         t ^= ctx->key_enc[4 * i];               \
1153         ctx->key_enc[4 * i + 4] = t;            \
1154         t ^= ctx->key_enc[4 * i + 1];           \
1155         ctx->key_enc[4 * i + 5] = t;            \
1156         t ^= ctx->key_enc[4 * i + 2];           \
1157         ctx->key_enc[4 * i + 6] = t;            \
1158         t ^= ctx->key_enc[4 * i + 3];           \
1159         ctx->key_enc[4 * i + 7] = t;            \
1160 } while (0)
1161
1162 #define loop6(i)        do {            \
1163         t = ror32(t, 8);                \
1164         t = ls_box(t) ^ rco_tab[i];     \
1165         t ^= ctx->key_enc[6 * i];               \
1166         ctx->key_enc[6 * i + 6] = t;            \
1167         t ^= ctx->key_enc[6 * i + 1];           \
1168         ctx->key_enc[6 * i + 7] = t;            \
1169         t ^= ctx->key_enc[6 * i + 2];           \
1170         ctx->key_enc[6 * i + 8] = t;            \
1171         t ^= ctx->key_enc[6 * i + 3];           \
1172         ctx->key_enc[6 * i + 9] = t;            \
1173         t ^= ctx->key_enc[6 * i + 4];           \
1174         ctx->key_enc[6 * i + 10] = t;           \
1175         t ^= ctx->key_enc[6 * i + 5];           \
1176         ctx->key_enc[6 * i + 11] = t;           \
1177 } while (0)
1178
1179 #define loop8tophalf(i) do {                    \
1180         t = ror32(t, 8);                        \
1181         t = ls_box(t) ^ rco_tab[i];             \
1182         t ^= ctx->key_enc[8 * i];                       \
1183         ctx->key_enc[8 * i + 8] = t;                    \
1184         t ^= ctx->key_enc[8 * i + 1];                   \
1185         ctx->key_enc[8 * i + 9] = t;                    \
1186         t ^= ctx->key_enc[8 * i + 2];                   \
1187         ctx->key_enc[8 * i + 10] = t;                   \
1188         t ^= ctx->key_enc[8 * i + 3];                   \
1189         ctx->key_enc[8 * i + 11] = t;                   \
1190 } while (0)
1191
1192 #define loop8(i)        do {                            \
1193         loop8tophalf(i);                                \
1194         t  = ctx->key_enc[8 * i + 4] ^ ls_box(t);       \
1195         ctx->key_enc[8 * i + 12] = t;                   \
1196         t ^= ctx->key_enc[8 * i + 5];                   \
1197         ctx->key_enc[8 * i + 13] = t;                   \
1198         t ^= ctx->key_enc[8 * i + 6];                   \
1199         ctx->key_enc[8 * i + 14] = t;                   \
1200         t ^= ctx->key_enc[8 * i + 7];                   \
1201         ctx->key_enc[8 * i + 15] = t;                   \
1202 } while (0)
1203
1204 /**
1205  * crypto_aes_expand_key - Expands the AES key as described in FIPS-197
1206  * @ctx:        The location where the computed key will be stored.
1207  * @in_key:     The supplied key.
1208  * @key_len:    The length of the supplied key.
1209  *
1210  * Returns 0 on success. The function fails only if an invalid key size (or
1211  * pointer) is supplied.
1212  * The expanded key size is 240 bytes (max of 14 rounds with a unique 16 bytes
1213  * key schedule plus a 16 bytes key which is used before the first round).
1214  * The decryption key is prepared for the "Equivalent Inverse Cipher" as
1215  * described in FIPS-197. The first slot (16 bytes) of each key (enc or dec) is
1216  * for the initial combination, the second slot for the first round and so on.
1217  */
1218 int crypto_aes_expand_key(struct crypto_aes_ctx *ctx, const u8 *in_key,
1219                 unsigned int key_len)
1220 {
1221         u32 i, t, u, v, w, j;
1222
1223         if (key_len != AES_KEYSIZE_128 && key_len != AES_KEYSIZE_192 &&
1224                         key_len != AES_KEYSIZE_256)
1225                 return -EINVAL;
1226
1227         ctx->key_length = key_len;
1228
1229         ctx->key_enc[0] = get_unaligned_le32(in_key);
1230         ctx->key_enc[1] = get_unaligned_le32(in_key + 4);
1231         ctx->key_enc[2] = get_unaligned_le32(in_key + 8);
1232         ctx->key_enc[3] = get_unaligned_le32(in_key + 12);
1233
1234         ctx->key_dec[key_len + 24] = ctx->key_enc[0];
1235         ctx->key_dec[key_len + 25] = ctx->key_enc[1];
1236         ctx->key_dec[key_len + 26] = ctx->key_enc[2];
1237         ctx->key_dec[key_len + 27] = ctx->key_enc[3];
1238
1239         switch (key_len) {
1240         case AES_KEYSIZE_128:
1241                 t = ctx->key_enc[3];
1242                 for (i = 0; i < 10; ++i)
1243                         loop4(i);
1244                 break;
1245
1246         case AES_KEYSIZE_192:
1247                 ctx->key_enc[4] = get_unaligned_le32(in_key + 16);
1248                 t = ctx->key_enc[5] = get_unaligned_le32(in_key + 20);
1249                 for (i = 0; i < 8; ++i)
1250                         loop6(i);
1251                 break;
1252
1253         case AES_KEYSIZE_256:
1254                 ctx->key_enc[4] = get_unaligned_le32(in_key + 16);
1255                 ctx->key_enc[5] = get_unaligned_le32(in_key + 20);
1256                 ctx->key_enc[6] = get_unaligned_le32(in_key + 24);
1257                 t = ctx->key_enc[7] = get_unaligned_le32(in_key + 28);
1258                 for (i = 0; i < 6; ++i)
1259                         loop8(i);
1260                 loop8tophalf(i);
1261                 break;
1262         }
1263
1264         ctx->key_dec[0] = ctx->key_enc[key_len + 24];
1265         ctx->key_dec[1] = ctx->key_enc[key_len + 25];
1266         ctx->key_dec[2] = ctx->key_enc[key_len + 26];
1267         ctx->key_dec[3] = ctx->key_enc[key_len + 27];
1268
1269         for (i = 4; i < key_len + 24; ++i) {
1270                 j = key_len + 24 - (i & ~3) + (i & 3);
1271                 imix_col(ctx->key_dec[j], ctx->key_enc[i]);
1272         }
1273         return 0;
1274 }
1275 EXPORT_SYMBOL_GPL(crypto_aes_expand_key);
1276
1277 /**
1278  * crypto_aes_set_key - Set the AES key.
1279  * @tfm:        The %crypto_tfm that is used in the context.
1280  * @in_key:     The input key.
1281  * @key_len:    The size of the key.
1282  *
1283  * Returns 0 on success, on failure the %CRYPTO_TFM_RES_BAD_KEY_LEN flag in tfm
1284  * is set. The function uses crypto_aes_expand_key() to expand the key.
1285  * &crypto_aes_ctx _must_ be the private data embedded in @tfm which is
1286  * retrieved with crypto_tfm_ctx().
1287  */
1288 int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
1289                 unsigned int key_len)
1290 {
1291         struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1292         u32 *flags = &tfm->crt_flags;
1293         int ret;
1294
1295         ret = crypto_aes_expand_key(ctx, in_key, key_len);
1296         if (!ret)
1297                 return 0;
1298
1299         *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1300         return -EINVAL;
1301 }
1302 EXPORT_SYMBOL_GPL(crypto_aes_set_key);
1303
1304 /* encrypt a block of text */
1305
1306 #define f_rn(bo, bi, n, k)      do {                            \
1307         bo[n] = crypto_ft_tab[0][byte(bi[n], 0)] ^                      \
1308                 crypto_ft_tab[1][byte(bi[(n + 1) & 3], 1)] ^            \
1309                 crypto_ft_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1310                 crypto_ft_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n);  \
1311 } while (0)
1312
1313 #define f_nround(bo, bi, k)     do {\
1314         f_rn(bo, bi, 0, k);     \
1315         f_rn(bo, bi, 1, k);     \
1316         f_rn(bo, bi, 2, k);     \
1317         f_rn(bo, bi, 3, k);     \
1318         k += 4;                 \
1319 } while (0)
1320
1321 #define f_rl(bo, bi, n, k)      do {                            \
1322         bo[n] = crypto_fl_tab[0][byte(bi[n], 0)] ^                      \
1323                 crypto_fl_tab[1][byte(bi[(n + 1) & 3], 1)] ^            \
1324                 crypto_fl_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1325                 crypto_fl_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n);  \
1326 } while (0)
1327
1328 #define f_lround(bo, bi, k)     do {\
1329         f_rl(bo, bi, 0, k);     \
1330         f_rl(bo, bi, 1, k);     \
1331         f_rl(bo, bi, 2, k);     \
1332         f_rl(bo, bi, 3, k);     \
1333 } while (0)
1334
1335 static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1336 {
1337         const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1338         u32 b0[4], b1[4];
1339         const u32 *kp = ctx->key_enc + 4;
1340         const int key_len = ctx->key_length;
1341
1342         b0[0] = ctx->key_enc[0] ^ get_unaligned_le32(in);
1343         b0[1] = ctx->key_enc[1] ^ get_unaligned_le32(in + 4);
1344         b0[2] = ctx->key_enc[2] ^ get_unaligned_le32(in + 8);
1345         b0[3] = ctx->key_enc[3] ^ get_unaligned_le32(in + 12);
1346
1347         if (key_len > 24) {
1348                 f_nround(b1, b0, kp);
1349                 f_nround(b0, b1, kp);
1350         }
1351
1352         if (key_len > 16) {
1353                 f_nround(b1, b0, kp);
1354                 f_nround(b0, b1, kp);
1355         }
1356
1357         f_nround(b1, b0, kp);
1358         f_nround(b0, b1, kp);
1359         f_nround(b1, b0, kp);
1360         f_nround(b0, b1, kp);
1361         f_nround(b1, b0, kp);
1362         f_nround(b0, b1, kp);
1363         f_nround(b1, b0, kp);
1364         f_nround(b0, b1, kp);
1365         f_nround(b1, b0, kp);
1366         f_lround(b0, b1, kp);
1367
1368         put_unaligned_le32(b0[0], out);
1369         put_unaligned_le32(b0[1], out + 4);
1370         put_unaligned_le32(b0[2], out + 8);
1371         put_unaligned_le32(b0[3], out + 12);
1372 }
1373
1374 /* decrypt a block of text */
1375
1376 #define i_rn(bo, bi, n, k)      do {                            \
1377         bo[n] = crypto_it_tab[0][byte(bi[n], 0)] ^                      \
1378                 crypto_it_tab[1][byte(bi[(n + 3) & 3], 1)] ^            \
1379                 crypto_it_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1380                 crypto_it_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n);  \
1381 } while (0)
1382
1383 #define i_nround(bo, bi, k)     do {\
1384         i_rn(bo, bi, 0, k);     \
1385         i_rn(bo, bi, 1, k);     \
1386         i_rn(bo, bi, 2, k);     \
1387         i_rn(bo, bi, 3, k);     \
1388         k += 4;                 \
1389 } while (0)
1390
1391 #define i_rl(bo, bi, n, k)      do {                    \
1392         bo[n] = crypto_il_tab[0][byte(bi[n], 0)] ^              \
1393         crypto_il_tab[1][byte(bi[(n + 3) & 3], 1)] ^            \
1394         crypto_il_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1395         crypto_il_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n);  \
1396 } while (0)
1397
1398 #define i_lround(bo, bi, k)     do {\
1399         i_rl(bo, bi, 0, k);     \
1400         i_rl(bo, bi, 1, k);     \
1401         i_rl(bo, bi, 2, k);     \
1402         i_rl(bo, bi, 3, k);     \
1403 } while (0)
1404
1405 static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1406 {
1407         const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1408         u32 b0[4], b1[4];
1409         const int key_len = ctx->key_length;
1410         const u32 *kp = ctx->key_dec + 4;
1411
1412         b0[0] = ctx->key_dec[0] ^ get_unaligned_le32(in);
1413         b0[1] = ctx->key_dec[1] ^ get_unaligned_le32(in + 4);
1414         b0[2] = ctx->key_dec[2] ^ get_unaligned_le32(in + 8);
1415         b0[3] = ctx->key_dec[3] ^ get_unaligned_le32(in + 12);
1416
1417         if (key_len > 24) {
1418                 i_nround(b1, b0, kp);
1419                 i_nround(b0, b1, kp);
1420         }
1421
1422         if (key_len > 16) {
1423                 i_nround(b1, b0, kp);
1424                 i_nround(b0, b1, kp);
1425         }
1426
1427         i_nround(b1, b0, kp);
1428         i_nround(b0, b1, kp);
1429         i_nround(b1, b0, kp);
1430         i_nround(b0, b1, kp);
1431         i_nround(b1, b0, kp);
1432         i_nround(b0, b1, kp);
1433         i_nround(b1, b0, kp);
1434         i_nround(b0, b1, kp);
1435         i_nround(b1, b0, kp);
1436         i_lround(b0, b1, kp);
1437
1438         put_unaligned_le32(b0[0], out);
1439         put_unaligned_le32(b0[1], out + 4);
1440         put_unaligned_le32(b0[2], out + 8);
1441         put_unaligned_le32(b0[3], out + 12);
1442 }
1443
1444 static struct crypto_alg aes_alg = {
1445         .cra_name               =       "aes",
1446         .cra_driver_name        =       "aes-generic",
1447         .cra_priority           =       100,
1448         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
1449         .cra_blocksize          =       AES_BLOCK_SIZE,
1450         .cra_ctxsize            =       sizeof(struct crypto_aes_ctx),
1451         .cra_module             =       THIS_MODULE,
1452         .cra_u                  =       {
1453                 .cipher = {
1454                         .cia_min_keysize        =       AES_MIN_KEY_SIZE,
1455                         .cia_max_keysize        =       AES_MAX_KEY_SIZE,
1456                         .cia_setkey             =       crypto_aes_set_key,
1457                         .cia_encrypt            =       aes_encrypt,
1458                         .cia_decrypt            =       aes_decrypt
1459                 }
1460         }
1461 };
1462
1463 static int __init aes_init(void)
1464 {
1465         return crypto_register_alg(&aes_alg);
1466 }
1467
1468 static void __exit aes_fini(void)
1469 {
1470         crypto_unregister_alg(&aes_alg);
1471 }
1472
1473 module_init(aes_init);
1474 module_exit(aes_fini);
1475
1476 MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
1477 MODULE_LICENSE("Dual BSD/GPL");
1478 MODULE_ALIAS_CRYPTO("aes");
1479 MODULE_ALIAS_CRYPTO("aes-generic");