improve dependency handling, fix some package makefile bugs
[openwrt.git] / target / linux / package / ieee80211-dscape / src / aes.c
1 /* Based on Rijndael implementation that has been placed in the public domain,
2  * although heavily modified.
3  *
4  * Modifications Copyright 2003, Instant802 Networks, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * Optimized both speed and size by removing not used key lengths (only
11  * 128-bit is used in IEEE 802.11i).
12  */
13
14 /* Use 256-byte Te4 table instead of larger 1024-byte */
15 #define SMALL_TE4
16
17 /* Save data size by using only one 1k table, but with a drawback of having to
18  * rotate entries at lookup. This can be useful, if the CPU supports free
19  * rotate on memory read. However, if this is not the case, this is much slower
20  * than four-table implementation. */
21 /* #define ONLY_ONE_TABLE */
22
23
24 /* --- start of code that is based on public domain AES implementation --- */
25
26 /**
27  * rijndael-alg-fst.c
28  *
29  * @version 3.0 (December 2000)
30  *
31  * Optimised ANSI C code for the Rijndael cipher (now AES)
32  *
33  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
34  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
35  * @author Paulo Barreto <paulo.barreto@terra.com.br>
36  *
37  * This code is hereby placed in the public domain.
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
40  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
41  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
43  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
44  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
45  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
46  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
47  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
48  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50  */
51
52 /*
53 Te0[x] = S [x].[02, 01, 01, 03];
54 Te1[x] = S [x].[03, 02, 01, 01];
55 Te2[x] = S [x].[01, 03, 02, 01];
56 Te3[x] = S [x].[01, 01, 03, 02];
57 Te4[x] = S [x].[01, 01, 01, 01];
58 */
59
60 static const u32 Te0[256] =
61 {
62         0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
63         0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
64         0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
65         0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
66         0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
67         0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
68         0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
69         0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
70         0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
71         0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
72         0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
73         0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
74         0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
75         0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
76         0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
77         0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
78         0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
79         0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
80         0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
81         0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
82         0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
83         0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
84         0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
85         0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
86         0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
87         0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
88         0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
89         0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
90         0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
91         0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
92         0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
93         0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
94         0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
95         0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
96         0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
97         0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
98         0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
99         0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
100         0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
101         0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
102         0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
103         0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
104         0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
105         0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
106         0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
107         0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
108         0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
109         0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
110         0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
111         0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
112         0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
113         0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
114         0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
115         0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
116         0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
117         0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
118         0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
119         0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
120         0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
121         0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
122         0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
123         0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
124         0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
125         0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
126 };
127
128 #ifndef ONLY_ONE_TABLE
129 static const u32 Te1[256] =
130 {
131         0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
132         0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
133         0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
134         0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
135         0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
136         0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
137         0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
138         0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
139         0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
140         0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
141         0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
142         0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
143         0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
144         0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
145         0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
146         0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
147         0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
148         0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
149         0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
150         0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
151         0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
152         0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
153         0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
154         0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
155         0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
156         0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
157         0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
158         0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
159         0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
160         0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
161         0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
162         0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
163         0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
164         0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
165         0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
166         0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
167         0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
168         0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
169         0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
170         0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
171         0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
172         0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
173         0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
174         0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
175         0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
176         0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
177         0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
178         0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
179         0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
180         0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
181         0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
182         0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
183         0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
184         0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
185         0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
186         0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
187         0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
188         0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
189         0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
190         0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
191         0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
192         0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
193         0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
194         0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
195 };
196
197 static const u32 Te2[256] =
198 {
199         0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
200         0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
201         0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
202         0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
203         0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
204         0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
205         0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
206         0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
207         0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
208         0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
209         0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
210         0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
211         0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
212         0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
213         0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
214         0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
215         0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
216         0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
217         0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
218         0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
219         0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
220         0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
221         0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
222         0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
223         0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
224         0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
225         0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
226         0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
227         0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
228         0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
229         0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
230         0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
231         0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
232         0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
233         0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
234         0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
235         0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
236         0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
237         0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
238         0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
239         0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
240         0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
241         0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
242         0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
243         0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
244         0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
245         0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
246         0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
247         0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
248         0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
249         0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
250         0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
251         0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
252         0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
253         0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
254         0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
255         0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
256         0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
257         0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
258         0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
259         0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
260         0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
261         0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
262         0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
263 };
264
265 static const u32 Te3[256] =
266 {
267         0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
268         0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
269         0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
270         0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
271         0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
272         0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
273         0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
274         0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
275         0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
276         0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
277         0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
278         0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
279         0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
280         0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
281         0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
282         0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
283         0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
284         0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
285         0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
286         0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
287         0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
288         0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
289         0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
290         0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
291         0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
292         0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
293         0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
294         0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
295         0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
296         0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
297         0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
298         0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
299         0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
300         0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
301         0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
302         0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
303         0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
304         0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
305         0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
306         0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
307         0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
308         0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
309         0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
310         0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
311         0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
312         0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
313         0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
314         0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
315         0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
316         0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
317         0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
318         0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
319         0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
320         0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
321         0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
322         0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
323         0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
324         0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
325         0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
326         0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
327         0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
328         0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
329         0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
330         0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
331 };
332
333 #define TE0(v) (Te0[(v) >> 24])
334 #define TE1(v) (Te1[((v) >> 16) & 0xff])
335 #define TE2(v) (Te2[((v) >> 8) & 0xff])
336 #define TE3(v) (Te3[(v) & 0xff])
337
338 #else /* ONLY_ONE_TABLE */
339
340
341 static inline u32 ROR8(u32 v)
342 {
343         return (v >> 8) | (v << 24);
344 }
345
346 static inline u32 ROR16(u32 v)
347 {
348         return (v >> 16) | (v << 16);
349 }
350
351 static inline u32 ROR24(u32 v)
352 {
353         return (v >> 24) | (v << 8);
354 }
355
356 #define TE0(v) (Te0[(v) >> 24])
357 #define TE1(v) (ROR8(Te0[((v) >> 16) & 0xff]))
358 #define TE2(v) (ROR16(Te0[((v) >> 8) & 0xff]))
359 #define TE3(v) (ROR24(Te0[(v) & 0xff]))
360
361 #endif /* ONLY_ONE_TABLE */
362
363
364
365 #ifdef SMALL_TE4
366 static const u8 Te4s[256] = {
367         0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
368         0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
369         0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
370         0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
371         0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
372         0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
373         0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
374         0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
375         0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
376         0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
377         0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
378         0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
379         0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
380         0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
381         0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
382         0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
383         0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
384         0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
385         0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
386         0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
387         0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
388         0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
389         0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
390         0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
391         0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
392         0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
393         0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
394         0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
395         0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
396         0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
397         0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
398         0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
399 };
400
401 #define TE4_1(v) (Te4s[(v) & 0xff] << 24)
402 #define TE4_2(v) (Te4s[(v) & 0xff] << 16)
403 #define TE4_3(v) (Te4s[(v) & 0xff] << 8)
404 #define TE4_4(v) (Te4s[(v) & 0xff])
405
406 #else /* SMALL_TE4 */
407
408 static const u32 Te4[256] =
409 {
410         0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
411         0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
412         0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
413         0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
414         0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
415         0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
416         0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
417         0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
418         0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
419         0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
420         0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
421         0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
422         0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
423         0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
424         0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
425         0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
426         0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
427         0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
428         0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
429         0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
430         0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
431         0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
432         0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
433         0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
434         0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
435         0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
436         0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
437         0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
438         0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
439         0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
440         0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
441         0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
442         0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
443         0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
444         0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
445         0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
446         0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
447         0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
448         0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
449         0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
450         0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
451         0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
452         0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
453         0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
454         0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
455         0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
456         0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
457         0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
458         0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
459         0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
460         0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
461         0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
462         0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
463         0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
464         0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
465         0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
466         0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
467         0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
468         0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
469         0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
470         0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
471         0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
472         0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
473         0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
474 };
475
476 #define TE4_1(v) (Te4[(v) & 0xff] & 0xff000000)
477 #define TE4_2(v) (Te4[(v) & 0xff] & 0x00ff0000)
478 #define TE4_3(v) (Te4[(v) & 0xff] & 0x0000ff00)
479 #define TE4_4(v) (Te4[(v) & 0xff] & 0x000000ff)
480
481 #endif /* SMALL_TE4 */
482
483
484 static const u32 rcon[] = {
485         0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
486         0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
487 };
488
489 #define GETU32(pt) \
490 (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ \
491 ((u32)(pt)[3]))
492 #define PUTU32(ct, st) \
493 { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
494 (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
495
496
497 /* Expand the cipher key into the encryption key schedule. */
498 void ieee80211_aes_key_setup_encrypt(u32 rk[/*44*/], const u8 key[])
499 {
500         int i;
501         u32 temp;
502
503         rk[0] = GETU32(key     );
504         rk[1] = GETU32(key +  4);
505         rk[2] = GETU32(key +  8);
506         rk[3] = GETU32(key + 12);
507
508         for (i = 0; i < 10; i++) {
509                 temp = rk[3];
510                 rk[4] = rk[0] ^ TE4_1(temp >> 16) ^ TE4_2(temp >>  8) ^
511                         TE4_3(temp) ^ TE4_4(temp >> 24) ^ rcon[i];
512                 rk[5] = rk[1] ^ rk[4];
513                 rk[6] = rk[2] ^ rk[5];
514                 rk[7] = rk[3] ^ rk[6];
515                 rk += 4;
516         }
517 }
518
519
520 void ieee80211_aes_encrypt(const u32 rk[/*44*/], const u8 pt[16], u8 ct[16])
521 {
522         const int Nr = 10;
523         u32 s0, s1, s2, s3, t0, t1, t2, t3;
524
525         /* Map byte array block to cipher state and add initial round key */
526         s0 = GETU32(pt     ) ^ rk[0];
527         s1 = GETU32(pt +  4) ^ rk[1];
528         s2 = GETU32(pt +  8) ^ rk[2];
529         s3 = GETU32(pt + 12) ^ rk[3];
530
531 #define ROUND(r,d,s,i) \
532 d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[i]; \
533 d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[i + 1]; \
534 d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[i + 2]; \
535 d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[i + 3]
536         ROUND(1,t,s,4);
537         ROUND(2,s,t,8);
538         ROUND(3,t,s,12);
539         ROUND(4,s,t,16);
540         ROUND(5,t,s,20);
541         ROUND(6,s,t,24);
542         ROUND(7,t,s,28);
543         ROUND(8,s,t,32);
544         ROUND(9,t,s,36);
545 #undef ROUND
546
547         rk += Nr << 2;
548
549         /* Apply the last round and map cipher state to byte array block */
550         s0 = TE4_1(t0 >> 24) ^ TE4_2(t1 >> 16) ^ TE4_3(t2 >> 8) ^ TE4_4(t3) ^
551                 rk[0];
552         PUTU32(ct, s0);
553         s0 = TE4_1(t1 >> 24) ^ TE4_2(t2 >> 16) ^ TE4_3(t3 >> 8) ^ TE4_4(t0) ^
554                 rk[1];
555         PUTU32(ct + 4, s0);
556         s0 = TE4_1(t2 >> 24) ^ TE4_2(t3 >> 16) ^ TE4_3(t0 >> 8) ^ TE4_4(t1) ^
557                 rk[2];
558         PUTU32(ct + 8, s0);
559         s0 = TE4_1(t3 >> 24) ^ TE4_2(t0 >> 16) ^ TE4_3(t1 >> 8) ^ TE4_4(t2) ^
560                 rk[3];
561         PUTU32(ct + 12, s0);
562 }
563
564 /* --- end of code that is based on public domain AES implementation --- */