Root/crypto/aes_generic.c

1/*
2 * Cryptographic API.
3 *
4 * AES Cipher Algorithm.
5 *
6 * Based on Brian Gladman's code.
7 *
8 * Linux developers:
9 * Alexander Kjeldaas <astor@fast.no>
10 * Herbert Valerio Riedel <hvr@hvrlab.org>
11 * Kyle McMartin <kyle@debian.org>
12 * Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API).
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * ---------------------------------------------------------------------------
20 * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
21 * All rights reserved.
22 *
23 * LICENSE TERMS
24 *
25 * The free distribution and use of this software in both source and binary
26 * form is allowed (with or without changes) provided that:
27 *
28 * 1. distributions of this source code include the above copyright
29 * notice, this list of conditions and the following disclaimer;
30 *
31 * 2. distributions in binary form include the above copyright
32 * notice, this list of conditions and the following disclaimer
33 * in the documentation and/or other associated materials;
34 *
35 * 3. the copyright holder's name is not used to endorse products
36 * built using this software without specific written permission.
37 *
38 * ALTERNATIVELY, provided that this notice is retained in full, this product
39 * may be distributed under the terms of the GNU General Public License (GPL),
40 * in which case the provisions of the GPL apply INSTEAD OF those given above.
41 *
42 * DISCLAIMER
43 *
44 * This software is provided 'as is' with no explicit or implied warranties
45 * in respect of its properties, including, but not limited to, correctness
46 * and/or fitness for purpose.
47 * ---------------------------------------------------------------------------
48 */
49
50#include <crypto/aes.h>
51#include <linux/module.h>
52#include <linux/init.h>
53#include <linux/types.h>
54#include <linux/errno.h>
55#include <linux/crypto.h>
56#include <asm/byteorder.h>
57
58static inline u8 byte(const u32 x, const unsigned n)
59{
60    return x >> (n << 3);
61}
62
63static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
64
65const 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
329const 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
593const 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
857const 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
1121EXPORT_SYMBOL_GPL(crypto_ft_tab);
1122EXPORT_SYMBOL_GPL(crypto_fl_tab);
1123EXPORT_SYMBOL_GPL(crypto_it_tab);
1124EXPORT_SYMBOL_GPL(crypto_il_tab);
1125
1126/* initialise the key schedule from the user supplied key */
1127
1128#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b)
1129
1130#define imix_col(y, x) do { \
1131    u = star_x(x); \
1132    v = star_x(u); \
1133    w = star_x(v); \
1134    t = w ^ (x); \
1135    (y) = u ^ v ^ w; \
1136    (y) ^= ror32(u ^ t, 8) ^ \
1137        ror32(v ^ t, 16) ^ \
1138        ror32(t, 24); \
1139} while (0)
1140
1141#define ls_box(x) \
1142    crypto_fl_tab[0][byte(x, 0)] ^ \
1143    crypto_fl_tab[1][byte(x, 1)] ^ \
1144    crypto_fl_tab[2][byte(x, 2)] ^ \
1145    crypto_fl_tab[3][byte(x, 3)]
1146
1147#define loop4(i) do { \
1148    t = ror32(t, 8); \
1149    t = ls_box(t) ^ rco_tab[i]; \
1150    t ^= ctx->key_enc[4 * i]; \
1151    ctx->key_enc[4 * i + 4] = t; \
1152    t ^= ctx->key_enc[4 * i + 1]; \
1153    ctx->key_enc[4 * i + 5] = t; \
1154    t ^= ctx->key_enc[4 * i + 2]; \
1155    ctx->key_enc[4 * i + 6] = t; \
1156    t ^= ctx->key_enc[4 * i + 3]; \
1157    ctx->key_enc[4 * i + 7] = t; \
1158} while (0)
1159
1160#define loop6(i) do { \
1161    t = ror32(t, 8); \
1162    t = ls_box(t) ^ rco_tab[i]; \
1163    t ^= ctx->key_enc[6 * i]; \
1164    ctx->key_enc[6 * i + 6] = t; \
1165    t ^= ctx->key_enc[6 * i + 1]; \
1166    ctx->key_enc[6 * i + 7] = t; \
1167    t ^= ctx->key_enc[6 * i + 2]; \
1168    ctx->key_enc[6 * i + 8] = t; \
1169    t ^= ctx->key_enc[6 * i + 3]; \
1170    ctx->key_enc[6 * i + 9] = t; \
1171    t ^= ctx->key_enc[6 * i + 4]; \
1172    ctx->key_enc[6 * i + 10] = t; \
1173    t ^= ctx->key_enc[6 * i + 5]; \
1174    ctx->key_enc[6 * i + 11] = t; \
1175} while (0)
1176
1177#define loop8tophalf(i) do { \
1178    t = ror32(t, 8); \
1179    t = ls_box(t) ^ rco_tab[i]; \
1180    t ^= ctx->key_enc[8 * i]; \
1181    ctx->key_enc[8 * i + 8] = t; \
1182    t ^= ctx->key_enc[8 * i + 1]; \
1183    ctx->key_enc[8 * i + 9] = t; \
1184    t ^= ctx->key_enc[8 * i + 2]; \
1185    ctx->key_enc[8 * i + 10] = t; \
1186    t ^= ctx->key_enc[8 * i + 3]; \
1187    ctx->key_enc[8 * i + 11] = t; \
1188} while (0)
1189
1190#define loop8(i) do { \
1191    loop8tophalf(i); \
1192    t = ctx->key_enc[8 * i + 4] ^ ls_box(t); \
1193    ctx->key_enc[8 * i + 12] = t; \
1194    t ^= ctx->key_enc[8 * i + 5]; \
1195    ctx->key_enc[8 * i + 13] = t; \
1196    t ^= ctx->key_enc[8 * i + 6]; \
1197    ctx->key_enc[8 * i + 14] = t; \
1198    t ^= ctx->key_enc[8 * i + 7]; \
1199    ctx->key_enc[8 * i + 15] = t; \
1200} while (0)
1201
1202/**
1203 * crypto_aes_expand_key - Expands the AES key as described in FIPS-197
1204 * @ctx: The location where the computed key will be stored.
1205 * @in_key: The supplied key.
1206 * @key_len: The length of the supplied key.
1207 *
1208 * Returns 0 on success. The function fails only if an invalid key size (or
1209 * pointer) is supplied.
1210 * The expanded key size is 240 bytes (max of 14 rounds with a unique 16 bytes
1211 * key schedule plus a 16 bytes key which is used before the first round).
1212 * The decryption key is prepared for the "Equivalent Inverse Cipher" as
1213 * described in FIPS-197. The first slot (16 bytes) of each key (enc or dec) is
1214 * for the initial combination, the second slot for the first round and so on.
1215 */
1216int 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}
1269EXPORT_SYMBOL_GPL(crypto_aes_expand_key);
1270
1271/**
1272 * crypto_aes_set_key - Set the AES key.
1273 * @tfm: The %crypto_tfm that is used in the context.
1274 * @in_key: The input key.
1275 * @key_len: The size of the key.
1276 *
1277 * Returns 0 on success, on failure the %CRYPTO_TFM_RES_BAD_KEY_LEN flag in tfm
1278 * is set. The function uses crypto_aes_expand_key() to expand the key.
1279 * &crypto_aes_ctx _must_ be the private data embedded in @tfm which is
1280 * retrieved with crypto_tfm_ctx().
1281 */
1282int 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}
1296EXPORT_SYMBOL_GPL(crypto_aes_set_key);
1297
1298/* encrypt a block of text */
1299
1300#define f_rn(bo, bi, n, k) do { \
1301    bo[n] = crypto_ft_tab[0][byte(bi[n], 0)] ^ \
1302        crypto_ft_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \
1303        crypto_ft_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \
1304        crypto_ft_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \
1305} while (0)
1306
1307#define f_nround(bo, bi, k) do {\
1308    f_rn(bo, bi, 0, k); \
1309    f_rn(bo, bi, 1, k); \
1310    f_rn(bo, bi, 2, k); \
1311    f_rn(bo, bi, 3, k); \
1312    k += 4; \
1313} while (0)
1314
1315#define f_rl(bo, bi, n, k) do { \
1316    bo[n] = crypto_fl_tab[0][byte(bi[n], 0)] ^ \
1317        crypto_fl_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \
1318        crypto_fl_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \
1319        crypto_fl_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \
1320} while (0)
1321
1322#define f_lround(bo, bi, k) do {\
1323    f_rl(bo, bi, 0, k); \
1324    f_rl(bo, bi, 1, k); \
1325    f_rl(bo, bi, 2, k); \
1326    f_rl(bo, bi, 3, k); \
1327} while (0)
1328
1329static 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
1401static 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
1442static 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_list = LIST_HEAD_INIT(aes_alg.cra_list),
1452    .cra_u = {
1453        .cipher = {
1454            .cia_min_keysize = AES_MIN_KEY_SIZE,
1455            .cia_max_keysize = AES_MAX_KEY_SIZE,
1456            .cia_setkey = crypto_aes_set_key,
1457            .cia_encrypt = aes_encrypt,
1458            .cia_decrypt = aes_decrypt
1459        }
1460    }
1461};
1462
1463static int __init aes_init(void)
1464{
1465    return crypto_register_alg(&aes_alg);
1466}
1467
1468static void __exit aes_fini(void)
1469{
1470    crypto_unregister_alg(&aes_alg);
1471}
1472
1473module_init(aes_init);
1474module_exit(aes_fini);
1475
1476MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
1477MODULE_LICENSE("Dual BSD/GPL");
1478MODULE_ALIAS("aes");
1479

Archive Download this file



interactive