1122410Sume/*	$KAME: rijndael-alg-fst.c,v 1.10 2003/07/15 10:47:16 itojun Exp $	*/
2122410Sume/**
3122410Sume * rijndael-alg-fst.c
467957Skris *
5122410Sume * @version 3.0 (December 2000)
667957Skris *
7122410Sume * Optimised ANSI C code for the Rijndael cipher (now AES)
867957Skris *
9122410Sume * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
10122410Sume * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
11122410Sume * @author Paulo Barreto <paulo.barreto@terra.com.br>
12122410Sume *
13122410Sume * This code is hereby placed in the public domain.
14122410Sume *
15122410Sume * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
16122410Sume * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17122410Sume * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18122410Sume * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
19122410Sume * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20122410Sume * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21122410Sume * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22122410Sume * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23122410Sume * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24122410Sume * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25122410Sume * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2667957Skris */
2767957Skris#include <sys/cdefs.h>
28116174Sobrien__FBSDID("$FreeBSD$");
29116174Sobrien
30116174Sobrien#include <sys/cdefs.h>
3167957Skris#include <sys/types.h>
3278064Sume#ifdef _KERNEL
3378064Sume#include <sys/systm.h>
3478064Sume#else
3578064Sume#include <string.h>
36149176Spjd#include <assert.h>
37149176Spjd#define	KASSERT(exp, msg)	assert(exp)
3878064Sume#endif
39122410Sume
40143420Sume#include <crypto/rijndael/rijndael.h>
4167957Skris#include <crypto/rijndael/rijndael_local.h>
4267957Skris
43122410Sume/*
44122410SumeTe0[x] = S [x].[02, 01, 01, 03];
45122410SumeTe1[x] = S [x].[03, 02, 01, 01];
46122410SumeTe2[x] = S [x].[01, 03, 02, 01];
47122410SumeTe3[x] = S [x].[01, 01, 03, 02];
48122410SumeTe4[x] = S [x].[01, 01, 01, 01];
4967957Skris
50122410SumeTd0[x] = Si[x].[0e, 09, 0d, 0b];
51122410SumeTd1[x] = Si[x].[0b, 0e, 09, 0d];
52122410SumeTd2[x] = Si[x].[0d, 0b, 0e, 09];
53122410SumeTd3[x] = Si[x].[09, 0d, 0b, 0e];
54122410SumeTd4[x] = Si[x].[01, 01, 01, 01];
55122410Sume*/
5667957Skris
57122410Sumestatic const u32 Te0[256] = {
58122410Sume    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
59122410Sume    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
60122410Sume    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
61122410Sume    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
62122410Sume    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
63122410Sume    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
64122410Sume    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
65122410Sume    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
66122410Sume    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
67122410Sume    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
68122410Sume    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
69122410Sume    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
70122410Sume    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
71122410Sume    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
72122410Sume    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
73122410Sume    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
74122410Sume    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
75122410Sume    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
76122410Sume    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
77122410Sume    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
78122410Sume    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
79122410Sume    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
80122410Sume    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
81122410Sume    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
82122410Sume    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
83122410Sume    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
84122410Sume    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
85122410Sume    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
86122410Sume    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
87122410Sume    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
88122410Sume    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
89122410Sume    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
90122410Sume    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
91122410Sume    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
92122410Sume    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
93122410Sume    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
94122410Sume    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
95122410Sume    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
96122410Sume    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
97122410Sume    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
98122410Sume    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
99122410Sume    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
100122410Sume    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
101122410Sume    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
102122410Sume    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
103122410Sume    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
104122410Sume    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
105122410Sume    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
106122410Sume    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
107122410Sume    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
108122410Sume    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
109122410Sume    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
110122410Sume    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
111122410Sume    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
112122410Sume    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
113122410Sume    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
114122410Sume    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
115122410Sume    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
116122410Sume    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
117122410Sume    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
118122410Sume    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
119122410Sume    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
120122410Sume    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
121122410Sume    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
122121050Sume};
123122410Sumestatic const u32 Te1[256] = {
124122410Sume    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
125122410Sume    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
126122410Sume    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
127122410Sume    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
128122410Sume    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
129122410Sume    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
130122410Sume    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
131122410Sume    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
132122410Sume    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
133122410Sume    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
134122410Sume    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
135122410Sume    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
136122410Sume    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
137122410Sume    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
138122410Sume    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
139122410Sume    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
140122410Sume    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
141122410Sume    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
142122410Sume    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
143122410Sume    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
144122410Sume    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
145122410Sume    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
146122410Sume    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
147122410Sume    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
148122410Sume    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
149122410Sume    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
150122410Sume    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
151122410Sume    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
152122410Sume    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
153122410Sume    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
154122410Sume    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
155122410Sume    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
156122410Sume    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
157122410Sume    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
158122410Sume    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
159122410Sume    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
160122410Sume    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
161122410Sume    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
162122410Sume    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
163122410Sume    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
164122410Sume    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
165122410Sume    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
166122410Sume    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
167122410Sume    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
168122410Sume    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
169122410Sume    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
170122410Sume    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
171122410Sume    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
172122410Sume    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
173122410Sume    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
174122410Sume    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
175122410Sume    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
176122410Sume    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
177122410Sume    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
178122410Sume    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
179122410Sume    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
180122410Sume    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
181122410Sume    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
182122410Sume    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
183122410Sume    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
184122410Sume    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
185122410Sume    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
186122410Sume    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
187122410Sume    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
188121050Sume};
189122410Sumestatic const u32 Te2[256] = {
190122410Sume    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
191122410Sume    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
192122410Sume    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
193122410Sume    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
194122410Sume    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
195122410Sume    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
196122410Sume    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
197122410Sume    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
198122410Sume    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
199122410Sume    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
200122410Sume    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
201122410Sume    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
202122410Sume    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
203122410Sume    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
204122410Sume    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
205122410Sume    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
206122410Sume    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
207122410Sume    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
208122410Sume    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
209122410Sume    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
210122410Sume    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
211122410Sume    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
212122410Sume    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
213122410Sume    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
214122410Sume    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
215122410Sume    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
216122410Sume    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
217122410Sume    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
218122410Sume    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
219122410Sume    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
220122410Sume    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
221122410Sume    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
222122410Sume    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
223122410Sume    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
224122410Sume    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
225122410Sume    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
226122410Sume    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
227122410Sume    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
228122410Sume    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
229122410Sume    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
230122410Sume    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
231122410Sume    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
232122410Sume    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
233122410Sume    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
234122410Sume    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
235122410Sume    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
236122410Sume    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
237122410Sume    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
238122410Sume    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
239122410Sume    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
240122410Sume    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
241122410Sume    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
242122410Sume    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
243122410Sume    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
244122410Sume    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
245122410Sume    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
246122410Sume    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
247122410Sume    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
248122410Sume    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
249122410Sume    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
250122410Sume    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
251122410Sume    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
252122410Sume    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
253122410Sume    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
254121050Sume};
255122410Sumestatic const u32 Te3[256] = {
25667957Skris
257122410Sume    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
258122410Sume    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
259122410Sume    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
260122410Sume    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
261122410Sume    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
262122410Sume    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
263122410Sume    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
264122410Sume    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
265122410Sume    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
266122410Sume    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
267122410Sume    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
268122410Sume    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
269122410Sume    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
270122410Sume    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
271122410Sume    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
272122410Sume    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
273122410Sume    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
274122410Sume    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
275122410Sume    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
276122410Sume    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
277122410Sume    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
278122410Sume    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
279122410Sume    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
280122410Sume    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
281122410Sume    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
282122410Sume    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
283122410Sume    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
284122410Sume    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
285122410Sume    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
286122410Sume    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
287122410Sume    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
288122410Sume    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
289122410Sume    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
290122410Sume    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
291122410Sume    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
292122410Sume    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
293122410Sume    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
294122410Sume    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
295122410Sume    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
296122410Sume    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
297122410Sume    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
298122410Sume    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
299122410Sume    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
300122410Sume    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
301122410Sume    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
302122410Sume    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
303122410Sume    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
304122410Sume    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
305122410Sume    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
306122410Sume    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
307122410Sume    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
308122410Sume    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
309122410Sume    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
310122410Sume    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
311122410Sume    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
312122410Sume    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
313122410Sume    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
314122410Sume    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
315122410Sume    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
316122410Sume    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
317122410Sume    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
318122410Sume    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
319122410Sume    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
320122410Sume    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
321121050Sume};
322122410Sumestatic const u32 Te4[256] = {
323122410Sume    0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
324122410Sume    0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
325122410Sume    0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
326122410Sume    0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
327122410Sume    0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
328122410Sume    0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
329122410Sume    0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
330122410Sume    0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
331122410Sume    0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
332122410Sume    0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
333122410Sume    0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
334122410Sume    0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
335122410Sume    0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
336122410Sume    0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
337122410Sume    0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
338122410Sume    0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
339122410Sume    0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
340122410Sume    0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
341122410Sume    0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
342122410Sume    0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
343122410Sume    0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
344122410Sume    0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
345122410Sume    0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
346122410Sume    0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
347122410Sume    0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
348122410Sume    0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
349122410Sume    0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
350122410Sume    0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
351122410Sume    0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
352122410Sume    0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
353122410Sume    0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
354122410Sume    0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
355122410Sume    0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
356122410Sume    0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
357122410Sume    0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
358122410Sume    0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
359122410Sume    0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
360122410Sume    0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
361122410Sume    0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
362122410Sume    0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
363122410Sume    0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
364122410Sume    0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
365122410Sume    0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
366122410Sume    0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
367122410Sume    0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
368122410Sume    0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
369122410Sume    0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
370122410Sume    0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
371122410Sume    0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
372122410Sume    0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
373122410Sume    0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
374122410Sume    0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
375122410Sume    0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
376122410Sume    0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
377122410Sume    0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
378122410Sume    0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
379122410Sume    0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
380122410Sume    0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
381122410Sume    0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
382122410Sume    0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
383122410Sume    0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
384122410Sume    0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
385122410Sume    0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
386122410Sume    0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
387121050Sume};
388122410Sumestatic const u32 Td0[256] = {
389122410Sume    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
390122410Sume    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
391122410Sume    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
392122410Sume    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
393122410Sume    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
394122410Sume    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
395122410Sume    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
396122410Sume    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
397122410Sume    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
398122410Sume    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
399122410Sume    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
400122410Sume    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
401122410Sume    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
402122410Sume    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
403122410Sume    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
404122410Sume    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
405122410Sume    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
406122410Sume    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
407122410Sume    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
408122410Sume    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
409122410Sume    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
410122410Sume    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
411122410Sume    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
412122410Sume    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
413122410Sume    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
414122410Sume    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
415122410Sume    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
416122410Sume    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
417122410Sume    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
418122410Sume    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
419122410Sume    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
420122410Sume    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
421122410Sume    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
422122410Sume    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
423122410Sume    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
424122410Sume    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
425122410Sume    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
426122410Sume    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
427122410Sume    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
428122410Sume    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
429122410Sume    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
430122410Sume    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
431122410Sume    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
432122410Sume    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
433122410Sume    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
434122410Sume    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
435122410Sume    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
436122410Sume    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
437122410Sume    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
438122410Sume    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
439122410Sume    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
440122410Sume    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
441122410Sume    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
442122410Sume    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
443122410Sume    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
444122410Sume    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
445122410Sume    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
446122410Sume    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
447122410Sume    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
448122410Sume    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
449122410Sume    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
450122410Sume    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
451122410Sume    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
452122410Sume    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
453121050Sume};
454122410Sumestatic const u32 Td1[256] = {
455122410Sume    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
456122410Sume    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
457122410Sume    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
458122410Sume    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
459122410Sume    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
460122410Sume    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
461122410Sume    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
462122410Sume    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
463122410Sume    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
464122410Sume    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
465122410Sume    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
466122410Sume    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
467122410Sume    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
468122410Sume    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
469122410Sume    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
470122410Sume    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
471122410Sume    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
472122410Sume    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
473122410Sume    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
474122410Sume    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
475122410Sume    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
476122410Sume    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
477122410Sume    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
478122410Sume    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
479122410Sume    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
480122410Sume    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
481122410Sume    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
482122410Sume    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
483122410Sume    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
484122410Sume    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
485122410Sume    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
486122410Sume    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
487122410Sume    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
488122410Sume    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
489122410Sume    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
490122410Sume    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
491122410Sume    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
492122410Sume    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
493122410Sume    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
494122410Sume    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
495122410Sume    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
496122410Sume    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
497122410Sume    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
498122410Sume    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
499122410Sume    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
500122410Sume    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
501122410Sume    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
502122410Sume    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
503122410Sume    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
504122410Sume    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
505122410Sume    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
506122410Sume    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
507122410Sume    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
508122410Sume    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
509122410Sume    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
510122410Sume    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
511122410Sume    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
512122410Sume    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
513122410Sume    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
514122410Sume    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
515122410Sume    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
516122410Sume    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
517122410Sume    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
518122410Sume    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
519121050Sume};
520122410Sumestatic const u32 Td2[256] = {
521122410Sume    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
522122410Sume    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
523122410Sume    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
524122410Sume    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
525122410Sume    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
526122410Sume    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
527122410Sume    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
528122410Sume    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
529122410Sume    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
530122410Sume    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
531122410Sume    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
532122410Sume    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
533122410Sume    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
534122410Sume    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
535122410Sume    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
536122410Sume    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
537122410Sume    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
538122410Sume    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
539122410Sume    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
540122410Sume    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
54167957Skris
542122410Sume    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
543122410Sume    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
544122410Sume    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
545122410Sume    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
546122410Sume    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
547122410Sume    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
548122410Sume    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
549122410Sume    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
550122410Sume    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
551122410Sume    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
552122410Sume    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
553122410Sume    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
554122410Sume    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
555122410Sume    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
556122410Sume    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
557122410Sume    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
558122410Sume    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
559122410Sume    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
560122410Sume    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
561122410Sume    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
562122410Sume    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
563122410Sume    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
564122410Sume    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
565122410Sume    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
566122410Sume    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
567122410Sume    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
568122410Sume    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
569122410Sume    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
570122410Sume    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
571122410Sume    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
572122410Sume    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
573122410Sume    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
574122410Sume    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
575122410Sume    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
576122410Sume    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
577122410Sume    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
578122410Sume    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
579122410Sume    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
580122410Sume    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
581122410Sume    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
582122410Sume    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
583122410Sume    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
584122410Sume    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
585122410Sume    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
586121050Sume};
587122410Sumestatic const u32 Td3[256] = {
588122410Sume    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
589122410Sume    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
590122410Sume    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
591122410Sume    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
592122410Sume    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
593122410Sume    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
594122410Sume    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
595122410Sume    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
596122410Sume    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
597122410Sume    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
598122410Sume    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
599122410Sume    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
600122410Sume    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
601122410Sume    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
602122410Sume    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
603122410Sume    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
604122410Sume    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
605122410Sume    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
606122410Sume    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
607122410Sume    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
608122410Sume    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
609122410Sume    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
610122410Sume    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
611122410Sume    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
612122410Sume    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
613122410Sume    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
614122410Sume    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
615122410Sume    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
616122410Sume    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
617122410Sume    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
618122410Sume    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
619122410Sume    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
620122410Sume    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
621122410Sume    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
622122410Sume    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
623122410Sume    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
624122410Sume    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
625122410Sume    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
626122410Sume    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
627122410Sume    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
628122410Sume    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
629122410Sume    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
630122410Sume    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
631122410Sume    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
632122410Sume    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
633122410Sume    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
634122410Sume    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
635122410Sume    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
636122410Sume    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
637122410Sume    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
638122410Sume    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
639122410Sume    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
640122410Sume    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
641122410Sume    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
642122410Sume    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
643122410Sume    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
644122410Sume    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
645122410Sume    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
646122410Sume    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
647122410Sume    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
648122410Sume    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
649122410Sume    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
650122410Sume    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
651122410Sume    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
652121050Sume};
653122410Sumestatic const u32 Td4[256] = {
654122410Sume    0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
655122410Sume    0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
656122410Sume    0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
657122410Sume    0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
658122410Sume    0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
659122410Sume    0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
660122410Sume    0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
661122410Sume    0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
662122410Sume    0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
663122410Sume    0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
664122410Sume    0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
665122410Sume    0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
666122410Sume    0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
667122410Sume    0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
668122410Sume    0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
669122410Sume    0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
670122410Sume    0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
671122410Sume    0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
672122410Sume    0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
673122410Sume    0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
674122410Sume    0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
675122410Sume    0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
676122410Sume    0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
677122410Sume    0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
678122410Sume    0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
679122410Sume    0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
680122410Sume    0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
681122410Sume    0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
682122410Sume    0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
683122410Sume    0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
684122410Sume    0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
685122410Sume    0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
686122410Sume    0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
687122410Sume    0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
688122410Sume    0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
689122410Sume    0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
690122410Sume    0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
691122410Sume    0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
692122410Sume    0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
693122410Sume    0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
694122410Sume    0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
695122410Sume    0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
696122410Sume    0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
697122410Sume    0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
698122410Sume    0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
699122410Sume    0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
700122410Sume    0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
701122410Sume    0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
702122410Sume    0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
703122410Sume    0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
704122410Sume    0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
705122410Sume    0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
706122410Sume    0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
707122410Sume    0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
708122410Sume    0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
709122410Sume    0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
710122410Sume    0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
711122410Sume    0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
712122410Sume    0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
713122410Sume    0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
714122410Sume    0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
715122410Sume    0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
716122410Sume    0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
717122410Sume    0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
718121050Sume};
719122410Sumestatic const u32 rcon[] = {
720122410Sume	0x01000000, 0x02000000, 0x04000000, 0x08000000,
721122410Sume	0x10000000, 0x20000000, 0x40000000, 0x80000000,
722122410Sume	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
723121050Sume};
72467957Skris
725122410Sume#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
72667957Skris
727122410Sume#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
728122410Sume#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
72967957Skris
730122410Sume/**
731122410Sume * Expand the cipher key into the encryption key schedule.
732122410Sume *
733122410Sume * @return	the number of rounds for the given cipher key size.
734122410Sume */
735122410Sumeint rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {
736122410Sume   	int i = 0;
737122410Sume	u32 temp;
73867957Skris
739149143Spjd	KASSERT(keyBits == 128 || keyBits == 192 || keyBits == 256,
740149143Spjd	    ("Invalid key size (%d).", keyBits));
741122410Sume	rk[0] = GETU32(cipherKey     );
742122410Sume	rk[1] = GETU32(cipherKey +  4);
743122410Sume	rk[2] = GETU32(cipherKey +  8);
744122410Sume	rk[3] = GETU32(cipherKey + 12);
745122410Sume	if (keyBits == 128) {
746122410Sume		for (;;) {
747122410Sume			temp  = rk[3];
748122410Sume			rk[4] = rk[0] ^
749122410Sume				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
750122410Sume				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
751122410Sume				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
752122410Sume				(Te4[(temp >> 24)       ] & 0x000000ff) ^
753122410Sume				rcon[i];
754122410Sume			rk[5] = rk[1] ^ rk[4];
755122410Sume			rk[6] = rk[2] ^ rk[5];
756122410Sume			rk[7] = rk[3] ^ rk[6];
757122410Sume			if (++i == 10) {
758122410Sume				return 10;
759122410Sume			}
760122410Sume			rk += 4;
761121050Sume		}
762121050Sume	}
763122410Sume	rk[4] = GETU32(cipherKey + 16);
764122410Sume	rk[5] = GETU32(cipherKey + 20);
765122410Sume	if (keyBits == 192) {
766122410Sume		for (;;) {
767122410Sume			temp = rk[ 5];
768122410Sume			rk[ 6] = rk[ 0] ^
769122410Sume				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
770122410Sume				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
771122410Sume				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
772122410Sume				(Te4[(temp >> 24)       ] & 0x000000ff) ^
773122410Sume				rcon[i];
774122410Sume			rk[ 7] = rk[ 1] ^ rk[ 6];
775122410Sume			rk[ 8] = rk[ 2] ^ rk[ 7];
776122410Sume			rk[ 9] = rk[ 3] ^ rk[ 8];
777122410Sume			if (++i == 8) {
778122410Sume				return 12;
779121050Sume			}
780122410Sume			rk[10] = rk[ 4] ^ rk[ 9];
781122410Sume			rk[11] = rk[ 5] ^ rk[10];
782122410Sume			rk += 6;
783121050Sume		}
784122410Sume	}
785122410Sume	rk[6] = GETU32(cipherKey + 24);
786122410Sume	rk[7] = GETU32(cipherKey + 28);
787122410Sume	if (keyBits == 256) {
788122410Sume        for (;;) {
789122410Sume        	temp = rk[ 7];
790122410Sume        	rk[ 8] = rk[ 0] ^
791122410Sume        		(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
792122410Sume        		(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
793122410Sume        		(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
794122410Sume        		(Te4[(temp >> 24)       ] & 0x000000ff) ^
795122410Sume        		rcon[i];
796122410Sume        	rk[ 9] = rk[ 1] ^ rk[ 8];
797122410Sume        	rk[10] = rk[ 2] ^ rk[ 9];
798122410Sume        	rk[11] = rk[ 3] ^ rk[10];
799122410Sume			if (++i == 7) {
800122410Sume				return 14;
801121050Sume			}
802122410Sume        	temp = rk[11];
803122410Sume        	rk[12] = rk[ 4] ^
804122410Sume        		(Te4[(temp >> 24)       ] & 0xff000000) ^
805122410Sume        		(Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
806122410Sume        		(Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
807122410Sume        		(Te4[(temp      ) & 0xff] & 0x000000ff);
808122410Sume        	rk[13] = rk[ 5] ^ rk[12];
809122410Sume        	rk[14] = rk[ 6] ^ rk[13];
810122410Sume        	rk[15] = rk[ 7] ^ rk[14];
81178064Sume
812122410Sume			rk += 8;
813122410Sume        }
81467957Skris	}
81567957Skris	return 0;
81667957Skris}
81767957Skris
81867957Skris/**
819122410Sume * Expand the cipher key into the decryption key schedule.
820122410Sume *
821122410Sume * @return	the number of rounds for the given cipher key size.
82267957Skris */
823122410Sumeint rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {
824122410Sume	int Nr, i, j;
825122410Sume	u32 temp;
82667957Skris
827122410Sume	/* expand the cipher key: */
828122410Sume	Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
829122410Sume	/* invert the order of the round keys: */
830122410Sume	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
831122410Sume		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
832122410Sume		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
833122410Sume		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
834122410Sume		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
83567957Skris	}
836122410Sume	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
837122410Sume	for (i = 1; i < Nr; i++) {
838122410Sume		rk += 4;
839122410Sume		rk[0] =
840122410Sume			Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
841122410Sume			Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
842122410Sume			Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
843122410Sume			Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
844122410Sume		rk[1] =
845122410Sume			Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
846122410Sume			Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
847122410Sume			Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
848122410Sume			Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
849122410Sume		rk[2] =
850122410Sume			Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
851122410Sume			Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
852122410Sume			Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
853122410Sume			Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
854122410Sume		rk[3] =
855122410Sume			Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
856122410Sume			Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
857122410Sume			Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
858122410Sume			Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
85967957Skris	}
860122410Sume	return Nr;
861122410Sume}
86267957Skris
863122410Sumevoid rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) {
864122410Sume	u32 s0, s1, s2, s3, t0, t1, t2, t3;
865122410Sume#ifndef FULL_UNROLL
866122410Sume    int r;
867122410Sume#endif /* ?FULL_UNROLL */
86867957Skris
869122410Sume    /*
870122410Sume	 * map byte array block to cipher state
871122410Sume	 * and add initial round key:
872122410Sume	 */
873122410Sume	s0 = GETU32(pt     ) ^ rk[0];
874122410Sume	s1 = GETU32(pt +  4) ^ rk[1];
875122410Sume	s2 = GETU32(pt +  8) ^ rk[2];
876122410Sume	s3 = GETU32(pt + 12) ^ rk[3];
877122410Sume#ifdef FULL_UNROLL
878122410Sume    /* round 1: */
879122410Sume   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
880122410Sume   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
881122410Sume   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
882122410Sume   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
883122410Sume   	/* round 2: */
884122410Sume   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
885122410Sume   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
886122410Sume   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
887122410Sume   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
888122410Sume    /* round 3: */
889122410Sume   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
890122410Sume   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
891122410Sume   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
892122410Sume   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
893122410Sume   	/* round 4: */
894122410Sume   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
895122410Sume   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
896122410Sume   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
897122410Sume   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
898122410Sume    /* round 5: */
899122410Sume   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
900122410Sume   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
901122410Sume   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
902122410Sume   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
903122410Sume   	/* round 6: */
904122410Sume   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
905122410Sume   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
906122410Sume   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
907122410Sume   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
908122410Sume    /* round 7: */
909122410Sume   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
910122410Sume   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
911122410Sume   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
912122410Sume   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
913122410Sume   	/* round 8: */
914122410Sume   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
915122410Sume   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
916122410Sume   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
917122410Sume   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
918122410Sume    /* round 9: */
919122410Sume   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
920122410Sume   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
921122410Sume   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
922122410Sume   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
923122410Sume    if (Nr > 10) {
924122410Sume        /* round 10: */
925122410Sume        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
926122410Sume        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
927122410Sume        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
928122410Sume        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
929122410Sume        /* round 11: */
930122410Sume        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
931122410Sume        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
932122410Sume        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
933122410Sume        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
934122410Sume        if (Nr > 12) {
935122410Sume            /* round 12: */
936122410Sume            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
937122410Sume            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
938122410Sume            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
939122410Sume            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
940122410Sume            /* round 13: */
941122410Sume            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
942122410Sume            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
943122410Sume            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
944122410Sume            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
945122410Sume        }
946122410Sume    }
947122410Sume    rk += Nr << 2;
948122410Sume#else  /* !FULL_UNROLL */
949122410Sume    /*
950122410Sume	 * Nr - 1 full rounds:
951122410Sume	 */
952122410Sume    r = Nr >> 1;
953122410Sume    for (;;) {
954122410Sume        t0 =
955122410Sume            Te0[(s0 >> 24)       ] ^
956122410Sume            Te1[(s1 >> 16) & 0xff] ^
957122410Sume            Te2[(s2 >>  8) & 0xff] ^
958122410Sume            Te3[(s3      ) & 0xff] ^
959122410Sume            rk[4];
960122410Sume        t1 =
961122410Sume            Te0[(s1 >> 24)       ] ^
962122410Sume            Te1[(s2 >> 16) & 0xff] ^
963122410Sume            Te2[(s3 >>  8) & 0xff] ^
964122410Sume            Te3[(s0      ) & 0xff] ^
965122410Sume            rk[5];
966122410Sume        t2 =
967122410Sume            Te0[(s2 >> 24)       ] ^
968122410Sume            Te1[(s3 >> 16) & 0xff] ^
969122410Sume            Te2[(s0 >>  8) & 0xff] ^
970122410Sume            Te3[(s1      ) & 0xff] ^
971122410Sume            rk[6];
972122410Sume        t3 =
973122410Sume            Te0[(s3 >> 24)       ] ^
974122410Sume            Te1[(s0 >> 16) & 0xff] ^
975122410Sume            Te2[(s1 >>  8) & 0xff] ^
976122410Sume            Te3[(s2      ) & 0xff] ^
977122410Sume            rk[7];
97878064Sume
979122410Sume        rk += 8;
980122410Sume        if (--r == 0) {
981122410Sume            break;
982122410Sume        }
98367957Skris
984122410Sume        s0 =
985122410Sume            Te0[(t0 >> 24)       ] ^
986122410Sume            Te1[(t1 >> 16) & 0xff] ^
987122410Sume            Te2[(t2 >>  8) & 0xff] ^
988122410Sume            Te3[(t3      ) & 0xff] ^
989122410Sume            rk[0];
990122410Sume        s1 =
991122410Sume            Te0[(t1 >> 24)       ] ^
992122410Sume            Te1[(t2 >> 16) & 0xff] ^
993122410Sume            Te2[(t3 >>  8) & 0xff] ^
994122410Sume            Te3[(t0      ) & 0xff] ^
995122410Sume            rk[1];
996122410Sume        s2 =
997122410Sume            Te0[(t2 >> 24)       ] ^
998122410Sume            Te1[(t3 >> 16) & 0xff] ^
999122410Sume            Te2[(t0 >>  8) & 0xff] ^
1000122410Sume            Te3[(t1      ) & 0xff] ^
1001122410Sume            rk[2];
1002122410Sume        s3 =
1003122410Sume            Te0[(t3 >> 24)       ] ^
1004122410Sume            Te1[(t0 >> 16) & 0xff] ^
1005122410Sume            Te2[(t1 >>  8) & 0xff] ^
1006122410Sume            Te3[(t2      ) & 0xff] ^
1007122410Sume            rk[3];
1008122410Sume    }
1009122410Sume#endif /* ?FULL_UNROLL */
1010122410Sume    /*
1011122410Sume	 * apply last round and
1012122410Sume	 * map cipher state to byte array block:
1013122410Sume	 */
1014122410Sume	s0 =
1015122410Sume		(Te4[(t0 >> 24)       ] & 0xff000000) ^
1016122410Sume		(Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1017122410Sume		(Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1018122410Sume		(Te4[(t3      ) & 0xff] & 0x000000ff) ^
1019122410Sume		rk[0];
1020122410Sume	PUTU32(ct     , s0);
1021122410Sume	s1 =
1022122410Sume		(Te4[(t1 >> 24)       ] & 0xff000000) ^
1023122410Sume		(Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1024122410Sume		(Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1025122410Sume		(Te4[(t0      ) & 0xff] & 0x000000ff) ^
1026122410Sume		rk[1];
1027122410Sume	PUTU32(ct +  4, s1);
1028122410Sume	s2 =
1029122410Sume		(Te4[(t2 >> 24)       ] & 0xff000000) ^
1030122410Sume		(Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1031122410Sume		(Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1032122410Sume		(Te4[(t1      ) & 0xff] & 0x000000ff) ^
1033122410Sume		rk[2];
1034122410Sume	PUTU32(ct +  8, s2);
1035122410Sume	s3 =
1036122410Sume		(Te4[(t3 >> 24)       ] & 0xff000000) ^
1037122410Sume		(Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1038122410Sume		(Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1039122410Sume		(Te4[(t2      ) & 0xff] & 0x000000ff) ^
1040122410Sume		rk[3];
1041122410Sume	PUTU32(ct + 12, s3);
104267957Skris}
104367957Skris
1044122410Sumevoid rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) {
1045122410Sume	u32 s0, s1, s2, s3, t0, t1, t2, t3;
1046122410Sume#ifndef FULL_UNROLL
1047122410Sume    int r;
1048122410Sume#endif /* ?FULL_UNROLL */
104967957Skris
1050122410Sume    /*
1051122410Sume	 * map byte array block to cipher state
1052122410Sume	 * and add initial round key:
1053122410Sume	 */
1054122410Sume    s0 = GETU32(ct     ) ^ rk[0];
1055122410Sume    s1 = GETU32(ct +  4) ^ rk[1];
1056122410Sume    s2 = GETU32(ct +  8) ^ rk[2];
1057122410Sume    s3 = GETU32(ct + 12) ^ rk[3];
1058122410Sume#ifdef FULL_UNROLL
1059122410Sume    /* round 1: */
1060122410Sume    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
1061122410Sume    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
1062122410Sume    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
1063122410Sume    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
1064122410Sume    /* round 2: */
1065122410Sume    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
1066122410Sume    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
1067122410Sume    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
1068122410Sume    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
1069122410Sume    /* round 3: */
1070122410Sume    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
1071122410Sume    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
1072122410Sume    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
1073122410Sume    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
1074122410Sume    /* round 4: */
1075122410Sume    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1076122410Sume    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1077122410Sume    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1078122410Sume    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1079122410Sume    /* round 5: */
1080122410Sume    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1081122410Sume    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1082122410Sume    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1083122410Sume    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1084122410Sume    /* round 6: */
1085122410Sume    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1086122410Sume    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1087122410Sume    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1088122410Sume    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1089122410Sume    /* round 7: */
1090122410Sume    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1091122410Sume    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1092122410Sume    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1093122410Sume    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1094122410Sume    /* round 8: */
1095122410Sume    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1096122410Sume    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1097122410Sume    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1098122410Sume    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1099122410Sume    /* round 9: */
1100122410Sume    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1101122410Sume    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1102122410Sume    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1103122410Sume    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1104122410Sume    if (Nr > 10) {
1105122410Sume        /* round 10: */
1106122410Sume        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1107122410Sume        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1108122410Sume        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1109122410Sume        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1110122410Sume        /* round 11: */
1111122410Sume        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1112122410Sume        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1113122410Sume        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1114122410Sume        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1115122410Sume        if (Nr > 12) {
1116122410Sume            /* round 12: */
1117122410Sume            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1118122410Sume            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1119122410Sume            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1120122410Sume            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1121122410Sume            /* round 13: */
1122122410Sume            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1123122410Sume            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1124122410Sume            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1125122410Sume            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1126122410Sume        }
1127122410Sume    }
1128122410Sume	rk += Nr << 2;
1129122410Sume#else  /* !FULL_UNROLL */
1130122410Sume    /*
1131122410Sume     * Nr - 1 full rounds:
1132122410Sume     */
1133122410Sume    r = Nr >> 1;
1134122410Sume    for (;;) {
1135122410Sume        t0 =
1136122410Sume            Td0[(s0 >> 24)       ] ^
1137122410Sume            Td1[(s3 >> 16) & 0xff] ^
1138122410Sume            Td2[(s2 >>  8) & 0xff] ^
1139122410Sume            Td3[(s1      ) & 0xff] ^
1140122410Sume            rk[4];
1141122410Sume        t1 =
1142122410Sume            Td0[(s1 >> 24)       ] ^
1143122410Sume            Td1[(s0 >> 16) & 0xff] ^
1144122410Sume            Td2[(s3 >>  8) & 0xff] ^
1145122410Sume            Td3[(s2      ) & 0xff] ^
1146122410Sume            rk[5];
1147122410Sume        t2 =
1148122410Sume            Td0[(s2 >> 24)       ] ^
1149122410Sume            Td1[(s1 >> 16) & 0xff] ^
1150122410Sume            Td2[(s0 >>  8) & 0xff] ^
1151122410Sume            Td3[(s3      ) & 0xff] ^
1152122410Sume            rk[6];
1153122410Sume        t3 =
1154122410Sume            Td0[(s3 >> 24)       ] ^
1155122410Sume            Td1[(s2 >> 16) & 0xff] ^
1156122410Sume            Td2[(s1 >>  8) & 0xff] ^
1157122410Sume            Td3[(s0      ) & 0xff] ^
1158122410Sume            rk[7];
115967957Skris
1160122410Sume        rk += 8;
1161122410Sume        if (--r == 0) {
1162122410Sume            break;
1163122410Sume        }
116467957Skris
1165122410Sume        s0 =
1166122410Sume            Td0[(t0 >> 24)       ] ^
1167122410Sume            Td1[(t3 >> 16) & 0xff] ^
1168122410Sume            Td2[(t2 >>  8) & 0xff] ^
1169122410Sume            Td3[(t1      ) & 0xff] ^
1170122410Sume            rk[0];
1171122410Sume        s1 =
1172122410Sume            Td0[(t1 >> 24)       ] ^
1173122410Sume            Td1[(t0 >> 16) & 0xff] ^
1174122410Sume            Td2[(t3 >>  8) & 0xff] ^
1175122410Sume            Td3[(t2      ) & 0xff] ^
1176122410Sume            rk[1];
1177122410Sume        s2 =
1178122410Sume            Td0[(t2 >> 24)       ] ^
1179122410Sume            Td1[(t1 >> 16) & 0xff] ^
1180122410Sume            Td2[(t0 >>  8) & 0xff] ^
1181122410Sume            Td3[(t3      ) & 0xff] ^
1182122410Sume            rk[2];
1183122410Sume        s3 =
1184122410Sume            Td0[(t3 >> 24)       ] ^
1185122410Sume            Td1[(t2 >> 16) & 0xff] ^
1186122410Sume            Td2[(t1 >>  8) & 0xff] ^
1187122410Sume            Td3[(t0      ) & 0xff] ^
1188122410Sume            rk[3];
1189122410Sume    }
1190122410Sume#endif /* ?FULL_UNROLL */
1191122410Sume    /*
1192122410Sume	 * apply last round and
1193122410Sume	 * map cipher state to byte array block:
1194122410Sume	 */
1195122410Sume   	s0 =
1196122410Sume   		(Td4[(t0 >> 24)       ] & 0xff000000) ^
1197122410Sume   		(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1198122410Sume   		(Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1199122410Sume   		(Td4[(t1      ) & 0xff] & 0x000000ff) ^
1200122410Sume   		rk[0];
1201122410Sume	PUTU32(pt     , s0);
1202122410Sume   	s1 =
1203122410Sume   		(Td4[(t1 >> 24)       ] & 0xff000000) ^
1204122410Sume   		(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1205122410Sume   		(Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1206122410Sume   		(Td4[(t2      ) & 0xff] & 0x000000ff) ^
1207122410Sume   		rk[1];
1208122410Sume	PUTU32(pt +  4, s1);
1209122410Sume   	s2 =
1210122410Sume   		(Td4[(t2 >> 24)       ] & 0xff000000) ^
1211122410Sume   		(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1212122410Sume   		(Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1213122410Sume   		(Td4[(t3      ) & 0xff] & 0x000000ff) ^
1214122410Sume   		rk[2];
1215122410Sume	PUTU32(pt +  8, s2);
1216122410Sume   	s3 =
1217122410Sume   		(Td4[(t3 >> 24)       ] & 0xff000000) ^
1218122410Sume   		(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1219122410Sume   		(Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1220122410Sume   		(Td4[(t0      ) & 0xff] & 0x000000ff) ^
1221122410Sume   		rk[3];
1222122410Sume	PUTU32(pt + 12, s3);
122367957Skris}
1224