xref: /freebsd/sys/crypto/rijndael/rijndael-alg-fst.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
15129dcfcSHajimu UMEMOTO /*	$KAME: rijndael-alg-fst.c,v 1.10 2003/07/15 10:47:16 itojun Exp $	*/
25129dcfcSHajimu UMEMOTO /**
35129dcfcSHajimu UMEMOTO  * rijndael-alg-fst.c
4fe2869c8SKris Kennaway  *
55129dcfcSHajimu UMEMOTO  * @version 3.0 (December 2000)
6fe2869c8SKris Kennaway  *
75129dcfcSHajimu UMEMOTO  * Optimised ANSI C code for the Rijndael cipher (now AES)
8fe2869c8SKris Kennaway  *
95129dcfcSHajimu UMEMOTO  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
105129dcfcSHajimu UMEMOTO  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
115129dcfcSHajimu UMEMOTO  * @author Paulo Barreto <paulo.barreto@terra.com.br>
125129dcfcSHajimu UMEMOTO  *
135129dcfcSHajimu UMEMOTO  * This code is hereby placed in the public domain.
145129dcfcSHajimu UMEMOTO  *
155129dcfcSHajimu UMEMOTO  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
165129dcfcSHajimu UMEMOTO  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
175129dcfcSHajimu UMEMOTO  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
185129dcfcSHajimu UMEMOTO  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
195129dcfcSHajimu UMEMOTO  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
205129dcfcSHajimu UMEMOTO  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
215129dcfcSHajimu UMEMOTO  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
225129dcfcSHajimu UMEMOTO  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235129dcfcSHajimu UMEMOTO  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
245129dcfcSHajimu UMEMOTO  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
255129dcfcSHajimu UMEMOTO  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26fe2869c8SKris Kennaway  */
27fe2869c8SKris Kennaway #include <sys/cdefs.h>
28*fdafd315SWarner Losh 
29fe2869c8SKris Kennaway #include <sys/types.h>
3033841545SHajimu UMEMOTO #ifdef _KERNEL
3133841545SHajimu UMEMOTO #include <sys/systm.h>
3233841545SHajimu UMEMOTO #else
3333841545SHajimu UMEMOTO #include <string.h>
3412e75535SPawel Jakub Dawidek #include <assert.h>
3512e75535SPawel Jakub Dawidek #define	KASSERT(exp, msg)	assert(exp)
3633841545SHajimu UMEMOTO #endif
375129dcfcSHajimu UMEMOTO 
382dc7d840SHajimu UMEMOTO #include <crypto/rijndael/rijndael.h>
39fe2869c8SKris Kennaway #include <crypto/rijndael/rijndael_local.h>
40fe2869c8SKris Kennaway 
415129dcfcSHajimu UMEMOTO /*
425129dcfcSHajimu UMEMOTO Te0[x] = S [x].[02, 01, 01, 03];
435129dcfcSHajimu UMEMOTO Te1[x] = S [x].[03, 02, 01, 01];
445129dcfcSHajimu UMEMOTO Te2[x] = S [x].[01, 03, 02, 01];
455129dcfcSHajimu UMEMOTO Te3[x] = S [x].[01, 01, 03, 02];
465129dcfcSHajimu UMEMOTO Te4[x] = S [x].[01, 01, 01, 01];
47fe2869c8SKris Kennaway 
485129dcfcSHajimu UMEMOTO Td0[x] = Si[x].[0e, 09, 0d, 0b];
495129dcfcSHajimu UMEMOTO Td1[x] = Si[x].[0b, 0e, 09, 0d];
505129dcfcSHajimu UMEMOTO Td2[x] = Si[x].[0d, 0b, 0e, 09];
515129dcfcSHajimu UMEMOTO Td3[x] = Si[x].[09, 0d, 0b, 0e];
525129dcfcSHajimu UMEMOTO Td4[x] = Si[x].[01, 01, 01, 01];
53fe2869c8SKris Kennaway */
54fe2869c8SKris Kennaway 
555129dcfcSHajimu UMEMOTO static const u32 Te0[256] = {
565129dcfcSHajimu UMEMOTO     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
575129dcfcSHajimu UMEMOTO     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
585129dcfcSHajimu UMEMOTO     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
595129dcfcSHajimu UMEMOTO     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
605129dcfcSHajimu UMEMOTO     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
615129dcfcSHajimu UMEMOTO     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
625129dcfcSHajimu UMEMOTO     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
635129dcfcSHajimu UMEMOTO     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
645129dcfcSHajimu UMEMOTO     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
655129dcfcSHajimu UMEMOTO     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
665129dcfcSHajimu UMEMOTO     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
675129dcfcSHajimu UMEMOTO     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
685129dcfcSHajimu UMEMOTO     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
695129dcfcSHajimu UMEMOTO     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
705129dcfcSHajimu UMEMOTO     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
715129dcfcSHajimu UMEMOTO     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
725129dcfcSHajimu UMEMOTO     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
735129dcfcSHajimu UMEMOTO     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
745129dcfcSHajimu UMEMOTO     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
755129dcfcSHajimu UMEMOTO     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
765129dcfcSHajimu UMEMOTO     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
775129dcfcSHajimu UMEMOTO     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
785129dcfcSHajimu UMEMOTO     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
795129dcfcSHajimu UMEMOTO     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
805129dcfcSHajimu UMEMOTO     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
815129dcfcSHajimu UMEMOTO     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
825129dcfcSHajimu UMEMOTO     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
835129dcfcSHajimu UMEMOTO     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
845129dcfcSHajimu UMEMOTO     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
855129dcfcSHajimu UMEMOTO     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
865129dcfcSHajimu UMEMOTO     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
875129dcfcSHajimu UMEMOTO     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
885129dcfcSHajimu UMEMOTO     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
895129dcfcSHajimu UMEMOTO     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
905129dcfcSHajimu UMEMOTO     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
915129dcfcSHajimu UMEMOTO     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
925129dcfcSHajimu UMEMOTO     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
935129dcfcSHajimu UMEMOTO     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
945129dcfcSHajimu UMEMOTO     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
955129dcfcSHajimu UMEMOTO     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
965129dcfcSHajimu UMEMOTO     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
975129dcfcSHajimu UMEMOTO     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
985129dcfcSHajimu UMEMOTO     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
995129dcfcSHajimu UMEMOTO     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
1005129dcfcSHajimu UMEMOTO     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
1015129dcfcSHajimu UMEMOTO     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
1025129dcfcSHajimu UMEMOTO     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
1035129dcfcSHajimu UMEMOTO     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
1045129dcfcSHajimu UMEMOTO     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
1055129dcfcSHajimu UMEMOTO     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
1065129dcfcSHajimu UMEMOTO     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
1075129dcfcSHajimu UMEMOTO     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
1085129dcfcSHajimu UMEMOTO     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
1095129dcfcSHajimu UMEMOTO     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
1105129dcfcSHajimu UMEMOTO     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
1115129dcfcSHajimu UMEMOTO     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
1125129dcfcSHajimu UMEMOTO     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
1135129dcfcSHajimu UMEMOTO     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
1145129dcfcSHajimu UMEMOTO     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
1155129dcfcSHajimu UMEMOTO     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
1165129dcfcSHajimu UMEMOTO     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
1175129dcfcSHajimu UMEMOTO     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
1185129dcfcSHajimu UMEMOTO     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
1195129dcfcSHajimu UMEMOTO     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
1205129dcfcSHajimu UMEMOTO };
1215129dcfcSHajimu UMEMOTO static const u32 Te1[256] = {
1225129dcfcSHajimu UMEMOTO     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
1235129dcfcSHajimu UMEMOTO     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
1245129dcfcSHajimu UMEMOTO     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
1255129dcfcSHajimu UMEMOTO     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
1265129dcfcSHajimu UMEMOTO     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
1275129dcfcSHajimu UMEMOTO     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
1285129dcfcSHajimu UMEMOTO     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
1295129dcfcSHajimu UMEMOTO     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
1305129dcfcSHajimu UMEMOTO     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
1315129dcfcSHajimu UMEMOTO     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
1325129dcfcSHajimu UMEMOTO     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
1335129dcfcSHajimu UMEMOTO     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
1345129dcfcSHajimu UMEMOTO     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
1355129dcfcSHajimu UMEMOTO     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
1365129dcfcSHajimu UMEMOTO     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
1375129dcfcSHajimu UMEMOTO     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
1385129dcfcSHajimu UMEMOTO     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
1395129dcfcSHajimu UMEMOTO     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
1405129dcfcSHajimu UMEMOTO     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
1415129dcfcSHajimu UMEMOTO     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
1425129dcfcSHajimu UMEMOTO     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
1435129dcfcSHajimu UMEMOTO     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
1445129dcfcSHajimu UMEMOTO     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
1455129dcfcSHajimu UMEMOTO     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
1465129dcfcSHajimu UMEMOTO     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
1475129dcfcSHajimu UMEMOTO     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
1485129dcfcSHajimu UMEMOTO     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
1495129dcfcSHajimu UMEMOTO     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
1505129dcfcSHajimu UMEMOTO     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
1515129dcfcSHajimu UMEMOTO     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
1525129dcfcSHajimu UMEMOTO     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
1535129dcfcSHajimu UMEMOTO     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
1545129dcfcSHajimu UMEMOTO     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
1555129dcfcSHajimu UMEMOTO     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
1565129dcfcSHajimu UMEMOTO     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
1575129dcfcSHajimu UMEMOTO     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
1585129dcfcSHajimu UMEMOTO     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
1595129dcfcSHajimu UMEMOTO     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
1605129dcfcSHajimu UMEMOTO     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
1615129dcfcSHajimu UMEMOTO     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
1625129dcfcSHajimu UMEMOTO     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
1635129dcfcSHajimu UMEMOTO     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
1645129dcfcSHajimu UMEMOTO     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
1655129dcfcSHajimu UMEMOTO     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
1665129dcfcSHajimu UMEMOTO     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
1675129dcfcSHajimu UMEMOTO     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
1685129dcfcSHajimu UMEMOTO     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
1695129dcfcSHajimu UMEMOTO     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
1705129dcfcSHajimu UMEMOTO     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
1715129dcfcSHajimu UMEMOTO     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
1725129dcfcSHajimu UMEMOTO     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
1735129dcfcSHajimu UMEMOTO     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
1745129dcfcSHajimu UMEMOTO     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
1755129dcfcSHajimu UMEMOTO     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
1765129dcfcSHajimu UMEMOTO     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
1775129dcfcSHajimu UMEMOTO     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
1785129dcfcSHajimu UMEMOTO     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
1795129dcfcSHajimu UMEMOTO     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
1805129dcfcSHajimu UMEMOTO     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
1815129dcfcSHajimu UMEMOTO     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
1825129dcfcSHajimu UMEMOTO     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
1835129dcfcSHajimu UMEMOTO     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
1845129dcfcSHajimu UMEMOTO     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
1855129dcfcSHajimu UMEMOTO     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
1865129dcfcSHajimu UMEMOTO };
1875129dcfcSHajimu UMEMOTO static const u32 Te2[256] = {
1885129dcfcSHajimu UMEMOTO     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
1895129dcfcSHajimu UMEMOTO     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
1905129dcfcSHajimu UMEMOTO     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
1915129dcfcSHajimu UMEMOTO     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
1925129dcfcSHajimu UMEMOTO     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
1935129dcfcSHajimu UMEMOTO     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
1945129dcfcSHajimu UMEMOTO     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
1955129dcfcSHajimu UMEMOTO     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
1965129dcfcSHajimu UMEMOTO     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
1975129dcfcSHajimu UMEMOTO     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
1985129dcfcSHajimu UMEMOTO     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
1995129dcfcSHajimu UMEMOTO     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
2005129dcfcSHajimu UMEMOTO     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
2015129dcfcSHajimu UMEMOTO     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
2025129dcfcSHajimu UMEMOTO     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
2035129dcfcSHajimu UMEMOTO     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
2045129dcfcSHajimu UMEMOTO     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
2055129dcfcSHajimu UMEMOTO     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
2065129dcfcSHajimu UMEMOTO     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
2075129dcfcSHajimu UMEMOTO     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
2085129dcfcSHajimu UMEMOTO     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
2095129dcfcSHajimu UMEMOTO     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
2105129dcfcSHajimu UMEMOTO     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
2115129dcfcSHajimu UMEMOTO     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
2125129dcfcSHajimu UMEMOTO     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
2135129dcfcSHajimu UMEMOTO     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
2145129dcfcSHajimu UMEMOTO     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
2155129dcfcSHajimu UMEMOTO     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
2165129dcfcSHajimu UMEMOTO     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
2175129dcfcSHajimu UMEMOTO     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
2185129dcfcSHajimu UMEMOTO     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
2195129dcfcSHajimu UMEMOTO     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
2205129dcfcSHajimu UMEMOTO     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
2215129dcfcSHajimu UMEMOTO     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
2225129dcfcSHajimu UMEMOTO     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
2235129dcfcSHajimu UMEMOTO     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
2245129dcfcSHajimu UMEMOTO     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
2255129dcfcSHajimu UMEMOTO     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
2265129dcfcSHajimu UMEMOTO     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
2275129dcfcSHajimu UMEMOTO     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
2285129dcfcSHajimu UMEMOTO     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
2295129dcfcSHajimu UMEMOTO     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
2305129dcfcSHajimu UMEMOTO     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
2315129dcfcSHajimu UMEMOTO     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
2325129dcfcSHajimu UMEMOTO     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
2335129dcfcSHajimu UMEMOTO     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
2345129dcfcSHajimu UMEMOTO     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
2355129dcfcSHajimu UMEMOTO     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
2365129dcfcSHajimu UMEMOTO     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
2375129dcfcSHajimu UMEMOTO     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
2385129dcfcSHajimu UMEMOTO     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
2395129dcfcSHajimu UMEMOTO     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
2405129dcfcSHajimu UMEMOTO     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
2415129dcfcSHajimu UMEMOTO     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
2425129dcfcSHajimu UMEMOTO     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
2435129dcfcSHajimu UMEMOTO     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
2445129dcfcSHajimu UMEMOTO     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
2455129dcfcSHajimu UMEMOTO     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
2465129dcfcSHajimu UMEMOTO     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
2475129dcfcSHajimu UMEMOTO     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
2485129dcfcSHajimu UMEMOTO     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
2495129dcfcSHajimu UMEMOTO     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
2505129dcfcSHajimu UMEMOTO     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
2515129dcfcSHajimu UMEMOTO     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
2525129dcfcSHajimu UMEMOTO };
2535129dcfcSHajimu UMEMOTO static const u32 Te3[256] = {
254fe2869c8SKris Kennaway 
2555129dcfcSHajimu UMEMOTO     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
2565129dcfcSHajimu UMEMOTO     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
2575129dcfcSHajimu UMEMOTO     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
2585129dcfcSHajimu UMEMOTO     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
2595129dcfcSHajimu UMEMOTO     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
2605129dcfcSHajimu UMEMOTO     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
2615129dcfcSHajimu UMEMOTO     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
2625129dcfcSHajimu UMEMOTO     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
2635129dcfcSHajimu UMEMOTO     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
2645129dcfcSHajimu UMEMOTO     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
2655129dcfcSHajimu UMEMOTO     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
2665129dcfcSHajimu UMEMOTO     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
2675129dcfcSHajimu UMEMOTO     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
2685129dcfcSHajimu UMEMOTO     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
2695129dcfcSHajimu UMEMOTO     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
2705129dcfcSHajimu UMEMOTO     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
2715129dcfcSHajimu UMEMOTO     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
2725129dcfcSHajimu UMEMOTO     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
2735129dcfcSHajimu UMEMOTO     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
2745129dcfcSHajimu UMEMOTO     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
2755129dcfcSHajimu UMEMOTO     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
2765129dcfcSHajimu UMEMOTO     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
2775129dcfcSHajimu UMEMOTO     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
2785129dcfcSHajimu UMEMOTO     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
2795129dcfcSHajimu UMEMOTO     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
2805129dcfcSHajimu UMEMOTO     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
2815129dcfcSHajimu UMEMOTO     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
2825129dcfcSHajimu UMEMOTO     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
2835129dcfcSHajimu UMEMOTO     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
2845129dcfcSHajimu UMEMOTO     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
2855129dcfcSHajimu UMEMOTO     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
2865129dcfcSHajimu UMEMOTO     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
2875129dcfcSHajimu UMEMOTO     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
2885129dcfcSHajimu UMEMOTO     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
2895129dcfcSHajimu UMEMOTO     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
2905129dcfcSHajimu UMEMOTO     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
2915129dcfcSHajimu UMEMOTO     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
2925129dcfcSHajimu UMEMOTO     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
2935129dcfcSHajimu UMEMOTO     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
2945129dcfcSHajimu UMEMOTO     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
2955129dcfcSHajimu UMEMOTO     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
2965129dcfcSHajimu UMEMOTO     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
2975129dcfcSHajimu UMEMOTO     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
2985129dcfcSHajimu UMEMOTO     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
2995129dcfcSHajimu UMEMOTO     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
3005129dcfcSHajimu UMEMOTO     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
3015129dcfcSHajimu UMEMOTO     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
3025129dcfcSHajimu UMEMOTO     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
3035129dcfcSHajimu UMEMOTO     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
3045129dcfcSHajimu UMEMOTO     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
3055129dcfcSHajimu UMEMOTO     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
3065129dcfcSHajimu UMEMOTO     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
3075129dcfcSHajimu UMEMOTO     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
3085129dcfcSHajimu UMEMOTO     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
3095129dcfcSHajimu UMEMOTO     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
3105129dcfcSHajimu UMEMOTO     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
3115129dcfcSHajimu UMEMOTO     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
3125129dcfcSHajimu UMEMOTO     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
3135129dcfcSHajimu UMEMOTO     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
3145129dcfcSHajimu UMEMOTO     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
3155129dcfcSHajimu UMEMOTO     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
3165129dcfcSHajimu UMEMOTO     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
3175129dcfcSHajimu UMEMOTO     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
3185129dcfcSHajimu UMEMOTO     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
3195129dcfcSHajimu UMEMOTO };
3205129dcfcSHajimu UMEMOTO static const u32 Te4[256] = {
3215129dcfcSHajimu UMEMOTO     0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
3225129dcfcSHajimu UMEMOTO     0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
3235129dcfcSHajimu UMEMOTO     0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
3245129dcfcSHajimu UMEMOTO     0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
3255129dcfcSHajimu UMEMOTO     0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
3265129dcfcSHajimu UMEMOTO     0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
3275129dcfcSHajimu UMEMOTO     0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
3285129dcfcSHajimu UMEMOTO     0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
3295129dcfcSHajimu UMEMOTO     0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
3305129dcfcSHajimu UMEMOTO     0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
3315129dcfcSHajimu UMEMOTO     0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
3325129dcfcSHajimu UMEMOTO     0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
3335129dcfcSHajimu UMEMOTO     0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
3345129dcfcSHajimu UMEMOTO     0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
3355129dcfcSHajimu UMEMOTO     0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
3365129dcfcSHajimu UMEMOTO     0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
3375129dcfcSHajimu UMEMOTO     0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
3385129dcfcSHajimu UMEMOTO     0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
3395129dcfcSHajimu UMEMOTO     0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
3405129dcfcSHajimu UMEMOTO     0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
3415129dcfcSHajimu UMEMOTO     0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
3425129dcfcSHajimu UMEMOTO     0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
3435129dcfcSHajimu UMEMOTO     0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
3445129dcfcSHajimu UMEMOTO     0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
3455129dcfcSHajimu UMEMOTO     0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
3465129dcfcSHajimu UMEMOTO     0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
3475129dcfcSHajimu UMEMOTO     0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
3485129dcfcSHajimu UMEMOTO     0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
3495129dcfcSHajimu UMEMOTO     0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
3505129dcfcSHajimu UMEMOTO     0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
3515129dcfcSHajimu UMEMOTO     0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
3525129dcfcSHajimu UMEMOTO     0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
3535129dcfcSHajimu UMEMOTO     0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
3545129dcfcSHajimu UMEMOTO     0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
3555129dcfcSHajimu UMEMOTO     0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
3565129dcfcSHajimu UMEMOTO     0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
3575129dcfcSHajimu UMEMOTO     0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
3585129dcfcSHajimu UMEMOTO     0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
3595129dcfcSHajimu UMEMOTO     0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
3605129dcfcSHajimu UMEMOTO     0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
3615129dcfcSHajimu UMEMOTO     0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
3625129dcfcSHajimu UMEMOTO     0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
3635129dcfcSHajimu UMEMOTO     0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
3645129dcfcSHajimu UMEMOTO     0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
3655129dcfcSHajimu UMEMOTO     0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
3665129dcfcSHajimu UMEMOTO     0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
3675129dcfcSHajimu UMEMOTO     0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
3685129dcfcSHajimu UMEMOTO     0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
3695129dcfcSHajimu UMEMOTO     0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
3705129dcfcSHajimu UMEMOTO     0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
3715129dcfcSHajimu UMEMOTO     0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
3725129dcfcSHajimu UMEMOTO     0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
3735129dcfcSHajimu UMEMOTO     0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
3745129dcfcSHajimu UMEMOTO     0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
3755129dcfcSHajimu UMEMOTO     0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
3765129dcfcSHajimu UMEMOTO     0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
3775129dcfcSHajimu UMEMOTO     0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
3785129dcfcSHajimu UMEMOTO     0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
3795129dcfcSHajimu UMEMOTO     0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
3805129dcfcSHajimu UMEMOTO     0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
3815129dcfcSHajimu UMEMOTO     0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
3825129dcfcSHajimu UMEMOTO     0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
3835129dcfcSHajimu UMEMOTO     0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
3845129dcfcSHajimu UMEMOTO     0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
3855129dcfcSHajimu UMEMOTO };
3865129dcfcSHajimu UMEMOTO static const u32 Td0[256] = {
3875129dcfcSHajimu UMEMOTO     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
3885129dcfcSHajimu UMEMOTO     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
3895129dcfcSHajimu UMEMOTO     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
3905129dcfcSHajimu UMEMOTO     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
3915129dcfcSHajimu UMEMOTO     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
3925129dcfcSHajimu UMEMOTO     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
3935129dcfcSHajimu UMEMOTO     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
3945129dcfcSHajimu UMEMOTO     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
3955129dcfcSHajimu UMEMOTO     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
3965129dcfcSHajimu UMEMOTO     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
3975129dcfcSHajimu UMEMOTO     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
3985129dcfcSHajimu UMEMOTO     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
3995129dcfcSHajimu UMEMOTO     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
4005129dcfcSHajimu UMEMOTO     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
4015129dcfcSHajimu UMEMOTO     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
4025129dcfcSHajimu UMEMOTO     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
4035129dcfcSHajimu UMEMOTO     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
4045129dcfcSHajimu UMEMOTO     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
4055129dcfcSHajimu UMEMOTO     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
4065129dcfcSHajimu UMEMOTO     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
4075129dcfcSHajimu UMEMOTO     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
4085129dcfcSHajimu UMEMOTO     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
4095129dcfcSHajimu UMEMOTO     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
4105129dcfcSHajimu UMEMOTO     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
4115129dcfcSHajimu UMEMOTO     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
4125129dcfcSHajimu UMEMOTO     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
4135129dcfcSHajimu UMEMOTO     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
4145129dcfcSHajimu UMEMOTO     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
4155129dcfcSHajimu UMEMOTO     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
4165129dcfcSHajimu UMEMOTO     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
4175129dcfcSHajimu UMEMOTO     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
4185129dcfcSHajimu UMEMOTO     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
4195129dcfcSHajimu UMEMOTO     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
4205129dcfcSHajimu UMEMOTO     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
4215129dcfcSHajimu UMEMOTO     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
4225129dcfcSHajimu UMEMOTO     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
4235129dcfcSHajimu UMEMOTO     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
4245129dcfcSHajimu UMEMOTO     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
4255129dcfcSHajimu UMEMOTO     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
4265129dcfcSHajimu UMEMOTO     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
4275129dcfcSHajimu UMEMOTO     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
4285129dcfcSHajimu UMEMOTO     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
4295129dcfcSHajimu UMEMOTO     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
4305129dcfcSHajimu UMEMOTO     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
4315129dcfcSHajimu UMEMOTO     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
4325129dcfcSHajimu UMEMOTO     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
4335129dcfcSHajimu UMEMOTO     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
4345129dcfcSHajimu UMEMOTO     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
4355129dcfcSHajimu UMEMOTO     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
4365129dcfcSHajimu UMEMOTO     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
4375129dcfcSHajimu UMEMOTO     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
4385129dcfcSHajimu UMEMOTO     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
4395129dcfcSHajimu UMEMOTO     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
4405129dcfcSHajimu UMEMOTO     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
4415129dcfcSHajimu UMEMOTO     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
4425129dcfcSHajimu UMEMOTO     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
4435129dcfcSHajimu UMEMOTO     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
4445129dcfcSHajimu UMEMOTO     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
4455129dcfcSHajimu UMEMOTO     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
4465129dcfcSHajimu UMEMOTO     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
4475129dcfcSHajimu UMEMOTO     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
4485129dcfcSHajimu UMEMOTO     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
4495129dcfcSHajimu UMEMOTO     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
4505129dcfcSHajimu UMEMOTO     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
4515129dcfcSHajimu UMEMOTO };
4525129dcfcSHajimu UMEMOTO static const u32 Td1[256] = {
4535129dcfcSHajimu UMEMOTO     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
4545129dcfcSHajimu UMEMOTO     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
4555129dcfcSHajimu UMEMOTO     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
4565129dcfcSHajimu UMEMOTO     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
4575129dcfcSHajimu UMEMOTO     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
4585129dcfcSHajimu UMEMOTO     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
4595129dcfcSHajimu UMEMOTO     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
4605129dcfcSHajimu UMEMOTO     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
4615129dcfcSHajimu UMEMOTO     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
4625129dcfcSHajimu UMEMOTO     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
4635129dcfcSHajimu UMEMOTO     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
4645129dcfcSHajimu UMEMOTO     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
4655129dcfcSHajimu UMEMOTO     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
4665129dcfcSHajimu UMEMOTO     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
4675129dcfcSHajimu UMEMOTO     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
4685129dcfcSHajimu UMEMOTO     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
4695129dcfcSHajimu UMEMOTO     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
4705129dcfcSHajimu UMEMOTO     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
4715129dcfcSHajimu UMEMOTO     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
4725129dcfcSHajimu UMEMOTO     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
4735129dcfcSHajimu UMEMOTO     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
4745129dcfcSHajimu UMEMOTO     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
4755129dcfcSHajimu UMEMOTO     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
4765129dcfcSHajimu UMEMOTO     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
4775129dcfcSHajimu UMEMOTO     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
4785129dcfcSHajimu UMEMOTO     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
4795129dcfcSHajimu UMEMOTO     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
4805129dcfcSHajimu UMEMOTO     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
4815129dcfcSHajimu UMEMOTO     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
4825129dcfcSHajimu UMEMOTO     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
4835129dcfcSHajimu UMEMOTO     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
4845129dcfcSHajimu UMEMOTO     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
4855129dcfcSHajimu UMEMOTO     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
4865129dcfcSHajimu UMEMOTO     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
4875129dcfcSHajimu UMEMOTO     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
4885129dcfcSHajimu UMEMOTO     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
4895129dcfcSHajimu UMEMOTO     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
4905129dcfcSHajimu UMEMOTO     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
4915129dcfcSHajimu UMEMOTO     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
4925129dcfcSHajimu UMEMOTO     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
4935129dcfcSHajimu UMEMOTO     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
4945129dcfcSHajimu UMEMOTO     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
4955129dcfcSHajimu UMEMOTO     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
4965129dcfcSHajimu UMEMOTO     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
4975129dcfcSHajimu UMEMOTO     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
4985129dcfcSHajimu UMEMOTO     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
4995129dcfcSHajimu UMEMOTO     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
5005129dcfcSHajimu UMEMOTO     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
5015129dcfcSHajimu UMEMOTO     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
5025129dcfcSHajimu UMEMOTO     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
5035129dcfcSHajimu UMEMOTO     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
5045129dcfcSHajimu UMEMOTO     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
5055129dcfcSHajimu UMEMOTO     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
5065129dcfcSHajimu UMEMOTO     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
5075129dcfcSHajimu UMEMOTO     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
5085129dcfcSHajimu UMEMOTO     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
5095129dcfcSHajimu UMEMOTO     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
5105129dcfcSHajimu UMEMOTO     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
5115129dcfcSHajimu UMEMOTO     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
5125129dcfcSHajimu UMEMOTO     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
5135129dcfcSHajimu UMEMOTO     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
5145129dcfcSHajimu UMEMOTO     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
5155129dcfcSHajimu UMEMOTO     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
5165129dcfcSHajimu UMEMOTO     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
5175129dcfcSHajimu UMEMOTO };
5185129dcfcSHajimu UMEMOTO static const u32 Td2[256] = {
5195129dcfcSHajimu UMEMOTO     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
5205129dcfcSHajimu UMEMOTO     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
5215129dcfcSHajimu UMEMOTO     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
5225129dcfcSHajimu UMEMOTO     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
5235129dcfcSHajimu UMEMOTO     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
5245129dcfcSHajimu UMEMOTO     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
5255129dcfcSHajimu UMEMOTO     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
5265129dcfcSHajimu UMEMOTO     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
5275129dcfcSHajimu UMEMOTO     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
5285129dcfcSHajimu UMEMOTO     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
5295129dcfcSHajimu UMEMOTO     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
5305129dcfcSHajimu UMEMOTO     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
5315129dcfcSHajimu UMEMOTO     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
5325129dcfcSHajimu UMEMOTO     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
5335129dcfcSHajimu UMEMOTO     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
5345129dcfcSHajimu UMEMOTO     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
5355129dcfcSHajimu UMEMOTO     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
5365129dcfcSHajimu UMEMOTO     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
5375129dcfcSHajimu UMEMOTO     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
5385129dcfcSHajimu UMEMOTO     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
5399132d507SHajimu UMEMOTO 
5405129dcfcSHajimu UMEMOTO     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
5415129dcfcSHajimu UMEMOTO     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
5425129dcfcSHajimu UMEMOTO     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
5435129dcfcSHajimu UMEMOTO     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
5445129dcfcSHajimu UMEMOTO     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
5455129dcfcSHajimu UMEMOTO     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
5465129dcfcSHajimu UMEMOTO     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
5475129dcfcSHajimu UMEMOTO     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
5485129dcfcSHajimu UMEMOTO     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
5495129dcfcSHajimu UMEMOTO     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
5505129dcfcSHajimu UMEMOTO     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
5515129dcfcSHajimu UMEMOTO     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
5525129dcfcSHajimu UMEMOTO     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
5535129dcfcSHajimu UMEMOTO     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
5545129dcfcSHajimu UMEMOTO     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
5555129dcfcSHajimu UMEMOTO     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
5565129dcfcSHajimu UMEMOTO     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
5575129dcfcSHajimu UMEMOTO     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
5585129dcfcSHajimu UMEMOTO     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
5595129dcfcSHajimu UMEMOTO     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
5605129dcfcSHajimu UMEMOTO     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
5615129dcfcSHajimu UMEMOTO     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
5625129dcfcSHajimu UMEMOTO     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
5635129dcfcSHajimu UMEMOTO     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
5645129dcfcSHajimu UMEMOTO     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
5655129dcfcSHajimu UMEMOTO     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
5665129dcfcSHajimu UMEMOTO     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
5675129dcfcSHajimu UMEMOTO     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
5685129dcfcSHajimu UMEMOTO     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
5695129dcfcSHajimu UMEMOTO     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
5705129dcfcSHajimu UMEMOTO     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
5715129dcfcSHajimu UMEMOTO     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
5725129dcfcSHajimu UMEMOTO     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
5735129dcfcSHajimu UMEMOTO     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
5745129dcfcSHajimu UMEMOTO     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
5755129dcfcSHajimu UMEMOTO     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
5765129dcfcSHajimu UMEMOTO     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
5775129dcfcSHajimu UMEMOTO     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
5785129dcfcSHajimu UMEMOTO     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
5795129dcfcSHajimu UMEMOTO     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
5805129dcfcSHajimu UMEMOTO     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
5815129dcfcSHajimu UMEMOTO     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
5825129dcfcSHajimu UMEMOTO     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
5835129dcfcSHajimu UMEMOTO     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
5845129dcfcSHajimu UMEMOTO };
5855129dcfcSHajimu UMEMOTO static const u32 Td3[256] = {
5865129dcfcSHajimu UMEMOTO     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
5875129dcfcSHajimu UMEMOTO     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
5885129dcfcSHajimu UMEMOTO     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
5895129dcfcSHajimu UMEMOTO     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
5905129dcfcSHajimu UMEMOTO     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
5915129dcfcSHajimu UMEMOTO     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
5925129dcfcSHajimu UMEMOTO     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
5935129dcfcSHajimu UMEMOTO     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
5945129dcfcSHajimu UMEMOTO     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
5955129dcfcSHajimu UMEMOTO     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
5965129dcfcSHajimu UMEMOTO     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
5975129dcfcSHajimu UMEMOTO     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
5985129dcfcSHajimu UMEMOTO     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
5995129dcfcSHajimu UMEMOTO     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
6005129dcfcSHajimu UMEMOTO     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
6015129dcfcSHajimu UMEMOTO     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
6025129dcfcSHajimu UMEMOTO     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
6035129dcfcSHajimu UMEMOTO     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
6045129dcfcSHajimu UMEMOTO     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
6055129dcfcSHajimu UMEMOTO     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
6065129dcfcSHajimu UMEMOTO     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
6075129dcfcSHajimu UMEMOTO     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
6085129dcfcSHajimu UMEMOTO     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
6095129dcfcSHajimu UMEMOTO     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
6105129dcfcSHajimu UMEMOTO     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
6115129dcfcSHajimu UMEMOTO     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
6125129dcfcSHajimu UMEMOTO     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
6135129dcfcSHajimu UMEMOTO     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
6145129dcfcSHajimu UMEMOTO     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
6155129dcfcSHajimu UMEMOTO     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
6165129dcfcSHajimu UMEMOTO     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
6175129dcfcSHajimu UMEMOTO     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
6185129dcfcSHajimu UMEMOTO     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
6195129dcfcSHajimu UMEMOTO     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
6205129dcfcSHajimu UMEMOTO     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
6215129dcfcSHajimu UMEMOTO     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
6225129dcfcSHajimu UMEMOTO     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
6235129dcfcSHajimu UMEMOTO     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
6245129dcfcSHajimu UMEMOTO     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
6255129dcfcSHajimu UMEMOTO     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
6265129dcfcSHajimu UMEMOTO     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
6275129dcfcSHajimu UMEMOTO     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
6285129dcfcSHajimu UMEMOTO     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
6295129dcfcSHajimu UMEMOTO     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
6305129dcfcSHajimu UMEMOTO     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
6315129dcfcSHajimu UMEMOTO     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
6325129dcfcSHajimu UMEMOTO     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
6335129dcfcSHajimu UMEMOTO     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
6345129dcfcSHajimu UMEMOTO     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
6355129dcfcSHajimu UMEMOTO     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
6365129dcfcSHajimu UMEMOTO     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
6375129dcfcSHajimu UMEMOTO     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
6385129dcfcSHajimu UMEMOTO     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
6395129dcfcSHajimu UMEMOTO     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
6405129dcfcSHajimu UMEMOTO     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
6415129dcfcSHajimu UMEMOTO     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
6425129dcfcSHajimu UMEMOTO     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
6435129dcfcSHajimu UMEMOTO     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
6445129dcfcSHajimu UMEMOTO     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
6455129dcfcSHajimu UMEMOTO     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
6465129dcfcSHajimu UMEMOTO     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
6475129dcfcSHajimu UMEMOTO     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
6485129dcfcSHajimu UMEMOTO     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
6495129dcfcSHajimu UMEMOTO     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
6505129dcfcSHajimu UMEMOTO };
6515129dcfcSHajimu UMEMOTO static const u32 Td4[256] = {
6525129dcfcSHajimu UMEMOTO     0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
6535129dcfcSHajimu UMEMOTO     0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
6545129dcfcSHajimu UMEMOTO     0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
6555129dcfcSHajimu UMEMOTO     0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
6565129dcfcSHajimu UMEMOTO     0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
6575129dcfcSHajimu UMEMOTO     0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
6585129dcfcSHajimu UMEMOTO     0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
6595129dcfcSHajimu UMEMOTO     0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
6605129dcfcSHajimu UMEMOTO     0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
6615129dcfcSHajimu UMEMOTO     0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
6625129dcfcSHajimu UMEMOTO     0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
6635129dcfcSHajimu UMEMOTO     0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
6645129dcfcSHajimu UMEMOTO     0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
6655129dcfcSHajimu UMEMOTO     0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
6665129dcfcSHajimu UMEMOTO     0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
6675129dcfcSHajimu UMEMOTO     0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
6685129dcfcSHajimu UMEMOTO     0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
6695129dcfcSHajimu UMEMOTO     0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
6705129dcfcSHajimu UMEMOTO     0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
6715129dcfcSHajimu UMEMOTO     0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
6725129dcfcSHajimu UMEMOTO     0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
6735129dcfcSHajimu UMEMOTO     0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
6745129dcfcSHajimu UMEMOTO     0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
6755129dcfcSHajimu UMEMOTO     0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
6765129dcfcSHajimu UMEMOTO     0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
6775129dcfcSHajimu UMEMOTO     0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
6785129dcfcSHajimu UMEMOTO     0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
6795129dcfcSHajimu UMEMOTO     0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
6805129dcfcSHajimu UMEMOTO     0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
6815129dcfcSHajimu UMEMOTO     0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
6825129dcfcSHajimu UMEMOTO     0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
6835129dcfcSHajimu UMEMOTO     0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
6845129dcfcSHajimu UMEMOTO     0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
6855129dcfcSHajimu UMEMOTO     0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
6865129dcfcSHajimu UMEMOTO     0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
6875129dcfcSHajimu UMEMOTO     0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
6885129dcfcSHajimu UMEMOTO     0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
6895129dcfcSHajimu UMEMOTO     0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
6905129dcfcSHajimu UMEMOTO     0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
6915129dcfcSHajimu UMEMOTO     0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
6925129dcfcSHajimu UMEMOTO     0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
6935129dcfcSHajimu UMEMOTO     0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
6945129dcfcSHajimu UMEMOTO     0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
6955129dcfcSHajimu UMEMOTO     0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
6965129dcfcSHajimu UMEMOTO     0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
6975129dcfcSHajimu UMEMOTO     0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
6985129dcfcSHajimu UMEMOTO     0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
6995129dcfcSHajimu UMEMOTO     0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
7005129dcfcSHajimu UMEMOTO     0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
7015129dcfcSHajimu UMEMOTO     0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
7025129dcfcSHajimu UMEMOTO     0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
7035129dcfcSHajimu UMEMOTO     0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
7045129dcfcSHajimu UMEMOTO     0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
7055129dcfcSHajimu UMEMOTO     0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
7065129dcfcSHajimu UMEMOTO     0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
7075129dcfcSHajimu UMEMOTO     0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
7085129dcfcSHajimu UMEMOTO     0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
7095129dcfcSHajimu UMEMOTO     0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
7105129dcfcSHajimu UMEMOTO     0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
7115129dcfcSHajimu UMEMOTO     0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
7125129dcfcSHajimu UMEMOTO     0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
7135129dcfcSHajimu UMEMOTO     0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
7145129dcfcSHajimu UMEMOTO     0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
7155129dcfcSHajimu UMEMOTO     0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
7165129dcfcSHajimu UMEMOTO };
7175129dcfcSHajimu UMEMOTO static const u32 rcon[] = {
7185129dcfcSHajimu UMEMOTO 	0x01000000, 0x02000000, 0x04000000, 0x08000000,
7195129dcfcSHajimu UMEMOTO 	0x10000000, 0x20000000, 0x40000000, 0x80000000,
7205129dcfcSHajimu UMEMOTO 	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
7215129dcfcSHajimu UMEMOTO };
7229132d507SHajimu UMEMOTO 
7235129dcfcSHajimu UMEMOTO #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
7249132d507SHajimu UMEMOTO 
7255129dcfcSHajimu UMEMOTO #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
7265129dcfcSHajimu UMEMOTO #define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
7279132d507SHajimu UMEMOTO 
7285129dcfcSHajimu UMEMOTO /**
7295129dcfcSHajimu UMEMOTO  * Expand the cipher key into the encryption key schedule.
7305129dcfcSHajimu UMEMOTO  *
7315129dcfcSHajimu UMEMOTO  * @return	the number of rounds for the given cipher key size.
7325129dcfcSHajimu UMEMOTO  */
rijndaelKeySetupEnc(u32 rk[],const u8 cipherKey[],int keyBits)7335129dcfcSHajimu UMEMOTO int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {
7345129dcfcSHajimu UMEMOTO    	int i = 0;
7355129dcfcSHajimu UMEMOTO 	u32 temp;
7369132d507SHajimu UMEMOTO 
73736c51ae0SPawel Jakub Dawidek 	KASSERT(keyBits == 128 || keyBits == 192 || keyBits == 256,
73836c51ae0SPawel Jakub Dawidek 	    ("Invalid key size (%d).", keyBits));
7395129dcfcSHajimu UMEMOTO 	rk[0] = GETU32(cipherKey     );
7405129dcfcSHajimu UMEMOTO 	rk[1] = GETU32(cipherKey +  4);
7415129dcfcSHajimu UMEMOTO 	rk[2] = GETU32(cipherKey +  8);
7425129dcfcSHajimu UMEMOTO 	rk[3] = GETU32(cipherKey + 12);
7435129dcfcSHajimu UMEMOTO 	if (keyBits == 128) {
7445129dcfcSHajimu UMEMOTO 		for (;;) {
7455129dcfcSHajimu UMEMOTO 			temp  = rk[3];
7465129dcfcSHajimu UMEMOTO 			rk[4] = rk[0] ^
7475129dcfcSHajimu UMEMOTO 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
7485129dcfcSHajimu UMEMOTO 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
7495129dcfcSHajimu UMEMOTO 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
7505129dcfcSHajimu UMEMOTO 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
7515129dcfcSHajimu UMEMOTO 				rcon[i];
7525129dcfcSHajimu UMEMOTO 			rk[5] = rk[1] ^ rk[4];
7535129dcfcSHajimu UMEMOTO 			rk[6] = rk[2] ^ rk[5];
7545129dcfcSHajimu UMEMOTO 			rk[7] = rk[3] ^ rk[6];
7555129dcfcSHajimu UMEMOTO 			if (++i == 10) {
7565129dcfcSHajimu UMEMOTO 				return 10;
7575129dcfcSHajimu UMEMOTO 			}
7585129dcfcSHajimu UMEMOTO 			rk += 4;
7595129dcfcSHajimu UMEMOTO 		}
7605129dcfcSHajimu UMEMOTO 	}
7615129dcfcSHajimu UMEMOTO 	rk[4] = GETU32(cipherKey + 16);
7625129dcfcSHajimu UMEMOTO 	rk[5] = GETU32(cipherKey + 20);
7635129dcfcSHajimu UMEMOTO 	if (keyBits == 192) {
7645129dcfcSHajimu UMEMOTO 		for (;;) {
7655129dcfcSHajimu UMEMOTO 			temp = rk[ 5];
7665129dcfcSHajimu UMEMOTO 			rk[ 6] = rk[ 0] ^
7675129dcfcSHajimu UMEMOTO 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
7685129dcfcSHajimu UMEMOTO 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
7695129dcfcSHajimu UMEMOTO 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
7705129dcfcSHajimu UMEMOTO 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
7715129dcfcSHajimu UMEMOTO 				rcon[i];
7725129dcfcSHajimu UMEMOTO 			rk[ 7] = rk[ 1] ^ rk[ 6];
7735129dcfcSHajimu UMEMOTO 			rk[ 8] = rk[ 2] ^ rk[ 7];
7745129dcfcSHajimu UMEMOTO 			rk[ 9] = rk[ 3] ^ rk[ 8];
7755129dcfcSHajimu UMEMOTO 			if (++i == 8) {
7765129dcfcSHajimu UMEMOTO 				return 12;
7775129dcfcSHajimu UMEMOTO 			}
7785129dcfcSHajimu UMEMOTO 			rk[10] = rk[ 4] ^ rk[ 9];
7795129dcfcSHajimu UMEMOTO 			rk[11] = rk[ 5] ^ rk[10];
7805129dcfcSHajimu UMEMOTO 			rk += 6;
7815129dcfcSHajimu UMEMOTO 		}
7825129dcfcSHajimu UMEMOTO 	}
7835129dcfcSHajimu UMEMOTO 	rk[6] = GETU32(cipherKey + 24);
7845129dcfcSHajimu UMEMOTO 	rk[7] = GETU32(cipherKey + 28);
7855129dcfcSHajimu UMEMOTO 	if (keyBits == 256) {
7865129dcfcSHajimu UMEMOTO         for (;;) {
7875129dcfcSHajimu UMEMOTO         	temp = rk[ 7];
7885129dcfcSHajimu UMEMOTO         	rk[ 8] = rk[ 0] ^
7895129dcfcSHajimu UMEMOTO         		(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
7905129dcfcSHajimu UMEMOTO         		(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
7915129dcfcSHajimu UMEMOTO         		(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
7925129dcfcSHajimu UMEMOTO         		(Te4[(temp >> 24)       ] & 0x000000ff) ^
7935129dcfcSHajimu UMEMOTO         		rcon[i];
7945129dcfcSHajimu UMEMOTO         	rk[ 9] = rk[ 1] ^ rk[ 8];
7955129dcfcSHajimu UMEMOTO         	rk[10] = rk[ 2] ^ rk[ 9];
7965129dcfcSHajimu UMEMOTO         	rk[11] = rk[ 3] ^ rk[10];
7975129dcfcSHajimu UMEMOTO 			if (++i == 7) {
7985129dcfcSHajimu UMEMOTO 				return 14;
7995129dcfcSHajimu UMEMOTO 			}
8005129dcfcSHajimu UMEMOTO         	temp = rk[11];
8015129dcfcSHajimu UMEMOTO         	rk[12] = rk[ 4] ^
8025129dcfcSHajimu UMEMOTO         		(Te4[(temp >> 24)       ] & 0xff000000) ^
8035129dcfcSHajimu UMEMOTO         		(Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
8045129dcfcSHajimu UMEMOTO         		(Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
8055129dcfcSHajimu UMEMOTO         		(Te4[(temp      ) & 0xff] & 0x000000ff);
8065129dcfcSHajimu UMEMOTO         	rk[13] = rk[ 5] ^ rk[12];
8075129dcfcSHajimu UMEMOTO         	rk[14] = rk[ 6] ^ rk[13];
8085129dcfcSHajimu UMEMOTO         	rk[15] = rk[ 7] ^ rk[14];
8099132d507SHajimu UMEMOTO 
8105129dcfcSHajimu UMEMOTO 			rk += 8;
8115129dcfcSHajimu UMEMOTO         }
812fe2869c8SKris Kennaway 	}
813fe2869c8SKris Kennaway 	return 0;
814fe2869c8SKris Kennaway }
815fe2869c8SKris Kennaway 
816fe2869c8SKris Kennaway /**
8175129dcfcSHajimu UMEMOTO  * Expand the cipher key into the decryption key schedule.
8185129dcfcSHajimu UMEMOTO  *
8195129dcfcSHajimu UMEMOTO  * @return	the number of rounds for the given cipher key size.
820fe2869c8SKris Kennaway  */
rijndaelKeySetupDec(u32 rk[],const u8 cipherKey[],int keyBits)8215129dcfcSHajimu UMEMOTO int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {
8225129dcfcSHajimu UMEMOTO 	int Nr, i, j;
8235129dcfcSHajimu UMEMOTO 	u32 temp;
8245129dcfcSHajimu UMEMOTO 
8255129dcfcSHajimu UMEMOTO 	/* expand the cipher key: */
8265129dcfcSHajimu UMEMOTO 	Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
8275129dcfcSHajimu UMEMOTO 	/* invert the order of the round keys: */
8285129dcfcSHajimu UMEMOTO 	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
8295129dcfcSHajimu UMEMOTO 		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
8305129dcfcSHajimu UMEMOTO 		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
8315129dcfcSHajimu UMEMOTO 		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
8325129dcfcSHajimu UMEMOTO 		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
8335129dcfcSHajimu UMEMOTO 	}
8345129dcfcSHajimu UMEMOTO 	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
8355129dcfcSHajimu UMEMOTO 	for (i = 1; i < Nr; i++) {
8365129dcfcSHajimu UMEMOTO 		rk += 4;
8375129dcfcSHajimu UMEMOTO 		rk[0] =
8385129dcfcSHajimu UMEMOTO 			Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
8395129dcfcSHajimu UMEMOTO 			Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
8405129dcfcSHajimu UMEMOTO 			Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
8415129dcfcSHajimu UMEMOTO 			Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
8425129dcfcSHajimu UMEMOTO 		rk[1] =
8435129dcfcSHajimu UMEMOTO 			Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
8445129dcfcSHajimu UMEMOTO 			Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
8455129dcfcSHajimu UMEMOTO 			Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
8465129dcfcSHajimu UMEMOTO 			Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
8475129dcfcSHajimu UMEMOTO 		rk[2] =
8485129dcfcSHajimu UMEMOTO 			Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
8495129dcfcSHajimu UMEMOTO 			Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
8505129dcfcSHajimu UMEMOTO 			Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
8515129dcfcSHajimu UMEMOTO 			Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
8525129dcfcSHajimu UMEMOTO 		rk[3] =
8535129dcfcSHajimu UMEMOTO 			Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
8545129dcfcSHajimu UMEMOTO 			Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
8555129dcfcSHajimu UMEMOTO 			Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
8565129dcfcSHajimu UMEMOTO 			Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
8575129dcfcSHajimu UMEMOTO 	}
8585129dcfcSHajimu UMEMOTO 	return Nr;
8595129dcfcSHajimu UMEMOTO }
8605129dcfcSHajimu UMEMOTO 
rijndaelEncrypt(const u32 rk[],int Nr,const u8 pt[16],u8 ct[16])8615129dcfcSHajimu UMEMOTO void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) {
8625129dcfcSHajimu UMEMOTO 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
8635129dcfcSHajimu UMEMOTO #ifndef FULL_UNROLL
864fe2869c8SKris Kennaway     int r;
8655129dcfcSHajimu UMEMOTO #endif /* ?FULL_UNROLL */
86633841545SHajimu UMEMOTO 
8675129dcfcSHajimu UMEMOTO     /*
8685129dcfcSHajimu UMEMOTO 	 * map byte array block to cipher state
8695129dcfcSHajimu UMEMOTO 	 * and add initial round key:
870fe2869c8SKris Kennaway 	 */
8715129dcfcSHajimu UMEMOTO 	s0 = GETU32(pt     ) ^ rk[0];
8725129dcfcSHajimu UMEMOTO 	s1 = GETU32(pt +  4) ^ rk[1];
8735129dcfcSHajimu UMEMOTO 	s2 = GETU32(pt +  8) ^ rk[2];
8745129dcfcSHajimu UMEMOTO 	s3 = GETU32(pt + 12) ^ rk[3];
8755129dcfcSHajimu UMEMOTO #ifdef FULL_UNROLL
8765129dcfcSHajimu UMEMOTO     /* round 1: */
8775129dcfcSHajimu UMEMOTO    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
8785129dcfcSHajimu UMEMOTO    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
8795129dcfcSHajimu UMEMOTO    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
8805129dcfcSHajimu UMEMOTO    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
8815129dcfcSHajimu UMEMOTO    	/* round 2: */
8825129dcfcSHajimu UMEMOTO    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
8835129dcfcSHajimu UMEMOTO    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
8845129dcfcSHajimu UMEMOTO    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
8855129dcfcSHajimu UMEMOTO    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
8865129dcfcSHajimu UMEMOTO     /* round 3: */
8875129dcfcSHajimu UMEMOTO    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
8885129dcfcSHajimu UMEMOTO    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
8895129dcfcSHajimu UMEMOTO    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
8905129dcfcSHajimu UMEMOTO    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
8915129dcfcSHajimu UMEMOTO    	/* round 4: */
8925129dcfcSHajimu UMEMOTO    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
8935129dcfcSHajimu UMEMOTO    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
8945129dcfcSHajimu UMEMOTO    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
8955129dcfcSHajimu UMEMOTO    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
8965129dcfcSHajimu UMEMOTO     /* round 5: */
8975129dcfcSHajimu UMEMOTO    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
8985129dcfcSHajimu UMEMOTO    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
8995129dcfcSHajimu UMEMOTO    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
9005129dcfcSHajimu UMEMOTO    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
9015129dcfcSHajimu UMEMOTO    	/* round 6: */
9025129dcfcSHajimu UMEMOTO    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
9035129dcfcSHajimu UMEMOTO    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
9045129dcfcSHajimu UMEMOTO    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
9055129dcfcSHajimu UMEMOTO    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
9065129dcfcSHajimu UMEMOTO     /* round 7: */
9075129dcfcSHajimu UMEMOTO    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
9085129dcfcSHajimu UMEMOTO    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
9095129dcfcSHajimu UMEMOTO    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
9105129dcfcSHajimu UMEMOTO    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
9115129dcfcSHajimu UMEMOTO    	/* round 8: */
9125129dcfcSHajimu UMEMOTO    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
9135129dcfcSHajimu UMEMOTO    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
9145129dcfcSHajimu UMEMOTO    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
9155129dcfcSHajimu UMEMOTO    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
9165129dcfcSHajimu UMEMOTO     /* round 9: */
9175129dcfcSHajimu UMEMOTO    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
9185129dcfcSHajimu UMEMOTO    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
9195129dcfcSHajimu UMEMOTO    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
9205129dcfcSHajimu UMEMOTO    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
9215129dcfcSHajimu UMEMOTO     if (Nr > 10) {
9225129dcfcSHajimu UMEMOTO         /* round 10: */
9235129dcfcSHajimu UMEMOTO         s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
9245129dcfcSHajimu UMEMOTO         s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
9255129dcfcSHajimu UMEMOTO         s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
9265129dcfcSHajimu UMEMOTO         s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
9275129dcfcSHajimu UMEMOTO         /* round 11: */
9285129dcfcSHajimu UMEMOTO         t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
9295129dcfcSHajimu UMEMOTO         t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
9305129dcfcSHajimu UMEMOTO         t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
9315129dcfcSHajimu UMEMOTO         t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
9325129dcfcSHajimu UMEMOTO         if (Nr > 12) {
9335129dcfcSHajimu UMEMOTO             /* round 12: */
9345129dcfcSHajimu UMEMOTO             s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
9355129dcfcSHajimu UMEMOTO             s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
9365129dcfcSHajimu UMEMOTO             s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
9375129dcfcSHajimu UMEMOTO             s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
9385129dcfcSHajimu UMEMOTO             /* round 13: */
9395129dcfcSHajimu UMEMOTO             t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
9405129dcfcSHajimu UMEMOTO             t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
9415129dcfcSHajimu UMEMOTO             t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
9425129dcfcSHajimu UMEMOTO             t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
9435129dcfcSHajimu UMEMOTO         }
9445129dcfcSHajimu UMEMOTO     }
9455129dcfcSHajimu UMEMOTO     rk += Nr << 2;
9465129dcfcSHajimu UMEMOTO #else  /* !FULL_UNROLL */
9475129dcfcSHajimu UMEMOTO     /*
9485129dcfcSHajimu UMEMOTO 	 * Nr - 1 full rounds:
9495129dcfcSHajimu UMEMOTO 	 */
9505129dcfcSHajimu UMEMOTO     r = Nr >> 1;
9515129dcfcSHajimu UMEMOTO     for (;;) {
9525129dcfcSHajimu UMEMOTO         t0 =
9535129dcfcSHajimu UMEMOTO             Te0[(s0 >> 24)       ] ^
9545129dcfcSHajimu UMEMOTO             Te1[(s1 >> 16) & 0xff] ^
9555129dcfcSHajimu UMEMOTO             Te2[(s2 >>  8) & 0xff] ^
9565129dcfcSHajimu UMEMOTO             Te3[(s3      ) & 0xff] ^
9575129dcfcSHajimu UMEMOTO             rk[4];
9585129dcfcSHajimu UMEMOTO         t1 =
9595129dcfcSHajimu UMEMOTO             Te0[(s1 >> 24)       ] ^
9605129dcfcSHajimu UMEMOTO             Te1[(s2 >> 16) & 0xff] ^
9615129dcfcSHajimu UMEMOTO             Te2[(s3 >>  8) & 0xff] ^
9625129dcfcSHajimu UMEMOTO             Te3[(s0      ) & 0xff] ^
9635129dcfcSHajimu UMEMOTO             rk[5];
9645129dcfcSHajimu UMEMOTO         t2 =
9655129dcfcSHajimu UMEMOTO             Te0[(s2 >> 24)       ] ^
9665129dcfcSHajimu UMEMOTO             Te1[(s3 >> 16) & 0xff] ^
9675129dcfcSHajimu UMEMOTO             Te2[(s0 >>  8) & 0xff] ^
9685129dcfcSHajimu UMEMOTO             Te3[(s1      ) & 0xff] ^
9695129dcfcSHajimu UMEMOTO             rk[6];
9705129dcfcSHajimu UMEMOTO         t3 =
9715129dcfcSHajimu UMEMOTO             Te0[(s3 >> 24)       ] ^
9725129dcfcSHajimu UMEMOTO             Te1[(s0 >> 16) & 0xff] ^
9735129dcfcSHajimu UMEMOTO             Te2[(s1 >>  8) & 0xff] ^
9745129dcfcSHajimu UMEMOTO             Te3[(s2      ) & 0xff] ^
9755129dcfcSHajimu UMEMOTO             rk[7];
9765129dcfcSHajimu UMEMOTO 
9775129dcfcSHajimu UMEMOTO         rk += 8;
9785129dcfcSHajimu UMEMOTO         if (--r == 0) {
9795129dcfcSHajimu UMEMOTO             break;
9805129dcfcSHajimu UMEMOTO         }
9815129dcfcSHajimu UMEMOTO 
9825129dcfcSHajimu UMEMOTO         s0 =
9835129dcfcSHajimu UMEMOTO             Te0[(t0 >> 24)       ] ^
9845129dcfcSHajimu UMEMOTO             Te1[(t1 >> 16) & 0xff] ^
9855129dcfcSHajimu UMEMOTO             Te2[(t2 >>  8) & 0xff] ^
9865129dcfcSHajimu UMEMOTO             Te3[(t3      ) & 0xff] ^
9875129dcfcSHajimu UMEMOTO             rk[0];
9885129dcfcSHajimu UMEMOTO         s1 =
9895129dcfcSHajimu UMEMOTO             Te0[(t1 >> 24)       ] ^
9905129dcfcSHajimu UMEMOTO             Te1[(t2 >> 16) & 0xff] ^
9915129dcfcSHajimu UMEMOTO             Te2[(t3 >>  8) & 0xff] ^
9925129dcfcSHajimu UMEMOTO             Te3[(t0      ) & 0xff] ^
9935129dcfcSHajimu UMEMOTO             rk[1];
9945129dcfcSHajimu UMEMOTO         s2 =
9955129dcfcSHajimu UMEMOTO             Te0[(t2 >> 24)       ] ^
9965129dcfcSHajimu UMEMOTO             Te1[(t3 >> 16) & 0xff] ^
9975129dcfcSHajimu UMEMOTO             Te2[(t0 >>  8) & 0xff] ^
9985129dcfcSHajimu UMEMOTO             Te3[(t1      ) & 0xff] ^
9995129dcfcSHajimu UMEMOTO             rk[2];
10005129dcfcSHajimu UMEMOTO         s3 =
10015129dcfcSHajimu UMEMOTO             Te0[(t3 >> 24)       ] ^
10025129dcfcSHajimu UMEMOTO             Te1[(t0 >> 16) & 0xff] ^
10035129dcfcSHajimu UMEMOTO             Te2[(t1 >>  8) & 0xff] ^
10045129dcfcSHajimu UMEMOTO             Te3[(t2      ) & 0xff] ^
10055129dcfcSHajimu UMEMOTO             rk[3];
10065129dcfcSHajimu UMEMOTO     }
10075129dcfcSHajimu UMEMOTO #endif /* ?FULL_UNROLL */
10085129dcfcSHajimu UMEMOTO     /*
10095129dcfcSHajimu UMEMOTO 	 * apply last round and
10105129dcfcSHajimu UMEMOTO 	 * map cipher state to byte array block:
10115129dcfcSHajimu UMEMOTO 	 */
10125129dcfcSHajimu UMEMOTO 	s0 =
10135129dcfcSHajimu UMEMOTO 		(Te4[(t0 >> 24)       ] & 0xff000000) ^
10145129dcfcSHajimu UMEMOTO 		(Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
10155129dcfcSHajimu UMEMOTO 		(Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
10165129dcfcSHajimu UMEMOTO 		(Te4[(t3      ) & 0xff] & 0x000000ff) ^
10175129dcfcSHajimu UMEMOTO 		rk[0];
10185129dcfcSHajimu UMEMOTO 	PUTU32(ct     , s0);
10195129dcfcSHajimu UMEMOTO 	s1 =
10205129dcfcSHajimu UMEMOTO 		(Te4[(t1 >> 24)       ] & 0xff000000) ^
10215129dcfcSHajimu UMEMOTO 		(Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
10225129dcfcSHajimu UMEMOTO 		(Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
10235129dcfcSHajimu UMEMOTO 		(Te4[(t0      ) & 0xff] & 0x000000ff) ^
10245129dcfcSHajimu UMEMOTO 		rk[1];
10255129dcfcSHajimu UMEMOTO 	PUTU32(ct +  4, s1);
10265129dcfcSHajimu UMEMOTO 	s2 =
10275129dcfcSHajimu UMEMOTO 		(Te4[(t2 >> 24)       ] & 0xff000000) ^
10285129dcfcSHajimu UMEMOTO 		(Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
10295129dcfcSHajimu UMEMOTO 		(Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
10305129dcfcSHajimu UMEMOTO 		(Te4[(t1      ) & 0xff] & 0x000000ff) ^
10315129dcfcSHajimu UMEMOTO 		rk[2];
10325129dcfcSHajimu UMEMOTO 	PUTU32(ct +  8, s2);
10335129dcfcSHajimu UMEMOTO 	s3 =
10345129dcfcSHajimu UMEMOTO 		(Te4[(t3 >> 24)       ] & 0xff000000) ^
10355129dcfcSHajimu UMEMOTO 		(Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
10365129dcfcSHajimu UMEMOTO 		(Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
10375129dcfcSHajimu UMEMOTO 		(Te4[(t2      ) & 0xff] & 0x000000ff) ^
10385129dcfcSHajimu UMEMOTO 		rk[3];
10395129dcfcSHajimu UMEMOTO 	PUTU32(ct + 12, s3);
10405129dcfcSHajimu UMEMOTO }
10415129dcfcSHajimu UMEMOTO 
rijndaelDecrypt(const u32 rk[],int Nr,const u8 ct[16],u8 pt[16])10425129dcfcSHajimu UMEMOTO void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) {
10435129dcfcSHajimu UMEMOTO 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
10445129dcfcSHajimu UMEMOTO #ifndef FULL_UNROLL
1045fe2869c8SKris Kennaway     int r;
10465129dcfcSHajimu UMEMOTO #endif /* ?FULL_UNROLL */
1047fe2869c8SKris Kennaway 
10485129dcfcSHajimu UMEMOTO     /*
10495129dcfcSHajimu UMEMOTO 	 * map byte array block to cipher state
10505129dcfcSHajimu UMEMOTO 	 * and add initial round key:
10518f21478bSHajimu UMEMOTO 	 */
10525129dcfcSHajimu UMEMOTO     s0 = GETU32(ct     ) ^ rk[0];
10535129dcfcSHajimu UMEMOTO     s1 = GETU32(ct +  4) ^ rk[1];
10545129dcfcSHajimu UMEMOTO     s2 = GETU32(ct +  8) ^ rk[2];
10555129dcfcSHajimu UMEMOTO     s3 = GETU32(ct + 12) ^ rk[3];
10565129dcfcSHajimu UMEMOTO #ifdef FULL_UNROLL
10575129dcfcSHajimu UMEMOTO     /* round 1: */
10585129dcfcSHajimu UMEMOTO     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
10595129dcfcSHajimu UMEMOTO     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
10605129dcfcSHajimu UMEMOTO     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
10615129dcfcSHajimu UMEMOTO     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
10625129dcfcSHajimu UMEMOTO     /* round 2: */
10635129dcfcSHajimu UMEMOTO     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
10645129dcfcSHajimu UMEMOTO     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
10655129dcfcSHajimu UMEMOTO     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
10665129dcfcSHajimu UMEMOTO     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
10675129dcfcSHajimu UMEMOTO     /* round 3: */
10685129dcfcSHajimu UMEMOTO     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
10695129dcfcSHajimu UMEMOTO     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
10705129dcfcSHajimu UMEMOTO     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
10715129dcfcSHajimu UMEMOTO     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
10725129dcfcSHajimu UMEMOTO     /* round 4: */
10735129dcfcSHajimu UMEMOTO     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
10745129dcfcSHajimu UMEMOTO     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
10755129dcfcSHajimu UMEMOTO     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
10765129dcfcSHajimu UMEMOTO     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
10775129dcfcSHajimu UMEMOTO     /* round 5: */
10785129dcfcSHajimu UMEMOTO     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
10795129dcfcSHajimu UMEMOTO     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
10805129dcfcSHajimu UMEMOTO     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
10815129dcfcSHajimu UMEMOTO     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
10825129dcfcSHajimu UMEMOTO     /* round 6: */
10835129dcfcSHajimu UMEMOTO     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
10845129dcfcSHajimu UMEMOTO     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
10855129dcfcSHajimu UMEMOTO     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
10865129dcfcSHajimu UMEMOTO     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
10875129dcfcSHajimu UMEMOTO     /* round 7: */
10885129dcfcSHajimu UMEMOTO     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
10895129dcfcSHajimu UMEMOTO     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
10905129dcfcSHajimu UMEMOTO     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
10915129dcfcSHajimu UMEMOTO     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
10925129dcfcSHajimu UMEMOTO     /* round 8: */
10935129dcfcSHajimu UMEMOTO     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
10945129dcfcSHajimu UMEMOTO     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
10955129dcfcSHajimu UMEMOTO     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
10965129dcfcSHajimu UMEMOTO     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
10975129dcfcSHajimu UMEMOTO     /* round 9: */
10985129dcfcSHajimu UMEMOTO     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
10995129dcfcSHajimu UMEMOTO     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
11005129dcfcSHajimu UMEMOTO     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
11015129dcfcSHajimu UMEMOTO     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
11025129dcfcSHajimu UMEMOTO     if (Nr > 10) {
11035129dcfcSHajimu UMEMOTO         /* round 10: */
11045129dcfcSHajimu UMEMOTO         s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
11055129dcfcSHajimu UMEMOTO         s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
11065129dcfcSHajimu UMEMOTO         s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
11075129dcfcSHajimu UMEMOTO         s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
11085129dcfcSHajimu UMEMOTO         /* round 11: */
11095129dcfcSHajimu UMEMOTO         t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
11105129dcfcSHajimu UMEMOTO         t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
11115129dcfcSHajimu UMEMOTO         t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
11125129dcfcSHajimu UMEMOTO         t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
11135129dcfcSHajimu UMEMOTO         if (Nr > 12) {
11145129dcfcSHajimu UMEMOTO             /* round 12: */
11155129dcfcSHajimu UMEMOTO             s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
11165129dcfcSHajimu UMEMOTO             s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
11175129dcfcSHajimu UMEMOTO             s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
11185129dcfcSHajimu UMEMOTO             s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
11195129dcfcSHajimu UMEMOTO             /* round 13: */
11205129dcfcSHajimu UMEMOTO             t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
11215129dcfcSHajimu UMEMOTO             t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
11225129dcfcSHajimu UMEMOTO             t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
11235129dcfcSHajimu UMEMOTO             t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1124fe2869c8SKris Kennaway         }
11259132d507SHajimu UMEMOTO     }
11265129dcfcSHajimu UMEMOTO 	rk += Nr << 2;
11275129dcfcSHajimu UMEMOTO #else  /* !FULL_UNROLL */
11285129dcfcSHajimu UMEMOTO     /*
11295129dcfcSHajimu UMEMOTO      * Nr - 1 full rounds:
11309132d507SHajimu UMEMOTO      */
11315129dcfcSHajimu UMEMOTO     r = Nr >> 1;
11325129dcfcSHajimu UMEMOTO     for (;;) {
11335129dcfcSHajimu UMEMOTO         t0 =
11345129dcfcSHajimu UMEMOTO             Td0[(s0 >> 24)       ] ^
11355129dcfcSHajimu UMEMOTO             Td1[(s3 >> 16) & 0xff] ^
11365129dcfcSHajimu UMEMOTO             Td2[(s2 >>  8) & 0xff] ^
11375129dcfcSHajimu UMEMOTO             Td3[(s1      ) & 0xff] ^
11385129dcfcSHajimu UMEMOTO             rk[4];
11395129dcfcSHajimu UMEMOTO         t1 =
11405129dcfcSHajimu UMEMOTO             Td0[(s1 >> 24)       ] ^
11415129dcfcSHajimu UMEMOTO             Td1[(s0 >> 16) & 0xff] ^
11425129dcfcSHajimu UMEMOTO             Td2[(s3 >>  8) & 0xff] ^
11435129dcfcSHajimu UMEMOTO             Td3[(s2      ) & 0xff] ^
11445129dcfcSHajimu UMEMOTO             rk[5];
11455129dcfcSHajimu UMEMOTO         t2 =
11465129dcfcSHajimu UMEMOTO             Td0[(s2 >> 24)       ] ^
11475129dcfcSHajimu UMEMOTO             Td1[(s1 >> 16) & 0xff] ^
11485129dcfcSHajimu UMEMOTO             Td2[(s0 >>  8) & 0xff] ^
11495129dcfcSHajimu UMEMOTO             Td3[(s3      ) & 0xff] ^
11505129dcfcSHajimu UMEMOTO             rk[6];
11515129dcfcSHajimu UMEMOTO         t3 =
11525129dcfcSHajimu UMEMOTO             Td0[(s3 >> 24)       ] ^
11535129dcfcSHajimu UMEMOTO             Td1[(s2 >> 16) & 0xff] ^
11545129dcfcSHajimu UMEMOTO             Td2[(s1 >>  8) & 0xff] ^
11555129dcfcSHajimu UMEMOTO             Td3[(s0      ) & 0xff] ^
11565129dcfcSHajimu UMEMOTO             rk[7];
11579132d507SHajimu UMEMOTO 
11585129dcfcSHajimu UMEMOTO         rk += 8;
11595129dcfcSHajimu UMEMOTO         if (--r == 0) {
11605129dcfcSHajimu UMEMOTO             break;
11619132d507SHajimu UMEMOTO         }
11629132d507SHajimu UMEMOTO 
11635129dcfcSHajimu UMEMOTO         s0 =
11645129dcfcSHajimu UMEMOTO             Td0[(t0 >> 24)       ] ^
11655129dcfcSHajimu UMEMOTO             Td1[(t3 >> 16) & 0xff] ^
11665129dcfcSHajimu UMEMOTO             Td2[(t2 >>  8) & 0xff] ^
11675129dcfcSHajimu UMEMOTO             Td3[(t1      ) & 0xff] ^
11685129dcfcSHajimu UMEMOTO             rk[0];
11695129dcfcSHajimu UMEMOTO         s1 =
11705129dcfcSHajimu UMEMOTO             Td0[(t1 >> 24)       ] ^
11715129dcfcSHajimu UMEMOTO             Td1[(t0 >> 16) & 0xff] ^
11725129dcfcSHajimu UMEMOTO             Td2[(t3 >>  8) & 0xff] ^
11735129dcfcSHajimu UMEMOTO             Td3[(t2      ) & 0xff] ^
11745129dcfcSHajimu UMEMOTO             rk[1];
11755129dcfcSHajimu UMEMOTO         s2 =
11765129dcfcSHajimu UMEMOTO             Td0[(t2 >> 24)       ] ^
11775129dcfcSHajimu UMEMOTO             Td1[(t1 >> 16) & 0xff] ^
11785129dcfcSHajimu UMEMOTO             Td2[(t0 >>  8) & 0xff] ^
11795129dcfcSHajimu UMEMOTO             Td3[(t3      ) & 0xff] ^
11805129dcfcSHajimu UMEMOTO             rk[2];
11815129dcfcSHajimu UMEMOTO         s3 =
11825129dcfcSHajimu UMEMOTO             Td0[(t3 >> 24)       ] ^
11835129dcfcSHajimu UMEMOTO             Td1[(t2 >> 16) & 0xff] ^
11845129dcfcSHajimu UMEMOTO             Td2[(t1 >>  8) & 0xff] ^
11855129dcfcSHajimu UMEMOTO             Td3[(t0      ) & 0xff] ^
11865129dcfcSHajimu UMEMOTO             rk[3];
11879132d507SHajimu UMEMOTO     }
11885129dcfcSHajimu UMEMOTO #endif /* ?FULL_UNROLL */
11895129dcfcSHajimu UMEMOTO     /*
11905129dcfcSHajimu UMEMOTO 	 * apply last round and
11915129dcfcSHajimu UMEMOTO 	 * map cipher state to byte array block:
11925129dcfcSHajimu UMEMOTO 	 */
11935129dcfcSHajimu UMEMOTO    	s0 =
11945129dcfcSHajimu UMEMOTO    		(Td4[(t0 >> 24)       ] & 0xff000000) ^
11955129dcfcSHajimu UMEMOTO    		(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
11965129dcfcSHajimu UMEMOTO    		(Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
11975129dcfcSHajimu UMEMOTO    		(Td4[(t1      ) & 0xff] & 0x000000ff) ^
11985129dcfcSHajimu UMEMOTO    		rk[0];
11995129dcfcSHajimu UMEMOTO 	PUTU32(pt     , s0);
12005129dcfcSHajimu UMEMOTO    	s1 =
12015129dcfcSHajimu UMEMOTO    		(Td4[(t1 >> 24)       ] & 0xff000000) ^
12025129dcfcSHajimu UMEMOTO    		(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
12035129dcfcSHajimu UMEMOTO    		(Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
12045129dcfcSHajimu UMEMOTO    		(Td4[(t2      ) & 0xff] & 0x000000ff) ^
12055129dcfcSHajimu UMEMOTO    		rk[1];
12065129dcfcSHajimu UMEMOTO 	PUTU32(pt +  4, s1);
12075129dcfcSHajimu UMEMOTO    	s2 =
12085129dcfcSHajimu UMEMOTO    		(Td4[(t2 >> 24)       ] & 0xff000000) ^
12095129dcfcSHajimu UMEMOTO    		(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
12105129dcfcSHajimu UMEMOTO    		(Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
12115129dcfcSHajimu UMEMOTO    		(Td4[(t3      ) & 0xff] & 0x000000ff) ^
12125129dcfcSHajimu UMEMOTO    		rk[2];
12135129dcfcSHajimu UMEMOTO 	PUTU32(pt +  8, s2);
12145129dcfcSHajimu UMEMOTO    	s3 =
12155129dcfcSHajimu UMEMOTO    		(Td4[(t3 >> 24)       ] & 0xff000000) ^
12165129dcfcSHajimu UMEMOTO    		(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
12175129dcfcSHajimu UMEMOTO    		(Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
12185129dcfcSHajimu UMEMOTO    		(Td4[(t0      ) & 0xff] & 0x000000ff) ^
12195129dcfcSHajimu UMEMOTO    		rk[3];
12205129dcfcSHajimu UMEMOTO 	PUTU32(pt + 12, s3);
12219132d507SHajimu UMEMOTO }
1222