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