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