Create tag for version 1.20
[oscam.git] / cscrypt / fast_aes.c
blob6987a8137fe75ff57cd6b07c7c30e3205dd7e0f5
1 #include "stdio.h"
2 #include "fast_aes.h"
4 static const unsigned int Te0[256] =
6 0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,
7 0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,
8 0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,
9 0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,
10 0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,
11 0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,
12 0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,
13 0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,
14 0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,
15 0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,
16 0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,
17 0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,
18 0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,
19 0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,
20 0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,
21 0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,
22 0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,
23 0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,
24 0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,
25 0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,
26 0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,
27 0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,
28 0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,
29 0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,
30 0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,
31 0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,
32 0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,
33 0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,
34 0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,
35 0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,
36 0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,
37 0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,
38 0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,
39 0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,
40 0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,
41 0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,
42 0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,
43 0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,
44 0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,
45 0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,
46 0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,
47 0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,
48 0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,
49 0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,
50 0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,
51 0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,
52 0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,
53 0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,
54 0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,
55 0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,
56 0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,
57 0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,
58 0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,
59 0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,
60 0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,
61 0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,
62 0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,
63 0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,
64 0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,
65 0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,
66 0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,
67 0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,
68 0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,
69 0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL,
71 static const unsigned int Te1[256] =
73 0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,
74 0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,
75 0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,
76 0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,
77 0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,
78 0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,
79 0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,
80 0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,
81 0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,
82 0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,
83 0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,
84 0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,
85 0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,
86 0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,
87 0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,
88 0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,
89 0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,
90 0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,
91 0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,
92 0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,
93 0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,
94 0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,
95 0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,
96 0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,
97 0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,
98 0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,
99 0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,
100 0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,
101 0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,
102 0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,
103 0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,
104 0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,
105 0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,
106 0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,
107 0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,
108 0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,
109 0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,
110 0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,
111 0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,
112 0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,
113 0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,
114 0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,
115 0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,
116 0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,
117 0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,
118 0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,
119 0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,
120 0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,
121 0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,
122 0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,
123 0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,
124 0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,
125 0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,
126 0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,
127 0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,
128 0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,
129 0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,
130 0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,
131 0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,
132 0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,
133 0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,
134 0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,
135 0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,
136 0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL,
138 static const unsigned int Te2[256] =
140 0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,
141 0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,
142 0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,
143 0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,
144 0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,
145 0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,
146 0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,
147 0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,
148 0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,
149 0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,
150 0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,
151 0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,
152 0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,
153 0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,
154 0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,
155 0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,
156 0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,
157 0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,
158 0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,
159 0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,
160 0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,
161 0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,
162 0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,
163 0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,
164 0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,
165 0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,
166 0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,
167 0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,
168 0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,
169 0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,
170 0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,
171 0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,
172 0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,
173 0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,
174 0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,
175 0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,
176 0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,
177 0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,
178 0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,
179 0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,
180 0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,
181 0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,
182 0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,
183 0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,
184 0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,
185 0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,
186 0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,
187 0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,
188 0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,
189 0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,
190 0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,
191 0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,
192 0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,
193 0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,
194 0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,
195 0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,
196 0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,
197 0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,
198 0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,
199 0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,
200 0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,
201 0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,
202 0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,
203 0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL,
205 static const unsigned int Te3[256] =
207 0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,
208 0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,
209 0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,
210 0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,
211 0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,
212 0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,
213 0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,
214 0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,
215 0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,
216 0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,
217 0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,
218 0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,
219 0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,
220 0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,
221 0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,
222 0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,
223 0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,
224 0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,
225 0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,
226 0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,
227 0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,
228 0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,
229 0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,
230 0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,
231 0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,
232 0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,
233 0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,
234 0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,
235 0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,
236 0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,
237 0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,
238 0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,
239 0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,
240 0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,
241 0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,
242 0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,
243 0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,
244 0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,
245 0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,
246 0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,
247 0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,
248 0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,
249 0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,
250 0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,
251 0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,
252 0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,
253 0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,
254 0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,
255 0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,
256 0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,
257 0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,
258 0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,
259 0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,
260 0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,
261 0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,
262 0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,
263 0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,
264 0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,
265 0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,
266 0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,
267 0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,
268 0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,
269 0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,
270 0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL,
272 static const unsigned int Te4[256] =
274 0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL,
275 0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL,
276 0x30303030UL, 0x01010101UL, 0x67676767UL, 0x2b2b2b2bUL,
277 0xfefefefeUL, 0xd7d7d7d7UL, 0xababababUL, 0x76767676UL,
278 0xcacacacaUL, 0x82828282UL, 0xc9c9c9c9UL, 0x7d7d7d7dUL,
279 0xfafafafaUL, 0x59595959UL, 0x47474747UL, 0xf0f0f0f0UL,
280 0xadadadadUL, 0xd4d4d4d4UL, 0xa2a2a2a2UL, 0xafafafafUL,
281 0x9c9c9c9cUL, 0xa4a4a4a4UL, 0x72727272UL, 0xc0c0c0c0UL,
282 0xb7b7b7b7UL, 0xfdfdfdfdUL, 0x93939393UL, 0x26262626UL,
283 0x36363636UL, 0x3f3f3f3fUL, 0xf7f7f7f7UL, 0xccccccccUL,
284 0x34343434UL, 0xa5a5a5a5UL, 0xe5e5e5e5UL, 0xf1f1f1f1UL,
285 0x71717171UL, 0xd8d8d8d8UL, 0x31313131UL, 0x15151515UL,
286 0x04040404UL, 0xc7c7c7c7UL, 0x23232323UL, 0xc3c3c3c3UL,
287 0x18181818UL, 0x96969696UL, 0x05050505UL, 0x9a9a9a9aUL,
288 0x07070707UL, 0x12121212UL, 0x80808080UL, 0xe2e2e2e2UL,
289 0xebebebebUL, 0x27272727UL, 0xb2b2b2b2UL, 0x75757575UL,
290 0x09090909UL, 0x83838383UL, 0x2c2c2c2cUL, 0x1a1a1a1aUL,
291 0x1b1b1b1bUL, 0x6e6e6e6eUL, 0x5a5a5a5aUL, 0xa0a0a0a0UL,
292 0x52525252UL, 0x3b3b3b3bUL, 0xd6d6d6d6UL, 0xb3b3b3b3UL,
293 0x29292929UL, 0xe3e3e3e3UL, 0x2f2f2f2fUL, 0x84848484UL,
294 0x53535353UL, 0xd1d1d1d1UL, 0x00000000UL, 0xededededUL,
295 0x20202020UL, 0xfcfcfcfcUL, 0xb1b1b1b1UL, 0x5b5b5b5bUL,
296 0x6a6a6a6aUL, 0xcbcbcbcbUL, 0xbebebebeUL, 0x39393939UL,
297 0x4a4a4a4aUL, 0x4c4c4c4cUL, 0x58585858UL, 0xcfcfcfcfUL,
298 0xd0d0d0d0UL, 0xefefefefUL, 0xaaaaaaaaUL, 0xfbfbfbfbUL,
299 0x43434343UL, 0x4d4d4d4dUL, 0x33333333UL, 0x85858585UL,
300 0x45454545UL, 0xf9f9f9f9UL, 0x02020202UL, 0x7f7f7f7fUL,
301 0x50505050UL, 0x3c3c3c3cUL, 0x9f9f9f9fUL, 0xa8a8a8a8UL,
302 0x51515151UL, 0xa3a3a3a3UL, 0x40404040UL, 0x8f8f8f8fUL,
303 0x92929292UL, 0x9d9d9d9dUL, 0x38383838UL, 0xf5f5f5f5UL,
304 0xbcbcbcbcUL, 0xb6b6b6b6UL, 0xdadadadaUL, 0x21212121UL,
305 0x10101010UL, 0xffffffffUL, 0xf3f3f3f3UL, 0xd2d2d2d2UL,
306 0xcdcdcdcdUL, 0x0c0c0c0cUL, 0x13131313UL, 0xececececUL,
307 0x5f5f5f5fUL, 0x97979797UL, 0x44444444UL, 0x17171717UL,
308 0xc4c4c4c4UL, 0xa7a7a7a7UL, 0x7e7e7e7eUL, 0x3d3d3d3dUL,
309 0x64646464UL, 0x5d5d5d5dUL, 0x19191919UL, 0x73737373UL,
310 0x60606060UL, 0x81818181UL, 0x4f4f4f4fUL, 0xdcdcdcdcUL,
311 0x22222222UL, 0x2a2a2a2aUL, 0x90909090UL, 0x88888888UL,
312 0x46464646UL, 0xeeeeeeeeUL, 0xb8b8b8b8UL, 0x14141414UL,
313 0xdedededeUL, 0x5e5e5e5eUL, 0x0b0b0b0bUL, 0xdbdbdbdbUL,
314 0xe0e0e0e0UL, 0x32323232UL, 0x3a3a3a3aUL, 0x0a0a0a0aUL,
315 0x49494949UL, 0x06060606UL, 0x24242424UL, 0x5c5c5c5cUL,
316 0xc2c2c2c2UL, 0xd3d3d3d3UL, 0xacacacacUL, 0x62626262UL,
317 0x91919191UL, 0x95959595UL, 0xe4e4e4e4UL, 0x79797979UL,
318 0xe7e7e7e7UL, 0xc8c8c8c8UL, 0x37373737UL, 0x6d6d6d6dUL,
319 0x8d8d8d8dUL, 0xd5d5d5d5UL, 0x4e4e4e4eUL, 0xa9a9a9a9UL,
320 0x6c6c6c6cUL, 0x56565656UL, 0xf4f4f4f4UL, 0xeaeaeaeaUL,
321 0x65656565UL, 0x7a7a7a7aUL, 0xaeaeaeaeUL, 0x08080808UL,
322 0xbabababaUL, 0x78787878UL, 0x25252525UL, 0x2e2e2e2eUL,
323 0x1c1c1c1cUL, 0xa6a6a6a6UL, 0xb4b4b4b4UL, 0xc6c6c6c6UL,
324 0xe8e8e8e8UL, 0xddddddddUL, 0x74747474UL, 0x1f1f1f1fUL,
325 0x4b4b4b4bUL, 0xbdbdbdbdUL, 0x8b8b8b8bUL, 0x8a8a8a8aUL,
326 0x70707070UL, 0x3e3e3e3eUL, 0xb5b5b5b5UL, 0x66666666UL,
327 0x48484848UL, 0x03030303UL, 0xf6f6f6f6UL, 0x0e0e0e0eUL,
328 0x61616161UL, 0x35353535UL, 0x57575757UL, 0xb9b9b9b9UL,
329 0x86868686UL, 0xc1c1c1c1UL, 0x1d1d1d1dUL, 0x9e9e9e9eUL,
330 0xe1e1e1e1UL, 0xf8f8f8f8UL, 0x98989898UL, 0x11111111UL,
331 0x69696969UL, 0xd9d9d9d9UL, 0x8e8e8e8eUL, 0x94949494UL,
332 0x9b9b9b9bUL, 0x1e1e1e1eUL, 0x87878787UL, 0xe9e9e9e9UL,
333 0xcecececeUL, 0x55555555UL, 0x28282828UL, 0xdfdfdfdfUL,
334 0x8c8c8c8cUL, 0xa1a1a1a1UL, 0x89898989UL, 0x0d0d0d0dUL,
335 0xbfbfbfbfUL, 0xe6e6e6e6UL, 0x42424242UL, 0x68686868UL,
336 0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL,
337 0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL,
339 static const unsigned int Td0[256] =
341 0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,
342 0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,
343 0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,
344 0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,
345 0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,
346 0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,
347 0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,
348 0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,
349 0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,
350 0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,
351 0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,
352 0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,
353 0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,
354 0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,
355 0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,
356 0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,
357 0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,
358 0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,
359 0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,
360 0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,
361 0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,
362 0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,
363 0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,
364 0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,
365 0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,
366 0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,
367 0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,
368 0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,
369 0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,
370 0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,
371 0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,
372 0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,
373 0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,
374 0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,
375 0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,
376 0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,
377 0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,
378 0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,
379 0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,
380 0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,
381 0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,
382 0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,
383 0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,
384 0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,
385 0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,
386 0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,
387 0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,
388 0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,
389 0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,
390 0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,
391 0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,
392 0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,
393 0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,
394 0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,
395 0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,
396 0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,
397 0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,
398 0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,
399 0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,
400 0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,
401 0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,
402 0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,
403 0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,
404 0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL,
406 static const unsigned int Td1[256] =
408 0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,
409 0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,
410 0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,
411 0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,
412 0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,
413 0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,
414 0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,
415 0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,
416 0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,
417 0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,
418 0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,
419 0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,
420 0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,
421 0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,
422 0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,
423 0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,
424 0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,
425 0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,
426 0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,
427 0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,
428 0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,
429 0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,
430 0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,
431 0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,
432 0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,
433 0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,
434 0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,
435 0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,
436 0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,
437 0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,
438 0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,
439 0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,
440 0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,
441 0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,
442 0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,
443 0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,
444 0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,
445 0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,
446 0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,
447 0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,
448 0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,
449 0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,
450 0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,
451 0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,
452 0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,
453 0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,
454 0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,
455 0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,
456 0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,
457 0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,
458 0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,
459 0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,
460 0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,
461 0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,
462 0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,
463 0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,
464 0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,
465 0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,
466 0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,
467 0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,
468 0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,
469 0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,
470 0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,
471 0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL,
473 static const unsigned int Td2[256] =
475 0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,
476 0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,
477 0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,
478 0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,
479 0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,
480 0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,
481 0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,
482 0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,
483 0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,
484 0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,
485 0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,
486 0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,
487 0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,
488 0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,
489 0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,
490 0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,
491 0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,
492 0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,
493 0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,
494 0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,
495 0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,
496 0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,
497 0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,
498 0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,
499 0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,
500 0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,
501 0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,
502 0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,
503 0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,
504 0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,
505 0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,
506 0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,
507 0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,
508 0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,
509 0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,
510 0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,
511 0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,
512 0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,
513 0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,
514 0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,
515 0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,
516 0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,
517 0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,
518 0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,
519 0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,
520 0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,
521 0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,
522 0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,
523 0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,
524 0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,
525 0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,
526 0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,
527 0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,
528 0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,
529 0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,
530 0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,
531 0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,
532 0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,
533 0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,
534 0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,
535 0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,
536 0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,
537 0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,
538 0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL,
540 static const unsigned int Td3[256] =
542 0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,
543 0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,
544 0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,
545 0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,
546 0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,
547 0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,
548 0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,
549 0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,
550 0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,
551 0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,
552 0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,
553 0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,
554 0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,
555 0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,
556 0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,
557 0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,
558 0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,
559 0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,
560 0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,
561 0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,
562 0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,
563 0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,
564 0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,
565 0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,
566 0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,
567 0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,
568 0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,
569 0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,
570 0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,
571 0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,
572 0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,
573 0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,
574 0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,
575 0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,
576 0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,
577 0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,
578 0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,
579 0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,
580 0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,
581 0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,
582 0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,
583 0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,
584 0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,
585 0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,
586 0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,
587 0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,
588 0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,
589 0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,
590 0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,
591 0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,
592 0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,
593 0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,
594 0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,
595 0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,
596 0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,
597 0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,
598 0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,
599 0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,
600 0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,
601 0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,
602 0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,
603 0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,
604 0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,
605 0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL,
607 static const unsigned int Td4[256] =
609 0x52525252UL, 0x09090909UL, 0x6a6a6a6aUL, 0xd5d5d5d5UL,
610 0x30303030UL, 0x36363636UL, 0xa5a5a5a5UL, 0x38383838UL,
611 0xbfbfbfbfUL, 0x40404040UL, 0xa3a3a3a3UL, 0x9e9e9e9eUL,
612 0x81818181UL, 0xf3f3f3f3UL, 0xd7d7d7d7UL, 0xfbfbfbfbUL,
613 0x7c7c7c7cUL, 0xe3e3e3e3UL, 0x39393939UL, 0x82828282UL,
614 0x9b9b9b9bUL, 0x2f2f2f2fUL, 0xffffffffUL, 0x87878787UL,
615 0x34343434UL, 0x8e8e8e8eUL, 0x43434343UL, 0x44444444UL,
616 0xc4c4c4c4UL, 0xdedededeUL, 0xe9e9e9e9UL, 0xcbcbcbcbUL,
617 0x54545454UL, 0x7b7b7b7bUL, 0x94949494UL, 0x32323232UL,
618 0xa6a6a6a6UL, 0xc2c2c2c2UL, 0x23232323UL, 0x3d3d3d3dUL,
619 0xeeeeeeeeUL, 0x4c4c4c4cUL, 0x95959595UL, 0x0b0b0b0bUL,
620 0x42424242UL, 0xfafafafaUL, 0xc3c3c3c3UL, 0x4e4e4e4eUL,
621 0x08080808UL, 0x2e2e2e2eUL, 0xa1a1a1a1UL, 0x66666666UL,
622 0x28282828UL, 0xd9d9d9d9UL, 0x24242424UL, 0xb2b2b2b2UL,
623 0x76767676UL, 0x5b5b5b5bUL, 0xa2a2a2a2UL, 0x49494949UL,
624 0x6d6d6d6dUL, 0x8b8b8b8bUL, 0xd1d1d1d1UL, 0x25252525UL,
625 0x72727272UL, 0xf8f8f8f8UL, 0xf6f6f6f6UL, 0x64646464UL,
626 0x86868686UL, 0x68686868UL, 0x98989898UL, 0x16161616UL,
627 0xd4d4d4d4UL, 0xa4a4a4a4UL, 0x5c5c5c5cUL, 0xccccccccUL,
628 0x5d5d5d5dUL, 0x65656565UL, 0xb6b6b6b6UL, 0x92929292UL,
629 0x6c6c6c6cUL, 0x70707070UL, 0x48484848UL, 0x50505050UL,
630 0xfdfdfdfdUL, 0xededededUL, 0xb9b9b9b9UL, 0xdadadadaUL,
631 0x5e5e5e5eUL, 0x15151515UL, 0x46464646UL, 0x57575757UL,
632 0xa7a7a7a7UL, 0x8d8d8d8dUL, 0x9d9d9d9dUL, 0x84848484UL,
633 0x90909090UL, 0xd8d8d8d8UL, 0xababababUL, 0x00000000UL,
634 0x8c8c8c8cUL, 0xbcbcbcbcUL, 0xd3d3d3d3UL, 0x0a0a0a0aUL,
635 0xf7f7f7f7UL, 0xe4e4e4e4UL, 0x58585858UL, 0x05050505UL,
636 0xb8b8b8b8UL, 0xb3b3b3b3UL, 0x45454545UL, 0x06060606UL,
637 0xd0d0d0d0UL, 0x2c2c2c2cUL, 0x1e1e1e1eUL, 0x8f8f8f8fUL,
638 0xcacacacaUL, 0x3f3f3f3fUL, 0x0f0f0f0fUL, 0x02020202UL,
639 0xc1c1c1c1UL, 0xafafafafUL, 0xbdbdbdbdUL, 0x03030303UL,
640 0x01010101UL, 0x13131313UL, 0x8a8a8a8aUL, 0x6b6b6b6bUL,
641 0x3a3a3a3aUL, 0x91919191UL, 0x11111111UL, 0x41414141UL,
642 0x4f4f4f4fUL, 0x67676767UL, 0xdcdcdcdcUL, 0xeaeaeaeaUL,
643 0x97979797UL, 0xf2f2f2f2UL, 0xcfcfcfcfUL, 0xcecececeUL,
644 0xf0f0f0f0UL, 0xb4b4b4b4UL, 0xe6e6e6e6UL, 0x73737373UL,
645 0x96969696UL, 0xacacacacUL, 0x74747474UL, 0x22222222UL,
646 0xe7e7e7e7UL, 0xadadadadUL, 0x35353535UL, 0x85858585UL,
647 0xe2e2e2e2UL, 0xf9f9f9f9UL, 0x37373737UL, 0xe8e8e8e8UL,
648 0x1c1c1c1cUL, 0x75757575UL, 0xdfdfdfdfUL, 0x6e6e6e6eUL,
649 0x47474747UL, 0xf1f1f1f1UL, 0x1a1a1a1aUL, 0x71717171UL,
650 0x1d1d1d1dUL, 0x29292929UL, 0xc5c5c5c5UL, 0x89898989UL,
651 0x6f6f6f6fUL, 0xb7b7b7b7UL, 0x62626262UL, 0x0e0e0e0eUL,
652 0xaaaaaaaaUL, 0x18181818UL, 0xbebebebeUL, 0x1b1b1b1bUL,
653 0xfcfcfcfcUL, 0x56565656UL, 0x3e3e3e3eUL, 0x4b4b4b4bUL,
654 0xc6c6c6c6UL, 0xd2d2d2d2UL, 0x79797979UL, 0x20202020UL,
655 0x9a9a9a9aUL, 0xdbdbdbdbUL, 0xc0c0c0c0UL, 0xfefefefeUL,
656 0x78787878UL, 0xcdcdcdcdUL, 0x5a5a5a5aUL, 0xf4f4f4f4UL,
657 0x1f1f1f1fUL, 0xddddddddUL, 0xa8a8a8a8UL, 0x33333333UL,
658 0x88888888UL, 0x07070707UL, 0xc7c7c7c7UL, 0x31313131UL,
659 0xb1b1b1b1UL, 0x12121212UL, 0x10101010UL, 0x59595959UL,
660 0x27272727UL, 0x80808080UL, 0xececececUL, 0x5f5f5f5fUL,
661 0x60606060UL, 0x51515151UL, 0x7f7f7f7fUL, 0xa9a9a9a9UL,
662 0x19191919UL, 0xb5b5b5b5UL, 0x4a4a4a4aUL, 0x0d0d0d0dUL,
663 0x2d2d2d2dUL, 0xe5e5e5e5UL, 0x7a7a7a7aUL, 0x9f9f9f9fUL,
664 0x93939393UL, 0xc9c9c9c9UL, 0x9c9c9c9cUL, 0xefefefefUL,
665 0xa0a0a0a0UL, 0xe0e0e0e0UL, 0x3b3b3b3bUL, 0x4d4d4d4dUL,
666 0xaeaeaeaeUL, 0x2a2a2a2aUL, 0xf5f5f5f5UL, 0xb0b0b0b0UL,
667 0xc8c8c8c8UL, 0xebebebebUL, 0xbbbbbbbbUL, 0x3c3c3c3cUL,
668 0x83838383UL, 0x53535353UL, 0x99999999UL, 0x61616161UL,
669 0x17171717UL, 0x2b2b2b2bUL, 0x04040404UL, 0x7e7e7e7eUL,
670 0xbabababaUL, 0x77777777UL, 0xd6d6d6d6UL, 0x26262626UL,
671 0xe1e1e1e1UL, 0x69696969UL, 0x14141414UL, 0x63636363UL,
672 0x55555555UL, 0x21212121UL, 0x0c0c0c0cUL, 0x7d7d7d7dUL,
674 static const unsigned int rcon[] =
676 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
677 0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL,
678 0x1B000000UL, 0x36000000UL,
681 #define GETU32(pt) (((unsigned int)(pt)[0] << 24) ^ \
682 ((unsigned int)(pt)[1] << 16) ^ \
683 ((unsigned int)(pt)[2] << 8) ^ \
684 ((unsigned int)(pt)[3]))
686 #define PUTU32(ct, st) { (ct)[0] = (unsigned char)((st) >> 24); \
687 (ct)[1] = (unsigned char)((st) >> 16); \
688 (ct)[2] = (unsigned char)((st) >> 8); \
689 (ct)[3] = (unsigned char)(st); }
692 * Expand the cipher key into the encryption key schedule and return the
693 * number of rounds for the given cipher key size.
695 int aes_setkey_enc(unsigned int rk[], const unsigned char cipherKey[], int keyBytes)
697 int i = 0;
698 unsigned int temp;
700 rk[0] = GETU32(cipherKey );
701 rk[1] = GETU32(cipherKey + 4);
702 rk[2] = GETU32(cipherKey + 8);
703 rk[3] = GETU32(cipherKey + 12);
704 if (keyBytes == 16) // 128 bits
706 for (;;)
708 temp = rk[3];
709 rk[4] = rk[0] ^
710 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
711 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
712 (Te4[(temp ) & 0xff] & 0x0000ff00) ^
713 (Te4[(temp >> 24) ] & 0x000000ff) ^
714 rcon[i];
715 rk[5] = rk[1] ^ rk[4];
716 rk[6] = rk[2] ^ rk[5];
717 rk[7] = rk[3] ^ rk[6];
718 if (++i == 10)
720 return 10;
722 rk += 4;
725 rk[4] = GETU32(cipherKey + 16);
726 rk[5] = GETU32(cipherKey + 20);
727 if (keyBytes == 24) // 192 bits
729 for (;;)
731 temp = rk[ 5];
732 rk[ 6] = rk[ 0] ^
733 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
734 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
735 (Te4[(temp ) & 0xff] & 0x0000ff00) ^
736 (Te4[(temp >> 24) ] & 0x000000ff) ^
737 rcon[i];
738 rk[ 7] = rk[ 1] ^ rk[ 6];
739 rk[ 8] = rk[ 2] ^ rk[ 7];
740 rk[ 9] = rk[ 3] ^ rk[ 8];
741 if (++i == 8)
743 return 12;
745 rk[10] = rk[ 4] ^ rk[ 9];
746 rk[11] = rk[ 5] ^ rk[10];
747 rk += 6;
750 rk[6] = GETU32(cipherKey + 24);
751 rk[7] = GETU32(cipherKey + 28);
752 if (keyBytes == 32) // 256 bits
754 for (;;)
756 temp = rk[ 7];
757 rk[ 8] = rk[ 0] ^
758 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
759 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
760 (Te4[(temp ) & 0xff] & 0x0000ff00) ^
761 (Te4[(temp >> 24) ] & 0x000000ff) ^
762 rcon[i];
763 rk[ 9] = rk[ 1] ^ rk[ 8];
764 rk[10] = rk[ 2] ^ rk[ 9];
765 rk[11] = rk[ 3] ^ rk[10];
766 if (++i == 7)
768 return 14;
770 temp = rk[11];
771 rk[12] = rk[ 4] ^
772 (Te4[(temp >> 24) ] & 0xff000000) ^
773 (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
774 (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
775 (Te4[(temp ) & 0xff] & 0x000000ff);
776 rk[13] = rk[ 5] ^ rk[12];
777 rk[14] = rk[ 6] ^ rk[13];
778 rk[15] = rk[ 7] ^ rk[14];
780 rk += 8;
783 return 0;
787 * Expand the cipher key into encryption and decryption key schedule and
788 * return the number of rounds for the given cipher key size.
790 int AesGenKeySched(unsigned int rk[], unsigned int rrk[], const unsigned char cipherKey[], int keyBytes)
792 int Nr, i;
794 // expand the cipher key
795 Nr = aes_setkey_enc(rk, cipherKey, keyBytes);
796 // invert the order of the first round keys
797 rrk += Nr * 4;
798 rrk[0] = rk[0];
799 rrk[1] = rk[1];
800 rrk[2] = rk[2];
801 rrk[3] = rk[3];
804 * apply the inverse MixColumn transform to all round keys but the first
805 * and the last
807 for (i = 1; i < Nr; i++)
809 rrk -= 4;
810 rk += 4;
811 rrk[0] =
812 Td0[Te4[(rk[0] >> 24) ] & 0xff] ^
813 Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
814 Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
815 Td3[Te4[(rk[0] ) & 0xff] & 0xff];
816 rrk[1] =
817 Td0[Te4[(rk[1] >> 24) ] & 0xff] ^
818 Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
819 Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
820 Td3[Te4[(rk[1] ) & 0xff] & 0xff];
821 rrk[2] =
822 Td0[Te4[(rk[2] >> 24) ] & 0xff] ^
823 Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
824 Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
825 Td3[Te4[(rk[2] ) & 0xff] & 0xff];
826 rrk[3] =
827 Td0[Te4[(rk[3] >> 24) ] & 0xff] ^
828 Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
829 Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
830 Td3[Te4[(rk[3] ) & 0xff] & 0xff];
832 // invert the order of the last round keys
833 rrk -= 4;
834 rk += 4;
835 rrk[0] = rk[0];
836 rrk[1] = rk[1];
837 rrk[2] = rk[2];
838 rrk[3] = rk[3];
840 return Nr;
844 * Encrypt the plain text into cipher
846 void AesEncBlk(AesCtx *pCtx, const unsigned char pt[], unsigned char ct[])
848 unsigned int s0, s1, s2, s3, t0, t1, t2, t3, *iv;
849 const unsigned int *rk;
850 int r;
852 rk = pCtx->Ek;
853 iv = pCtx->Iv;
855 * map byte array block to cipher state
856 * and add initial round key:
858 s0 = GETU32(pt ) ^ rk[0];
859 s1 = GETU32(pt + 4) ^ rk[1];
860 s2 = GETU32(pt + 8) ^ rk[2];
861 s3 = GETU32(pt + 12) ^ rk[3];
862 if (pCtx->Mode)
864 s0 = s0 ^ iv[0];
865 s1 = s1 ^ iv[1];
866 s2 = s2 ^ iv[2];
867 s3 = s3 ^ iv[3];
870 * Nr - 1 full rounds:
872 r = pCtx->Nr >> 1;
873 for (;;)
875 t0 =
876 Te0[(s0 >> 24) ] ^
877 Te1[(s1 >> 16) & 0xff] ^
878 Te2[(s2 >> 8) & 0xff] ^
879 Te3[(s3 ) & 0xff] ^
880 rk[4];
881 t1 =
882 Te0[(s1 >> 24) ] ^
883 Te1[(s2 >> 16) & 0xff] ^
884 Te2[(s3 >> 8) & 0xff] ^
885 Te3[(s0 ) & 0xff] ^
886 rk[5];
887 t2 =
888 Te0[(s2 >> 24) ] ^
889 Te1[(s3 >> 16) & 0xff] ^
890 Te2[(s0 >> 8) & 0xff] ^
891 Te3[(s1 ) & 0xff] ^
892 rk[6];
893 t3 =
894 Te0[(s3 >> 24) ] ^
895 Te1[(s0 >> 16) & 0xff] ^
896 Te2[(s1 >> 8) & 0xff] ^
897 Te3[(s2 ) & 0xff] ^
898 rk[7];
900 rk += 8;
901 if (--r == 0)
903 break;
906 s0 =
907 Te0[(t0 >> 24) ] ^
908 Te1[(t1 >> 16) & 0xff] ^
909 Te2[(t2 >> 8) & 0xff] ^
910 Te3[(t3 ) & 0xff] ^
911 rk[0];
912 s1 =
913 Te0[(t1 >> 24) ] ^
914 Te1[(t2 >> 16) & 0xff] ^
915 Te2[(t3 >> 8) & 0xff] ^
916 Te3[(t0 ) & 0xff] ^
917 rk[1];
918 s2 =
919 Te0[(t2 >> 24) ] ^
920 Te1[(t3 >> 16) & 0xff] ^
921 Te2[(t0 >> 8) & 0xff] ^
922 Te3[(t1 ) & 0xff] ^
923 rk[2];
924 s3 =
925 Te0[(t3 >> 24) ] ^
926 Te1[(t0 >> 16) & 0xff] ^
927 Te2[(t1 >> 8) & 0xff] ^
928 Te3[(t2 ) & 0xff] ^
929 rk[3];
932 * apply last round and
933 * map cipher state to byte array block:
935 s0 =
936 (Te4[(t0 >> 24) ] & 0xff000000) ^
937 (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
938 (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
939 (Te4[(t3 ) & 0xff] & 0x000000ff) ^
940 rk[0];
941 PUTU32(ct, s0);
942 s1 =
943 (Te4[(t1 >> 24) ] & 0xff000000) ^
944 (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
945 (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
946 (Te4[(t0 ) & 0xff] & 0x000000ff) ^
947 rk[1];
948 PUTU32(ct + 4, s1);
949 s2 =
950 (Te4[(t2 >> 24) ] & 0xff000000) ^
951 (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
952 (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
953 (Te4[(t1 ) & 0xff] & 0x000000ff) ^
954 rk[2];
955 PUTU32(ct + 8, s2);
956 s3 =
957 (Te4[(t3 >> 24) ] & 0xff000000) ^
958 (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
959 (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
960 (Te4[(t2 ) & 0xff] & 0x000000ff) ^
961 rk[3];
962 PUTU32(ct + 12, s3);
964 if (pCtx->Mode)
966 iv[0] = s0;
967 iv[1] = s1;
968 iv[2] = s2;
969 iv[3] = s3;
974 * Decrypt the cipher into plain text
976 void AesDecBlk(AesCtx *pCtx, const unsigned char ct[], unsigned char pt[])
978 unsigned int s0, s1, s2, s3, t0, t1, t2, t3, v0, v1, v2, v3, *iv;
979 const unsigned int *rk;
980 int r;
982 rk = pCtx->Dk;
983 iv = pCtx->Iv;
985 * map byte array block to cipher state
986 * and add initial round key:
988 v0 = GETU32(ct );
989 s0 = v0 ^ rk[0];
990 v1 = GETU32(ct + 4);
991 s1 = v1 ^ rk[1];
992 v2 = GETU32(ct + 8);
993 s2 = v2 ^ rk[2];
994 v3 = GETU32(ct + 12);
995 s3 = v3 ^ rk[3];
997 * Nr - 1 full rounds:
999 r = pCtx->Nr >> 1;
1000 for (;;)
1002 t0 =
1003 Td0[(s0 >> 24) ] ^
1004 Td1[(s3 >> 16) & 0xff] ^
1005 Td2[(s2 >> 8) & 0xff] ^
1006 Td3[(s1 ) & 0xff] ^
1007 rk[4];
1008 t1 =
1009 Td0[(s1 >> 24) ] ^
1010 Td1[(s0 >> 16) & 0xff] ^
1011 Td2[(s3 >> 8) & 0xff] ^
1012 Td3[(s2 ) & 0xff] ^
1013 rk[5];
1014 t2 =
1015 Td0[(s2 >> 24) ] ^
1016 Td1[(s1 >> 16) & 0xff] ^
1017 Td2[(s0 >> 8) & 0xff] ^
1018 Td3[(s3 ) & 0xff] ^
1019 rk[6];
1020 t3 =
1021 Td0[(s3 >> 24) ] ^
1022 Td1[(s2 >> 16) & 0xff] ^
1023 Td2[(s1 >> 8) & 0xff] ^
1024 Td3[(s0 ) & 0xff] ^
1025 rk[7];
1027 rk += 8;
1028 if (--r == 0)
1030 break;
1033 s0 =
1034 Td0[(t0 >> 24) ] ^
1035 Td1[(t3 >> 16) & 0xff] ^
1036 Td2[(t2 >> 8) & 0xff] ^
1037 Td3[(t1 ) & 0xff] ^
1038 rk[0];
1039 s1 =
1040 Td0[(t1 >> 24) ] ^
1041 Td1[(t0 >> 16) & 0xff] ^
1042 Td2[(t3 >> 8) & 0xff] ^
1043 Td3[(t2 ) & 0xff] ^
1044 rk[1];
1045 s2 =
1046 Td0[(t2 >> 24) ] ^
1047 Td1[(t1 >> 16) & 0xff] ^
1048 Td2[(t0 >> 8) & 0xff] ^
1049 Td3[(t3 ) & 0xff] ^
1050 rk[2];
1051 s3 =
1052 Td0[(t3 >> 24) ] ^
1053 Td1[(t2 >> 16) & 0xff] ^
1054 Td2[(t1 >> 8) & 0xff] ^
1055 Td3[(t0 ) & 0xff] ^
1056 rk[3];
1059 * apply last round and
1060 * map cipher state to byte array block:
1062 s0 =
1063 (Td4[(t0 >> 24) ] & 0xff000000) ^
1064 (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1065 (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
1066 (Td4[(t1 ) & 0xff] & 0x000000ff) ^
1067 rk[0];
1068 s1 =
1069 (Td4[(t1 >> 24) ] & 0xff000000) ^
1070 (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1071 (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
1072 (Td4[(t2 ) & 0xff] & 0x000000ff) ^
1073 rk[1];
1074 s2 =
1075 (Td4[(t2 >> 24) ] & 0xff000000) ^
1076 (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1077 (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
1078 (Td4[(t3 ) & 0xff] & 0x000000ff) ^
1079 rk[2];
1080 s3 =
1081 (Td4[(t3 >> 24) ] & 0xff000000) ^
1082 (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1083 (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
1084 (Td4[(t0 ) & 0xff] & 0x000000ff) ^
1085 rk[3];
1087 if (pCtx->Mode)
1089 s0 = s0 ^ iv[0];
1090 iv[0] = v0;
1091 s1 = s1 ^ iv[1];
1092 iv[1] = v1;
1093 s2 = s2 ^ iv[2];
1094 iv[2] = v2;
1095 s3 = s3 ^ iv[3];
1096 iv[3] = v3;
1099 PUTU32(pt, s0);
1100 PUTU32(pt + 4, s1);
1101 PUTU32(pt + 8, s2);
1102 PUTU32(pt + 12, s3);
1105 //////////////////////////////////////////////////////////////////////////////
1106 // API functions //
1107 //////////////////////////////////////////////////////////////////////////////
1110 * initialize AES context
1112 int AesCtxIni(AesCtx *pCtx, unsigned char *pIV, unsigned char *pKey, unsigned int KeyLen, unsigned char Mode)
1114 if (pKey == 0 || pCtx == 0 || (KeyLen != KEY128 && KeyLen != KEY192 && KeyLen != KEY256))
1115 return -1;
1117 // generate key schedule
1118 pCtx->Nr = AesGenKeySched(pCtx->Ek, pCtx->Dk, pKey, KeyLen);
1120 // initialize IV
1121 if (pIV != 0)
1123 pCtx->Iv[0] = GETU32(pIV );
1124 pCtx->Iv[1] = GETU32(pIV + 4 );
1125 pCtx->Iv[2] = GETU32(pIV + 8 );
1126 pCtx->Iv[3] = GETU32(pIV + 12);
1129 // mode
1130 pCtx->Mode = Mode;
1132 return 0;
1136 * Encrypt plain text
1138 int AesEncrypt(AesCtx *pCtx, unsigned char *pData, unsigned char *pCipher, unsigned int DataLen)
1140 unsigned int i;
1142 if (pData == 0 || pCipher == 0 || pCtx == 0 || (DataLen & 0xf) != 0)
1143 return -1;
1145 for (i = 0; i < DataLen; i += BLOCKSZ)
1147 // encrypt block by block
1148 AesEncBlk(pCtx, pData, pCipher);
1149 pCipher += BLOCKSZ;
1150 pData += BLOCKSZ;
1152 return DataLen;
1156 * Decrypt cipher
1158 int AesDecrypt(AesCtx *pCtx, unsigned char *pCipher, unsigned char *pData, unsigned int CipherLen)
1160 unsigned int i;
1162 if (pData == 0 || pCipher == 0 || pCtx == 0 || (CipherLen & 0xf) != 0)
1163 return -1;
1165 for (i = 0; i < CipherLen; i += BLOCKSZ)
1167 // decrypt block by block
1168 AesDecBlk(pCtx, pCipher, pData);
1169 pCipher += BLOCKSZ;
1170 pData += BLOCKSZ;
1172 return CipherLen;