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