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