2ead1ea9f27f37f4c5168b1a7906da8f381a7497
[hashcat.git] / OpenCL / m06231.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _WHIRLPOOL_
9
10 #include "inc_hash_constants.h"
11 #include "inc_vendor.cl"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "inc_hash_functions.cl"
19 #include "inc_types.cl"
20 #include "inc_common.cl"
21
22 #include "inc_cipher_aes256.cl"
23 #include "inc_cipher_twofish256.cl"
24 #include "inc_cipher_serpent256.cl"
25
26 #define R 10
27
28 __constant u32 Ch[8][256] =
29 {
30   {
31     0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8,
32     0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f,
33     0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5,
34     0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552,
35     0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e,
36     0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435,
37     0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2,
38     0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157,
39     0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5,
40     0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda,
41     0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a,
42     0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85,
43     0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4,
44     0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167,
45     0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b,
46     0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8,
47     0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566,
48     0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e,
49     0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07,
50     0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33,
51     0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971,
52     0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9,
53     0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88,
54     0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0,
55     0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80,
56     0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48,
57     0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f,
58     0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae,
59     0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822,
60     0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812,
61     0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec,
62     0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d,
63     0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b,
64     0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b,
65     0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50,
66     0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef,
67     0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea,
68     0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0,
69     0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d,
70     0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a,
71     0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f,
72     0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296,
73     0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959,
74     0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c,
75     0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c,
76     0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961,
77     0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e,
78     0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004,
79     0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d,
80     0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024,
81     0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411,
82     0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb,
83     0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7,
84     0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3,
85     0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03,
86     0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9,
87     0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153,
88     0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c,
89     0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546,
90     0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1,
91     0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409,
92     0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed,
93     0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4,
94     0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286,
95   },
96   {
97     0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887,
98     0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21,
99     0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3,
100     0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255,
101     0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02,
102     0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4,
103     0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f,
104     0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741,
105     0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3,
106     0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f,
107     0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28,
108     0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e,
109     0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7,
110     0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781,
111     0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16,
112     0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847,
113     0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685,
114     0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42,
115     0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c,
116     0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc,
117     0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9,
118     0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943,
119     0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a,
120     0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa,
121     0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a,
122     0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d,
123     0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61,
124     0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82,
125     0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288,
126     0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248,
127     0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97,
128     0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4,
129     0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac,
130     0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c,
131     0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d,
132     0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b,
133     0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f,
134     0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027,
135     0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29,
136     0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12,
137     0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c,
138     0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662,
139     0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979,
140     0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d,
141     0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a,
142     0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199,
143     0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78,
144     0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410,
145     0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34,
146     0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490,
147     0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144,
148     0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b,
149     0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb,
150     0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b,
151     0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c,
152     0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e,
153     0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351,
154     0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad,
155     0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605,
156     0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3,
157     0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924,
158     0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93,
159     0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa,
160     0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622,
161   },
162   {
163     0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8,
164     0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f,
165     0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5,
166     0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252,
167     0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e,
168     0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535,
169     0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2,
170     0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757,
171     0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5,
172     0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada,
173     0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a,
174     0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585,
175     0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4,
176     0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767,
177     0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b,
178     0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8,
179     0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666,
180     0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e,
181     0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707,
182     0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333,
183     0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171,
184     0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9,
185     0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888,
186     0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0,
187     0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080,
188     0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848,
189     0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f,
190     0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae,
191     0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222,
192     0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212,
193     0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec,
194     0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d,
195     0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b,
196     0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b,
197     0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050,
198     0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef,
199     0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea,
200     0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0,
201     0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d,
202     0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a,
203     0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f,
204     0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696,
205     0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959,
206     0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c,
207     0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c,
208     0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161,
209     0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e,
210     0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404,
211     0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d,
212     0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424,
213     0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111,
214     0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb,
215     0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7,
216     0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3,
217     0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303,
218     0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9,
219     0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353,
220     0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c,
221     0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646,
222     0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1,
223     0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909,
224     0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded,
225     0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4,
226     0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686,
227   },
228   {
229     0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8,
230     0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f,
231     0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5,
232     0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852,
233     0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e,
234     0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035,
235     0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2,
236     0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557,
237     0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5,
238     0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da,
239     0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a,
240     0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985,
241     0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4,
242     0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867,
243     0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b,
244     0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8,
245     0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166,
246     0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e,
247     0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07,
248     0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633,
249     0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71,
250     0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9,
251     0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88,
252     0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0,
253     0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480,
254     0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248,
255     0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f,
256     0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae,
257     0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22,
258     0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212,
259     0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec,
260     0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d,
261     0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b,
262     0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b,
263     0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50,
264     0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef,
265     0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea,
266     0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0,
267     0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d,
268     0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a,
269     0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f,
270     0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296,
271     0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59,
272     0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c,
273     0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c,
274     0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61,
275     0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e,
276     0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404,
277     0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d,
278     0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924,
279     0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911,
280     0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb,
281     0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7,
282     0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3,
283     0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03,
284     0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9,
285     0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153,
286     0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c,
287     0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46,
288     0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1,
289     0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109,
290     0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed,
291     0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4,
292     0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286,
293   },
294   {
295     0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb,
296     0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d,
297     0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e,
298     0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8,
299     0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a,
300     0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80,
301     0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c,
302     0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5,
303     0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e,
304     0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944,
305     0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a,
306     0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9,
307     0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507,
308     0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78,
309     0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7,
310     0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56,
311     0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71,
312     0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a,
313     0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f,
314     0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6,
315     0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de,
316     0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f,
317     0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc,
318     0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59,
319     0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4,
320     0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032,
321     0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d,
322     0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7,
323     0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f,
324     0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482,
325     0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df,
326     0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8,
327     0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e,
328     0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3,
329     0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea,
330     0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4,
331     0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9,
332     0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e,
333     0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f,
334     0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae,
335     0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7,
336     0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152,
337     0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab,
338     0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816,
339     0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598,
340     0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e,
341     0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee,
342     0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824,
343     0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65,
344     0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819,
345     0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299,
346     0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0,
347     0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c,
348     0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05,
349     0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b,
350     0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88,
351     0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1,
352     0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b,
353     0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c,
354     0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba,
355     0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241,
356     0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6,
357     0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed,
358     0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2,
359   },
360   {
361     0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd,
362     0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e,
363     0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7,
364     0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4,
365     0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01,
366     0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a,
367     0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99,
368     0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae,
369     0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7,
370     0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9,
371     0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214,
372     0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17,
373     0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5,
374     0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce,
375     0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b,
376     0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad,
377     0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc,
378     0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21,
379     0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e,
380     0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66,
381     0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2,
382     0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf,
383     0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d,
384     0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d,
385     0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d,
386     0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590,
387     0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe,
388     0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41,
389     0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44,
390     0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24,
391     0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5,
392     0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a,
393     0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756,
394     0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736,
395     0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0,
396     0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3,
397     0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9,
398     0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d,
399     0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a,
400     0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809,
401     0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e,
402     0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431,
403     0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2,
404     0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198,
405     0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605,
406     0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2,
407     0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c,
408     0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408,
409     0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a,
410     0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448,
411     0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522,
412     0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb,
413     0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3,
414     0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb,
415     0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06,
416     0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f,
417     0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6,
418     0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8,
419     0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c,
420     0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df,
421     0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12,
422     0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7,
423     0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55,
424     0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411,
425   },
426   {
427     0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f,
428     0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e,
429     0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06,
430     0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07,
431     0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c,
432     0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1,
433     0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed,
434     0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216,
435     0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56,
436     0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95,
437     0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022,
438     0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab,
439     0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303,
440     0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6,
441     0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d,
442     0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f,
443     0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3,
444     0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc,
445     0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b,
446     0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff,
447     0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8,
448     0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a,
449     0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492,
450     0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a,
451     0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba,
452     0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75,
453     0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e,
454     0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c,
455     0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa,
456     0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a,
457     0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b,
458     0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9,
459     0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587,
460     0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877,
461     0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d,
462     0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74,
463     0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365,
464     0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7,
465     0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264,
466     0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498,
467     0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863,
468     0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4,
469     0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220,
470     0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61,
471     0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486,
472     0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8,
473     0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066,
474     0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014,
475     0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839,
476     0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4,
477     0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855,
478     0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60,
479     0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c,
480     0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8,
481     0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f,
482     0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137,
483     0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202,
484     0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1,
485     0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43,
486     0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42,
487     0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d,
488     0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e,
489     0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e,
490     0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4,
491   },
492   {
493     0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813,
494     0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42,
495     0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb,
496     0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa,
497     0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04,
498     0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5,
499     0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e,
500     0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782,
501     0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b,
502     0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e,
503     0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50,
504     0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c,
505     0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3,
506     0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f,
507     0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c,
508     0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e,
509     0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617,
510     0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84,
511     0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738,
512     0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385,
513     0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af,
514     0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986,
515     0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834,
516     0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9,
517     0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074,
518     0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a,
519     0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2,
520     0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19,
521     0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d,
522     0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290,
523     0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33,
524     0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5,
525     0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45,
526     0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8,
527     0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba,
528     0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b,
529     0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03,
530     0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e,
531     0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52,
532     0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24,
533     0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8,
534     0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4,
535     0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2,
536     0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a,
537     0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14,
538     0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f,
539     0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0,
540     0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420,
541     0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68,
542     0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d,
543     0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188,
544     0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b,
545     0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb,
546     0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6,
547     0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318,
548     0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921,
549     0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2,
550     0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47,
551     0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a,
552     0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b,
553     0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948,
554     0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b,
555     0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449,
556     0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644,
557   }
558 };
559
560 __constant u32 Cl[8][256] =
561 {
562   {
563     0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb,
564     0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d,
565     0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e,
566     0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8,
567     0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a,
568     0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80,
569     0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c,
570     0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5,
571     0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e,
572     0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944,
573     0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a,
574     0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9,
575     0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507,
576     0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78,
577     0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7,
578     0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56,
579     0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71,
580     0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a,
581     0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f,
582     0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6,
583     0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de,
584     0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f,
585     0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc,
586     0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59,
587     0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4,
588     0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032,
589     0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d,
590     0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7,
591     0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f,
592     0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482,
593     0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df,
594     0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8,
595     0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e,
596     0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3,
597     0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea,
598     0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4,
599     0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9,
600     0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e,
601     0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f,
602     0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae,
603     0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7,
604     0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152,
605     0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab,
606     0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816,
607     0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598,
608     0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e,
609     0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee,
610     0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824,
611     0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65,
612     0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819,
613     0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299,
614     0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0,
615     0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c,
616     0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05,
617     0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b,
618     0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88,
619     0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1,
620     0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b,
621     0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c,
622     0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba,
623     0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241,
624     0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6,
625     0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed,
626     0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2,
627   },
628   {
629     0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd,
630     0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e,
631     0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7,
632     0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4,
633     0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01,
634     0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a,
635     0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99,
636     0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae,
637     0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7,
638     0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9,
639     0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214,
640     0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17,
641     0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5,
642     0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce,
643     0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b,
644     0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad,
645     0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc,
646     0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21,
647     0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e,
648     0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66,
649     0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2,
650     0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf,
651     0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d,
652     0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d,
653     0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d,
654     0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590,
655     0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe,
656     0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41,
657     0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44,
658     0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24,
659     0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5,
660     0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a,
661     0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756,
662     0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736,
663     0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0,
664     0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3,
665     0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9,
666     0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d,
667     0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a,
668     0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809,
669     0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e,
670     0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431,
671     0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2,
672     0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198,
673     0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605,
674     0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2,
675     0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c,
676     0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408,
677     0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a,
678     0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448,
679     0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522,
680     0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb,
681     0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3,
682     0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb,
683     0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06,
684     0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f,
685     0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6,
686     0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8,
687     0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c,
688     0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df,
689     0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12,
690     0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7,
691     0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55,
692     0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411,
693   },
694   {
695     0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f,
696     0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e,
697     0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06,
698     0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07,
699     0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c,
700     0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1,
701     0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed,
702     0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216,
703     0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56,
704     0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95,
705     0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022,
706     0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab,
707     0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303,
708     0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6,
709     0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d,
710     0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f,
711     0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3,
712     0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc,
713     0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b,
714     0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff,
715     0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8,
716     0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a,
717     0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492,
718     0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a,
719     0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba,
720     0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75,
721     0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e,
722     0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c,
723     0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa,
724     0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a,
725     0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b,
726     0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9,
727     0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587,
728     0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877,
729     0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d,
730     0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74,
731     0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365,
732     0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7,
733     0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264,
734     0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498,
735     0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863,
736     0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4,
737     0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220,
738     0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61,
739     0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486,
740     0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8,
741     0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066,
742     0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014,
743     0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839,
744     0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4,
745     0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855,
746     0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60,
747     0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c,
748     0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8,
749     0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f,
750     0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137,
751     0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202,
752     0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1,
753     0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43,
754     0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42,
755     0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d,
756     0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e,
757     0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e,
758     0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4,
759   },
760   {
761     0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813,
762     0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42,
763     0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb,
764     0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa,
765     0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04,
766     0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5,
767     0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e,
768     0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782,
769     0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b,
770     0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e,
771     0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50,
772     0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c,
773     0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3,
774     0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f,
775     0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c,
776     0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e,
777     0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617,
778     0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84,
779     0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738,
780     0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385,
781     0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af,
782     0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986,
783     0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834,
784     0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9,
785     0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074,
786     0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a,
787     0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2,
788     0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19,
789     0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d,
790     0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290,
791     0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33,
792     0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5,
793     0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45,
794     0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8,
795     0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba,
796     0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b,
797     0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03,
798     0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e,
799     0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52,
800     0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24,
801     0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8,
802     0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4,
803     0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2,
804     0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a,
805     0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14,
806     0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f,
807     0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0,
808     0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420,
809     0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68,
810     0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d,
811     0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188,
812     0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b,
813     0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb,
814     0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6,
815     0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318,
816     0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921,
817     0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2,
818     0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47,
819     0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a,
820     0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b,
821     0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948,
822     0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b,
823     0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449,
824     0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644,
825   },
826   {
827     0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8,
828     0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f,
829     0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5,
830     0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552,
831     0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e,
832     0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435,
833     0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2,
834     0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157,
835     0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5,
836     0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda,
837     0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a,
838     0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85,
839     0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4,
840     0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167,
841     0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b,
842     0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8,
843     0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566,
844     0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e,
845     0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07,
846     0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33,
847     0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971,
848     0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9,
849     0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88,
850     0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0,
851     0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80,
852     0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48,
853     0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f,
854     0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae,
855     0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822,
856     0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812,
857     0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec,
858     0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d,
859     0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b,
860     0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b,
861     0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50,
862     0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef,
863     0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea,
864     0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0,
865     0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d,
866     0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a,
867     0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f,
868     0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296,
869     0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959,
870     0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c,
871     0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c,
872     0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961,
873     0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e,
874     0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004,
875     0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d,
876     0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024,
877     0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411,
878     0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb,
879     0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7,
880     0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3,
881     0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03,
882     0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9,
883     0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153,
884     0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c,
885     0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546,
886     0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1,
887     0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409,
888     0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed,
889     0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4,
890     0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286,
891   },
892   {
893     0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887,
894     0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21,
895     0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3,
896     0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255,
897     0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02,
898     0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4,
899     0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f,
900     0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741,
901     0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3,
902     0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f,
903     0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28,
904     0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e,
905     0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7,
906     0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781,
907     0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16,
908     0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847,
909     0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685,
910     0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42,
911     0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c,
912     0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc,
913     0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9,
914     0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943,
915     0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a,
916     0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa,
917     0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a,
918     0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d,
919     0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61,
920     0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82,
921     0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288,
922     0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248,
923     0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97,
924     0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4,
925     0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac,
926     0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c,
927     0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d,
928     0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b,
929     0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f,
930     0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027,
931     0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29,
932     0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12,
933     0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c,
934     0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662,
935     0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979,
936     0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d,
937     0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a,
938     0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199,
939     0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78,
940     0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410,
941     0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34,
942     0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490,
943     0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144,
944     0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b,
945     0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb,
946     0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b,
947     0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c,
948     0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e,
949     0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351,
950     0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad,
951     0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605,
952     0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3,
953     0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924,
954     0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93,
955     0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa,
956     0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622,
957   },
958   {
959     0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8,
960     0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f,
961     0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5,
962     0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252,
963     0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e,
964     0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535,
965     0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2,
966     0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757,
967     0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5,
968     0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada,
969     0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a,
970     0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585,
971     0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4,
972     0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767,
973     0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b,
974     0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8,
975     0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666,
976     0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e,
977     0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707,
978     0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333,
979     0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171,
980     0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9,
981     0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888,
982     0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0,
983     0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080,
984     0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848,
985     0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f,
986     0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae,
987     0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222,
988     0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212,
989     0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec,
990     0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d,
991     0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b,
992     0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b,
993     0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050,
994     0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef,
995     0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea,
996     0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0,
997     0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d,
998     0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a,
999     0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f,
1000     0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696,
1001     0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959,
1002     0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c,
1003     0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c,
1004     0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161,
1005     0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e,
1006     0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404,
1007     0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d,
1008     0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424,
1009     0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111,
1010     0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb,
1011     0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7,
1012     0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3,
1013     0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303,
1014     0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9,
1015     0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353,
1016     0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c,
1017     0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646,
1018     0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1,
1019     0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909,
1020     0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded,
1021     0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4,
1022     0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686,
1023   },
1024   {
1025     0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8,
1026     0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f,
1027     0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5,
1028     0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852,
1029     0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e,
1030     0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035,
1031     0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2,
1032     0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557,
1033     0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5,
1034     0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da,
1035     0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a,
1036     0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985,
1037     0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4,
1038     0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867,
1039     0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b,
1040     0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8,
1041     0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166,
1042     0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e,
1043     0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07,
1044     0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633,
1045     0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71,
1046     0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9,
1047     0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88,
1048     0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0,
1049     0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480,
1050     0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248,
1051     0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f,
1052     0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae,
1053     0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22,
1054     0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212,
1055     0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec,
1056     0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d,
1057     0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b,
1058     0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b,
1059     0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50,
1060     0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef,
1061     0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea,
1062     0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0,
1063     0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d,
1064     0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a,
1065     0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f,
1066     0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296,
1067     0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59,
1068     0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c,
1069     0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c,
1070     0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61,
1071     0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e,
1072     0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404,
1073     0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d,
1074     0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924,
1075     0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911,
1076     0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb,
1077     0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7,
1078     0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3,
1079     0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03,
1080     0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9,
1081     0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153,
1082     0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c,
1083     0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46,
1084     0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1,
1085     0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109,
1086     0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed,
1087     0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4,
1088     0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286,
1089   },
1090 };
1091
1092 #define BOX(S,n,i) (S)[(n)][(i)]
1093
1094 void whirlpool_transform_last (u32 dgst[16], __local u32 (*s_Ch)[256], __local u32 (*s_Cl)[256])
1095 {
1096   const u32 rch[R + 1] =
1097   {
1098     0x00000000,
1099     0x1823c6e8,
1100     0x36a6d2f5,
1101     0x60bc9b8e,
1102     0x1de0d7c2,
1103     0x157737e5,
1104     0x58c9290a,
1105     0xbd5d10f4,
1106     0xe427418b,
1107     0xfbee7c66,
1108     0xca2dbf07,
1109   };
1110
1111   const u32 rcl[R + 1] =
1112   {
1113     0x00000000,
1114     0x87b8014f,
1115     0x796f9152,
1116     0xa30c7b35,
1117     0x2e4bfe57,
1118     0x9ff04ada,
1119     0xb1a06b85,
1120     0xcb3e0567,
1121     0xa77d95d8,
1122     0xdd17479e,
1123     0xad5a8333,
1124   };
1125
1126   u32 Kh[8];
1127   u32 Kl[8];
1128
1129   Kh[0] = dgst[ 0];
1130   Kl[0] = dgst[ 1];
1131   Kh[1] = dgst[ 2];
1132   Kl[1] = dgst[ 3];
1133   Kh[2] = dgst[ 4];
1134   Kl[2] = dgst[ 5];
1135   Kh[3] = dgst[ 6];
1136   Kl[3] = dgst[ 7];
1137   Kh[4] = dgst[ 8];
1138   Kl[4] = dgst[ 9];
1139   Kh[5] = dgst[10];
1140   Kl[5] = dgst[11];
1141   Kh[6] = dgst[12];
1142   Kl[6] = dgst[13];
1143   Kh[7] = dgst[14];
1144   Kl[7] = dgst[15];
1145
1146   u32 stateh[8];
1147   u32 statel[8];
1148
1149   #define LAST_W00 0x80000000
1150   #define LAST_W15 ((64 + 64) * 8)
1151
1152   stateh[0] = Kh[0] ^ LAST_W00;
1153   statel[0] = Kl[0];
1154   stateh[1] = Kh[1];
1155   statel[1] = Kl[1];
1156   stateh[2] = Kh[2];
1157   statel[2] = Kl[2];
1158   stateh[3] = Kh[3];
1159   statel[3] = Kl[3];
1160   stateh[4] = Kh[4];
1161   statel[4] = Kl[4];
1162   stateh[5] = Kh[5];
1163   statel[5] = Kl[5];
1164   stateh[6] = Kh[6];
1165   statel[6] = Kl[6];
1166   stateh[7] = Kh[7];
1167   statel[7] = Kl[7] ^ LAST_W15;
1168
1169   u32 r;
1170
1171   for (r = 1; r <= R; r++)
1172   {
1173     u32 Lh[8];
1174     u32 Ll[8];
1175
1176     u32 i;
1177
1178     #ifdef _unroll
1179     #pragma unroll
1180     #endif
1181     for (i = 0; i < 8; i++)
1182     {
1183       const u32 Lp0 = Kh[(i + 8) & 7] >> 24;
1184       const u32 Lp1 = Kh[(i + 7) & 7] >> 16;
1185       const u32 Lp2 = Kh[(i + 6) & 7] >>  8;
1186       const u32 Lp3 = Kh[(i + 5) & 7] >>  0;
1187       const u32 Lp4 = Kl[(i + 4) & 7] >> 24;
1188       const u32 Lp5 = Kl[(i + 3) & 7] >> 16;
1189       const u32 Lp6 = Kl[(i + 2) & 7] >>  8;
1190       const u32 Lp7 = Kl[(i + 1) & 7] >>  0;
1191
1192       Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff)
1193             ^ BOX (s_Ch, 1, Lp1 & 0xff)
1194             ^ BOX (s_Ch, 2, Lp2 & 0xff)
1195             ^ BOX (s_Ch, 3, Lp3 & 0xff)
1196             ^ BOX (s_Ch, 4, Lp4 & 0xff)
1197             ^ BOX (s_Ch, 5, Lp5 & 0xff)
1198             ^ BOX (s_Ch, 6, Lp6 & 0xff)
1199             ^ BOX (s_Ch, 7, Lp7 & 0xff);
1200
1201       Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff)
1202             ^ BOX (s_Cl, 1, Lp1 & 0xff)
1203             ^ BOX (s_Cl, 2, Lp2 & 0xff)
1204             ^ BOX (s_Cl, 3, Lp3 & 0xff)
1205             ^ BOX (s_Cl, 4, Lp4 & 0xff)
1206             ^ BOX (s_Cl, 5, Lp5 & 0xff)
1207             ^ BOX (s_Cl, 6, Lp6 & 0xff)
1208             ^ BOX (s_Cl, 7, Lp7 & 0xff);
1209     }
1210
1211     Kh[0] = Lh[0] ^ rch[r];
1212     Kl[0] = Ll[0] ^ rcl[r];
1213     Kh[1] = Lh[1];
1214     Kl[1] = Ll[1];
1215     Kh[2] = Lh[2];
1216     Kl[2] = Ll[2];
1217     Kh[3] = Lh[3];
1218     Kl[3] = Ll[3];
1219     Kh[4] = Lh[4];
1220     Kl[4] = Ll[4];
1221     Kh[5] = Lh[5];
1222     Kl[5] = Ll[5];
1223     Kh[6] = Lh[6];
1224     Kl[6] = Ll[6];
1225     Kh[7] = Lh[7];
1226     Kl[7] = Ll[7];
1227
1228     #ifdef _unroll
1229     #pragma unroll
1230     #endif
1231     for (i = 0; i < 8; i++)
1232     {
1233       const u32 Lp0 = stateh[(i + 8) & 7] >> 24;
1234       const u32 Lp1 = stateh[(i + 7) & 7] >> 16;
1235       const u32 Lp2 = stateh[(i + 6) & 7] >>  8;
1236       const u32 Lp3 = stateh[(i + 5) & 7] >>  0;
1237       const u32 Lp4 = statel[(i + 4) & 7] >> 24;
1238       const u32 Lp5 = statel[(i + 3) & 7] >> 16;
1239       const u32 Lp6 = statel[(i + 2) & 7] >>  8;
1240       const u32 Lp7 = statel[(i + 1) & 7] >>  0;
1241
1242       Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff)
1243             ^ BOX (s_Ch, 1, Lp1 & 0xff)
1244             ^ BOX (s_Ch, 2, Lp2 & 0xff)
1245             ^ BOX (s_Ch, 3, Lp3 & 0xff)
1246             ^ BOX (s_Ch, 4, Lp4 & 0xff)
1247             ^ BOX (s_Ch, 5, Lp5 & 0xff)
1248             ^ BOX (s_Ch, 6, Lp6 & 0xff)
1249             ^ BOX (s_Ch, 7, Lp7 & 0xff);
1250
1251       Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff)
1252             ^ BOX (s_Cl, 1, Lp1 & 0xff)
1253             ^ BOX (s_Cl, 2, Lp2 & 0xff)
1254             ^ BOX (s_Cl, 3, Lp3 & 0xff)
1255             ^ BOX (s_Cl, 4, Lp4 & 0xff)
1256             ^ BOX (s_Cl, 5, Lp5 & 0xff)
1257             ^ BOX (s_Cl, 6, Lp6 & 0xff)
1258             ^ BOX (s_Cl, 7, Lp7 & 0xff);
1259     }
1260
1261     stateh[0] = Lh[0] ^ Kh[0];
1262     statel[0] = Ll[0] ^ Kl[0];
1263     stateh[1] = Lh[1] ^ Kh[1];
1264     statel[1] = Ll[1] ^ Kl[1];
1265     stateh[2] = Lh[2] ^ Kh[2];
1266     statel[2] = Ll[2] ^ Kl[2];
1267     stateh[3] = Lh[3] ^ Kh[3];
1268     statel[3] = Ll[3] ^ Kl[3];
1269     stateh[4] = Lh[4] ^ Kh[4];
1270     statel[4] = Ll[4] ^ Kl[4];
1271     stateh[5] = Lh[5] ^ Kh[5];
1272     statel[5] = Ll[5] ^ Kl[5];
1273     stateh[6] = Lh[6] ^ Kh[6];
1274     statel[6] = Ll[6] ^ Kl[6];
1275     stateh[7] = Lh[7] ^ Kh[7];
1276     statel[7] = Ll[7] ^ Kl[7];
1277   }
1278
1279   dgst[ 0] ^= stateh[0] ^ LAST_W00;
1280   dgst[ 1] ^= statel[0];
1281   dgst[ 2] ^= stateh[1];
1282   dgst[ 3] ^= statel[1];
1283   dgst[ 4] ^= stateh[2];
1284   dgst[ 5] ^= statel[2];
1285   dgst[ 6] ^= stateh[3];
1286   dgst[ 7] ^= statel[3];
1287   dgst[ 8] ^= stateh[4];
1288   dgst[ 9] ^= statel[4];
1289   dgst[10] ^= stateh[5];
1290   dgst[11] ^= statel[5];
1291   dgst[12] ^= stateh[6];
1292   dgst[13] ^= statel[6];
1293   dgst[14] ^= stateh[7];
1294   dgst[15] ^= statel[7] ^ LAST_W15;
1295 }
1296
1297 void whirlpool_transform (const u32 w[16], u32 dgst[16], __local u32 (*s_Ch)[256], __local u32 (*s_Cl)[256])
1298 {
1299   const u32 rch[R + 1] =
1300   {
1301     0x00000000,
1302     0x1823c6e8,
1303     0x36a6d2f5,
1304     0x60bc9b8e,
1305     0x1de0d7c2,
1306     0x157737e5,
1307     0x58c9290a,
1308     0xbd5d10f4,
1309     0xe427418b,
1310     0xfbee7c66,
1311     0xca2dbf07,
1312   };
1313
1314   const u32 rcl[R + 1] =
1315   {
1316     0x00000000,
1317     0x87b8014f,
1318     0x796f9152,
1319     0xa30c7b35,
1320     0x2e4bfe57,
1321     0x9ff04ada,
1322     0xb1a06b85,
1323     0xcb3e0567,
1324     0xa77d95d8,
1325     0xdd17479e,
1326     0xad5a8333,
1327   };
1328
1329   u32 Kh[8];
1330   u32 Kl[8];
1331
1332   Kh[0] = dgst[ 0];
1333   Kl[0] = dgst[ 1];
1334   Kh[1] = dgst[ 2];
1335   Kl[1] = dgst[ 3];
1336   Kh[2] = dgst[ 4];
1337   Kl[2] = dgst[ 5];
1338   Kh[3] = dgst[ 6];
1339   Kl[3] = dgst[ 7];
1340   Kh[4] = dgst[ 8];
1341   Kl[4] = dgst[ 9];
1342   Kh[5] = dgst[10];
1343   Kl[5] = dgst[11];
1344   Kh[6] = dgst[12];
1345   Kl[6] = dgst[13];
1346   Kh[7] = dgst[14];
1347   Kl[7] = dgst[15];
1348
1349   u32 stateh[8];
1350   u32 statel[8];
1351
1352   stateh[0] = w[ 0] ^ Kh[0];
1353   statel[0] = w[ 1] ^ Kl[0];
1354   stateh[1] = w[ 2] ^ Kh[1];
1355   statel[1] = w[ 3] ^ Kl[1];
1356   stateh[2] = w[ 4] ^ Kh[2];
1357   statel[2] = w[ 5] ^ Kl[2];
1358   stateh[3] = w[ 6] ^ Kh[3];
1359   statel[3] = w[ 7] ^ Kl[3];
1360   stateh[4] = w[ 8] ^ Kh[4];
1361   statel[4] = w[ 9] ^ Kl[4];
1362   stateh[5] = w[10] ^ Kh[5];
1363   statel[5] = w[11] ^ Kl[5];
1364   stateh[6] = w[12] ^ Kh[6];
1365   statel[6] = w[13] ^ Kl[6];
1366   stateh[7] = w[14] ^ Kh[7];
1367   statel[7] = w[15] ^ Kl[7];
1368
1369   u32 r;
1370
1371   for (r = 1; r <= R; r++)
1372   {
1373     u32 Lh[8];
1374     u32 Ll[8];
1375
1376     u32 i;
1377
1378     #ifdef _unroll
1379     #pragma unroll
1380     #endif
1381     for (i = 0; i < 8; i++)
1382     {
1383       const u32 Lp0 = Kh[(i + 8) & 7] >> 24;
1384       const u32 Lp1 = Kh[(i + 7) & 7] >> 16;
1385       const u32 Lp2 = Kh[(i + 6) & 7] >>  8;
1386       const u32 Lp3 = Kh[(i + 5) & 7] >>  0;
1387       const u32 Lp4 = Kl[(i + 4) & 7] >> 24;
1388       const u32 Lp5 = Kl[(i + 3) & 7] >> 16;
1389       const u32 Lp6 = Kl[(i + 2) & 7] >>  8;
1390       const u32 Lp7 = Kl[(i + 1) & 7] >>  0;
1391
1392       Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff)
1393             ^ BOX (s_Ch, 1, Lp1 & 0xff)
1394             ^ BOX (s_Ch, 2, Lp2 & 0xff)
1395             ^ BOX (s_Ch, 3, Lp3 & 0xff)
1396             ^ BOX (s_Ch, 4, Lp4 & 0xff)
1397             ^ BOX (s_Ch, 5, Lp5 & 0xff)
1398             ^ BOX (s_Ch, 6, Lp6 & 0xff)
1399             ^ BOX (s_Ch, 7, Lp7 & 0xff);
1400
1401       Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff)
1402             ^ BOX (s_Cl, 1, Lp1 & 0xff)
1403             ^ BOX (s_Cl, 2, Lp2 & 0xff)
1404             ^ BOX (s_Cl, 3, Lp3 & 0xff)
1405             ^ BOX (s_Cl, 4, Lp4 & 0xff)
1406             ^ BOX (s_Cl, 5, Lp5 & 0xff)
1407             ^ BOX (s_Cl, 6, Lp6 & 0xff)
1408             ^ BOX (s_Cl, 7, Lp7 & 0xff);
1409     }
1410
1411     Kh[0] = Lh[0] ^ rch[r];
1412     Kl[0] = Ll[0] ^ rcl[r];
1413     Kh[1] = Lh[1];
1414     Kl[1] = Ll[1];
1415     Kh[2] = Lh[2];
1416     Kl[2] = Ll[2];
1417     Kh[3] = Lh[3];
1418     Kl[3] = Ll[3];
1419     Kh[4] = Lh[4];
1420     Kl[4] = Ll[4];
1421     Kh[5] = Lh[5];
1422     Kl[5] = Ll[5];
1423     Kh[6] = Lh[6];
1424     Kl[6] = Ll[6];
1425     Kh[7] = Lh[7];
1426     Kl[7] = Ll[7];
1427
1428     #ifdef _unroll
1429     #pragma unroll
1430     #endif
1431     for (i = 0; i < 8; i++)
1432     {
1433       const u32 Lp0 = stateh[(i + 8) & 7] >> 24;
1434       const u32 Lp1 = stateh[(i + 7) & 7] >> 16;
1435       const u32 Lp2 = stateh[(i + 6) & 7] >>  8;
1436       const u32 Lp3 = stateh[(i + 5) & 7] >>  0;
1437       const u32 Lp4 = statel[(i + 4) & 7] >> 24;
1438       const u32 Lp5 = statel[(i + 3) & 7] >> 16;
1439       const u32 Lp6 = statel[(i + 2) & 7] >>  8;
1440       const u32 Lp7 = statel[(i + 1) & 7] >>  0;
1441
1442       Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff)
1443             ^ BOX (s_Ch, 1, Lp1 & 0xff)
1444             ^ BOX (s_Ch, 2, Lp2 & 0xff)
1445             ^ BOX (s_Ch, 3, Lp3 & 0xff)
1446             ^ BOX (s_Ch, 4, Lp4 & 0xff)
1447             ^ BOX (s_Ch, 5, Lp5 & 0xff)
1448             ^ BOX (s_Ch, 6, Lp6 & 0xff)
1449             ^ BOX (s_Ch, 7, Lp7 & 0xff);
1450
1451       Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff)
1452             ^ BOX (s_Cl, 1, Lp1 & 0xff)
1453             ^ BOX (s_Cl, 2, Lp2 & 0xff)
1454             ^ BOX (s_Cl, 3, Lp3 & 0xff)
1455             ^ BOX (s_Cl, 4, Lp4 & 0xff)
1456             ^ BOX (s_Cl, 5, Lp5 & 0xff)
1457             ^ BOX (s_Cl, 6, Lp6 & 0xff)
1458             ^ BOX (s_Cl, 7, Lp7 & 0xff);
1459     }
1460
1461     stateh[0] = Lh[0] ^ Kh[0];
1462     statel[0] = Ll[0] ^ Kl[0];
1463     stateh[1] = Lh[1] ^ Kh[1];
1464     statel[1] = Ll[1] ^ Kl[1];
1465     stateh[2] = Lh[2] ^ Kh[2];
1466     statel[2] = Ll[2] ^ Kl[2];
1467     stateh[3] = Lh[3] ^ Kh[3];
1468     statel[3] = Ll[3] ^ Kl[3];
1469     stateh[4] = Lh[4] ^ Kh[4];
1470     statel[4] = Ll[4] ^ Kl[4];
1471     stateh[5] = Lh[5] ^ Kh[5];
1472     statel[5] = Ll[5] ^ Kl[5];
1473     stateh[6] = Lh[6] ^ Kh[6];
1474     statel[6] = Ll[6] ^ Kl[6];
1475     stateh[7] = Lh[7] ^ Kh[7];
1476     statel[7] = Ll[7] ^ Kl[7];
1477   }
1478
1479   dgst[ 0] ^= stateh[0] ^ w[ 0];
1480   dgst[ 1] ^= statel[0] ^ w[ 1];
1481   dgst[ 2] ^= stateh[1] ^ w[ 2];
1482   dgst[ 3] ^= statel[1] ^ w[ 3];
1483   dgst[ 4] ^= stateh[2] ^ w[ 4];
1484   dgst[ 5] ^= statel[2] ^ w[ 5];
1485   dgst[ 6] ^= stateh[3] ^ w[ 6];
1486   dgst[ 7] ^= statel[3] ^ w[ 7];
1487   dgst[ 8] ^= stateh[4] ^ w[ 8];
1488   dgst[ 9] ^= statel[4] ^ w[ 9];
1489   dgst[10] ^= stateh[5] ^ w[10];
1490   dgst[11] ^= statel[5] ^ w[11];
1491   dgst[12] ^= stateh[6] ^ w[12];
1492   dgst[13] ^= statel[6] ^ w[13];
1493   dgst[14] ^= stateh[7] ^ w[14];
1494   dgst[15] ^= statel[7] ^ w[15];
1495 }
1496
1497 void hmac_run2a (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], __local u32 (*s_Ch)[256], __local u32 (*s_Cl)[256])
1498 {
1499   dgst[ 0] = ipad[ 0];
1500   dgst[ 1] = ipad[ 1];
1501   dgst[ 2] = ipad[ 2];
1502   dgst[ 3] = ipad[ 3];
1503   dgst[ 4] = ipad[ 4];
1504   dgst[ 5] = ipad[ 5];
1505   dgst[ 6] = ipad[ 6];
1506   dgst[ 7] = ipad[ 7];
1507   dgst[ 8] = ipad[ 8];
1508   dgst[ 9] = ipad[ 9];
1509   dgst[10] = ipad[10];
1510   dgst[11] = ipad[11];
1511   dgst[12] = ipad[12];
1512   dgst[13] = ipad[13];
1513   dgst[14] = ipad[14];
1514   dgst[15] = ipad[15];
1515
1516   whirlpool_transform (w1, dgst, s_Ch, s_Cl);
1517   whirlpool_transform (w2, dgst, s_Ch, s_Cl);
1518
1519   u32 w[16];
1520
1521   w[ 0] = dgst[ 0];
1522   w[ 1] = dgst[ 1];
1523   w[ 2] = dgst[ 2];
1524   w[ 3] = dgst[ 3];
1525   w[ 4] = dgst[ 4];
1526   w[ 5] = dgst[ 5];
1527   w[ 6] = dgst[ 6];
1528   w[ 7] = dgst[ 7];
1529   w[ 8] = dgst[ 8];
1530   w[ 9] = dgst[ 9];
1531   w[10] = dgst[10];
1532   w[11] = dgst[11];
1533   w[12] = dgst[12];
1534   w[13] = dgst[13];
1535   w[14] = dgst[14];
1536   w[15] = dgst[15];
1537
1538   dgst[ 0] = opad[ 0];
1539   dgst[ 1] = opad[ 1];
1540   dgst[ 2] = opad[ 2];
1541   dgst[ 3] = opad[ 3];
1542   dgst[ 4] = opad[ 4];
1543   dgst[ 5] = opad[ 5];
1544   dgst[ 6] = opad[ 6];
1545   dgst[ 7] = opad[ 7];
1546   dgst[ 8] = opad[ 8];
1547   dgst[ 9] = opad[ 9];
1548   dgst[10] = opad[10];
1549   dgst[11] = opad[11];
1550   dgst[12] = opad[12];
1551   dgst[13] = opad[13];
1552   dgst[14] = opad[14];
1553   dgst[15] = opad[15];
1554
1555   whirlpool_transform (w, dgst, s_Ch, s_Cl);
1556
1557   whirlpool_transform_last (dgst, s_Ch, s_Cl);
1558 }
1559
1560 void hmac_run2b (const u32 w1[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], __local u32 (*s_Ch)[256], __local u32 (*s_Cl)[256])
1561 {
1562   dgst[ 0] = ipad[ 0];
1563   dgst[ 1] = ipad[ 1];
1564   dgst[ 2] = ipad[ 2];
1565   dgst[ 3] = ipad[ 3];
1566   dgst[ 4] = ipad[ 4];
1567   dgst[ 5] = ipad[ 5];
1568   dgst[ 6] = ipad[ 6];
1569   dgst[ 7] = ipad[ 7];
1570   dgst[ 8] = ipad[ 8];
1571   dgst[ 9] = ipad[ 9];
1572   dgst[10] = ipad[10];
1573   dgst[11] = ipad[11];
1574   dgst[12] = ipad[12];
1575   dgst[13] = ipad[13];
1576   dgst[14] = ipad[14];
1577   dgst[15] = ipad[15];
1578
1579   whirlpool_transform (w1, dgst, s_Ch, s_Cl);
1580
1581   whirlpool_transform_last (dgst, s_Ch, s_Cl);
1582
1583   u32 w[16];
1584
1585   w[ 0] = dgst[ 0];
1586   w[ 1] = dgst[ 1];
1587   w[ 2] = dgst[ 2];
1588   w[ 3] = dgst[ 3];
1589   w[ 4] = dgst[ 4];
1590   w[ 5] = dgst[ 5];
1591   w[ 6] = dgst[ 6];
1592   w[ 7] = dgst[ 7];
1593   w[ 8] = dgst[ 8];
1594   w[ 9] = dgst[ 9];
1595   w[10] = dgst[10];
1596   w[11] = dgst[11];
1597   w[12] = dgst[12];
1598   w[13] = dgst[13];
1599   w[14] = dgst[14];
1600   w[15] = dgst[15];
1601
1602   dgst[ 0] = opad[ 0];
1603   dgst[ 1] = opad[ 1];
1604   dgst[ 2] = opad[ 2];
1605   dgst[ 3] = opad[ 3];
1606   dgst[ 4] = opad[ 4];
1607   dgst[ 5] = opad[ 5];
1608   dgst[ 6] = opad[ 6];
1609   dgst[ 7] = opad[ 7];
1610   dgst[ 8] = opad[ 8];
1611   dgst[ 9] = opad[ 9];
1612   dgst[10] = opad[10];
1613   dgst[11] = opad[11];
1614   dgst[12] = opad[12];
1615   dgst[13] = opad[13];
1616   dgst[14] = opad[14];
1617   dgst[15] = opad[15];
1618
1619   whirlpool_transform (w, dgst, s_Ch, s_Cl);
1620
1621   whirlpool_transform_last (dgst, s_Ch, s_Cl);
1622 }
1623
1624 void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], __local u32 (*s_Ch)[256], __local u32 (*s_Cl)[256])
1625 {
1626   w[ 0] ^= 0x36363636;
1627   w[ 1] ^= 0x36363636;
1628   w[ 2] ^= 0x36363636;
1629   w[ 3] ^= 0x36363636;
1630   w[ 4] ^= 0x36363636;
1631   w[ 5] ^= 0x36363636;
1632   w[ 6] ^= 0x36363636;
1633   w[ 7] ^= 0x36363636;
1634   w[ 8] ^= 0x36363636;
1635   w[ 9] ^= 0x36363636;
1636   w[10] ^= 0x36363636;
1637   w[11] ^= 0x36363636;
1638   w[12] ^= 0x36363636;
1639   w[13] ^= 0x36363636;
1640   w[14] ^= 0x36363636;
1641   w[15] ^= 0x36363636;
1642
1643   ipad[ 0] = 0;
1644   ipad[ 1] = 0;
1645   ipad[ 2] = 0;
1646   ipad[ 3] = 0;
1647   ipad[ 4] = 0;
1648   ipad[ 5] = 0;
1649   ipad[ 6] = 0;
1650   ipad[ 7] = 0;
1651   ipad[ 8] = 0;
1652   ipad[ 9] = 0;
1653   ipad[10] = 0;
1654   ipad[11] = 0;
1655   ipad[12] = 0;
1656   ipad[13] = 0;
1657   ipad[14] = 0;
1658   ipad[15] = 0;
1659
1660   whirlpool_transform (w, ipad, s_Ch, s_Cl);
1661
1662   w[ 0] ^= 0x6a6a6a6a;
1663   w[ 1] ^= 0x6a6a6a6a;
1664   w[ 2] ^= 0x6a6a6a6a;
1665   w[ 3] ^= 0x6a6a6a6a;
1666   w[ 4] ^= 0x6a6a6a6a;
1667   w[ 5] ^= 0x6a6a6a6a;
1668   w[ 6] ^= 0x6a6a6a6a;
1669   w[ 7] ^= 0x6a6a6a6a;
1670   w[ 8] ^= 0x6a6a6a6a;
1671   w[ 9] ^= 0x6a6a6a6a;
1672   w[10] ^= 0x6a6a6a6a;
1673   w[11] ^= 0x6a6a6a6a;
1674   w[12] ^= 0x6a6a6a6a;
1675   w[13] ^= 0x6a6a6a6a;
1676   w[14] ^= 0x6a6a6a6a;
1677   w[15] ^= 0x6a6a6a6a;
1678
1679   opad[ 0] = 0;
1680   opad[ 1] = 0;
1681   opad[ 2] = 0;
1682   opad[ 3] = 0;
1683   opad[ 4] = 0;
1684   opad[ 5] = 0;
1685   opad[ 6] = 0;
1686   opad[ 7] = 0;
1687   opad[ 8] = 0;
1688   opad[ 9] = 0;
1689   opad[10] = 0;
1690   opad[11] = 0;
1691   opad[12] = 0;
1692   opad[13] = 0;
1693   opad[14] = 0;
1694   opad[15] = 0;
1695
1696   whirlpool_transform (w, opad, s_Ch, s_Cl);
1697 }
1698
1699 u32 u8add (const u32 a, const u32 b)
1700 {
1701   const u32 a1 = (a >>  0) & 0xff;
1702   const u32 a2 = (a >>  8) & 0xff;
1703   const u32 a3 = (a >> 16) & 0xff;
1704   const u32 a4 = (a >> 24) & 0xff;
1705
1706   const u32 b1 = (b >>  0) & 0xff;
1707   const u32 b2 = (b >>  8) & 0xff;
1708   const u32 b3 = (b >> 16) & 0xff;
1709   const u32 b4 = (b >> 24) & 0xff;
1710
1711   const u32 r1 = (a1 + b1) & 0xff;
1712   const u32 r2 = (a2 + b2) & 0xff;
1713   const u32 r3 = (a3 + b3) & 0xff;
1714   const u32 r4 = (a4 + b4) & 0xff;
1715
1716   const u32 r = r1 <<  0
1717                | r2 <<  8
1718                | r3 << 16
1719                | r4 << 24;
1720
1721   return r;
1722 }
1723
1724 __kernel void m06231_init (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_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 tc_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1725 {
1726   /**
1727    * modifier
1728    */
1729
1730   const u32 gid = get_global_id (0);
1731   const u32 lid = get_local_id (0);
1732   const u32 lsz = get_local_size (0);
1733
1734   /**
1735    * shared
1736    */
1737
1738   __local u32 s_Ch[8][256];
1739   __local u32 s_Cl[8][256];
1740
1741   for (u32 i = lid; i < 256; i += lsz)
1742   {
1743     s_Ch[0][i] = Ch[0][i];
1744     s_Ch[1][i] = Ch[1][i];
1745     s_Ch[2][i] = Ch[2][i];
1746     s_Ch[3][i] = Ch[3][i];
1747     s_Ch[4][i] = Ch[4][i];
1748     s_Ch[5][i] = Ch[5][i];
1749     s_Ch[6][i] = Ch[6][i];
1750     s_Ch[7][i] = Ch[7][i];
1751
1752     s_Cl[0][i] = Cl[0][i];
1753     s_Cl[1][i] = Cl[1][i];
1754     s_Cl[2][i] = Cl[2][i];
1755     s_Cl[3][i] = Cl[3][i];
1756     s_Cl[4][i] = Cl[4][i];
1757     s_Cl[5][i] = Cl[5][i];
1758     s_Cl[6][i] = Cl[6][i];
1759     s_Cl[7][i] = Cl[7][i];
1760   }
1761
1762   barrier (CLK_LOCAL_MEM_FENCE);
1763
1764   if (gid >= gid_max) return;
1765
1766   /**
1767    * base
1768    */
1769
1770   u32 w0[4];
1771
1772   w0[0] = pws[gid].i[ 0];
1773   w0[1] = pws[gid].i[ 1];
1774   w0[2] = pws[gid].i[ 2];
1775   w0[3] = pws[gid].i[ 3];
1776
1777   u32 w1[4];
1778
1779   w1[0] = pws[gid].i[ 4];
1780   w1[1] = pws[gid].i[ 5];
1781   w1[2] = pws[gid].i[ 6];
1782   w1[3] = pws[gid].i[ 7];
1783
1784   u32 w2[4];
1785
1786   w2[0] = pws[gid].i[ 8];
1787   w2[1] = pws[gid].i[ 9];
1788   w2[2] = pws[gid].i[10];
1789   w2[3] = pws[gid].i[11];
1790
1791   u32 w3[4];
1792
1793   w3[0] = pws[gid].i[12];
1794   w3[1] = pws[gid].i[13];
1795   w3[2] = pws[gid].i[14];
1796   w3[3] = pws[gid].i[15];
1797
1798   /**
1799    * keyfile
1800    */
1801
1802   w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]);
1803   w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]);
1804   w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]);
1805   w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]);
1806   w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]);
1807   w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]);
1808   w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]);
1809   w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]);
1810   w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]);
1811   w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]);
1812   w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]);
1813   w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]);
1814   w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]);
1815   w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]);
1816   w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]);
1817   w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]);
1818
1819   /**
1820    * salt
1821    */
1822
1823   u32 salt_buf1[16];
1824
1825   salt_buf1[ 0] = swap32 (esalt_bufs[salt_pos].salt_buf[ 0]);
1826   salt_buf1[ 1] = swap32 (esalt_bufs[salt_pos].salt_buf[ 1]);
1827   salt_buf1[ 2] = swap32 (esalt_bufs[salt_pos].salt_buf[ 2]);
1828   salt_buf1[ 3] = swap32 (esalt_bufs[salt_pos].salt_buf[ 3]);
1829   salt_buf1[ 4] = swap32 (esalt_bufs[salt_pos].salt_buf[ 4]);
1830   salt_buf1[ 5] = swap32 (esalt_bufs[salt_pos].salt_buf[ 5]);
1831   salt_buf1[ 6] = swap32 (esalt_bufs[salt_pos].salt_buf[ 6]);
1832   salt_buf1[ 7] = swap32 (esalt_bufs[salt_pos].salt_buf[ 7]);
1833   salt_buf1[ 8] = swap32 (esalt_bufs[salt_pos].salt_buf[ 8]);
1834   salt_buf1[ 9] = swap32 (esalt_bufs[salt_pos].salt_buf[ 9]);
1835   salt_buf1[10] = swap32 (esalt_bufs[salt_pos].salt_buf[10]);
1836   salt_buf1[11] = swap32 (esalt_bufs[salt_pos].salt_buf[11]);
1837   salt_buf1[12] = swap32 (esalt_bufs[salt_pos].salt_buf[12]);
1838   salt_buf1[13] = swap32 (esalt_bufs[salt_pos].salt_buf[13]);
1839   salt_buf1[14] = swap32 (esalt_bufs[salt_pos].salt_buf[14]);
1840   salt_buf1[15] = swap32 (esalt_bufs[salt_pos].salt_buf[15]);
1841
1842   u32 salt_buf2[16];
1843
1844   salt_buf2[ 0] = 0;
1845   salt_buf2[ 1] = 0x80000000;
1846   salt_buf2[ 2] = 0;
1847   salt_buf2[ 3] = 0;
1848   salt_buf2[ 4] = 0;
1849   salt_buf2[ 5] = 0;
1850   salt_buf2[ 6] = 0;
1851   salt_buf2[ 7] = 0;
1852   salt_buf2[ 8] = 0;
1853   salt_buf2[ 9] = 0;
1854   salt_buf2[10] = 0;
1855   salt_buf2[11] = 0;
1856   salt_buf2[12] = 0;
1857   salt_buf2[13] = 0;
1858   salt_buf2[14] = 0;
1859   salt_buf2[15] = (64 + 64 + 4) * 8;
1860
1861   const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen;
1862
1863   u32 w[16];
1864
1865   w[ 0] = swap32 (w0[0]);
1866   w[ 1] = swap32 (w0[1]);
1867   w[ 2] = swap32 (w0[2]);
1868   w[ 3] = swap32 (w0[3]);
1869   w[ 4] = swap32 (w1[0]);
1870   w[ 5] = swap32 (w1[1]);
1871   w[ 6] = swap32 (w1[2]);
1872   w[ 7] = swap32 (w1[3]);
1873   w[ 8] = swap32 (w2[0]);
1874   w[ 9] = swap32 (w2[1]);
1875   w[10] = swap32 (w2[2]);
1876   w[11] = swap32 (w2[3]);
1877   w[12] = swap32 (w3[0]);
1878   w[13] = swap32 (w3[1]);
1879   w[14] = swap32 (w3[2]);
1880   w[15] = swap32 (w3[3]);
1881
1882   u32 ipad[16];
1883   u32 opad[16];
1884
1885   hmac_init (w, ipad, opad, s_Ch, s_Cl);
1886
1887   tmps[gid].ipad[ 0] = ipad[ 0];
1888   tmps[gid].ipad[ 1] = ipad[ 1];
1889   tmps[gid].ipad[ 2] = ipad[ 2];
1890   tmps[gid].ipad[ 3] = ipad[ 3];
1891   tmps[gid].ipad[ 4] = ipad[ 4];
1892   tmps[gid].ipad[ 5] = ipad[ 5];
1893   tmps[gid].ipad[ 6] = ipad[ 6];
1894   tmps[gid].ipad[ 7] = ipad[ 7];
1895   tmps[gid].ipad[ 8] = ipad[ 8];
1896   tmps[gid].ipad[ 9] = ipad[ 9];
1897   tmps[gid].ipad[10] = ipad[10];
1898   tmps[gid].ipad[11] = ipad[11];
1899   tmps[gid].ipad[12] = ipad[12];
1900   tmps[gid].ipad[13] = ipad[13];
1901   tmps[gid].ipad[14] = ipad[14];
1902   tmps[gid].ipad[15] = ipad[15];
1903
1904   tmps[gid].opad[ 0] = opad[ 0];
1905   tmps[gid].opad[ 1] = opad[ 1];
1906   tmps[gid].opad[ 2] = opad[ 2];
1907   tmps[gid].opad[ 3] = opad[ 3];
1908   tmps[gid].opad[ 4] = opad[ 4];
1909   tmps[gid].opad[ 5] = opad[ 5];
1910   tmps[gid].opad[ 6] = opad[ 6];
1911   tmps[gid].opad[ 7] = opad[ 7];
1912   tmps[gid].opad[ 8] = opad[ 8];
1913   tmps[gid].opad[ 9] = opad[ 9];
1914   tmps[gid].opad[10] = opad[10];
1915   tmps[gid].opad[11] = opad[11];
1916   tmps[gid].opad[12] = opad[12];
1917   tmps[gid].opad[13] = opad[13];
1918   tmps[gid].opad[14] = opad[14];
1919   tmps[gid].opad[15] = opad[15];
1920
1921   for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1)
1922   {
1923     salt_buf2[0] = j;
1924
1925     u32 dgst[16];
1926
1927     hmac_run2a (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl);
1928
1929     tmps[gid].dgst[i +  0] = dgst[ 0];
1930     tmps[gid].dgst[i +  1] = dgst[ 1];
1931     tmps[gid].dgst[i +  2] = dgst[ 2];
1932     tmps[gid].dgst[i +  3] = dgst[ 3];
1933     tmps[gid].dgst[i +  4] = dgst[ 4];
1934     tmps[gid].dgst[i +  5] = dgst[ 5];
1935     tmps[gid].dgst[i +  6] = dgst[ 6];
1936     tmps[gid].dgst[i +  7] = dgst[ 7];
1937     tmps[gid].dgst[i +  8] = dgst[ 8];
1938     tmps[gid].dgst[i +  9] = dgst[ 9];
1939     tmps[gid].dgst[i + 10] = dgst[10];
1940     tmps[gid].dgst[i + 11] = dgst[11];
1941     tmps[gid].dgst[i + 12] = dgst[12];
1942     tmps[gid].dgst[i + 13] = dgst[13];
1943     tmps[gid].dgst[i + 14] = dgst[14];
1944     tmps[gid].dgst[i + 15] = dgst[15];
1945
1946     tmps[gid].out[i +  0] = dgst[ 0];
1947     tmps[gid].out[i +  1] = dgst[ 1];
1948     tmps[gid].out[i +  2] = dgst[ 2];
1949     tmps[gid].out[i +  3] = dgst[ 3];
1950     tmps[gid].out[i +  4] = dgst[ 4];
1951     tmps[gid].out[i +  5] = dgst[ 5];
1952     tmps[gid].out[i +  6] = dgst[ 6];
1953     tmps[gid].out[i +  7] = dgst[ 7];
1954     tmps[gid].out[i +  8] = dgst[ 8];
1955     tmps[gid].out[i +  9] = dgst[ 9];
1956     tmps[gid].out[i + 10] = dgst[10];
1957     tmps[gid].out[i + 11] = dgst[11];
1958     tmps[gid].out[i + 12] = dgst[12];
1959     tmps[gid].out[i + 13] = dgst[13];
1960     tmps[gid].out[i + 14] = dgst[14];
1961     tmps[gid].out[i + 15] = dgst[15];
1962   }
1963 }
1964
1965 __kernel void m06231_loop (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_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 tc_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1966 {
1967   /**
1968    * modifier
1969    */
1970
1971   const u32 gid = get_global_id (0);
1972   const u32 lid = get_local_id (0);
1973   const u32 lsz = get_local_size (0);
1974
1975   /**
1976    * shared
1977    */
1978
1979   __local u32 s_Ch[8][256];
1980   __local u32 s_Cl[8][256];
1981
1982   for (u32 i = lid; i < 256; i += lsz)
1983   {
1984     s_Ch[0][i] = Ch[0][i];
1985     s_Ch[1][i] = Ch[1][i];
1986     s_Ch[2][i] = Ch[2][i];
1987     s_Ch[3][i] = Ch[3][i];
1988     s_Ch[4][i] = Ch[4][i];
1989     s_Ch[5][i] = Ch[5][i];
1990     s_Ch[6][i] = Ch[6][i];
1991     s_Ch[7][i] = Ch[7][i];
1992
1993     s_Cl[0][i] = Cl[0][i];
1994     s_Cl[1][i] = Cl[1][i];
1995     s_Cl[2][i] = Cl[2][i];
1996     s_Cl[3][i] = Cl[3][i];
1997     s_Cl[4][i] = Cl[4][i];
1998     s_Cl[5][i] = Cl[5][i];
1999     s_Cl[6][i] = Cl[6][i];
2000     s_Cl[7][i] = Cl[7][i];
2001   }
2002
2003   barrier (CLK_LOCAL_MEM_FENCE);
2004
2005   if (gid >= gid_max) return;
2006
2007   const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen;
2008
2009   u32 ipad[16];
2010
2011   ipad[ 0] = tmps[gid].ipad[ 0];
2012   ipad[ 1] = tmps[gid].ipad[ 1],
2013   ipad[ 2] = tmps[gid].ipad[ 2];
2014   ipad[ 3] = tmps[gid].ipad[ 3];
2015   ipad[ 4] = tmps[gid].ipad[ 4];
2016   ipad[ 5] = tmps[gid].ipad[ 5];
2017   ipad[ 6] = tmps[gid].ipad[ 6],
2018   ipad[ 7] = tmps[gid].ipad[ 7];
2019   ipad[ 8] = tmps[gid].ipad[ 8];
2020   ipad[ 9] = tmps[gid].ipad[ 9];
2021   ipad[10] = tmps[gid].ipad[10];
2022   ipad[11] = tmps[gid].ipad[11],
2023   ipad[12] = tmps[gid].ipad[12];
2024   ipad[13] = tmps[gid].ipad[13];
2025   ipad[14] = tmps[gid].ipad[14];
2026   ipad[15] = tmps[gid].ipad[15];
2027
2028   u32 opad[16];
2029
2030   opad[ 0] = tmps[gid].opad[ 0];
2031   opad[ 1] = tmps[gid].opad[ 1],
2032   opad[ 2] = tmps[gid].opad[ 2];
2033   opad[ 3] = tmps[gid].opad[ 3];
2034   opad[ 4] = tmps[gid].opad[ 4];
2035   opad[ 5] = tmps[gid].opad[ 5];
2036   opad[ 6] = tmps[gid].opad[ 6],
2037   opad[ 7] = tmps[gid].opad[ 7];
2038   opad[ 8] = tmps[gid].opad[ 8];
2039   opad[ 9] = tmps[gid].opad[ 9];
2040   opad[10] = tmps[gid].opad[10];
2041   opad[11] = tmps[gid].opad[11],
2042   opad[12] = tmps[gid].opad[12];
2043   opad[13] = tmps[gid].opad[13];
2044   opad[14] = tmps[gid].opad[14];
2045   opad[15] = tmps[gid].opad[15];
2046
2047   for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16)
2048   {
2049     u32 dgst[16];
2050
2051     dgst[ 0] = tmps[gid].dgst[i +  0];
2052     dgst[ 1] = tmps[gid].dgst[i +  1];
2053     dgst[ 2] = tmps[gid].dgst[i +  2];
2054     dgst[ 3] = tmps[gid].dgst[i +  3];
2055     dgst[ 4] = tmps[gid].dgst[i +  4];
2056     dgst[ 5] = tmps[gid].dgst[i +  5];
2057     dgst[ 6] = tmps[gid].dgst[i +  6];
2058     dgst[ 7] = tmps[gid].dgst[i +  7];
2059     dgst[ 8] = tmps[gid].dgst[i +  8];
2060     dgst[ 9] = tmps[gid].dgst[i +  9];
2061     dgst[10] = tmps[gid].dgst[i + 10];
2062     dgst[11] = tmps[gid].dgst[i + 11];
2063     dgst[12] = tmps[gid].dgst[i + 12];
2064     dgst[13] = tmps[gid].dgst[i + 13];
2065     dgst[14] = tmps[gid].dgst[i + 14];
2066     dgst[15] = tmps[gid].dgst[i + 15];
2067
2068     u32 out[16];
2069
2070     out[ 0] = tmps[gid].out[i +  0];
2071     out[ 1] = tmps[gid].out[i +  1];
2072     out[ 2] = tmps[gid].out[i +  2];
2073     out[ 3] = tmps[gid].out[i +  3];
2074     out[ 4] = tmps[gid].out[i +  4];
2075     out[ 5] = tmps[gid].out[i +  5];
2076     out[ 6] = tmps[gid].out[i +  6];
2077     out[ 7] = tmps[gid].out[i +  7];
2078     out[ 8] = tmps[gid].out[i +  8];
2079     out[ 9] = tmps[gid].out[i +  9];
2080     out[10] = tmps[gid].out[i + 10];
2081     out[11] = tmps[gid].out[i + 11];
2082     out[12] = tmps[gid].out[i + 12];
2083     out[13] = tmps[gid].out[i + 13];
2084     out[14] = tmps[gid].out[i + 14];
2085     out[15] = tmps[gid].out[i + 15];
2086
2087     for (u32 j = 0; j < loop_cnt; j++)
2088     {
2089       u32 w1[16];
2090
2091       w1[ 0] = dgst[ 0];
2092       w1[ 1] = dgst[ 1];
2093       w1[ 2] = dgst[ 2];
2094       w1[ 3] = dgst[ 3];
2095       w1[ 4] = dgst[ 4];
2096       w1[ 5] = dgst[ 5];
2097       w1[ 6] = dgst[ 6];
2098       w1[ 7] = dgst[ 7];
2099       w1[ 8] = dgst[ 8];
2100       w1[ 9] = dgst[ 9];
2101       w1[10] = dgst[10];
2102       w1[11] = dgst[11];
2103       w1[12] = dgst[12];
2104       w1[13] = dgst[13];
2105       w1[14] = dgst[14];
2106       w1[15] = dgst[15];
2107
2108       hmac_run2b (w1, ipad, opad, dgst, s_Ch, s_Cl);
2109
2110       out[ 0] ^= dgst[ 0];
2111       out[ 1] ^= dgst[ 1];
2112       out[ 2] ^= dgst[ 2];
2113       out[ 3] ^= dgst[ 3];
2114       out[ 4] ^= dgst[ 4];
2115       out[ 5] ^= dgst[ 5];
2116       out[ 6] ^= dgst[ 6];
2117       out[ 7] ^= dgst[ 7];
2118       out[ 8] ^= dgst[ 8];
2119       out[ 9] ^= dgst[ 9];
2120       out[10] ^= dgst[10];
2121       out[11] ^= dgst[11];
2122       out[12] ^= dgst[12];
2123       out[13] ^= dgst[13];
2124       out[14] ^= dgst[14];
2125       out[15] ^= dgst[15];
2126     }
2127
2128     tmps[gid].dgst[i +  0] = dgst[ 0];
2129     tmps[gid].dgst[i +  1] = dgst[ 1];
2130     tmps[gid].dgst[i +  2] = dgst[ 2];
2131     tmps[gid].dgst[i +  3] = dgst[ 3];
2132     tmps[gid].dgst[i +  4] = dgst[ 4];
2133     tmps[gid].dgst[i +  5] = dgst[ 5];
2134     tmps[gid].dgst[i +  6] = dgst[ 6];
2135     tmps[gid].dgst[i +  7] = dgst[ 7];
2136     tmps[gid].dgst[i +  8] = dgst[ 8];
2137     tmps[gid].dgst[i +  9] = dgst[ 9];
2138     tmps[gid].dgst[i + 10] = dgst[10];
2139     tmps[gid].dgst[i + 11] = dgst[11];
2140     tmps[gid].dgst[i + 12] = dgst[12];
2141     tmps[gid].dgst[i + 13] = dgst[13];
2142     tmps[gid].dgst[i + 14] = dgst[14];
2143     tmps[gid].dgst[i + 15] = dgst[15];
2144
2145     tmps[gid].out[i +  0] = out[ 0];
2146     tmps[gid].out[i +  1] = out[ 1];
2147     tmps[gid].out[i +  2] = out[ 2];
2148     tmps[gid].out[i +  3] = out[ 3];
2149     tmps[gid].out[i +  4] = out[ 4];
2150     tmps[gid].out[i +  5] = out[ 5];
2151     tmps[gid].out[i +  6] = out[ 6];
2152     tmps[gid].out[i +  7] = out[ 7];
2153     tmps[gid].out[i +  8] = out[ 8];
2154     tmps[gid].out[i +  9] = out[ 9];
2155     tmps[gid].out[i + 10] = out[10];
2156     tmps[gid].out[i + 11] = out[11];
2157     tmps[gid].out[i + 12] = out[12];
2158     tmps[gid].out[i + 13] = out[13];
2159     tmps[gid].out[i + 14] = out[14];
2160     tmps[gid].out[i + 15] = out[15];
2161   }
2162 }
2163
2164 __kernel void m06231_comp (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_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 tc_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
2165 {
2166   /**
2167    * base
2168    */
2169
2170   const u32 gid = get_global_id (0);
2171   const u32 lid = get_local_id (0);
2172
2173   if (gid >= gid_max) return;
2174
2175   u32 ukey1[8];
2176
2177   ukey1[0] = swap32 (tmps[gid].out[ 0]);
2178   ukey1[1] = swap32 (tmps[gid].out[ 1]);
2179   ukey1[2] = swap32 (tmps[gid].out[ 2]);
2180   ukey1[3] = swap32 (tmps[gid].out[ 3]);
2181   ukey1[4] = swap32 (tmps[gid].out[ 4]);
2182   ukey1[5] = swap32 (tmps[gid].out[ 5]);
2183   ukey1[6] = swap32 (tmps[gid].out[ 6]);
2184   ukey1[7] = swap32 (tmps[gid].out[ 7]);
2185
2186   u32 ukey2[8];
2187
2188   ukey2[0] = swap32 (tmps[gid].out[ 8]);
2189   ukey2[1] = swap32 (tmps[gid].out[ 9]);
2190   ukey2[2] = swap32 (tmps[gid].out[10]);
2191   ukey2[3] = swap32 (tmps[gid].out[11]);
2192   ukey2[4] = swap32 (tmps[gid].out[12]);
2193   ukey2[5] = swap32 (tmps[gid].out[13]);
2194   ukey2[6] = swap32 (tmps[gid].out[14]);
2195   ukey2[7] = swap32 (tmps[gid].out[15]);
2196
2197   u32 data[4];
2198
2199   data[0] = esalt_bufs[0].data_buf[0];
2200   data[1] = esalt_bufs[0].data_buf[1];
2201   data[2] = esalt_bufs[0].data_buf[2];
2202   data[3] = esalt_bufs[0].data_buf[3];
2203
2204   const u32 signature = esalt_bufs[0].signature;
2205
2206   u32 tmp[4];
2207
2208   {
2209     tmp[0] = data[0];
2210     tmp[1] = data[1];
2211     tmp[2] = data[2];
2212     tmp[3] = data[3];
2213
2214     aes256_decrypt_xts (ukey1, ukey2, tmp, tmp);
2215
2216     if (((tmp[0] == signature) && (tmp[3] == 0)) || ((tmp[0] == signature) && ((tmp[1] >> 16) <= 5)))
2217     {
2218       mark_hash (plains_buf, d_return_buf, salt_pos, 0, 0, gid, 0);
2219     }
2220   }
2221
2222   {
2223     tmp[0] = data[0];
2224     tmp[1] = data[1];
2225     tmp[2] = data[2];
2226     tmp[3] = data[3];
2227
2228     serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp);
2229
2230     if (((tmp[0] == signature) && (tmp[3] == 0)) || ((tmp[0] == signature) && ((tmp[1] >> 16) <= 5)))
2231     {
2232       mark_hash (plains_buf, d_return_buf, salt_pos, 0, 0, gid, 0);
2233     }
2234   }
2235
2236   {
2237     tmp[0] = data[0];
2238     tmp[1] = data[1];
2239     tmp[2] = data[2];
2240     tmp[3] = data[3];
2241
2242     twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp);
2243
2244     if (((tmp[0] == signature) && (tmp[3] == 0)) || ((tmp[0] == signature) && ((tmp[1] >> 16) <= 5)))
2245     {
2246       mark_hash (plains_buf, d_return_buf, salt_pos, 0, 0, gid, 0);
2247     }
2248   }
2249 }