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