xref: /linux/crypto/aes_generic.c (revision 0a87a2db485a1456b7427914969c0e8195a1bbda)
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