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