Initial commit
[hashcat.git] / amd / gpu_aes256_amd.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 __constant u32 te0[256] =
7 {
8 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
9 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
10 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
11 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
12 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
13 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
14 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
15 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
16 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
17 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
18 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
19 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
20 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
21 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
22 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
23 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
24 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
25 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
26 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
27 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
28 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
29 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
30 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
31 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
32 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
33 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
34 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
35 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
36 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
37 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
38 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
39 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
40 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
41 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
42 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
43 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
44 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
45 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
46 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
47 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
48 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
49 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
50 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
51 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
52 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
53 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
54 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
55 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
56 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
57 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
58 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
59 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
60 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
61 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
62 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
63 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
64 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
65 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
66 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
67 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
68 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
69 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
70 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
71 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
72 };
73
74 __constant u32 te1[256] =
75 {
76 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
77 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
78 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
79 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
80 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
81 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
82 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
83 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
84 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
85 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
86 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
87 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
88 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
89 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
90 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
91 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
92 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
93 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
94 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
95 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
96 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
97 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
98 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
99 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
100 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
101 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
102 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
103 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
104 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
105 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
106 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
107 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
108 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
109 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
110 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
111 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
112 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
113 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
114 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
115 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
116 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
117 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
118 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
119 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
120 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
121 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
122 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
123 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
124 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
125 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
126 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
127 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
128 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
129 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
130 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
131 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
132 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
133 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
134 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
135 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
136 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
137 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
138 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
139 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
140 };
141
142 __constant u32 te2[256] =
143 {
144 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
145 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
146 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
147 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
148 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
149 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
150 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
151 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
152 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
153 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
154 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
155 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
156 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
157 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
158 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
159 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
160 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
161 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
162 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
163 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
164 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
165 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
166 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
167 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
168 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
169 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
170 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
171 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
172 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
173 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
174 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
175 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
176 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
177 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
178 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
179 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
180 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
181 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
182 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
183 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
184 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
185 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
186 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
187 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
188 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
189 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
190 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
191 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
192 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
193 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
194 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
195 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
196 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
197 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
198 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
199 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
200 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
201 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
202 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
203 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
204 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
205 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
206 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
207 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
208 };
209
210 __constant u32 te3[256] =
211 {
212 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
213 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
214 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
215 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
216 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
217 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
218 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
219 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
220 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
221 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
222 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
223 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
224 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
225 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
226 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
227 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
228 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
229 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
230 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
231 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
232 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
233 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
234 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
235 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
236 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
237 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
238 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
239 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
240 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
241 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
242 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
243 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
244 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
245 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
246 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
247 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
248 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
249 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
250 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
251 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
252 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
253 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
254 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
255 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
256 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
257 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
258 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
259 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
260 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
261 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
262 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
263 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
264 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
265 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
266 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
267 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
268 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
269 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
270 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
271 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
272 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
273 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
274 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
275 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
276 };
277
278 __constant u32 te4[256] =
279 {
280 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
281 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
282 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
283 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
284 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
285 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
286 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
287 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
288 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
289 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
290 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
291 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
292 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
293 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
294 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
295 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
296 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
297 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
298 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
299 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
300 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
301 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
302 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
303 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
304 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
305 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
306 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
307 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
308 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
309 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
310 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
311 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
312 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
313 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
314 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
315 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
316 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
317 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
318 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
319 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
320 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
321 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
322 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
323 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
324 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
325 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
326 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
327 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
328 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
329 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
330 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
331 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
332 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
333 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
334 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
335 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
336 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
337 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
338 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
339 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
340 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
341 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
342 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
343 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
344 };
345
346 __constant u32 td0[256] =
347 {
348 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
349 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
350 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
351 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
352 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
353 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
354 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
355 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
356 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
357 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
358 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
359 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
360 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
361 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
362 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
363 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
364 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
365 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
366 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
367 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
368 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
369 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
370 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
371 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
372 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
373 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
374 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
375 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
376 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
377 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
378 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
379 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
380 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
381 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
382 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
383 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
384 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
385 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
386 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
387 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
388 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
389 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
390 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
391 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
392 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
393 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
394 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
395 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
396 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
397 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
398 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
399 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
400 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
401 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
402 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
403 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
404 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
405 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
406 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
407 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
408 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
409 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
410 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
411 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
412 };
413
414 __constant u32 td1[256] =
415 {
416 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
417 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
418 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
419 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
420 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
421 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
422 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
423 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
424 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
425 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
426 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
427 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
428 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
429 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
430 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
431 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
432 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
433 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
434 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
435 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
436 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
437 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
438 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
439 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
440 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
441 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
442 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
443 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
444 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
445 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
446 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
447 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
448 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
449 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
450 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
451 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
452 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
453 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
454 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
455 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
456 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
457 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
458 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
459 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
460 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
461 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
462 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
463 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
464 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
465 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
466 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
467 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
468 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
469 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
470 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
471 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
472 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
473 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
474 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
475 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
476 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
477 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
478 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
479 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
480 };
481
482 __constant u32 td2[256] =
483 {
484 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
485 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
486 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
487 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
488 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
489 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
490 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
491 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
492 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
493 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
494 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
495 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
496 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
497 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
498 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
499 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
500 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
501 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
502 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
503 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
504 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
505 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
506 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
507 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
508 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
509 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
510 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
511 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
512 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
513 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
514 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
515 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
516 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
517 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
518 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
519 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
520 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
521 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
522 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
523 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
524 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
525 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
526 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
527 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
528 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
529 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
530 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
531 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
532 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
533 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
534 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
535 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
536 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
537 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
538 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
539 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
540 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
541 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
542 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
543 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
544 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
545 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
546 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
547 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
548 };
549
550 __constant u32 td3[256] =
551 {
552 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
553 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
554 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
555 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
556 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
557 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
558 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
559 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
560 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
561 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
562 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
563 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
564 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
565 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
566 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
567 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
568 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
569 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
570 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
571 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
572 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
573 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
574 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
575 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
576 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
577 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
578 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
579 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
580 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
581 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
582 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
583 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
584 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
585 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
586 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
587 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
588 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
589 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
590 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
591 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
592 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
593 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
594 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
595 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
596 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
597 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
598 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
599 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
600 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
601 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
602 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
603 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
604 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
605 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
606 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
607 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
608 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
609 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
610 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
611 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
612 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
613 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
614 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
615 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
616 };
617
618 __constant u32 td4[256] =
619 {
620 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
621 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
622 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
623 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
624 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
625 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
626 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
627 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
628 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
629 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
630 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
631 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
632 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
633 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
634 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
635 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
636 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
637 0x86868686, 0x68686868, 0x98989898, 0x16161616,
638 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
639 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
640 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
641 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
642 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
643 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
644 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
645 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
646 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
647 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
648 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
649 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
650 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
651 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
652 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
653 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
654 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
655 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
656 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
657 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
658 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
659 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
660 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
661 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
662 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
663 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
664 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
665 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
666 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
667 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
668 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
669 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
670 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
671 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
672 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
673 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
674 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
675 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
676 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
677 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
678 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
679 0x83838383, 0x53535353, 0x99999999, 0x61616161,
680 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
681 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
682 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
683 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
684 };
685
686 __constant u32 rcon[] =
687 {
688 0x01000000, 0x02000000, 0x04000000, 0x08000000,
689 0x10000000, 0x20000000, 0x40000000, 0x80000000,
690 0x1b000000, 0x36000000,
691 };
692
693 static void aes256_ExpandKey (u32 *ks, const u32 *ukey)
694 {
695 ks[0] = ukey[0];
696 ks[1] = ukey[1];
697 ks[2] = ukey[2];
698 ks[3] = ukey[3];
699 ks[4] = ukey[4];
700 ks[5] = ukey[5];
701 ks[6] = ukey[6];
702 ks[7] = ukey[7];
703
704 int i;
705 int j;
706
707 i = 0;
708 j = 0;
709
710 while (1)
711 {
712 u32 temp = ks[j + 7];
713
714 ks[j + 8] = ks[j + 0]
715 ^ (te2[(temp >> 16) & 0xff] & 0xff000000)
716 ^ (te3[(temp >> 8) & 0xff] & 0x00ff0000)
717 ^ (te0[(temp >> 0) & 0xff] & 0x0000ff00)
718 ^ (te1[(temp >> 24) & 0xff] & 0x000000ff)
719 ^ rcon[i];
720
721 ks[j + 9] = ks[j + 1] ^ ks[j + 8];
722 ks[j + 10] = ks[j + 2] ^ ks[j + 9];
723 ks[j + 11] = ks[j + 3] ^ ks[j + 10];
724
725 if (++i == 7) break;
726
727 temp = ks[j + 11];
728
729 ks[j + 12] = ks[j + 4]
730 ^ (te2[(temp >> 24) & 0xff] & 0xff000000)
731 ^ (te3[(temp >> 16) & 0xff] & 0x00ff0000)
732 ^ (te0[(temp >> 8) & 0xff] & 0x0000ff00)
733 ^ (te1[(temp >> 0) & 0xff] & 0x000000ff);
734
735 ks[j + 13] = ks[j + 5] ^ ks[j + 12];
736 ks[j + 14] = ks[j + 6] ^ ks[j + 13];
737 ks[j + 15] = ks[j + 7] ^ ks[j + 14];
738
739 j += 8;
740 }
741 }
742
743 static void aes256_InvertKey (u32 *ks)
744 {
745 for (u32 i = 0, j = 56; i < j; i += 4, j -= 4)
746 {
747 u32 temp;
748
749 temp = ks[i + 0]; ks[i + 0] = ks[j + 0]; ks[j + 0] = temp;
750 temp = ks[i + 1]; ks[i + 1] = ks[j + 1]; ks[j + 1] = temp;
751 temp = ks[i + 2]; ks[i + 2] = ks[j + 2]; ks[j + 2] = temp;
752 temp = ks[i + 3]; ks[i + 3] = ks[j + 3]; ks[j + 3] = temp;
753 }
754
755 for (u32 i = 1, j = 4; i < 14; i += 1, j += 4)
756 {
757 ks[j + 0] =
758 td0[te1[(ks[j + 0] >> 24) & 0xff] & 0xff] ^
759 td1[te1[(ks[j + 0] >> 16) & 0xff] & 0xff] ^
760 td2[te1[(ks[j + 0] >> 8) & 0xff] & 0xff] ^
761 td3[te1[(ks[j + 0] >> 0) & 0xff] & 0xff];
762
763 ks[j + 1] =
764 td0[te1[(ks[j + 1] >> 24) & 0xff] & 0xff] ^
765 td1[te1[(ks[j + 1] >> 16) & 0xff] & 0xff] ^
766 td2[te1[(ks[j + 1] >> 8) & 0xff] & 0xff] ^
767 td3[te1[(ks[j + 1] >> 0) & 0xff] & 0xff];
768
769 ks[j + 2] =
770 td0[te1[(ks[j + 2] >> 24) & 0xff] & 0xff] ^
771 td1[te1[(ks[j + 2] >> 16) & 0xff] & 0xff] ^
772 td2[te1[(ks[j + 2] >> 8) & 0xff] & 0xff] ^
773 td3[te1[(ks[j + 2] >> 0) & 0xff] & 0xff];
774
775 ks[j + 3] =
776 td0[te1[(ks[j + 3] >> 24) & 0xff] & 0xff] ^
777 td1[te1[(ks[j + 3] >> 16) & 0xff] & 0xff] ^
778 td2[te1[(ks[j + 3] >> 8) & 0xff] & 0xff] ^
779 td3[te1[(ks[j + 3] >> 0) & 0xff] & 0xff];
780 }
781 }
782
783 static void aes256_set_encrypt_key (u32 *ks, const u32 *ukey)
784 {
785 u32 ukey_s[8];
786
787 ukey_s[0] = swap_workaround (ukey[0]);
788 ukey_s[1] = swap_workaround (ukey[1]);
789 ukey_s[2] = swap_workaround (ukey[2]);
790 ukey_s[3] = swap_workaround (ukey[3]);
791 ukey_s[4] = swap_workaround (ukey[4]);
792 ukey_s[5] = swap_workaround (ukey[5]);
793 ukey_s[6] = swap_workaround (ukey[6]);
794 ukey_s[7] = swap_workaround (ukey[7]);
795
796 aes256_ExpandKey (ks, ukey_s);
797 }
798
799 static void aes256_set_decrypt_key (u32 *ks, const u32 *ukey)
800 {
801 u32 ukey_s[8];
802
803 ukey_s[0] = swap_workaround (ukey[0]);
804 ukey_s[1] = swap_workaround (ukey[1]);
805 ukey_s[2] = swap_workaround (ukey[2]);
806 ukey_s[3] = swap_workaround (ukey[3]);
807 ukey_s[4] = swap_workaround (ukey[4]);
808 ukey_s[5] = swap_workaround (ukey[5]);
809 ukey_s[6] = swap_workaround (ukey[6]);
810 ukey_s[7] = swap_workaround (ukey[7]);
811
812 aes256_ExpandKey (ks, ukey_s);
813
814 aes256_InvertKey (ks);
815 }
816
817 static void aes256_decrypt (const u32 *ks, const u32 *in, u32 *out)
818 {
819 u32 in_s[4];
820
821 in_s[0] = swap_workaround (in[0]);
822 in_s[1] = swap_workaround (in[1]);
823 in_s[2] = swap_workaround (in[2]);
824 in_s[3] = swap_workaround (in[3]);
825
826 u32 s0 = in_s[0] ^ ks[0];
827 u32 s1 = in_s[1] ^ ks[1];
828 u32 s2 = in_s[2] ^ ks[2];
829 u32 s3 = in_s[3] ^ ks[3];
830
831 u32 t0;
832 u32 t1;
833 u32 t2;
834 u32 t3;
835
836 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[ 4];
837 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[ 5];
838 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[ 6];
839 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[ 7];
840 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[ 8];
841 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[ 9];
842 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[10];
843 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[11];
844 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[12];
845 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[13];
846 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[14];
847 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[15];
848 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[16];
849 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[17];
850 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[18];
851 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[19];
852 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[20];
853 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[21];
854 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[22];
855 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[23];
856 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[24];
857 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[25];
858 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[26];
859 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[27];
860 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[28];
861 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[29];
862 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[30];
863 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[31];
864 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[32];
865 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[33];
866 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[34];
867 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[35];
868 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[36];
869 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[37];
870 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[38];
871 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[39];
872 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[40];
873 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[41];
874 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[42];
875 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[43];
876 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[44];
877 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[45];
878 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[46];
879 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[47];
880 s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[48];
881 s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[49];
882 s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[50];
883 s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[51];
884 t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[52];
885 t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[53];
886 t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[54];
887 t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[55];
888
889 out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000)
890 ^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000)
891 ^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00)
892 ^ (td4[(t1 >> 0) & 0xff] & 0x000000ff)
893 ^ ks[56];
894
895 out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000)
896 ^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000)
897 ^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00)
898 ^ (td4[(t2 >> 0) & 0xff] & 0x000000ff)
899 ^ ks[57];
900
901 out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000)
902 ^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000)
903 ^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00)
904 ^ (td4[(t3 >> 0) & 0xff] & 0x000000ff)
905 ^ ks[58];
906
907 out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000)
908 ^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000)
909 ^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00)
910 ^ (td4[(t0 >> 0) & 0xff] & 0x000000ff)
911 ^ ks[59];
912
913 out[0] = swap_workaround (out[0]);
914 out[1] = swap_workaround (out[1]);
915 out[2] = swap_workaround (out[2]);
916 out[3] = swap_workaround (out[3]);
917 }
918
919 static void aes256_encrypt (const u32 *ks, const u32 *in, u32 *out)
920 {
921 u32 in_s[4];
922
923 in_s[0] = swap_workaround (in[0]);
924 in_s[1] = swap_workaround (in[1]);
925 in_s[2] = swap_workaround (in[2]);
926 in_s[3] = swap_workaround (in[3]);
927
928 u32 s0 = in_s[0] ^ ks[0];
929 u32 s1 = in_s[1] ^ ks[1];
930 u32 s2 = in_s[2] ^ ks[2];
931 u32 s3 = in_s[3] ^ ks[3];
932
933 u32 t0;
934 u32 t1;
935 u32 t2;
936 u32 t3;
937
938 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[ 4];
939 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[ 5];
940 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[ 6];
941 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[ 7];
942 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[ 8];
943 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[ 9];
944 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[10];
945 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[11];
946 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[12];
947 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[13];
948 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[14];
949 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[15];
950 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[16];
951 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[17];
952 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[18];
953 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[19];
954 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[20];
955 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[21];
956 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[22];
957 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[23];
958 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[24];
959 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[25];
960 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[26];
961 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[27];
962 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[28];
963 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[29];
964 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[30];
965 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[31];
966 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[32];
967 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[33];
968 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[34];
969 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[35];
970 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[36];
971 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[37];
972 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[38];
973 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[39];
974 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[40];
975 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[41];
976 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[42];
977 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[43];
978 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[44];
979 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[45];
980 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[46];
981 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[47];
982 s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[48];
983 s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[49];
984 s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[50];
985 s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[51];
986 t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[52];
987 t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[53];
988 t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[54];
989 t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[55];
990
991 out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000)
992 ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000)
993 ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00)
994 ^ (te4[(t3 >> 0) & 0xff] & 0x000000ff)
995 ^ ks[56];
996
997 out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000)
998 ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000)
999 ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00)
1000 ^ (te4[(t0 >> 0) & 0xff] & 0x000000ff)
1001 ^ ks[57];
1002
1003 out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000)
1004 ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000)
1005 ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00)
1006 ^ (te4[(t1 >> 0) & 0xff] & 0x000000ff)
1007 ^ ks[58];
1008
1009 out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000)
1010 ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000)
1011 ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00)
1012 ^ (te4[(t2 >> 0) & 0xff] & 0x000000ff)
1013 ^ ks[59];
1014
1015 out[0] = swap_workaround (out[0]);
1016 out[1] = swap_workaround (out[1]);
1017 out[2] = swap_workaround (out[2]);
1018 out[3] = swap_workaround (out[3]);
1019 }
1020
1021 static void aes256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out)
1022 {
1023 u32 T[4] = { 0 };
1024 u32 Z[4] = { 0 };
1025
1026 out[0] = in[0];
1027 out[1] = in[1];
1028 out[2] = in[2];
1029 out[3] = in[3];
1030
1031 u32 ks[60];
1032
1033 aes256_set_encrypt_key (ks, ukey2);
1034 aes256_encrypt (ks, Z, T);
1035
1036 out[0] ^= T[0];
1037 out[1] ^= T[1];
1038 out[2] ^= T[2];
1039 out[3] ^= T[3];
1040
1041 aes256_set_decrypt_key (ks, ukey1);
1042 aes256_decrypt (ks, out, out);
1043
1044 out[0] ^= T[0];
1045 out[1] ^= T[1];
1046 out[2] ^= T[2];
1047 out[3] ^= T[3];
1048 }