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