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