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