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