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