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