1 /*	$OpenBSD: rijndael.c,v 1.19 2008/06/09 07:49:45 djm Exp $ */
2 
3 /**
4  * rijndael-alg-fst.c
5  *
6  * @version 3.0 (December 2000)
7  *
8  * Optimised ANSI C code for the Rijndael cipher (now AES)
9  *
10  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
11  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
12  * @author Paulo Barreto <paulo.barreto@terra.com.br>
13  *
14  * This code is hereby placed in the public domain.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
17  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /* #include <sys/param.h> */
30 /* #include <sys/systm.h> */
31 
32 #include "rijndael.h"
33 
34 #undef FULL_UNROLL
35 
36 /*
37 Te0[x] = S [x].[02, 01, 01, 03];
38 Te1[x] = S [x].[03, 02, 01, 01];
39 Te2[x] = S [x].[01, 03, 02, 01];
40 Te3[x] = S [x].[01, 01, 03, 02];
41 Te4[x] = S [x].[01, 01, 01, 01];
42 
43 Td0[x] = Si[x].[0e, 09, 0d, 0b];
44 Td1[x] = Si[x].[0b, 0e, 09, 0d];
45 Td2[x] = Si[x].[0d, 0b, 0e, 09];
46 Td3[x] = Si[x].[09, 0d, 0b, 0e];
47 Td4[x] = Si[x].[01, 01, 01, 01];
48 */
49 
50 static const aes_u32 Te0[256] = {
51     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
52     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
53     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
54     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
55     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
56     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
57     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
58     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
59     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
60     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
61     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
62     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
63     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
64     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
65     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
66     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
67     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
68     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
69     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
70     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
71     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
72     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
73     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
74     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
75     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
76     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
77     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
78     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
79     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
80     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
81     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
82     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
83     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
84     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
85     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
86     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
87     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
88     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
89     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
90     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
91     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
92     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
93     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
94     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
95     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
96     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
97     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
98     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
99     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
100     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
101     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
102     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
103     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
104     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
105     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
106     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
107     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
108     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
109     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
110     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
111     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
112     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
113     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
114     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
115 };
116 static const aes_u32 Te1[256] = {
117     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
118     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
119     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
120     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
121     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
122     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
123     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
124     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
125     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
126     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
127     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
128     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
129     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
130     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
131     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
132     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
133     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
134     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
135     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
136     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
137     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
138     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
139     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
140     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
141     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
142     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
143     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
144     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
145     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
146     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
147     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
148     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
149     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
150     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
151     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
152     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
153     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
154     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
155     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
156     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
157     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
158     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
159     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
160     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
161     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
162     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
163     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
164     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
165     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
166     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
167     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
168     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
169     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
170     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
171     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
172     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
173     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
174     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
175     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
176     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
177     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
178     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
179     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
180     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
181 };
182 static const aes_u32 Te2[256] = {
183     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
184     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
185     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
186     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
187     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
188     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
189     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
190     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
191     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
192     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
193     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
194     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
195     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
196     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
197     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
198     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
199     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
200     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
201     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
202     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
203     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
204     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
205     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
206     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
207     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
208     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
209     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
210     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
211     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
212     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
213     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
214     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
215     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
216     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
217     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
218     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
219     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
220     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
221     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
222     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
223     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
224     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
225     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
226     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
227     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
228     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
229     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
230     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
231     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
232     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
233     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
234     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
235     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
236     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
237     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
238     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
239     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
240     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
241     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
242     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
243     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
244     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
245     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
246     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
247 };
248 static const aes_u32 Te3[256] = {
249     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
250     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
251     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
252     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
253     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
254     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
255     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
256     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
257     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
258     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
259     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
260     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
261     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
262     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
263     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
264     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
265     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
266     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
267     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
268     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
269     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
270     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
271     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
272     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
273     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
274     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
275     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
276     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
277     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
278     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
279     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
280     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
281     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
282     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
283     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
284     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
285     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
286     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
287     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
288     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
289     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
290     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
291     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
292     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
293     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
294     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
295     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
296     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
297     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
298     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
299     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
300     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
301     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
302     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
303     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
304     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
305     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
306     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
307     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
308     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
309     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
310     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
311     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
312     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
313 };
314 static const aes_u32 Te4[256] = {
315     0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
316     0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
317     0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
318     0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
319     0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
320     0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
321     0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
322     0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
323     0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
324     0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
325     0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
326     0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
327     0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
328     0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
329     0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
330     0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
331     0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
332     0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
333     0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
334     0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
335     0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
336     0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
337     0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
338     0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
339     0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
340     0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
341     0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
342     0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
343     0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
344     0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
345     0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
346     0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
347     0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
348     0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
349     0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
350     0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
351     0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
352     0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
353     0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
354     0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
355     0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
356     0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
357     0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
358     0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
359     0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
360     0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
361     0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
362     0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
363     0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
364     0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
365     0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
366     0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
367     0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
368     0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
369     0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
370     0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
371     0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
372     0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
373     0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
374     0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
375     0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
376     0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
377     0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
378     0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
379 };
380 
381 #ifdef WITH_AES_DECRYPT
382 
383 static const aes_u32 Td0[256] = {
384     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
385     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
386     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
387     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
388     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
389     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
390     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
391     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
392     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
393     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
394     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
395     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
396     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
397     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
398     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
399     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
400     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
401     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
402     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
403     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
404     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
405     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
406     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
407     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
408     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
409     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
410     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
411     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
412     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
413     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
414     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
415     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
416     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
417     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
418     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
419     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
420     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
421     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
422     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
423     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
424     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
425     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
426     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
427     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
428     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
429     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
430     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
431     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
432     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
433     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
434     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
435     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
436     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
437     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
438     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
439     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
440     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
441     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
442     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
443     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
444     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
445     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
446     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
447     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
448 };
449 static const aes_u32 Td1[256] = {
450     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
451     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
452     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
453     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
454     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
455     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
456     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
457     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
458     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
459     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
460     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
461     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
462     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
463     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
464     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
465     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
466     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
467     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
468     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
469     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
470     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
471     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
472     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
473     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
474     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
475     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
476     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
477     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
478     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
479     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
480     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
481     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
482     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
483     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
484     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
485     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
486     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
487     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
488     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
489     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
490     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
491     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
492     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
493     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
494     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
495     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
496     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
497     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
498     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
499     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
500     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
501     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
502     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
503     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
504     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
505     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
506     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
507     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
508     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
509     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
510     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
511     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
512     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
513     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
514 };
515 static const aes_u32 Td2[256] = {
516     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
517     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
518     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
519     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
520     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
521     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
522     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
523     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
524     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
525     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
526     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
527     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
528     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
529     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
530     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
531     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
532     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
533     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
534     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
535     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
536     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
537     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
538     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
539     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
540     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
541     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
542     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
543     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
544     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
545     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
546     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
547     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
548     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
549     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
550     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
551     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
552     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
553     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
554     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
555     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
556     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
557     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
558     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
559     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
560     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
561     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
562     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
563     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
564     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
565     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
566     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
567     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
568     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
569     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
570     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
571     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
572     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
573     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
574     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
575     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
576     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
577     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
578     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
579     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
580 };
581 static const aes_u32 Td3[256] = {
582     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
583     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
584     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
585     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
586     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
587     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
588     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
589     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
590     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
591     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
592     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
593     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
594     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
595     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
596     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
597     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
598     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
599     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
600     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
601     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
602     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
603     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
604     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
605     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
606     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
607     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
608     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
609     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
610     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
611     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
612     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
613     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
614     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
615     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
616     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
617     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
618     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
619     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
620     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
621     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
622     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
623     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
624     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
625     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
626     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
627     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
628     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
629     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
630     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
631     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
632     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
633     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
634     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
635     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
636     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
637     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
638     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
639     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
640     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
641     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
642     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
643     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
644     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
645     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
646 };
647 static const aes_u32 Td4[256] = {
648     0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
649     0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
650     0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
651     0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
652     0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
653     0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
654     0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
655     0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
656     0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
657     0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
658     0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
659     0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
660     0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
661     0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
662     0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
663     0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
664     0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
665     0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
666     0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
667     0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
668     0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
669     0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
670     0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
671     0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
672     0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
673     0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
674     0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
675     0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
676     0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
677     0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
678     0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
679     0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
680     0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
681     0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
682     0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
683     0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
684     0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
685     0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
686     0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
687     0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
688     0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
689     0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
690     0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
691     0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
692     0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
693     0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
694     0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
695     0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
696     0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
697     0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
698     0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
699     0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
700     0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
701     0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
702     0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
703     0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
704     0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
705     0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
706     0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
707     0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
708     0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
709     0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
710     0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
711     0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
712 };
713 
714 #endif /* WITH_AES_DECRYPT */
715 
716 static const aes_u32 rcon[] = {
717 	0x01000000, 0x02000000, 0x04000000, 0x08000000,
718 	0x10000000, 0x20000000, 0x40000000, 0x80000000,
719 	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
720 };
721 
722 #define GETU32(pt) (((aes_u32)(pt)[0] << 24) ^ ((aes_u32)(pt)[1] << 16) ^ ((aes_u32)(pt)[2] <<  8) ^ ((aes_u32)(pt)[3]))
723 #define PUTU32(ct, st) { (ct)[0] = (aes_u8)((st) >> 24); (ct)[1] = (aes_u8)((st) >> 16); (ct)[2] = (aes_u8)((st) >>  8); (ct)[3] = (aes_u8)(st); }
724 
725 /**
726  * Expand the cipher key into the encryption key schedule.
727  *
728  * @return	the number of rounds for the given cipher key size.
729  */
730 int
rijndaelKeySetupEnc(aes_u32 rk[],const aes_u8 cipherKey[],int keyBits)731 rijndaelKeySetupEnc(aes_u32 rk[/*4*(Nr + 1)*/], const aes_u8 cipherKey[], int keyBits)
732 {
733    	int i = 0;
734 	aes_u32 temp;
735 
736 	rk[0] = GETU32(cipherKey     );
737 	rk[1] = GETU32(cipherKey +  4);
738 	rk[2] = GETU32(cipherKey +  8);
739 	rk[3] = GETU32(cipherKey + 12);
740 	if (keyBits == 128) {
741 		for (;;) {
742 			temp  = rk[3];
743 			rk[4] = rk[0] ^
744 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
745 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
746 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
747 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
748 				rcon[i];
749 			rk[5] = rk[1] ^ rk[4];
750 			rk[6] = rk[2] ^ rk[5];
751 			rk[7] = rk[3] ^ rk[6];
752 			if (++i == 10) {
753 				return 10;
754 			}
755 			rk += 4;
756 		}
757 	}
758 	rk[4] = GETU32(cipherKey + 16);
759 	rk[5] = GETU32(cipherKey + 20);
760 	if (keyBits == 192) {
761 		for (;;) {
762 			temp = rk[ 5];
763 			rk[ 6] = rk[ 0] ^
764 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
765 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
766 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
767 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
768 				rcon[i];
769 			rk[ 7] = rk[ 1] ^ rk[ 6];
770 			rk[ 8] = rk[ 2] ^ rk[ 7];
771 			rk[ 9] = rk[ 3] ^ rk[ 8];
772 			if (++i == 8) {
773 				return 12;
774 			}
775 			rk[10] = rk[ 4] ^ rk[ 9];
776 			rk[11] = rk[ 5] ^ rk[10];
777 			rk += 6;
778 		}
779 	}
780 	rk[6] = GETU32(cipherKey + 24);
781 	rk[7] = GETU32(cipherKey + 28);
782 	if (keyBits == 256) {
783 		for (;;) {
784 			temp = rk[ 7];
785 			rk[ 8] = rk[ 0] ^
786 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
787 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
788 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
789 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
790 				rcon[i];
791 			rk[ 9] = rk[ 1] ^ rk[ 8];
792 			rk[10] = rk[ 2] ^ rk[ 9];
793 			rk[11] = rk[ 3] ^ rk[10];
794 			if (++i == 7) {
795 				return 14;
796 			}
797 			temp = rk[11];
798 			rk[12] = rk[ 4] ^
799 				(Te4[(temp >> 24)       ] & 0xff000000) ^
800 				(Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
801 				(Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
802 				(Te4[(temp      ) & 0xff] & 0x000000ff);
803 			rk[13] = rk[ 5] ^ rk[12];
804 			rk[14] = rk[ 6] ^ rk[13];
805 		     	rk[15] = rk[ 7] ^ rk[14];
806 			rk += 8;
807 		}
808 	}
809 	return 0;
810 }
811 
812 #ifdef WITH_AES_DECRYPT
813 /**
814  * Expand the cipher key into the decryption key schedule.
815  *
816  * @return	the number of rounds for the given cipher key size.
817  */
818 int
rijndaelKeySetupDec(aes_u32 rk[],const aes_u8 cipherKey[],int keyBits)819 rijndaelKeySetupDec(aes_u32 rk[/*4*(Nr + 1)*/], const aes_u8 cipherKey[], int keyBits)
820 {
821 	int Nr, i, j;
822 	aes_u32 temp;
823 
824 	/* expand the cipher key: */
825 	Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
826 
827 	/* invert the order of the round keys: */
828 	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
829 		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
830 		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
831 		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
832 		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
833 	}
834 	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
835 	for (i = 1; i < Nr; i++) {
836 		rk += 4;
837 		rk[0] =
838 			Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
839 			Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
840 			Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
841 			Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
842 		rk[1] =
843 			Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
844 			Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
845 			Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
846 			Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
847 		rk[2] =
848 			Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
849 			Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
850 			Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
851 			Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
852 		rk[3] =
853 			Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
854 			Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
855 			Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
856 			Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
857 	}
858 	return Nr;
859 }
860 #endif
861 
862 void
rijndaelEncrypt(const aes_u32 rk[],int Nr,const aes_u8 pt[16],aes_u8 ct[16])863 rijndaelEncrypt(const aes_u32 rk[/*4*(Nr + 1)*/], int Nr, const aes_u8 pt[16],
864     aes_u8 ct[16])
865 {
866 	aes_u32 s0, s1, s2, s3, t0, t1, t2, t3;
867 #ifndef FULL_UNROLL
868     int r;
869 #endif /* ?FULL_UNROLL */
870 
871     /*
872 	 * map byte array block to cipher state
873 	 * and add initial round key:
874 	 */
875 	s0 = GETU32(pt     ) ^ rk[0];
876 	s1 = GETU32(pt +  4) ^ rk[1];
877 	s2 = GETU32(pt +  8) ^ rk[2];
878 	s3 = GETU32(pt + 12) ^ rk[3];
879 #ifdef FULL_UNROLL
880     /* round 1: */
881    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
882    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
883    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
884    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
885    	/* round 2: */
886    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
887    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
888    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
889    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
890     /* round 3: */
891    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
892    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
893    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
894    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
895    	/* round 4: */
896    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
897    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
898    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
899    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
900     /* round 5: */
901    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
902    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
903    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
904    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
905    	/* round 6: */
906    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
907    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
908    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
909    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
910     /* round 7: */
911    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
912    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
913    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
914    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
915    	/* round 8: */
916    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
917    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
918    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
919    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
920     /* round 9: */
921    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
922    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
923    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
924    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
925     if (Nr > 10) {
926 	/* round 10: */
927 	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
928 	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
929 	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
930 	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
931 	/* round 11: */
932 	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
933 	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
934 	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
935 	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
936 	if (Nr > 12) {
937 	    /* round 12: */
938 	    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
939 	    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
940 	    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
941 	    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
942 	    /* round 13: */
943 	    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
944 	    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
945 	    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
946 	    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
947 	}
948     }
949     rk += Nr << 2;
950 #else  /* !FULL_UNROLL */
951     /*
952 	 * Nr - 1 full rounds:
953 	 */
954     r = Nr >> 1;
955     for (;;) {
956 	t0 =
957 	    Te0[(s0 >> 24)       ] ^
958 	    Te1[(s1 >> 16) & 0xff] ^
959 	    Te2[(s2 >>  8) & 0xff] ^
960 	    Te3[(s3      ) & 0xff] ^
961 	    rk[4];
962 	t1 =
963 	    Te0[(s1 >> 24)       ] ^
964 	    Te1[(s2 >> 16) & 0xff] ^
965 	    Te2[(s3 >>  8) & 0xff] ^
966 	    Te3[(s0      ) & 0xff] ^
967 	    rk[5];
968 	t2 =
969 	    Te0[(s2 >> 24)       ] ^
970 	    Te1[(s3 >> 16) & 0xff] ^
971 	    Te2[(s0 >>  8) & 0xff] ^
972 	    Te3[(s1      ) & 0xff] ^
973 	    rk[6];
974 	t3 =
975 	    Te0[(s3 >> 24)       ] ^
976 	    Te1[(s0 >> 16) & 0xff] ^
977 	    Te2[(s1 >>  8) & 0xff] ^
978 	    Te3[(s2      ) & 0xff] ^
979 	    rk[7];
980 
981 	rk += 8;
982 	if (--r == 0) {
983 	    break;
984 	}
985 
986 	s0 =
987 	    Te0[(t0 >> 24)       ] ^
988 	    Te1[(t1 >> 16) & 0xff] ^
989 	    Te2[(t2 >>  8) & 0xff] ^
990 	    Te3[(t3      ) & 0xff] ^
991 	    rk[0];
992 	s1 =
993 	    Te0[(t1 >> 24)       ] ^
994 	    Te1[(t2 >> 16) & 0xff] ^
995 	    Te2[(t3 >>  8) & 0xff] ^
996 	    Te3[(t0      ) & 0xff] ^
997 	    rk[1];
998 	s2 =
999 	    Te0[(t2 >> 24)       ] ^
1000 	    Te1[(t3 >> 16) & 0xff] ^
1001 	    Te2[(t0 >>  8) & 0xff] ^
1002 	    Te3[(t1      ) & 0xff] ^
1003 	    rk[2];
1004 	s3 =
1005 	    Te0[(t3 >> 24)       ] ^
1006 	    Te1[(t0 >> 16) & 0xff] ^
1007 	    Te2[(t1 >>  8) & 0xff] ^
1008 	    Te3[(t2      ) & 0xff] ^
1009 	    rk[3];
1010     }
1011 #endif /* ?FULL_UNROLL */
1012     /*
1013 	 * apply last round and
1014 	 * map cipher state to byte array block:
1015 	 */
1016 	s0 =
1017 		(Te4[(t0 >> 24)       ] & 0xff000000) ^
1018 		(Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1019 		(Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1020 		(Te4[(t3      ) & 0xff] & 0x000000ff) ^
1021 		rk[0];
1022 	PUTU32(ct     , s0);
1023 	s1 =
1024 		(Te4[(t1 >> 24)       ] & 0xff000000) ^
1025 		(Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1026 		(Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1027 		(Te4[(t0      ) & 0xff] & 0x000000ff) ^
1028 		rk[1];
1029 	PUTU32(ct +  4, s1);
1030 	s2 =
1031 		(Te4[(t2 >> 24)       ] & 0xff000000) ^
1032 		(Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1033 		(Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1034 		(Te4[(t1      ) & 0xff] & 0x000000ff) ^
1035 		rk[2];
1036 	PUTU32(ct +  8, s2);
1037 	s3 =
1038 		(Te4[(t3 >> 24)       ] & 0xff000000) ^
1039 		(Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1040 		(Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1041 		(Te4[(t2      ) & 0xff] & 0x000000ff) ^
1042 		rk[3];
1043 	PUTU32(ct + 12, s3);
1044 }
1045 
1046 #ifdef WITH_AES_DECRYPT
1047 static void
rijndaelDecrypt(const aes_u32 rk[],int Nr,const aes_u8 ct[16],aes_u8 pt[16])1048 rijndaelDecrypt(const aes_u32 rk[/*4*(Nr + 1)*/], int Nr, const aes_u8 ct[16],
1049     aes_u8 pt[16])
1050 {
1051 	aes_u32 s0, s1, s2, s3, t0, t1, t2, t3;
1052 #ifndef FULL_UNROLL
1053     int r;
1054 #endif /* ?FULL_UNROLL */
1055 
1056     /*
1057 	 * map byte array block to cipher state
1058 	 * and add initial round key:
1059 	 */
1060     s0 = GETU32(ct     ) ^ rk[0];
1061     s1 = GETU32(ct +  4) ^ rk[1];
1062     s2 = GETU32(ct +  8) ^ rk[2];
1063     s3 = GETU32(ct + 12) ^ rk[3];
1064 #ifdef FULL_UNROLL
1065     /* round 1: */
1066     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
1067     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
1068     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
1069     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
1070     /* round 2: */
1071     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
1072     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
1073     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
1074     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
1075     /* round 3: */
1076     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
1077     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
1078     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
1079     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
1080     /* round 4: */
1081     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1082     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1083     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1084     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1085     /* round 5: */
1086     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1087     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1088     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1089     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1090     /* round 6: */
1091     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1092     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1093     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1094     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1095     /* round 7: */
1096     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1097     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1098     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1099     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1100     /* round 8: */
1101     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1102     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1103     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1104     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1105     /* round 9: */
1106     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1107     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1108     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1109     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1110     if (Nr > 10) {
1111 	/* round 10: */
1112 	s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1113 	s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1114 	s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1115 	s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1116 	/* round 11: */
1117 	t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1118 	t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1119 	t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1120 	t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1121 	if (Nr > 12) {
1122 	    /* round 12: */
1123 	    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1124 	    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1125 	    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1126 	    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1127 	    /* round 13: */
1128 	    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1129 	    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1130 	    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1131 	    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1132 	}
1133     }
1134 	rk += Nr << 2;
1135 #else  /* !FULL_UNROLL */
1136     /*
1137      * Nr - 1 full rounds:
1138      */
1139     r = Nr >> 1;
1140     for (;;) {
1141 	t0 =
1142 	    Td0[(s0 >> 24)       ] ^
1143 	    Td1[(s3 >> 16) & 0xff] ^
1144 	    Td2[(s2 >>  8) & 0xff] ^
1145 	    Td3[(s1      ) & 0xff] ^
1146 	    rk[4];
1147 	t1 =
1148 	    Td0[(s1 >> 24)       ] ^
1149 	    Td1[(s0 >> 16) & 0xff] ^
1150 	    Td2[(s3 >>  8) & 0xff] ^
1151 	    Td3[(s2      ) & 0xff] ^
1152 	    rk[5];
1153 	t2 =
1154 	    Td0[(s2 >> 24)       ] ^
1155 	    Td1[(s1 >> 16) & 0xff] ^
1156 	    Td2[(s0 >>  8) & 0xff] ^
1157 	    Td3[(s3      ) & 0xff] ^
1158 	    rk[6];
1159 	t3 =
1160 	    Td0[(s3 >> 24)       ] ^
1161 	    Td1[(s2 >> 16) & 0xff] ^
1162 	    Td2[(s1 >>  8) & 0xff] ^
1163 	    Td3[(s0      ) & 0xff] ^
1164 	    rk[7];
1165 
1166 	rk += 8;
1167 	if (--r == 0) {
1168 	    break;
1169 	}
1170 
1171 	s0 =
1172 	    Td0[(t0 >> 24)       ] ^
1173 	    Td1[(t3 >> 16) & 0xff] ^
1174 	    Td2[(t2 >>  8) & 0xff] ^
1175 	    Td3[(t1      ) & 0xff] ^
1176 	    rk[0];
1177 	s1 =
1178 	    Td0[(t1 >> 24)       ] ^
1179 	    Td1[(t0 >> 16) & 0xff] ^
1180 	    Td2[(t3 >>  8) & 0xff] ^
1181 	    Td3[(t2      ) & 0xff] ^
1182 	    rk[1];
1183 	s2 =
1184 	    Td0[(t2 >> 24)       ] ^
1185 	    Td1[(t1 >> 16) & 0xff] ^
1186 	    Td2[(t0 >>  8) & 0xff] ^
1187 	    Td3[(t3      ) & 0xff] ^
1188 	    rk[2];
1189 	s3 =
1190 	    Td0[(t3 >> 24)       ] ^
1191 	    Td1[(t2 >> 16) & 0xff] ^
1192 	    Td2[(t1 >>  8) & 0xff] ^
1193 	    Td3[(t0      ) & 0xff] ^
1194 	    rk[3];
1195     }
1196 #endif /* ?FULL_UNROLL */
1197     /*
1198 	 * apply last round and
1199 	 * map cipher state to byte array block:
1200 	 */
1201    	s0 =
1202    		(Td4[(t0 >> 24)       ] & 0xff000000) ^
1203    		(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1204    		(Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1205    		(Td4[(t1      ) & 0xff] & 0x000000ff) ^
1206    		rk[0];
1207 	PUTU32(pt     , s0);
1208    	s1 =
1209    		(Td4[(t1 >> 24)       ] & 0xff000000) ^
1210    		(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1211    		(Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1212    		(Td4[(t2      ) & 0xff] & 0x000000ff) ^
1213    		rk[1];
1214 	PUTU32(pt +  4, s1);
1215    	s2 =
1216    		(Td4[(t2 >> 24)       ] & 0xff000000) ^
1217    		(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1218    		(Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1219    		(Td4[(t3      ) & 0xff] & 0x000000ff) ^
1220    		rk[2];
1221 	PUTU32(pt +  8, s2);
1222    	s3 =
1223    		(Td4[(t3 >> 24)       ] & 0xff000000) ^
1224    		(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1225    		(Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1226    		(Td4[(t0      ) & 0xff] & 0x000000ff) ^
1227    		rk[3];
1228 	PUTU32(pt + 12, s3);
1229 }
1230 #endif
1231 
1232 /* setup key context for encryption only */
1233 int
rijndael_set_key_enc_only(rijndael_ctx * ctx,const u_char * key,int bits)1234 rijndael_set_key_enc_only(rijndael_ctx *ctx, const u_char *key, int bits)
1235 {
1236 	int rounds;
1237 
1238 	rounds = rijndaelKeySetupEnc(ctx->ek, key, bits);
1239 	if (rounds == 0)
1240 		return -1;
1241 
1242 	ctx->Nr = rounds;
1243 #ifdef WITH_AES_DECRYPT
1244 	ctx->enc_only = 1;
1245 #endif
1246 
1247 	return 0;
1248 }
1249 
1250 #ifdef WITH_AES_DECRYPT
1251 /* setup key context for both encryption and decryption */
1252 int
rijndael_set_key(rijndael_ctx * ctx,const u_char * key,int bits)1253 rijndael_set_key(rijndael_ctx *ctx, const u_char *key, int bits)
1254 {
1255 	int rounds;
1256 
1257 	rounds = rijndaelKeySetupEnc(ctx->ek, key, bits);
1258 	if (rounds == 0)
1259 		return -1;
1260 	if (rijndaelKeySetupDec(ctx->dk, key, bits) != rounds)
1261 		return -1;
1262 
1263 	ctx->Nr = rounds;
1264 	ctx->enc_only = 0;
1265 
1266 	return 0;
1267 }
1268 
1269 void
rijndael_decrypt(rijndael_ctx * ctx,const u_char * src,u_char * dst)1270 rijndael_decrypt(rijndael_ctx *ctx, const u_char *src, u_char *dst)
1271 {
1272 	rijndaelDecrypt(ctx->dk, ctx->Nr, src, dst);
1273 }
1274 #endif
1275 
1276 void
rijndael_encrypt(rijndael_ctx * ctx,const u_char * src,u_char * dst)1277 rijndael_encrypt(rijndael_ctx *ctx, const u_char *src, u_char *dst)
1278 {
1279 	rijndaelEncrypt(ctx->ek, ctx->Nr, src, dst);
1280 }
1281