2 * Author......: Jens Steube <jens.steube@gmail.com>
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "check_multi_comp4.c"
23 __constant u32 te0[256] =
25 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
26 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
27 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
28 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
29 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
30 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
31 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
32 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
33 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
34 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
35 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
36 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
37 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
38 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
39 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
40 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
41 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
42 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
43 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
44 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
45 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
46 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
47 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
48 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
49 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
50 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
51 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
52 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
53 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
54 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
55 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
56 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
57 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
58 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
59 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
60 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
61 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
62 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
63 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
64 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
65 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
66 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
67 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
68 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
69 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
70 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
71 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
72 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
73 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
74 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
75 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
76 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
77 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
78 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
79 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
80 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
81 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
82 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
83 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
84 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
85 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
86 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
87 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
88 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
91 __constant u32 te1[256] =
93 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
94 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
95 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
96 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
97 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
98 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
99 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
100 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
101 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
102 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
103 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
104 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
105 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
106 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
107 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
108 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
109 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
110 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
111 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
112 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
113 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
114 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
115 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
116 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
117 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
118 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
119 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
120 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
121 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
122 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
123 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
124 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
125 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
126 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
127 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
128 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
129 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
130 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
131 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
132 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
133 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
134 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
135 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
136 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
137 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
138 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
139 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
140 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
141 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
142 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
143 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
144 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
145 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
146 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
147 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
148 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
149 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
150 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
151 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
152 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
153 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
154 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
155 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
156 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
159 __constant u32 te2[256] =
161 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
162 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
163 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
164 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
165 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
166 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
167 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
168 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
169 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
170 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
171 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
172 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
173 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
174 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
175 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
176 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
177 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
178 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
179 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
180 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
181 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
182 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
183 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
184 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
185 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
186 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
187 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
188 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
189 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
190 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
191 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
192 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
193 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
194 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
195 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
196 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
197 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
198 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
199 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
200 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
201 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
202 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
203 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
204 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
205 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
206 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
207 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
208 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
209 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
210 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
211 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
212 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
213 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
214 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
215 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
216 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
217 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
218 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
219 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
220 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
221 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
222 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
223 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
224 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
227 __constant u32 te3[256] =
229 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
230 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
231 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
232 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
233 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
234 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
235 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
236 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
237 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
238 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
239 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
240 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
241 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
242 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
243 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
244 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
245 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
246 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
247 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
248 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
249 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
250 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
251 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
252 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
253 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
254 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
255 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
256 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
257 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
258 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
259 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
260 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
261 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
262 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
263 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
264 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
265 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
266 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
267 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
268 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
269 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
270 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
271 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
272 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
273 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
274 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
275 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
276 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
277 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
278 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
279 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
280 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
281 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
282 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
283 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
284 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
285 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
286 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
287 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
288 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
289 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
290 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
291 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
292 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
295 __constant u32 te4[256] =
297 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
298 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
299 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
300 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
301 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
302 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
303 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
304 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
305 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
306 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
307 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
308 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
309 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
310 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
311 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
312 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
313 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
314 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
315 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
316 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
317 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
318 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
319 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
320 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
321 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
322 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
323 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
324 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
325 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
326 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
327 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
328 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
329 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
330 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
331 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
332 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
333 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
334 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
335 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
336 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
337 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
338 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
339 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
340 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
341 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
342 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
343 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
344 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
345 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
346 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
347 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
348 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
349 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
350 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
351 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
352 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
353 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
354 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
355 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
356 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
357 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
358 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
359 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
360 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
363 __constant u32 td0[256] =
365 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
366 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
367 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
368 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
369 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
370 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
371 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
372 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
373 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
374 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
375 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
376 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
377 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
378 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
379 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
380 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
381 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
382 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
383 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
384 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
385 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
386 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
387 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
388 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
389 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
390 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
391 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
392 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
393 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
394 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
395 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
396 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
397 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
398 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
399 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
400 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
401 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
402 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
403 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
404 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
405 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
406 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
407 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
408 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
409 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
410 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
411 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
412 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
413 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
414 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
415 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
416 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
417 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
418 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
419 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
420 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
421 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
422 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
423 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
424 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
425 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
426 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
427 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
428 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
431 __constant u32 td1[256] =
433 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
434 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
435 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
436 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
437 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
438 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
439 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
440 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
441 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
442 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
443 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
444 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
445 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
446 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
447 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
448 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
449 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
450 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
451 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
452 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
453 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
454 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
455 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
456 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
457 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
458 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
459 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
460 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
461 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
462 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
463 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
464 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
465 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
466 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
467 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
468 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
469 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
470 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
471 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
472 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
473 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
474 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
475 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
476 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
477 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
478 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
479 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
480 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
481 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
482 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
483 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
484 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
485 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
486 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
487 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
488 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
489 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
490 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
491 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
492 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
493 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
494 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
495 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
496 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
499 __constant u32 td2[256] =
501 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
502 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
503 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
504 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
505 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
506 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
507 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
508 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
509 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
510 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
511 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
512 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
513 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
514 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
515 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
516 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
517 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
518 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
519 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
520 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
521 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
522 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
523 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
524 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
525 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
526 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
527 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
528 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
529 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
530 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
531 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
532 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
533 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
534 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
535 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
536 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
537 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
538 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
539 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
540 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
541 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
542 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
543 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
544 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
545 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
546 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
547 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
548 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
549 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
550 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
551 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
552 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
553 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
554 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
555 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
556 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
557 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
558 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
559 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
560 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
561 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
562 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
563 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
564 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
567 __constant u32 td3[256] =
569 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
570 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
571 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
572 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
573 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
574 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
575 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
576 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
577 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
578 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
579 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
580 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
581 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
582 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
583 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
584 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
585 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
586 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
587 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
588 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
589 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
590 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
591 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
592 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
593 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
594 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
595 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
596 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
597 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
598 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
599 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
600 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
601 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
602 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
603 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
604 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
605 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
606 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
607 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
608 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
609 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
610 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
611 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
612 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
613 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
614 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
615 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
616 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
617 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
618 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
619 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
620 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
621 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
622 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
623 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
624 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
625 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
626 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
627 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
628 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
629 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
630 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
631 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
632 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
635 __constant u32 td4[256] =
637 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
638 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
639 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
640 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
641 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
642 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
643 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
644 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
645 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
646 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
647 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
648 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
649 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
650 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
651 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
652 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
653 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
654 0x86868686, 0x68686868, 0x98989898, 0x16161616,
655 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
656 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
657 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
658 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
659 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
660 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
661 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
662 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
663 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
664 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
665 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
666 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
667 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
668 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
669 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
670 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
671 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
672 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
673 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
674 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
675 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
676 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
677 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
678 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
679 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
680 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
681 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
682 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
683 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
684 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
685 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
686 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
687 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
688 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
689 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
690 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
691 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
692 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
693 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
694 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
695 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
696 0x83838383, 0x53535353, 0x99999999, 0x61616161,
697 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
698 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
699 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
700 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
703 __constant u32 rcon[] =
705 0x01000000, 0x02000000, 0x04000000, 0x08000000,
706 0x10000000, 0x20000000, 0x40000000, 0x80000000,
707 0x1b000000, 0x36000000,
710 static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256])
731 u32 temp = rek[j + 7];
733 rek[j + 8] = rek[j + 0]
734 ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000)
735 ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000)
736 ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00)
737 ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff)
740 rek[j + 9] = rek[j + 1] ^ rek[j + 8];
741 rek[j + 10] = rek[j + 2] ^ rek[j + 9];
742 rek[j + 11] = rek[j + 3] ^ rek[j + 10];
752 rek[j + 12] = rek[j + 4]
753 ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000)
754 ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000)
755 ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00)
756 ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff);
758 rek[j + 13] = rek[j + 5] ^ rek[j + 12];
759 rek[j + 14] = rek[j + 6] ^ rek[j + 13];
760 rek[j + 15] = rek[j + 7] ^ rek[j + 14];
766 static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256])
768 for (u32 i = 0, j = 56; i < j; i += 4, j -= 4)
772 temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp;
773 temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp;
774 temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp;
775 temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp;
778 for (u32 i = 1, j = 4; i < 14; i += 1, j += 4)
781 s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^
782 s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^
783 s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^
784 s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff];
787 s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^
788 s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^
789 s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^
790 s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff];
793 s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^
794 s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^
795 s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^
796 s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff];
799 s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^
800 s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^
801 s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^
802 s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff];
806 static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256])
808 u32 s0 = in[0] ^ rdk[0];
809 u32 s1 = in[1] ^ rdk[1];
810 u32 s2 = in[2] ^ rdk[2];
811 u32 s3 = in[3] ^ rdk[3];
818 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4];
819 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5];
820 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6];
821 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7];
822 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8];
823 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9];
824 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10];
825 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11];
826 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12];
827 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13];
828 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14];
829 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15];
830 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16];
831 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17];
832 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18];
833 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19];
834 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20];
835 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21];
836 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22];
837 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23];
838 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24];
839 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25];
840 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26];
841 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27];
842 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28];
843 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29];
844 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30];
845 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31];
846 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32];
847 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33];
848 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34];
849 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35];
850 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36];
851 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37];
852 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38];
853 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39];
854 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40];
855 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41];
856 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42];
857 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43];
858 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44];
859 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45];
860 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46];
861 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47];
862 s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48];
863 s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49];
864 s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50];
865 s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51];
866 t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52];
867 t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53];
868 t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54];
869 t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55];
871 out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000)
872 ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000)
873 ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00)
874 ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff)
877 out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000)
878 ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000)
879 ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00)
880 ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff)
883 out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000)
884 ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000)
885 ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00)
886 ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff)
889 out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000)
890 ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000)
891 ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00)
892 ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff)
896 __constant u32 k_sha256[64] =
898 SHA256C00, SHA256C01, SHA256C02, SHA256C03,
899 SHA256C04, SHA256C05, SHA256C06, SHA256C07,
900 SHA256C08, SHA256C09, SHA256C0a, SHA256C0b,
901 SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f,
902 SHA256C10, SHA256C11, SHA256C12, SHA256C13,
903 SHA256C14, SHA256C15, SHA256C16, SHA256C17,
904 SHA256C18, SHA256C19, SHA256C1a, SHA256C1b,
905 SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f,
906 SHA256C20, SHA256C21, SHA256C22, SHA256C23,
907 SHA256C24, SHA256C25, SHA256C26, SHA256C27,
908 SHA256C28, SHA256C29, SHA256C2a, SHA256C2b,
909 SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f,
910 SHA256C30, SHA256C31, SHA256C32, SHA256C33,
911 SHA256C34, SHA256C35, SHA256C36, SHA256C37,
912 SHA256C38, SHA256C39, SHA256C3a, SHA256C3b,
913 SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f,
916 static void sha256_transform (const u32 w[16], u32 digest[8])
927 u32 w0_t = swap32 (w[ 0]);
928 u32 w1_t = swap32 (w[ 1]);
929 u32 w2_t = swap32 (w[ 2]);
930 u32 w3_t = swap32 (w[ 3]);
931 u32 w4_t = swap32 (w[ 4]);
932 u32 w5_t = swap32 (w[ 5]);
933 u32 w6_t = swap32 (w[ 6]);
934 u32 w7_t = swap32 (w[ 7]);
935 u32 w8_t = swap32 (w[ 8]);
936 u32 w9_t = swap32 (w[ 9]);
937 u32 wa_t = swap32 (w[10]);
938 u32 wb_t = swap32 (w[11]);
939 u32 wc_t = swap32 (w[12]);
940 u32 wd_t = swap32 (w[13]);
941 u32 we_t = swap32 (w[14]);
942 u32 wf_t = swap32 (w[15]);
944 #define ROUND_EXPAND() \
946 w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \
947 w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \
948 w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \
949 w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \
950 w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \
951 w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \
952 w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \
953 w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \
954 w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \
955 w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \
956 wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \
957 wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \
958 wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \
959 wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \
960 we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \
961 wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \
964 #define ROUND_STEP(i) \
966 SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \
967 SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \
968 SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \
969 SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \
970 SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \
971 SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \
972 SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \
973 SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \
974 SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \
975 SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \
976 SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \
977 SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \
978 SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \
979 SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \
980 SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \
981 SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \
987 for (int i = 16; i < 64; i += 16)
989 ROUND_EXPAND (); ROUND_STEP (i);
1002 __constant u32 crc32tab[0x100] =
1004 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
1005 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
1006 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
1007 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
1008 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1009 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
1010 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
1011 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
1012 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
1013 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1014 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
1015 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
1016 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
1017 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
1018 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1019 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
1020 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
1021 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
1022 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
1023 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1024 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
1025 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
1026 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
1027 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
1028 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1029 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
1030 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
1031 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
1032 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
1033 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1034 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
1035 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
1036 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
1037 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
1038 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1039 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
1040 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
1041 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
1042 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
1043 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1044 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
1045 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
1046 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
1047 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
1048 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1049 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
1050 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
1051 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
1052 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
1053 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1054 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
1055 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
1056 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
1057 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
1058 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1059 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
1060 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
1061 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
1062 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
1063 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1064 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
1065 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
1066 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
1067 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
1070 static u32 round_crc32 (u32 a, const u32 v)
1072 const u32 k = (a ^ v) & 0xff;
1074 const u32 s = a >> 8;
1081 a.s0 = crc32tab[k.s0];
1082 a.s1 = crc32tab[k.s1];
1086 a.s0 = crc32tab[k.s0];
1087 a.s1 = crc32tab[k.s1];
1088 a.s2 = crc32tab[k.s2];
1089 a.s3 = crc32tab[k.s3];
1097 static u32 crc32 (const u32 w[16], const u32 pw_len, const u32 iv)
1101 if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0);
1102 if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8);
1103 if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16);
1104 if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24);
1106 for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1)
1108 if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0);
1109 if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8);
1110 if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16);
1111 if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24);
1117 static void bzero16 (u32 block[16])
1137 static u32 memcat8c (u32 block[16], const u32 block_len, const u32 append[2], const u32 append_len, u32 digest[8])
1139 const u32 mod = block_len & 3;
1140 const u32 div = block_len / 4;
1147 const int offset_minus_4 = 4 - (block_len & 3);
1149 const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
1151 tmp0 = __byte_perm ( 0, append[0], selector);
1152 tmp1 = __byte_perm (append[0], append[1], selector);
1153 tmp2 = __byte_perm (append[1], 0, selector);
1157 const int offset_minus_4 = 4 - block_len;
1159 tmp0 = amd_bytealign (append[0], 0, offset_minus_4);
1160 tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
1161 tmp2 = amd_bytealign ( 0, append[1], offset_minus_4);
1171 u32 carry[2] = { 0, 0 };
1175 case 0: block[ 0] |= tmp0;
1179 case 1: block[ 1] |= tmp0;
1183 case 2: block[ 2] |= tmp0;
1187 case 3: block[ 3] |= tmp0;
1191 case 4: block[ 4] |= tmp0;
1195 case 5: block[ 5] |= tmp0;
1199 case 6: block[ 6] |= tmp0;
1203 case 7: block[ 7] |= tmp0;
1207 case 8: block[ 8] |= tmp0;
1211 case 9: block[ 9] |= tmp0;
1215 case 10: block[10] |= tmp0;
1219 case 11: block[11] |= tmp0;
1223 case 12: block[12] |= tmp0;
1227 case 13: block[13] |= tmp0;
1231 case 14: block[14] |= tmp0;
1235 case 15: block[15] |= tmp0;
1241 u32 new_len = block_len + append_len;
1247 sha256_transform (block, digest);
1251 block[0] = carry[0];
1252 block[1] = carry[1];
1258 static u32 memcat32c (u32 block[16], const u32 block_len, const u32 append[8], const u32 append_len, u32 digest[8])
1260 const u32 mod = block_len & 3;
1261 const u32 div = block_len / 4;
1274 const int offset_minus_4 = 4 - (block_len & 3);
1276 const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
1278 tmp0 = __byte_perm ( 0, append[0], selector);
1279 tmp1 = __byte_perm (append[0], append[1], selector);
1280 tmp2 = __byte_perm (append[1], append[2], selector);
1281 tmp3 = __byte_perm (append[2], append[3], selector);
1282 tmp4 = __byte_perm (append[3], append[4], selector);
1283 tmp5 = __byte_perm (append[4], append[5], selector);
1284 tmp6 = __byte_perm (append[5], append[6], selector);
1285 tmp7 = __byte_perm (append[6], append[7], selector);
1286 tmp8 = __byte_perm (append[7], 0, selector);
1290 const int offset_minus_4 = 4 - block_len;
1292 tmp0 = amd_bytealign (append[0], 0, offset_minus_4);
1293 tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
1294 tmp2 = amd_bytealign (append[2], append[1], offset_minus_4);
1295 tmp3 = amd_bytealign (append[3], append[2], offset_minus_4);
1296 tmp4 = amd_bytealign (append[4], append[3], offset_minus_4);
1297 tmp5 = amd_bytealign (append[5], append[4], offset_minus_4);
1298 tmp6 = amd_bytealign (append[6], append[5], offset_minus_4);
1299 tmp7 = amd_bytealign (append[7], append[6], offset_minus_4);
1300 tmp8 = amd_bytealign ( 0, append[7], offset_minus_4);
1316 u32 carry[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
1320 case 0: block[ 0] |= tmp0;
1330 case 1: block[ 1] |= tmp0;
1340 case 2: block[ 2] |= tmp0;
1350 case 3: block[ 3] |= tmp0;
1360 case 4: block[ 4] |= tmp0;
1370 case 5: block[ 5] |= tmp0;
1380 case 6: block[ 6] |= tmp0;
1390 case 7: block[ 7] |= tmp0;
1400 case 8: block[ 8] |= tmp0;
1410 case 9: block[ 9] |= tmp0;
1420 case 10: block[10] |= tmp0;
1430 case 11: block[11] |= tmp0;
1440 case 12: block[12] |= tmp0;
1450 case 13: block[13] |= tmp0;
1460 case 14: block[14] |= tmp0;
1470 case 15: block[15] |= tmp0;
1482 u32 new_len = block_len + append_len;
1488 sha256_transform (block, digest);
1492 block[0] = carry[0];
1493 block[1] = carry[1];
1494 block[2] = carry[2];
1495 block[3] = carry[3];
1496 block[4] = carry[4];
1497 block[5] = carry[5];
1498 block[6] = carry[6];
1499 block[7] = carry[7];
1505 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1511 const u32 gid = get_global_id (0);
1513 if (gid >= gid_max) return;
1516 * algo starts here already
1521 dgst[0] = SHA256M_A;
1522 dgst[1] = SHA256M_B;
1523 dgst[2] = SHA256M_C;
1524 dgst[3] = SHA256M_D;
1525 dgst[4] = SHA256M_E;
1526 dgst[5] = SHA256M_F;
1527 dgst[6] = SHA256M_G;
1528 dgst[7] = SHA256M_H;
1541 tmps[gid].dgst[0] = dgst[0];
1542 tmps[gid].dgst[1] = dgst[1];
1543 tmps[gid].dgst[2] = dgst[2];
1544 tmps[gid].dgst[3] = dgst[3];
1545 tmps[gid].dgst[4] = dgst[4];
1546 tmps[gid].dgst[5] = dgst[5];
1547 tmps[gid].dgst[6] = dgst[6];
1548 tmps[gid].dgst[7] = dgst[7];
1550 tmps[gid].block[ 0] = block[ 0];
1551 tmps[gid].block[ 1] = block[ 1];
1552 tmps[gid].block[ 2] = block[ 2];
1553 tmps[gid].block[ 3] = block[ 3];
1554 tmps[gid].block[ 4] = block[ 4];
1555 tmps[gid].block[ 5] = block[ 5];
1556 tmps[gid].block[ 6] = block[ 6];
1557 tmps[gid].block[ 7] = block[ 7];
1558 tmps[gid].block[ 8] = block[ 8];
1559 tmps[gid].block[ 9] = block[ 9];
1560 tmps[gid].block[10] = block[10];
1561 tmps[gid].block[11] = block[11];
1562 tmps[gid].block[12] = block[12];
1563 tmps[gid].block[13] = block[13];
1564 tmps[gid].block[14] = block[14];
1565 tmps[gid].block[15] = block[15];
1567 tmps[gid].block_len = block_len;
1568 tmps[gid].final_len = final_len;
1571 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1577 const u32 gid = get_global_id (0);
1579 if (gid >= gid_max) return;
1583 pw[0] = pws[gid].i[ 0];
1584 pw[1] = pws[gid].i[ 1];
1585 pw[2] = pws[gid].i[ 2];
1586 pw[3] = pws[gid].i[ 3];
1592 u32 pw_len = pws[gid].pw_len;
1594 make_unicode (&pw[0], &pw[0], &pw[4]);
1604 dgst[0] = tmps[gid].dgst[0];
1605 dgst[1] = tmps[gid].dgst[1];
1606 dgst[2] = tmps[gid].dgst[2];
1607 dgst[3] = tmps[gid].dgst[3];
1608 dgst[4] = tmps[gid].dgst[4];
1609 dgst[5] = tmps[gid].dgst[5];
1610 dgst[6] = tmps[gid].dgst[6];
1611 dgst[7] = tmps[gid].dgst[7];
1615 block[ 0] = tmps[gid].block[ 0];
1616 block[ 1] = tmps[gid].block[ 1];
1617 block[ 2] = tmps[gid].block[ 2];
1618 block[ 3] = tmps[gid].block[ 3];
1619 block[ 4] = tmps[gid].block[ 4];
1620 block[ 5] = tmps[gid].block[ 5];
1621 block[ 6] = tmps[gid].block[ 6];
1622 block[ 7] = tmps[gid].block[ 7];
1623 block[ 8] = tmps[gid].block[ 8];
1624 block[ 9] = tmps[gid].block[ 9];
1625 block[10] = tmps[gid].block[10];
1626 block[11] = tmps[gid].block[11];
1627 block[12] = tmps[gid].block[12];
1628 block[13] = tmps[gid].block[13];
1629 block[14] = tmps[gid].block[14];
1630 block[15] = tmps[gid].block[15];
1632 u32 block_len = tmps[gid].block_len;
1633 u32 final_len = tmps[gid].final_len;
1639 for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++)
1646 block_len = memcat32c (block, block_len, pw, pw_len, dgst); final_len += pw_len;
1647 block_len = memcat8c (block, block_len, it, 8, dgst); final_len += 8;
1654 tmps[gid].dgst[0] = dgst[0];
1655 tmps[gid].dgst[1] = dgst[1];
1656 tmps[gid].dgst[2] = dgst[2];
1657 tmps[gid].dgst[3] = dgst[3];
1658 tmps[gid].dgst[4] = dgst[4];
1659 tmps[gid].dgst[5] = dgst[5];
1660 tmps[gid].dgst[6] = dgst[6];
1661 tmps[gid].dgst[7] = dgst[7];
1663 tmps[gid].block[ 0] = block[ 0];
1664 tmps[gid].block[ 1] = block[ 1];
1665 tmps[gid].block[ 2] = block[ 2];
1666 tmps[gid].block[ 3] = block[ 3];
1667 tmps[gid].block[ 4] = block[ 4];
1668 tmps[gid].block[ 5] = block[ 5];
1669 tmps[gid].block[ 6] = block[ 6];
1670 tmps[gid].block[ 7] = block[ 7];
1671 tmps[gid].block[ 8] = block[ 8];
1672 tmps[gid].block[ 9] = block[ 9];
1673 tmps[gid].block[10] = block[10];
1674 tmps[gid].block[11] = block[11];
1675 tmps[gid].block[12] = block[12];
1676 tmps[gid].block[13] = block[13];
1677 tmps[gid].block[14] = block[14];
1678 tmps[gid].block[15] = block[15];
1680 tmps[gid].block_len = block_len;
1681 tmps[gid].final_len = final_len;
1684 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1690 const u32 gid = get_global_id (0);
1691 const u32 lid = get_local_id (0);
1697 const u32 lid4 = lid * 4;
1699 __local u32 s_td0[256];
1700 __local u32 s_td1[256];
1701 __local u32 s_td2[256];
1702 __local u32 s_td3[256];
1703 __local u32 s_td4[256];
1705 __local u32 s_te0[256];
1706 __local u32 s_te1[256];
1707 __local u32 s_te2[256];
1708 __local u32 s_te3[256];
1709 __local u32 s_te4[256];
1711 s_td0[lid4 + 0] = td0[lid4 + 0];
1712 s_td0[lid4 + 1] = td0[lid4 + 1];
1713 s_td0[lid4 + 2] = td0[lid4 + 2];
1714 s_td0[lid4 + 3] = td0[lid4 + 3];
1716 s_td1[lid4 + 0] = td1[lid4 + 0];
1717 s_td1[lid4 + 1] = td1[lid4 + 1];
1718 s_td1[lid4 + 2] = td1[lid4 + 2];
1719 s_td1[lid4 + 3] = td1[lid4 + 3];
1721 s_td2[lid4 + 0] = td2[lid4 + 0];
1722 s_td2[lid4 + 1] = td2[lid4 + 1];
1723 s_td2[lid4 + 2] = td2[lid4 + 2];
1724 s_td2[lid4 + 3] = td2[lid4 + 3];
1726 s_td3[lid4 + 0] = td3[lid4 + 0];
1727 s_td3[lid4 + 1] = td3[lid4 + 1];
1728 s_td3[lid4 + 2] = td3[lid4 + 2];
1729 s_td3[lid4 + 3] = td3[lid4 + 3];
1731 s_td4[lid4 + 0] = td4[lid4 + 0];
1732 s_td4[lid4 + 1] = td4[lid4 + 1];
1733 s_td4[lid4 + 2] = td4[lid4 + 2];
1734 s_td4[lid4 + 3] = td4[lid4 + 3];
1736 s_te0[lid4 + 0] = te0[lid4 + 0];
1737 s_te0[lid4 + 1] = te0[lid4 + 1];
1738 s_te0[lid4 + 2] = te0[lid4 + 2];
1739 s_te0[lid4 + 3] = te0[lid4 + 3];
1741 s_te1[lid4 + 0] = te1[lid4 + 0];
1742 s_te1[lid4 + 1] = te1[lid4 + 1];
1743 s_te1[lid4 + 2] = te1[lid4 + 2];
1744 s_te1[lid4 + 3] = te1[lid4 + 3];
1746 s_te2[lid4 + 0] = te2[lid4 + 0];
1747 s_te2[lid4 + 1] = te2[lid4 + 1];
1748 s_te2[lid4 + 2] = te2[lid4 + 2];
1749 s_te2[lid4 + 3] = te2[lid4 + 3];
1751 s_te3[lid4 + 0] = te3[lid4 + 0];
1752 s_te3[lid4 + 1] = te3[lid4 + 1];
1753 s_te3[lid4 + 2] = te3[lid4 + 2];
1754 s_te3[lid4 + 3] = te3[lid4 + 3];
1756 s_te4[lid4 + 0] = te4[lid4 + 0];
1757 s_te4[lid4 + 1] = te4[lid4 + 1];
1758 s_te4[lid4 + 2] = te4[lid4 + 2];
1759 s_te4[lid4 + 3] = te4[lid4 + 3];
1761 barrier (CLK_LOCAL_MEM_FENCE);
1763 if (gid >= gid_max) return;
1771 dgst[0] = tmps[gid].dgst[0];
1772 dgst[1] = tmps[gid].dgst[1];
1773 dgst[2] = tmps[gid].dgst[2];
1774 dgst[3] = tmps[gid].dgst[3];
1775 dgst[4] = tmps[gid].dgst[4];
1776 dgst[5] = tmps[gid].dgst[5];
1777 dgst[6] = tmps[gid].dgst[6];
1778 dgst[7] = tmps[gid].dgst[7];
1782 block[ 0] = tmps[gid].block[ 0];
1783 block[ 1] = tmps[gid].block[ 1];
1784 block[ 2] = tmps[gid].block[ 2];
1785 block[ 3] = tmps[gid].block[ 3];
1786 block[ 4] = tmps[gid].block[ 4];
1787 block[ 5] = tmps[gid].block[ 5];
1788 block[ 6] = tmps[gid].block[ 6];
1789 block[ 7] = tmps[gid].block[ 7];
1790 block[ 8] = tmps[gid].block[ 8];
1791 block[ 9] = tmps[gid].block[ 9];
1792 block[10] = tmps[gid].block[10];
1793 block[11] = tmps[gid].block[11];
1794 block[12] = tmps[gid].block[12];
1795 block[13] = tmps[gid].block[13];
1796 block[14] = tmps[gid].block[14];
1797 block[15] = tmps[gid].block[15];
1799 u32 block_len = tmps[gid].block_len;
1800 u32 final_len = tmps[gid].final_len;
1802 append_0x80_1x16 (block, block_len);
1804 if (block_len >= 56)
1806 sha256_transform (block, dgst);
1811 block[15] = swap32 (final_len * 8);
1813 sha256_transform (block, dgst);
1816 * final key operations
1821 iv[0] = esalt_bufs[salt_pos].iv_buf[0];
1822 iv[1] = esalt_bufs[salt_pos].iv_buf[1];
1823 iv[2] = esalt_bufs[salt_pos].iv_buf[2];
1824 iv[3] = esalt_bufs[salt_pos].iv_buf[3];
1841 AES256_ExpandKey (ukey, rk, s_te0, s_te1, s_te2, s_te3, s_te4);
1843 AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4);
1847 int data_len = esalt_bufs[salt_pos].data_len;
1848 int unpack_size = esalt_bufs[salt_pos].unpack_size;
1853 for (i = 0, j = 0; i < data_len - 16; i += 16, j += 4)
1857 data[0] = swap32 (esalt_bufs[salt_pos].data_buf[j + 0]);
1858 data[1] = swap32 (esalt_bufs[salt_pos].data_buf[j + 1]);
1859 data[2] = swap32 (esalt_bufs[salt_pos].data_buf[j + 2]);
1860 data[3] = swap32 (esalt_bufs[salt_pos].data_buf[j + 3]);
1864 AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4);
1876 out[0] = swap32 (out[0]);
1877 out[1] = swap32 (out[1]);
1878 out[2] = swap32 (out[2]);
1879 out[3] = swap32 (out[3]);
1881 crc = crc32 (out, 16, crc);
1886 data[0] = swap32 (esalt_bufs[salt_pos].data_buf[j + 0]);
1887 data[1] = swap32 (esalt_bufs[salt_pos].data_buf[j + 1]);
1888 data[2] = swap32 (esalt_bufs[salt_pos].data_buf[j + 2]);
1889 data[3] = swap32 (esalt_bufs[salt_pos].data_buf[j + 3]);
1893 AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4);
1905 out[0] = swap32 (out[0]);
1906 out[1] = swap32 (out[1]);
1907 out[2] = swap32 (out[2]);
1908 out[3] = swap32 (out[3]);
1910 const u32 margin = data_len - unpack_size;
1912 const u32 left = 16 - margin;
1914 crc = crc32 (out, left, crc);
1916 // use padding attack in that case
1922 case 15: out[0] &= 0xffffff00;
1924 case 14: out[0] &= 0xffff0000;
1926 case 13: out[0] &= 0xff000000;
1928 case 12: out[0] = 0;
1930 case 11: out[0] = 0;
1931 out[1] &= 0xffffff00;
1933 case 10: out[0] = 0;
1934 out[1] &= 0xffff0000;
1937 out[1] &= 0xff000000;
1944 out[2] &= 0xffffff00;
1948 out[2] &= 0xffff0000;
1952 out[2] &= 0xff000000;
1961 out[3] &= 0xffffff00;
1966 out[3] &= 0xffff0000;
1971 out[3] &= 0xff000000;
1975 if ((out[0] == 0) && (out[1] == 0) && (out[2] == 0) && (out[3] == 0))
1977 mark_hash (plains_buf, hashes_shown, digests_offset + 0, gid, 0);
1979 d_return_buf[lid] = 1;