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