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