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