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