xref: /btstack/3rd-party/rijndael/rijndael.c (revision b45b7749fd0a3efec18073ae84f893078d0216d0)
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   0x01000000U, 0x02000000U, 0x04000000U, 0x08000000U,
698   0x10000000U, 0x20000000U, 0x40000000U, 0x80000000U,
699   0x1B000000U, 0x36000000U,
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  */
rijndaelSetupEncrypt(uint32_t * rk,const uint8_t * key,int keybits)718 int rijndaelSetupEncrypt(uint32_t *rk, const uint8_t *key, int keybits)
719 {
720   u32 * rk_ = rk;
721 
722   int rounds = 0;
723   int i = 0;
724   u32 temp;
725 
726   rk_[0] = GETU32(key     );
727   rk_[1] = GETU32(key +  4);
728   rk_[2] = GETU32(key +  8);
729   rk_[3] = GETU32(key + 12);
730   if (keybits == 128)
731   {
732     for (;;)
733     {
734       temp  = rk_[3];
735       rk_[4] = rk_[0] ^
736         (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
737         (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
738         (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
739         (Te4[(temp >> 24)       ] & 0x000000ff) ^
740         rcon[i];
741       rk_[5] = rk_[1] ^ rk_[4];
742       rk_[6] = rk_[2] ^ rk_[5];
743       rk_[7] = rk_[3] ^ rk_[6];
744       if (++i == 10) {
745 		  rounds = 10;
746 		  break;
747 	  }
748       rk_ += 4;
749     }
750   }
751 
752 #if defined(ENABLE_RIJNDAEL_192) || defined (ENABLE_RIJNDAEL_256)
753 
754   rk_[4] = GETU32(key + 16);
755   rk_[5] = GETU32(key + 20);
756   if (keybits == 192)
757   {
758     for (;;)
759     {
760       temp = rk_[ 5];
761       rk_[ 6] = rk_[ 0] ^
762         (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
763         (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
764         (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
765         (Te4[(temp >> 24)       ] & 0x000000ff) ^
766         rcon[i];
767       rk_[ 7] = rk_[ 1] ^ rk_[ 6];
768       rk_[ 8] = rk_[ 2] ^ rk_[ 7];
769       rk_[ 9] = rk_[ 3] ^ rk_[ 8];
770       if (++i == 8){
771       	rounds = 12;
772       }
773       rk_[10] = rk_[ 4] ^ rk_[ 9];
774       rk_[11] = rk_[ 5] ^ rk_[10];
775       rk_ += 6;
776     }
777   }
778 #endif
779 
780 #ifdef ENABLE_RIJNDAEL_256
781   rk_[6] = GETU32(key + 24);
782   rk_[7] = GETU32(key + 28);
783   if (keybits == 256)
784   {
785     for (;;)
786     {
787       temp = rk_[ 7];
788       rk_[ 8] = rk_[ 0] ^
789         (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
790         (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
791         (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
792         (Te4[(temp >> 24)       ] & 0x000000ff) ^
793         rcon[i];
794       rk_[ 9] = rk_[ 1] ^ rk_[ 8];
795       rk_[10] = rk_[ 2] ^ rk_[ 9];
796       rk_[11] = rk_[ 3] ^ rk_[10];
797       if (++i == 7){
798       	rounds = 14;
799       	break;
800 	  }
801       temp = rk_[11];
802       rk_[12] = rk_[ 4] ^
803         (Te4[(temp >> 24)       ] & 0xff000000) ^
804         (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
805         (Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
806         (Te4[(temp      ) & 0xff] & 0x000000ff);
807       rk_[13] = rk_[ 5] ^ rk_[12];
808       rk_[14] = rk_[ 6] ^ rk_[13];
809       rk_[15] = rk_[ 7] ^ rk_[14];
810       rk_ += 8;
811     }
812   }
813 #endif
814 	return rounds;
815 }
816 
817 #ifdef ENABLE_RIJNDAEL_DECRYPT
818 /**
819  * Expand the cipher key into the decryption key schedule.
820  *
821  * @return the number of rounds for the given cipher key size.
822  */
rijndaelSetupDecrypt(uint32_t * rk,const uint8_t * key,int keybits)823 int rijndaelSetupDecrypt(uint32_t *rk, const uint8_t *key, int keybits)
824 {
825   u32 * rk_ = rk;
826   int nrounds, i, j;
827   u32 temp;
828 
829   /* expand the cipher key: */
830   nrounds = rijndaelSetupEncrypt(rk_, key, keybits);
831   /* invert the order of the round keys: */
832   for (i = 0, j = 4*nrounds; i < j; i += 4, j -= 4)
833   {
834     temp = rk_[i    ]; rk_[i    ] = rk_[j    ]; rk_[j    ] = temp;
835     temp = rk_[i + 1]; rk_[i + 1] = rk_[j + 1]; rk_[j + 1] = temp;
836     temp = rk_[i + 2]; rk_[i + 2] = rk_[j + 2]; rk_[j + 2] = temp;
837     temp = rk_[i + 3]; rk_[i + 3] = rk_[j + 3]; rk_[j + 3] = temp;
838   }
839   /* apply the inverse MixColumn transform to all round keys but the first and the last: */
840   for (i = 1; i < nrounds; i++)
841   {
842     rk_ += 4;
843     rk_[0] =
844       Td0[Te4[(rk_[0] >> 24)       ] & 0xff] ^
845       Td1[Te4[(rk_[0] >> 16) & 0xff] & 0xff] ^
846       Td2[Te4[(rk_[0] >>  8) & 0xff] & 0xff] ^
847       Td3[Te4[(rk_[0]      ) & 0xff] & 0xff];
848     rk_[1] =
849       Td0[Te4[(rk_[1] >> 24)       ] & 0xff] ^
850       Td1[Te4[(rk_[1] >> 16) & 0xff] & 0xff] ^
851       Td2[Te4[(rk_[1] >>  8) & 0xff] & 0xff] ^
852       Td3[Te4[(rk_[1]      ) & 0xff] & 0xff];
853     rk_[2] =
854       Td0[Te4[(rk_[2] >> 24)       ] & 0xff] ^
855       Td1[Te4[(rk_[2] >> 16) & 0xff] & 0xff] ^
856       Td2[Te4[(rk_[2] >>  8) & 0xff] & 0xff] ^
857       Td3[Te4[(rk_[2]      ) & 0xff] & 0xff];
858     rk_[3] =
859       Td0[Te4[(rk_[3] >> 24)       ] & 0xff] ^
860       Td1[Te4[(rk_[3] >> 16) & 0xff] & 0xff] ^
861       Td2[Te4[(rk_[3] >>  8) & 0xff] & 0xff] ^
862       Td3[Te4[(rk_[3]      ) & 0xff] & 0xff];
863   }
864   return nrounds;
865 }
866 #endif
867 
rijndaelEncrypt(const uint32_t * rk,int nrounds,const uint8_t plaintext[16],uint8_t ciphertext[16])868 void rijndaelEncrypt(const uint32_t *rk, int nrounds, const uint8_t plaintext[16], uint8_t ciphertext[16])
869 {
870 
871   const u32 * rk_ = rk;
872   u32 s0, s1, s2, s3, t0, t1, t2, t3;
873   #ifndef FULL_UNROLL
874     int r;
875   #endif /* ?FULL_UNROLL */
876   /*
877    * map byte array block to cipher state
878    * and add initial round key:
879   */
880   s0 = GETU32(plaintext     ) ^ rk_[0];
881   s1 = GETU32(plaintext +  4) ^ rk_[1];
882   s2 = GETU32(plaintext +  8) ^ rk_[2];
883   s3 = GETU32(plaintext + 12) ^ rk_[3];
884   #ifdef FULL_UNROLL
885     /* round 1: */
886     t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[ 4];
887     t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[ 5];
888     t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[ 6];
889     t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[ 7];
890     /* round 2: */
891     s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[ 8];
892     s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[ 9];
893     s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[10];
894     s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[11];
895     /* round 3: */
896     t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[12];
897     t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[13];
898     t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[14];
899     t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[15];
900     /* round 4: */
901     s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[16];
902     s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[17];
903     s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[18];
904     s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[19];
905     /* round 5: */
906     t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[20];
907     t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[21];
908     t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[22];
909     t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[23];
910     /* round 6: */
911     s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[24];
912     s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[25];
913     s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[26];
914     s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[27];
915     /* round 7: */
916     t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[28];
917     t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[29];
918     t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[30];
919     t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[31];
920     /* round 8: */
921     s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[32];
922     s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[33];
923     s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[34];
924     s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[35];
925     /* round 9: */
926     t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[36];
927     t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[37];
928     t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[38];
929     t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[39];
930 
931 #if defined(ENABLE_RIJNDAEL_192) || defined (ENABLE_RIJNDAEL_256)
932 
933     if (nrounds > 10)
934     {
935       /* round 10: */
936       s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[40];
937       s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[41];
938       s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[42];
939       s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[43];
940       /* round 11: */
941       t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[44];
942       t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[45];
943       t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[46];
944       t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[47];
945 
946 #ifdef ENABLE_RIJNDAEL_256
947 
948       if (nrounds > 12)
949       {
950         /* round 12: */
951         s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk_[48];
952         s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk_[49];
953         s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk_[50];
954         s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk_[51];
955         /* round 13: */
956         t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk_[52];
957         t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk_[53];
958         t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk_[54];
959         t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk_[55];
960       }
961 #endif
962     }
963 #endif
964 
965     rk_ += nrounds << 2;
966   #else  /* !FULL_UNROLL */
967     /*
968     * nrounds - 1 full rounds:
969     */
970     r = nrounds >> 1;
971     for (;;)
972     {
973       t0 =
974         Te0[(s0 >> 24)       ] ^
975         Te1[(s1 >> 16) & 0xff] ^
976         Te2[(s2 >>  8) & 0xff] ^
977         Te3[(s3      ) & 0xff] ^
978         rk_[4];
979       t1 =
980         Te0[(s1 >> 24)       ] ^
981         Te1[(s2 >> 16) & 0xff] ^
982         Te2[(s3 >>  8) & 0xff] ^
983         Te3[(s0      ) & 0xff] ^
984         rk_[5];
985       t2 =
986         Te0[(s2 >> 24)       ] ^
987         Te1[(s3 >> 16) & 0xff] ^
988         Te2[(s0 >>  8) & 0xff] ^
989         Te3[(s1      ) & 0xff] ^
990         rk_[6];
991       t3 =
992         Te0[(s3 >> 24)       ] ^
993         Te1[(s0 >> 16) & 0xff] ^
994         Te2[(s1 >>  8) & 0xff] ^
995         Te3[(s2      ) & 0xff] ^
996         rk_[7];
997         rk_ += 8;
998         if (--r == 0)
999             break;
1000       s0 =
1001         Te0[(t0 >> 24)       ] ^
1002         Te1[(t1 >> 16) & 0xff] ^
1003         Te2[(t2 >>  8) & 0xff] ^
1004         Te3[(t3      ) & 0xff] ^
1005         rk_[0];
1006       s1 =
1007         Te0[(t1 >> 24)       ] ^
1008         Te1[(t2 >> 16) & 0xff] ^
1009         Te2[(t3 >>  8) & 0xff] ^
1010         Te3[(t0      ) & 0xff] ^
1011         rk_[1];
1012       s2 =
1013         Te0[(t2 >> 24)       ] ^
1014         Te1[(t3 >> 16) & 0xff] ^
1015         Te2[(t0 >>  8) & 0xff] ^
1016         Te3[(t1      ) & 0xff] ^
1017         rk_[2];
1018       s3 =
1019         Te0[(t3 >> 24)       ] ^
1020         Te1[(t0 >> 16) & 0xff] ^
1021         Te2[(t1 >>  8) & 0xff] ^
1022         Te3[(t2      ) & 0xff] ^
1023         rk_[3];
1024      }
1025  #endif /* ?FULL_UNROLL */
1026   /*
1027   * apply last round and
1028   * map cipher state to byte array block:
1029   */
1030   s0 =
1031     (Te4[(t0 >> 24)       ] & 0xff000000) ^
1032     (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1033     (Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1034     (Te4[(t3      ) & 0xff] & 0x000000ff) ^
1035     rk_[0];
1036   PUTU32(ciphertext     , s0);
1037   s1 =
1038     (Te4[(t1 >> 24)       ] & 0xff000000) ^
1039     (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1040     (Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1041     (Te4[(t0      ) & 0xff] & 0x000000ff) ^
1042     rk_[1];
1043   PUTU32(ciphertext +  4, s1);
1044   s2 =
1045     (Te4[(t2 >> 24)       ] & 0xff000000) ^
1046     (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1047     (Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1048     (Te4[(t1      ) & 0xff] & 0x000000ff) ^
1049     rk_[2];
1050   PUTU32(ciphertext +  8, s2);
1051   s3 =
1052     (Te4[(t3 >> 24)       ] & 0xff000000) ^
1053     (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1054     (Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1055     (Te4[(t2      ) & 0xff] & 0x000000ff) ^
1056     rk_[3];
1057   PUTU32(ciphertext + 12, s3);
1058 
1059 
1060 }
1061 
1062 #ifdef ENABLE_RIJNDAEL_DECRYPT
rijndaelDecrypt(const uint32_t * rk,int nrounds,const uint8_t ciphertext[16],uint8_t plaintext[16])1063 void rijndaelDecrypt(const uint32_t *rk, int nrounds, const uint8_t ciphertext[16], uint8_t plaintext[16])
1064 {
1065 
1066   const u32 * rk_ = rk;
1067   u32 s0, s1, s2, s3, t0, t1, t2, t3;
1068   #ifndef FULL_UNROLL
1069     int 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(ciphertext     ) ^ rk_[0];
1077     s1 = GETU32(ciphertext +  4) ^ rk_[1];
1078     s2 = GETU32(ciphertext +  8) ^ rk_[2];
1079     s3 = GETU32(ciphertext + 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 
1127 #if defined(ENABLE_RIJNDAEL_192) || defined (ENABLE_RIJNDAEL_256)
1128 
1129     if (nrounds > 10)
1130     {
1131       /* round 10: */
1132       s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk_[40];
1133       s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk_[41];
1134       s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk_[42];
1135       s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk_[43];
1136       /* round 11: */
1137       t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk_[44];
1138       t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk_[45];
1139       t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk_[46];
1140       t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk_[47];
1141 
1142  #ifdef ENABLE_RIJNDAEL_256
1143      if (nrounds > 12)
1144       {
1145         /* round 12: */
1146         s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk_[48];
1147         s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk_[49];
1148         s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk_[50];
1149         s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk_[51];
1150         /* round 13: */
1151         t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk_[52];
1152         t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk_[53];
1153         t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk_[54];
1154         t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk_[55];
1155       }
1156 #endif
1157 
1158     }
1159 #endif
1160 
1161     rk_ += nrounds << 2;
1162   #else  /* !FULL_UNROLL */
1163     /*
1164     * nrounds - 1 full rounds:
1165     */
1166     r = nrounds >> 1;
1167     for (;;)
1168     {
1169       t0 =
1170         Td0[(s0 >> 24)       ] ^
1171         Td1[(s3 >> 16) & 0xff] ^
1172         Td2[(s2 >>  8) & 0xff] ^
1173         Td3[(s1      ) & 0xff] ^
1174         rk_[4];
1175       t1 =
1176         Td0[(s1 >> 24)       ] ^
1177         Td1[(s0 >> 16) & 0xff] ^
1178         Td2[(s3 >>  8) & 0xff] ^
1179         Td3[(s2      ) & 0xff] ^
1180         rk_[5];
1181       t2 =
1182         Td0[(s2 >> 24)       ] ^
1183         Td1[(s1 >> 16) & 0xff] ^
1184         Td2[(s0 >>  8) & 0xff] ^
1185         Td3[(s3      ) & 0xff] ^
1186         rk_[6];
1187       t3 =
1188         Td0[(s3 >> 24)       ] ^
1189         Td1[(s2 >> 16) & 0xff] ^
1190         Td2[(s1 >>  8) & 0xff] ^
1191         Td3[(s0      ) & 0xff] ^
1192         rk_[7];
1193       rk_ += 8;
1194       if (--r == 0)
1195           break;
1196       s0 =
1197         Td0[(t0 >> 24)       ] ^
1198         Td1[(t3 >> 16) & 0xff] ^
1199         Td2[(t2 >>  8) & 0xff] ^
1200         Td3[(t1      ) & 0xff] ^
1201         rk_[0];
1202       s1 =
1203         Td0[(t1 >> 24)       ] ^
1204         Td1[(t0 >> 16) & 0xff] ^
1205         Td2[(t3 >>  8) & 0xff] ^
1206         Td3[(t2      ) & 0xff] ^
1207         rk_[1];
1208       s2 =
1209         Td0[(t2 >> 24)       ] ^
1210         Td1[(t1 >> 16) & 0xff] ^
1211         Td2[(t0 >>  8) & 0xff] ^
1212         Td3[(t3      ) & 0xff] ^
1213         rk_[2];
1214       s3 =
1215         Td0[(t3 >> 24)       ] ^
1216         Td1[(t2 >> 16) & 0xff] ^
1217         Td2[(t1 >>  8) & 0xff] ^
1218         Td3[(t0      ) & 0xff] ^
1219         rk_[3];
1220     }
1221   #endif /* ?FULL_UNROLL */
1222   /*
1223   * apply last round and
1224   * map cipher state to byte array block:
1225   */
1226   s0 =
1227     (Td4[(t0 >> 24)       ] & 0xff000000) ^
1228     (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1229     (Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1230     (Td4[(t1      ) & 0xff] & 0x000000ff) ^
1231     rk_[0];
1232   PUTU32(plaintext     , s0);
1233   s1 =
1234     (Td4[(t1 >> 24)       ] & 0xff000000) ^
1235     (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1236     (Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1237     (Td4[(t2      ) & 0xff] & 0x000000ff) ^
1238     rk_[1];
1239   PUTU32(plaintext +  4, s1);
1240   s2 =
1241     (Td4[(t2 >> 24)       ] & 0xff000000) ^
1242     (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1243     (Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1244     (Td4[(t3      ) & 0xff] & 0x000000ff) ^
1245     rk_[2];
1246   PUTU32(plaintext +  8, s2);
1247   s3 =
1248     (Td4[(t3 >> 24)       ] & 0xff000000) ^
1249     (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1250     (Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1251     (Td4[(t0      ) & 0xff] & 0x000000ff) ^
1252     rk_[3];
1253 
1254 	PUTU32(plaintext + 12, s3);
1255 
1256 
1257 }
1258 #endif
1259