Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m05800.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
7
8 #include "inc_vendor.cl"
9 #include "inc_hash_constants.h"
10 #include "inc_hash_functions.cl"
11 #include "inc_types.cl"
12 #include "inc_common.cl"
13
14 #define COMPARE_S "inc_comp_single.cl"
15 #define COMPARE_M "inc_comp_multi.cl"
16
17 typedef struct
18 {
19   u32 dec;
20   u32 len;
21
22 } entry_t;
23
24 __constant entry_t pc[1024] =
25 {
26   { 0x00000030, 1 },
27   { 0x00000031, 1 },
28   { 0x00000032, 1 },
29   { 0x00000033, 1 },
30   { 0x00000034, 1 },
31   { 0x00000035, 1 },
32   { 0x00000036, 1 },
33   { 0x00000037, 1 },
34   { 0x00000038, 1 },
35   { 0x00000039, 1 },
36   { 0x00003031, 2 },
37   { 0x00003131, 2 },
38   { 0x00003231, 2 },
39   { 0x00003331, 2 },
40   { 0x00003431, 2 },
41   { 0x00003531, 2 },
42   { 0x00003631, 2 },
43   { 0x00003731, 2 },
44   { 0x00003831, 2 },
45   { 0x00003931, 2 },
46   { 0x00003032, 2 },
47   { 0x00003132, 2 },
48   { 0x00003232, 2 },
49   { 0x00003332, 2 },
50   { 0x00003432, 2 },
51   { 0x00003532, 2 },
52   { 0x00003632, 2 },
53   { 0x00003732, 2 },
54   { 0x00003832, 2 },
55   { 0x00003932, 2 },
56   { 0x00003033, 2 },
57   { 0x00003133, 2 },
58   { 0x00003233, 2 },
59   { 0x00003333, 2 },
60   { 0x00003433, 2 },
61   { 0x00003533, 2 },
62   { 0x00003633, 2 },
63   { 0x00003733, 2 },
64   { 0x00003833, 2 },
65   { 0x00003933, 2 },
66   { 0x00003034, 2 },
67   { 0x00003134, 2 },
68   { 0x00003234, 2 },
69   { 0x00003334, 2 },
70   { 0x00003434, 2 },
71   { 0x00003534, 2 },
72   { 0x00003634, 2 },
73   { 0x00003734, 2 },
74   { 0x00003834, 2 },
75   { 0x00003934, 2 },
76   { 0x00003035, 2 },
77   { 0x00003135, 2 },
78   { 0x00003235, 2 },
79   { 0x00003335, 2 },
80   { 0x00003435, 2 },
81   { 0x00003535, 2 },
82   { 0x00003635, 2 },
83   { 0x00003735, 2 },
84   { 0x00003835, 2 },
85   { 0x00003935, 2 },
86   { 0x00003036, 2 },
87   { 0x00003136, 2 },
88   { 0x00003236, 2 },
89   { 0x00003336, 2 },
90   { 0x00003436, 2 },
91   { 0x00003536, 2 },
92   { 0x00003636, 2 },
93   { 0x00003736, 2 },
94   { 0x00003836, 2 },
95   { 0x00003936, 2 },
96   { 0x00003037, 2 },
97   { 0x00003137, 2 },
98   { 0x00003237, 2 },
99   { 0x00003337, 2 },
100   { 0x00003437, 2 },
101   { 0x00003537, 2 },
102   { 0x00003637, 2 },
103   { 0x00003737, 2 },
104   { 0x00003837, 2 },
105   { 0x00003937, 2 },
106   { 0x00003038, 2 },
107   { 0x00003138, 2 },
108   { 0x00003238, 2 },
109   { 0x00003338, 2 },
110   { 0x00003438, 2 },
111   { 0x00003538, 2 },
112   { 0x00003638, 2 },
113   { 0x00003738, 2 },
114   { 0x00003838, 2 },
115   { 0x00003938, 2 },
116   { 0x00003039, 2 },
117   { 0x00003139, 2 },
118   { 0x00003239, 2 },
119   { 0x00003339, 2 },
120   { 0x00003439, 2 },
121   { 0x00003539, 2 },
122   { 0x00003639, 2 },
123   { 0x00003739, 2 },
124   { 0x00003839, 2 },
125   { 0x00003939, 2 },
126   { 0x00303031, 3 },
127   { 0x00313031, 3 },
128   { 0x00323031, 3 },
129   { 0x00333031, 3 },
130   { 0x00343031, 3 },
131   { 0x00353031, 3 },
132   { 0x00363031, 3 },
133   { 0x00373031, 3 },
134   { 0x00383031, 3 },
135   { 0x00393031, 3 },
136   { 0x00303131, 3 },
137   { 0x00313131, 3 },
138   { 0x00323131, 3 },
139   { 0x00333131, 3 },
140   { 0x00343131, 3 },
141   { 0x00353131, 3 },
142   { 0x00363131, 3 },
143   { 0x00373131, 3 },
144   { 0x00383131, 3 },
145   { 0x00393131, 3 },
146   { 0x00303231, 3 },
147   { 0x00313231, 3 },
148   { 0x00323231, 3 },
149   { 0x00333231, 3 },
150   { 0x00343231, 3 },
151   { 0x00353231, 3 },
152   { 0x00363231, 3 },
153   { 0x00373231, 3 },
154   { 0x00383231, 3 },
155   { 0x00393231, 3 },
156   { 0x00303331, 3 },
157   { 0x00313331, 3 },
158   { 0x00323331, 3 },
159   { 0x00333331, 3 },
160   { 0x00343331, 3 },
161   { 0x00353331, 3 },
162   { 0x00363331, 3 },
163   { 0x00373331, 3 },
164   { 0x00383331, 3 },
165   { 0x00393331, 3 },
166   { 0x00303431, 3 },
167   { 0x00313431, 3 },
168   { 0x00323431, 3 },
169   { 0x00333431, 3 },
170   { 0x00343431, 3 },
171   { 0x00353431, 3 },
172   { 0x00363431, 3 },
173   { 0x00373431, 3 },
174   { 0x00383431, 3 },
175   { 0x00393431, 3 },
176   { 0x00303531, 3 },
177   { 0x00313531, 3 },
178   { 0x00323531, 3 },
179   { 0x00333531, 3 },
180   { 0x00343531, 3 },
181   { 0x00353531, 3 },
182   { 0x00363531, 3 },
183   { 0x00373531, 3 },
184   { 0x00383531, 3 },
185   { 0x00393531, 3 },
186   { 0x00303631, 3 },
187   { 0x00313631, 3 },
188   { 0x00323631, 3 },
189   { 0x00333631, 3 },
190   { 0x00343631, 3 },
191   { 0x00353631, 3 },
192   { 0x00363631, 3 },
193   { 0x00373631, 3 },
194   { 0x00383631, 3 },
195   { 0x00393631, 3 },
196   { 0x00303731, 3 },
197   { 0x00313731, 3 },
198   { 0x00323731, 3 },
199   { 0x00333731, 3 },
200   { 0x00343731, 3 },
201   { 0x00353731, 3 },
202   { 0x00363731, 3 },
203   { 0x00373731, 3 },
204   { 0x00383731, 3 },
205   { 0x00393731, 3 },
206   { 0x00303831, 3 },
207   { 0x00313831, 3 },
208   { 0x00323831, 3 },
209   { 0x00333831, 3 },
210   { 0x00343831, 3 },
211   { 0x00353831, 3 },
212   { 0x00363831, 3 },
213   { 0x00373831, 3 },
214   { 0x00383831, 3 },
215   { 0x00393831, 3 },
216   { 0x00303931, 3 },
217   { 0x00313931, 3 },
218   { 0x00323931, 3 },
219   { 0x00333931, 3 },
220   { 0x00343931, 3 },
221   { 0x00353931, 3 },
222   { 0x00363931, 3 },
223   { 0x00373931, 3 },
224   { 0x00383931, 3 },
225   { 0x00393931, 3 },
226   { 0x00303032, 3 },
227   { 0x00313032, 3 },
228   { 0x00323032, 3 },
229   { 0x00333032, 3 },
230   { 0x00343032, 3 },
231   { 0x00353032, 3 },
232   { 0x00363032, 3 },
233   { 0x00373032, 3 },
234   { 0x00383032, 3 },
235   { 0x00393032, 3 },
236   { 0x00303132, 3 },
237   { 0x00313132, 3 },
238   { 0x00323132, 3 },
239   { 0x00333132, 3 },
240   { 0x00343132, 3 },
241   { 0x00353132, 3 },
242   { 0x00363132, 3 },
243   { 0x00373132, 3 },
244   { 0x00383132, 3 },
245   { 0x00393132, 3 },
246   { 0x00303232, 3 },
247   { 0x00313232, 3 },
248   { 0x00323232, 3 },
249   { 0x00333232, 3 },
250   { 0x00343232, 3 },
251   { 0x00353232, 3 },
252   { 0x00363232, 3 },
253   { 0x00373232, 3 },
254   { 0x00383232, 3 },
255   { 0x00393232, 3 },
256   { 0x00303332, 3 },
257   { 0x00313332, 3 },
258   { 0x00323332, 3 },
259   { 0x00333332, 3 },
260   { 0x00343332, 3 },
261   { 0x00353332, 3 },
262   { 0x00363332, 3 },
263   { 0x00373332, 3 },
264   { 0x00383332, 3 },
265   { 0x00393332, 3 },
266   { 0x00303432, 3 },
267   { 0x00313432, 3 },
268   { 0x00323432, 3 },
269   { 0x00333432, 3 },
270   { 0x00343432, 3 },
271   { 0x00353432, 3 },
272   { 0x00363432, 3 },
273   { 0x00373432, 3 },
274   { 0x00383432, 3 },
275   { 0x00393432, 3 },
276   { 0x00303532, 3 },
277   { 0x00313532, 3 },
278   { 0x00323532, 3 },
279   { 0x00333532, 3 },
280   { 0x00343532, 3 },
281   { 0x00353532, 3 },
282   { 0x00363532, 3 },
283   { 0x00373532, 3 },
284   { 0x00383532, 3 },
285   { 0x00393532, 3 },
286   { 0x00303632, 3 },
287   { 0x00313632, 3 },
288   { 0x00323632, 3 },
289   { 0x00333632, 3 },
290   { 0x00343632, 3 },
291   { 0x00353632, 3 },
292   { 0x00363632, 3 },
293   { 0x00373632, 3 },
294   { 0x00383632, 3 },
295   { 0x00393632, 3 },
296   { 0x00303732, 3 },
297   { 0x00313732, 3 },
298   { 0x00323732, 3 },
299   { 0x00333732, 3 },
300   { 0x00343732, 3 },
301   { 0x00353732, 3 },
302   { 0x00363732, 3 },
303   { 0x00373732, 3 },
304   { 0x00383732, 3 },
305   { 0x00393732, 3 },
306   { 0x00303832, 3 },
307   { 0x00313832, 3 },
308   { 0x00323832, 3 },
309   { 0x00333832, 3 },
310   { 0x00343832, 3 },
311   { 0x00353832, 3 },
312   { 0x00363832, 3 },
313   { 0x00373832, 3 },
314   { 0x00383832, 3 },
315   { 0x00393832, 3 },
316   { 0x00303932, 3 },
317   { 0x00313932, 3 },
318   { 0x00323932, 3 },
319   { 0x00333932, 3 },
320   { 0x00343932, 3 },
321   { 0x00353932, 3 },
322   { 0x00363932, 3 },
323   { 0x00373932, 3 },
324   { 0x00383932, 3 },
325   { 0x00393932, 3 },
326   { 0x00303033, 3 },
327   { 0x00313033, 3 },
328   { 0x00323033, 3 },
329   { 0x00333033, 3 },
330   { 0x00343033, 3 },
331   { 0x00353033, 3 },
332   { 0x00363033, 3 },
333   { 0x00373033, 3 },
334   { 0x00383033, 3 },
335   { 0x00393033, 3 },
336   { 0x00303133, 3 },
337   { 0x00313133, 3 },
338   { 0x00323133, 3 },
339   { 0x00333133, 3 },
340   { 0x00343133, 3 },
341   { 0x00353133, 3 },
342   { 0x00363133, 3 },
343   { 0x00373133, 3 },
344   { 0x00383133, 3 },
345   { 0x00393133, 3 },
346   { 0x00303233, 3 },
347   { 0x00313233, 3 },
348   { 0x00323233, 3 },
349   { 0x00333233, 3 },
350   { 0x00343233, 3 },
351   { 0x00353233, 3 },
352   { 0x00363233, 3 },
353   { 0x00373233, 3 },
354   { 0x00383233, 3 },
355   { 0x00393233, 3 },
356   { 0x00303333, 3 },
357   { 0x00313333, 3 },
358   { 0x00323333, 3 },
359   { 0x00333333, 3 },
360   { 0x00343333, 3 },
361   { 0x00353333, 3 },
362   { 0x00363333, 3 },
363   { 0x00373333, 3 },
364   { 0x00383333, 3 },
365   { 0x00393333, 3 },
366   { 0x00303433, 3 },
367   { 0x00313433, 3 },
368   { 0x00323433, 3 },
369   { 0x00333433, 3 },
370   { 0x00343433, 3 },
371   { 0x00353433, 3 },
372   { 0x00363433, 3 },
373   { 0x00373433, 3 },
374   { 0x00383433, 3 },
375   { 0x00393433, 3 },
376   { 0x00303533, 3 },
377   { 0x00313533, 3 },
378   { 0x00323533, 3 },
379   { 0x00333533, 3 },
380   { 0x00343533, 3 },
381   { 0x00353533, 3 },
382   { 0x00363533, 3 },
383   { 0x00373533, 3 },
384   { 0x00383533, 3 },
385   { 0x00393533, 3 },
386   { 0x00303633, 3 },
387   { 0x00313633, 3 },
388   { 0x00323633, 3 },
389   { 0x00333633, 3 },
390   { 0x00343633, 3 },
391   { 0x00353633, 3 },
392   { 0x00363633, 3 },
393   { 0x00373633, 3 },
394   { 0x00383633, 3 },
395   { 0x00393633, 3 },
396   { 0x00303733, 3 },
397   { 0x00313733, 3 },
398   { 0x00323733, 3 },
399   { 0x00333733, 3 },
400   { 0x00343733, 3 },
401   { 0x00353733, 3 },
402   { 0x00363733, 3 },
403   { 0x00373733, 3 },
404   { 0x00383733, 3 },
405   { 0x00393733, 3 },
406   { 0x00303833, 3 },
407   { 0x00313833, 3 },
408   { 0x00323833, 3 },
409   { 0x00333833, 3 },
410   { 0x00343833, 3 },
411   { 0x00353833, 3 },
412   { 0x00363833, 3 },
413   { 0x00373833, 3 },
414   { 0x00383833, 3 },
415   { 0x00393833, 3 },
416   { 0x00303933, 3 },
417   { 0x00313933, 3 },
418   { 0x00323933, 3 },
419   { 0x00333933, 3 },
420   { 0x00343933, 3 },
421   { 0x00353933, 3 },
422   { 0x00363933, 3 },
423   { 0x00373933, 3 },
424   { 0x00383933, 3 },
425   { 0x00393933, 3 },
426   { 0x00303034, 3 },
427   { 0x00313034, 3 },
428   { 0x00323034, 3 },
429   { 0x00333034, 3 },
430   { 0x00343034, 3 },
431   { 0x00353034, 3 },
432   { 0x00363034, 3 },
433   { 0x00373034, 3 },
434   { 0x00383034, 3 },
435   { 0x00393034, 3 },
436   { 0x00303134, 3 },
437   { 0x00313134, 3 },
438   { 0x00323134, 3 },
439   { 0x00333134, 3 },
440   { 0x00343134, 3 },
441   { 0x00353134, 3 },
442   { 0x00363134, 3 },
443   { 0x00373134, 3 },
444   { 0x00383134, 3 },
445   { 0x00393134, 3 },
446   { 0x00303234, 3 },
447   { 0x00313234, 3 },
448   { 0x00323234, 3 },
449   { 0x00333234, 3 },
450   { 0x00343234, 3 },
451   { 0x00353234, 3 },
452   { 0x00363234, 3 },
453   { 0x00373234, 3 },
454   { 0x00383234, 3 },
455   { 0x00393234, 3 },
456   { 0x00303334, 3 },
457   { 0x00313334, 3 },
458   { 0x00323334, 3 },
459   { 0x00333334, 3 },
460   { 0x00343334, 3 },
461   { 0x00353334, 3 },
462   { 0x00363334, 3 },
463   { 0x00373334, 3 },
464   { 0x00383334, 3 },
465   { 0x00393334, 3 },
466   { 0x00303434, 3 },
467   { 0x00313434, 3 },
468   { 0x00323434, 3 },
469   { 0x00333434, 3 },
470   { 0x00343434, 3 },
471   { 0x00353434, 3 },
472   { 0x00363434, 3 },
473   { 0x00373434, 3 },
474   { 0x00383434, 3 },
475   { 0x00393434, 3 },
476   { 0x00303534, 3 },
477   { 0x00313534, 3 },
478   { 0x00323534, 3 },
479   { 0x00333534, 3 },
480   { 0x00343534, 3 },
481   { 0x00353534, 3 },
482   { 0x00363534, 3 },
483   { 0x00373534, 3 },
484   { 0x00383534, 3 },
485   { 0x00393534, 3 },
486   { 0x00303634, 3 },
487   { 0x00313634, 3 },
488   { 0x00323634, 3 },
489   { 0x00333634, 3 },
490   { 0x00343634, 3 },
491   { 0x00353634, 3 },
492   { 0x00363634, 3 },
493   { 0x00373634, 3 },
494   { 0x00383634, 3 },
495   { 0x00393634, 3 },
496   { 0x00303734, 3 },
497   { 0x00313734, 3 },
498   { 0x00323734, 3 },
499   { 0x00333734, 3 },
500   { 0x00343734, 3 },
501   { 0x00353734, 3 },
502   { 0x00363734, 3 },
503   { 0x00373734, 3 },
504   { 0x00383734, 3 },
505   { 0x00393734, 3 },
506   { 0x00303834, 3 },
507   { 0x00313834, 3 },
508   { 0x00323834, 3 },
509   { 0x00333834, 3 },
510   { 0x00343834, 3 },
511   { 0x00353834, 3 },
512   { 0x00363834, 3 },
513   { 0x00373834, 3 },
514   { 0x00383834, 3 },
515   { 0x00393834, 3 },
516   { 0x00303934, 3 },
517   { 0x00313934, 3 },
518   { 0x00323934, 3 },
519   { 0x00333934, 3 },
520   { 0x00343934, 3 },
521   { 0x00353934, 3 },
522   { 0x00363934, 3 },
523   { 0x00373934, 3 },
524   { 0x00383934, 3 },
525   { 0x00393934, 3 },
526   { 0x00303035, 3 },
527   { 0x00313035, 3 },
528   { 0x00323035, 3 },
529   { 0x00333035, 3 },
530   { 0x00343035, 3 },
531   { 0x00353035, 3 },
532   { 0x00363035, 3 },
533   { 0x00373035, 3 },
534   { 0x00383035, 3 },
535   { 0x00393035, 3 },
536   { 0x00303135, 3 },
537   { 0x00313135, 3 },
538   { 0x00323135, 3 },
539   { 0x00333135, 3 },
540   { 0x00343135, 3 },
541   { 0x00353135, 3 },
542   { 0x00363135, 3 },
543   { 0x00373135, 3 },
544   { 0x00383135, 3 },
545   { 0x00393135, 3 },
546   { 0x00303235, 3 },
547   { 0x00313235, 3 },
548   { 0x00323235, 3 },
549   { 0x00333235, 3 },
550   { 0x00343235, 3 },
551   { 0x00353235, 3 },
552   { 0x00363235, 3 },
553   { 0x00373235, 3 },
554   { 0x00383235, 3 },
555   { 0x00393235, 3 },
556   { 0x00303335, 3 },
557   { 0x00313335, 3 },
558   { 0x00323335, 3 },
559   { 0x00333335, 3 },
560   { 0x00343335, 3 },
561   { 0x00353335, 3 },
562   { 0x00363335, 3 },
563   { 0x00373335, 3 },
564   { 0x00383335, 3 },
565   { 0x00393335, 3 },
566   { 0x00303435, 3 },
567   { 0x00313435, 3 },
568   { 0x00323435, 3 },
569   { 0x00333435, 3 },
570   { 0x00343435, 3 },
571   { 0x00353435, 3 },
572   { 0x00363435, 3 },
573   { 0x00373435, 3 },
574   { 0x00383435, 3 },
575   { 0x00393435, 3 },
576   { 0x00303535, 3 },
577   { 0x00313535, 3 },
578   { 0x00323535, 3 },
579   { 0x00333535, 3 },
580   { 0x00343535, 3 },
581   { 0x00353535, 3 },
582   { 0x00363535, 3 },
583   { 0x00373535, 3 },
584   { 0x00383535, 3 },
585   { 0x00393535, 3 },
586   { 0x00303635, 3 },
587   { 0x00313635, 3 },
588   { 0x00323635, 3 },
589   { 0x00333635, 3 },
590   { 0x00343635, 3 },
591   { 0x00353635, 3 },
592   { 0x00363635, 3 },
593   { 0x00373635, 3 },
594   { 0x00383635, 3 },
595   { 0x00393635, 3 },
596   { 0x00303735, 3 },
597   { 0x00313735, 3 },
598   { 0x00323735, 3 },
599   { 0x00333735, 3 },
600   { 0x00343735, 3 },
601   { 0x00353735, 3 },
602   { 0x00363735, 3 },
603   { 0x00373735, 3 },
604   { 0x00383735, 3 },
605   { 0x00393735, 3 },
606   { 0x00303835, 3 },
607   { 0x00313835, 3 },
608   { 0x00323835, 3 },
609   { 0x00333835, 3 },
610   { 0x00343835, 3 },
611   { 0x00353835, 3 },
612   { 0x00363835, 3 },
613   { 0x00373835, 3 },
614   { 0x00383835, 3 },
615   { 0x00393835, 3 },
616   { 0x00303935, 3 },
617   { 0x00313935, 3 },
618   { 0x00323935, 3 },
619   { 0x00333935, 3 },
620   { 0x00343935, 3 },
621   { 0x00353935, 3 },
622   { 0x00363935, 3 },
623   { 0x00373935, 3 },
624   { 0x00383935, 3 },
625   { 0x00393935, 3 },
626   { 0x00303036, 3 },
627   { 0x00313036, 3 },
628   { 0x00323036, 3 },
629   { 0x00333036, 3 },
630   { 0x00343036, 3 },
631   { 0x00353036, 3 },
632   { 0x00363036, 3 },
633   { 0x00373036, 3 },
634   { 0x00383036, 3 },
635   { 0x00393036, 3 },
636   { 0x00303136, 3 },
637   { 0x00313136, 3 },
638   { 0x00323136, 3 },
639   { 0x00333136, 3 },
640   { 0x00343136, 3 },
641   { 0x00353136, 3 },
642   { 0x00363136, 3 },
643   { 0x00373136, 3 },
644   { 0x00383136, 3 },
645   { 0x00393136, 3 },
646   { 0x00303236, 3 },
647   { 0x00313236, 3 },
648   { 0x00323236, 3 },
649   { 0x00333236, 3 },
650   { 0x00343236, 3 },
651   { 0x00353236, 3 },
652   { 0x00363236, 3 },
653   { 0x00373236, 3 },
654   { 0x00383236, 3 },
655   { 0x00393236, 3 },
656   { 0x00303336, 3 },
657   { 0x00313336, 3 },
658   { 0x00323336, 3 },
659   { 0x00333336, 3 },
660   { 0x00343336, 3 },
661   { 0x00353336, 3 },
662   { 0x00363336, 3 },
663   { 0x00373336, 3 },
664   { 0x00383336, 3 },
665   { 0x00393336, 3 },
666   { 0x00303436, 3 },
667   { 0x00313436, 3 },
668   { 0x00323436, 3 },
669   { 0x00333436, 3 },
670   { 0x00343436, 3 },
671   { 0x00353436, 3 },
672   { 0x00363436, 3 },
673   { 0x00373436, 3 },
674   { 0x00383436, 3 },
675   { 0x00393436, 3 },
676   { 0x00303536, 3 },
677   { 0x00313536, 3 },
678   { 0x00323536, 3 },
679   { 0x00333536, 3 },
680   { 0x00343536, 3 },
681   { 0x00353536, 3 },
682   { 0x00363536, 3 },
683   { 0x00373536, 3 },
684   { 0x00383536, 3 },
685   { 0x00393536, 3 },
686   { 0x00303636, 3 },
687   { 0x00313636, 3 },
688   { 0x00323636, 3 },
689   { 0x00333636, 3 },
690   { 0x00343636, 3 },
691   { 0x00353636, 3 },
692   { 0x00363636, 3 },
693   { 0x00373636, 3 },
694   { 0x00383636, 3 },
695   { 0x00393636, 3 },
696   { 0x00303736, 3 },
697   { 0x00313736, 3 },
698   { 0x00323736, 3 },
699   { 0x00333736, 3 },
700   { 0x00343736, 3 },
701   { 0x00353736, 3 },
702   { 0x00363736, 3 },
703   { 0x00373736, 3 },
704   { 0x00383736, 3 },
705   { 0x00393736, 3 },
706   { 0x00303836, 3 },
707   { 0x00313836, 3 },
708   { 0x00323836, 3 },
709   { 0x00333836, 3 },
710   { 0x00343836, 3 },
711   { 0x00353836, 3 },
712   { 0x00363836, 3 },
713   { 0x00373836, 3 },
714   { 0x00383836, 3 },
715   { 0x00393836, 3 },
716   { 0x00303936, 3 },
717   { 0x00313936, 3 },
718   { 0x00323936, 3 },
719   { 0x00333936, 3 },
720   { 0x00343936, 3 },
721   { 0x00353936, 3 },
722   { 0x00363936, 3 },
723   { 0x00373936, 3 },
724   { 0x00383936, 3 },
725   { 0x00393936, 3 },
726   { 0x00303037, 3 },
727   { 0x00313037, 3 },
728   { 0x00323037, 3 },
729   { 0x00333037, 3 },
730   { 0x00343037, 3 },
731   { 0x00353037, 3 },
732   { 0x00363037, 3 },
733   { 0x00373037, 3 },
734   { 0x00383037, 3 },
735   { 0x00393037, 3 },
736   { 0x00303137, 3 },
737   { 0x00313137, 3 },
738   { 0x00323137, 3 },
739   { 0x00333137, 3 },
740   { 0x00343137, 3 },
741   { 0x00353137, 3 },
742   { 0x00363137, 3 },
743   { 0x00373137, 3 },
744   { 0x00383137, 3 },
745   { 0x00393137, 3 },
746   { 0x00303237, 3 },
747   { 0x00313237, 3 },
748   { 0x00323237, 3 },
749   { 0x00333237, 3 },
750   { 0x00343237, 3 },
751   { 0x00353237, 3 },
752   { 0x00363237, 3 },
753   { 0x00373237, 3 },
754   { 0x00383237, 3 },
755   { 0x00393237, 3 },
756   { 0x00303337, 3 },
757   { 0x00313337, 3 },
758   { 0x00323337, 3 },
759   { 0x00333337, 3 },
760   { 0x00343337, 3 },
761   { 0x00353337, 3 },
762   { 0x00363337, 3 },
763   { 0x00373337, 3 },
764   { 0x00383337, 3 },
765   { 0x00393337, 3 },
766   { 0x00303437, 3 },
767   { 0x00313437, 3 },
768   { 0x00323437, 3 },
769   { 0x00333437, 3 },
770   { 0x00343437, 3 },
771   { 0x00353437, 3 },
772   { 0x00363437, 3 },
773   { 0x00373437, 3 },
774   { 0x00383437, 3 },
775   { 0x00393437, 3 },
776   { 0x00303537, 3 },
777   { 0x00313537, 3 },
778   { 0x00323537, 3 },
779   { 0x00333537, 3 },
780   { 0x00343537, 3 },
781   { 0x00353537, 3 },
782   { 0x00363537, 3 },
783   { 0x00373537, 3 },
784   { 0x00383537, 3 },
785   { 0x00393537, 3 },
786   { 0x00303637, 3 },
787   { 0x00313637, 3 },
788   { 0x00323637, 3 },
789   { 0x00333637, 3 },
790   { 0x00343637, 3 },
791   { 0x00353637, 3 },
792   { 0x00363637, 3 },
793   { 0x00373637, 3 },
794   { 0x00383637, 3 },
795   { 0x00393637, 3 },
796   { 0x00303737, 3 },
797   { 0x00313737, 3 },
798   { 0x00323737, 3 },
799   { 0x00333737, 3 },
800   { 0x00343737, 3 },
801   { 0x00353737, 3 },
802   { 0x00363737, 3 },
803   { 0x00373737, 3 },
804   { 0x00383737, 3 },
805   { 0x00393737, 3 },
806   { 0x00303837, 3 },
807   { 0x00313837, 3 },
808   { 0x00323837, 3 },
809   { 0x00333837, 3 },
810   { 0x00343837, 3 },
811   { 0x00353837, 3 },
812   { 0x00363837, 3 },
813   { 0x00373837, 3 },
814   { 0x00383837, 3 },
815   { 0x00393837, 3 },
816   { 0x00303937, 3 },
817   { 0x00313937, 3 },
818   { 0x00323937, 3 },
819   { 0x00333937, 3 },
820   { 0x00343937, 3 },
821   { 0x00353937, 3 },
822   { 0x00363937, 3 },
823   { 0x00373937, 3 },
824   { 0x00383937, 3 },
825   { 0x00393937, 3 },
826   { 0x00303038, 3 },
827   { 0x00313038, 3 },
828   { 0x00323038, 3 },
829   { 0x00333038, 3 },
830   { 0x00343038, 3 },
831   { 0x00353038, 3 },
832   { 0x00363038, 3 },
833   { 0x00373038, 3 },
834   { 0x00383038, 3 },
835   { 0x00393038, 3 },
836   { 0x00303138, 3 },
837   { 0x00313138, 3 },
838   { 0x00323138, 3 },
839   { 0x00333138, 3 },
840   { 0x00343138, 3 },
841   { 0x00353138, 3 },
842   { 0x00363138, 3 },
843   { 0x00373138, 3 },
844   { 0x00383138, 3 },
845   { 0x00393138, 3 },
846   { 0x00303238, 3 },
847   { 0x00313238, 3 },
848   { 0x00323238, 3 },
849   { 0x00333238, 3 },
850   { 0x00343238, 3 },
851   { 0x00353238, 3 },
852   { 0x00363238, 3 },
853   { 0x00373238, 3 },
854   { 0x00383238, 3 },
855   { 0x00393238, 3 },
856   { 0x00303338, 3 },
857   { 0x00313338, 3 },
858   { 0x00323338, 3 },
859   { 0x00333338, 3 },
860   { 0x00343338, 3 },
861   { 0x00353338, 3 },
862   { 0x00363338, 3 },
863   { 0x00373338, 3 },
864   { 0x00383338, 3 },
865   { 0x00393338, 3 },
866   { 0x00303438, 3 },
867   { 0x00313438, 3 },
868   { 0x00323438, 3 },
869   { 0x00333438, 3 },
870   { 0x00343438, 3 },
871   { 0x00353438, 3 },
872   { 0x00363438, 3 },
873   { 0x00373438, 3 },
874   { 0x00383438, 3 },
875   { 0x00393438, 3 },
876   { 0x00303538, 3 },
877   { 0x00313538, 3 },
878   { 0x00323538, 3 },
879   { 0x00333538, 3 },
880   { 0x00343538, 3 },
881   { 0x00353538, 3 },
882   { 0x00363538, 3 },
883   { 0x00373538, 3 },
884   { 0x00383538, 3 },
885   { 0x00393538, 3 },
886   { 0x00303638, 3 },
887   { 0x00313638, 3 },
888   { 0x00323638, 3 },
889   { 0x00333638, 3 },
890   { 0x00343638, 3 },
891   { 0x00353638, 3 },
892   { 0x00363638, 3 },
893   { 0x00373638, 3 },
894   { 0x00383638, 3 },
895   { 0x00393638, 3 },
896   { 0x00303738, 3 },
897   { 0x00313738, 3 },
898   { 0x00323738, 3 },
899   { 0x00333738, 3 },
900   { 0x00343738, 3 },
901   { 0x00353738, 3 },
902   { 0x00363738, 3 },
903   { 0x00373738, 3 },
904   { 0x00383738, 3 },
905   { 0x00393738, 3 },
906   { 0x00303838, 3 },
907   { 0x00313838, 3 },
908   { 0x00323838, 3 },
909   { 0x00333838, 3 },
910   { 0x00343838, 3 },
911   { 0x00353838, 3 },
912   { 0x00363838, 3 },
913   { 0x00373838, 3 },
914   { 0x00383838, 3 },
915   { 0x00393838, 3 },
916   { 0x00303938, 3 },
917   { 0x00313938, 3 },
918   { 0x00323938, 3 },
919   { 0x00333938, 3 },
920   { 0x00343938, 3 },
921   { 0x00353938, 3 },
922   { 0x00363938, 3 },
923   { 0x00373938, 3 },
924   { 0x00383938, 3 },
925   { 0x00393938, 3 },
926   { 0x00303039, 3 },
927   { 0x00313039, 3 },
928   { 0x00323039, 3 },
929   { 0x00333039, 3 },
930   { 0x00343039, 3 },
931   { 0x00353039, 3 },
932   { 0x00363039, 3 },
933   { 0x00373039, 3 },
934   { 0x00383039, 3 },
935   { 0x00393039, 3 },
936   { 0x00303139, 3 },
937   { 0x00313139, 3 },
938   { 0x00323139, 3 },
939   { 0x00333139, 3 },
940   { 0x00343139, 3 },
941   { 0x00353139, 3 },
942   { 0x00363139, 3 },
943   { 0x00373139, 3 },
944   { 0x00383139, 3 },
945   { 0x00393139, 3 },
946   { 0x00303239, 3 },
947   { 0x00313239, 3 },
948   { 0x00323239, 3 },
949   { 0x00333239, 3 },
950   { 0x00343239, 3 },
951   { 0x00353239, 3 },
952   { 0x00363239, 3 },
953   { 0x00373239, 3 },
954   { 0x00383239, 3 },
955   { 0x00393239, 3 },
956   { 0x00303339, 3 },
957   { 0x00313339, 3 },
958   { 0x00323339, 3 },
959   { 0x00333339, 3 },
960   { 0x00343339, 3 },
961   { 0x00353339, 3 },
962   { 0x00363339, 3 },
963   { 0x00373339, 3 },
964   { 0x00383339, 3 },
965   { 0x00393339, 3 },
966   { 0x00303439, 3 },
967   { 0x00313439, 3 },
968   { 0x00323439, 3 },
969   { 0x00333439, 3 },
970   { 0x00343439, 3 },
971   { 0x00353439, 3 },
972   { 0x00363439, 3 },
973   { 0x00373439, 3 },
974   { 0x00383439, 3 },
975   { 0x00393439, 3 },
976   { 0x00303539, 3 },
977   { 0x00313539, 3 },
978   { 0x00323539, 3 },
979   { 0x00333539, 3 },
980   { 0x00343539, 3 },
981   { 0x00353539, 3 },
982   { 0x00363539, 3 },
983   { 0x00373539, 3 },
984   { 0x00383539, 3 },
985   { 0x00393539, 3 },
986   { 0x00303639, 3 },
987   { 0x00313639, 3 },
988   { 0x00323639, 3 },
989   { 0x00333639, 3 },
990   { 0x00343639, 3 },
991   { 0x00353639, 3 },
992   { 0x00363639, 3 },
993   { 0x00373639, 3 },
994   { 0x00383639, 3 },
995   { 0x00393639, 3 },
996   { 0x00303739, 3 },
997   { 0x00313739, 3 },
998   { 0x00323739, 3 },
999   { 0x00333739, 3 },
1000   { 0x00343739, 3 },
1001   { 0x00353739, 3 },
1002   { 0x00363739, 3 },
1003   { 0x00373739, 3 },
1004   { 0x00383739, 3 },
1005   { 0x00393739, 3 },
1006   { 0x00303839, 3 },
1007   { 0x00313839, 3 },
1008   { 0x00323839, 3 },
1009   { 0x00333839, 3 },
1010   { 0x00343839, 3 },
1011   { 0x00353839, 3 },
1012   { 0x00363839, 3 },
1013   { 0x00373839, 3 },
1014   { 0x00383839, 3 },
1015   { 0x00393839, 3 },
1016   { 0x00303939, 3 },
1017   { 0x00313939, 3 },
1018   { 0x00323939, 3 },
1019   { 0x00333939, 3 },
1020   { 0x00343939, 3 },
1021   { 0x00353939, 3 },
1022   { 0x00363939, 3 },
1023   { 0x00373939, 3 },
1024   { 0x00383939, 3 },
1025   { 0x00393939, 3 },
1026   { 0x30303031, 4 },
1027   { 0x31303031, 4 },
1028   { 0x32303031, 4 },
1029   { 0x33303031, 4 },
1030   { 0x34303031, 4 },
1031   { 0x35303031, 4 },
1032   { 0x36303031, 4 },
1033   { 0x37303031, 4 },
1034   { 0x38303031, 4 },
1035   { 0x39303031, 4 },
1036   { 0x30313031, 4 },
1037   { 0x31313031, 4 },
1038   { 0x32313031, 4 },
1039   { 0x33313031, 4 },
1040   { 0x34313031, 4 },
1041   { 0x35313031, 4 },
1042   { 0x36313031, 4 },
1043   { 0x37313031, 4 },
1044   { 0x38313031, 4 },
1045   { 0x39313031, 4 },
1046   { 0x30323031, 4 },
1047   { 0x31323031, 4 },
1048   { 0x32323031, 4 },
1049   { 0x33323031, 4 }
1050 };
1051
1052 void append_word (u32 w0[4], u32 w1[4], const u32 append[4], const u32 offset)
1053 {
1054   switch (offset)
1055   {
1056     case 1:
1057       w0[0] = w0[0]           | append[0] <<  8;
1058       w0[1] = append[0] >> 24 | append[1] <<  8;
1059       w0[2] = append[1] >> 24 | append[2] <<  8;
1060       w0[3] = append[2] >> 24 | append[3] <<  8;
1061       break;
1062
1063     case 2:
1064       w0[0] = w0[0]           | append[0] << 16;
1065       w0[1] = append[0] >> 16 | append[1] << 16;
1066       w0[2] = append[1] >> 16 | append[2] << 16;
1067       w0[3] = append[2] >> 16 | append[3] << 16;
1068       break;
1069
1070     case 3:
1071       w0[0] = w0[0]           | append[0] << 24;
1072       w0[1] = append[0] >>  8 | append[1] << 24;
1073       w0[2] = append[1] >>  8 | append[2] << 24;
1074       w0[3] = append[2] >>  8 | append[3] << 24;
1075       break;
1076
1077     case 4:
1078       w0[1] = append[0];
1079       w0[2] = append[1];
1080       w0[3] = append[2];
1081       w1[0] = append[3];
1082       break;
1083   }
1084 }
1085
1086 void append_salt (u32 w0[4], u32 w1[4], u32 w2[4], const u32 append[5], const u32 offset)
1087 {
1088   u32 tmp0;
1089   u32 tmp1;
1090   u32 tmp2;
1091   u32 tmp3;
1092   u32 tmp4;
1093   u32 tmp5;
1094
1095   #if defined IS_AMD || defined IS_GENERIC
1096
1097   const int offset_minus_4 = 4 - (offset & 3);
1098
1099   tmp0 = amd_bytealign (append[0],         0, offset_minus_4);
1100   tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
1101   tmp2 = amd_bytealign (append[2], append[1], offset_minus_4);
1102   tmp3 = amd_bytealign (append[3], append[2], offset_minus_4);
1103   tmp4 = amd_bytealign (append[4], append[3], offset_minus_4);
1104   tmp5 = amd_bytealign (        0, append[4], offset_minus_4);
1105
1106   const u32 mod = offset & 3;
1107
1108   if (mod == 0)
1109   {
1110     tmp0 = tmp1;
1111     tmp1 = tmp2;
1112     tmp2 = tmp3;
1113     tmp3 = tmp4;
1114     tmp4 = tmp5;
1115     tmp5 = 0;
1116   }
1117
1118   #endif
1119
1120   #ifdef IS_NV
1121
1122   const int offset_minus_4 = 4 - (offset & 3);
1123
1124   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
1125
1126   tmp0 = __byte_perm (        0, append[0], selector);
1127   tmp1 = __byte_perm (append[0], append[1], selector);
1128   tmp2 = __byte_perm (append[1], append[2], selector);
1129   tmp3 = __byte_perm (append[2], append[3], selector);
1130   tmp4 = __byte_perm (append[3], append[4], selector);
1131   tmp5 = __byte_perm (append[4],         0, selector);
1132
1133   #endif
1134
1135   const u32 div = offset / 4;
1136
1137   switch (div)
1138   {
1139     case  0:  w0[0] |= tmp0;
1140               w0[1]  = tmp1;
1141               w0[2]  = tmp2;
1142               w0[3]  = tmp3;
1143               w1[0]  = tmp4;
1144               w1[1]  = tmp5;
1145               break;
1146     case  1:  w0[1] |= tmp0;
1147               w0[2]  = tmp1;
1148               w0[3]  = tmp2;
1149               w1[0]  = tmp3;
1150               w1[1]  = tmp4;
1151               w1[2]  = tmp5;
1152               break;
1153     case  2:  w0[2] |= tmp0;
1154               w0[3]  = tmp1;
1155               w1[0]  = tmp2;
1156               w1[1]  = tmp3;
1157               w1[2]  = tmp4;
1158               w1[3]  = tmp5;
1159               break;
1160     case  3:  w0[3] |= tmp0;
1161               w1[0]  = tmp1;
1162               w1[1]  = tmp2;
1163               w1[2]  = tmp3;
1164               w1[3]  = tmp4;
1165               w2[0]  = tmp5;
1166               break;
1167     case  4:  w1[0] |= tmp0;
1168               w1[1]  = tmp1;
1169               w1[2]  = tmp2;
1170               w1[3]  = tmp3;
1171               w2[0]  = tmp4;
1172               w2[1]  = tmp5;
1173               break;
1174   }
1175 }
1176
1177 void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
1178 {
1179   u32 A = digest[0];
1180   u32 B = digest[1];
1181   u32 C = digest[2];
1182   u32 D = digest[3];
1183   u32 E = digest[4];
1184
1185   u32 w0_t = w0[0];
1186   u32 w1_t = w0[1];
1187   u32 w2_t = w0[2];
1188   u32 w3_t = w0[3];
1189   u32 w4_t = w1[0];
1190   u32 w5_t = w1[1];
1191   u32 w6_t = w1[2];
1192   u32 w7_t = w1[3];
1193   u32 w8_t = w2[0];
1194   u32 w9_t = w2[1];
1195   u32 wa_t = w2[2];
1196   u32 wb_t = w2[3];
1197   u32 wc_t = w3[0];
1198   u32 wd_t = w3[1];
1199   u32 we_t = w3[2];
1200   u32 wf_t = w3[3];
1201
1202   #undef K
1203   #define K SHA1C00
1204
1205   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
1206   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
1207   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
1208   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
1209   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
1210   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
1211   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
1212   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
1213   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
1214   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
1215   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
1216   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
1217   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
1218   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
1219   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
1220   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
1221   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
1222   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
1223   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
1224   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
1225
1226   #undef K
1227   #define K SHA1C01
1228
1229   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
1230   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
1231   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
1232   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
1233   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
1234   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
1235   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
1236   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
1237   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
1238   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
1239   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
1240   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
1241   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
1242   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
1243   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
1244   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
1245   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
1246   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
1247   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
1248   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
1249
1250   #undef K
1251   #define K SHA1C02
1252
1253   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
1254   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
1255   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
1256   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
1257   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
1258   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
1259   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
1260   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
1261   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
1262   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
1263   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
1264   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
1265   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
1266   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
1267   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
1268   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
1269   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
1270   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
1271   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
1272   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
1273
1274   #undef K
1275   #define K SHA1C03
1276
1277   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
1278   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
1279   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
1280   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
1281   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
1282   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
1283   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
1284   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
1285   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
1286   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
1287   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
1288   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
1289   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
1290   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
1291   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
1292   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
1293   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
1294   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
1295   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
1296   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
1297
1298   digest[0] += A;
1299   digest[1] += B;
1300   digest[2] += C;
1301   digest[3] += D;
1302   digest[4] += E;
1303 }
1304
1305 __kernel void m05800_init (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1306 {
1307   /**
1308    * base
1309    */
1310
1311   const u32 gid = get_global_id (0);
1312
1313   if (gid >= gid_max) return;
1314
1315   u32 word_buf[4];
1316
1317   word_buf[0] = pws[gid].i[ 0];
1318   word_buf[1] = pws[gid].i[ 1];
1319   word_buf[2] = pws[gid].i[ 2];
1320   word_buf[3] = pws[gid].i[ 3];
1321
1322   const u32 pw_len = pws[gid].pw_len;
1323
1324   /**
1325    * salt
1326    */
1327
1328   u32 salt_len = salt_bufs[salt_pos].salt_len;
1329
1330   u32 salt_buf[5];
1331
1332   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
1333   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
1334   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
1335   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
1336   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
1337
1338   /**
1339    * init
1340    */
1341
1342   const u32 pc_len = 1;
1343   const u32 pc_dec = 0x30;
1344
1345   u32 data0[4] = { 0, 0, 0, 0 };
1346   u32 data1[4] = { 0, 0, 0, 0 };
1347   u32 data2[4] = { 0, 0, 0, 0 };
1348
1349   data0[0] = pc_dec;
1350
1351   append_word (data0, data1, word_buf, pc_len);
1352
1353   append_salt (data0, data1, data2, salt_buf, pc_len + pw_len);
1354
1355   u32 w0[4];
1356   u32 w1[4];
1357   u32 w2[4];
1358   u32 w3[4];
1359
1360   w0[0] = swap32 (data0[0]);
1361   w0[1] = swap32 (data0[1]);
1362   w0[2] = swap32 (data0[2]);
1363   w0[3] = swap32 (data0[3]);
1364   w1[0] = swap32 (data1[0]);
1365   w1[1] = swap32 (data1[1]);
1366   w1[2] = swap32 (data1[2]);
1367   w1[3] = swap32 (data1[3]);
1368   w2[0] = swap32 (data2[0]);
1369   w2[1] = swap32 (data2[1]);
1370   w2[2] = 0;
1371   w2[3] = 0;
1372   w3[0] = 0;
1373   w3[1] = 0;
1374   w3[2] = 0;
1375   w3[3] = (pc_len + pw_len + salt_len) * 8;
1376
1377   u32 digest[5];
1378
1379   digest[0] = SHA1M_A;
1380   digest[1] = SHA1M_B;
1381   digest[2] = SHA1M_C;
1382   digest[3] = SHA1M_D;
1383   digest[4] = SHA1M_E;
1384
1385   sha1_transform (w0, w1, w2, w3, digest);
1386
1387   tmps[gid].digest_buf[0] = digest[0];
1388   tmps[gid].digest_buf[1] = digest[1];
1389   tmps[gid].digest_buf[2] = digest[2];
1390   tmps[gid].digest_buf[3] = digest[3];
1391   tmps[gid].digest_buf[4] = digest[4];
1392 }
1393
1394 __kernel void m05800_loop (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1395 {
1396   /**
1397    * base
1398    */
1399
1400   const u32 gid = get_global_id (0);
1401   const u32 lid = get_local_id (0);
1402   const u32 lsz = get_local_size (0);
1403
1404   /**
1405    * cache precomputed conversion table in shared memory
1406    */
1407
1408   __local entry_t s_pc[1024];
1409
1410   for (u32 i = lid; i < 1024; i += lsz)
1411   {
1412     s_pc[i] = pc[i];
1413   }
1414
1415   barrier (CLK_LOCAL_MEM_FENCE);
1416
1417   if (gid >= gid_max) return;
1418
1419   /**
1420    * base
1421    */
1422
1423   u32 word_buf[4];
1424
1425   word_buf[0] = pws[gid].i[ 0];
1426   word_buf[1] = pws[gid].i[ 1];
1427   word_buf[2] = pws[gid].i[ 2];
1428   word_buf[3] = pws[gid].i[ 3];
1429
1430   const u32 pw_len = pws[gid].pw_len;
1431
1432   u32 digest[5];
1433
1434   digest[0] = tmps[gid].digest_buf[0];
1435   digest[1] = tmps[gid].digest_buf[1];
1436   digest[2] = tmps[gid].digest_buf[2];
1437   digest[3] = tmps[gid].digest_buf[3];
1438   digest[4] = tmps[gid].digest_buf[4];
1439
1440   /**
1441    * salt
1442    */
1443
1444   u32 salt_len = salt_bufs[salt_pos].salt_len;
1445
1446   u32 salt_buf[5];
1447
1448   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
1449   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
1450   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
1451   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
1452   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
1453
1454   /**
1455    * loop
1456    */
1457
1458   for (u32 i = 0, j = loop_pos + 1; i < loop_cnt; i++, j++)
1459   {
1460     const u32 pc_len = s_pc[j].len;
1461     const u32 pc_dec = s_pc[j].dec;
1462
1463     u32 data0[4] = { 0, 0, 0, 0 };
1464     u32 data1[4] = { 0, 0, 0, 0 };
1465     u32 data2[4] = { 0, 0, 0, 0 };
1466
1467     data0[0] = pc_dec;
1468
1469     append_word (data0, data1, word_buf, pc_len);
1470
1471     append_salt (data0, data1, data2, salt_buf, pc_len + pw_len);
1472
1473     u32 w0[4];
1474     u32 w1[4];
1475     u32 w2[4];
1476     u32 w3[4];
1477
1478     w0[0] = digest[0];
1479     w0[1] = digest[1];
1480     w0[2] = digest[2];
1481     w0[3] = digest[3];
1482     w1[0] = digest[4];
1483     w1[1] = swap32 (data0[0]);
1484     w1[2] = swap32 (data0[1]);
1485     w1[3] = swap32 (data0[2]);
1486     w2[0] = swap32 (data0[3]);
1487     w2[1] = swap32 (data1[0]);
1488     w2[2] = swap32 (data1[1]);
1489     w2[3] = swap32 (data1[2]);
1490     w3[0] = swap32 (data1[3]);
1491     w3[1] = swap32 (data2[0]);
1492     w3[2] = 0;
1493     w3[3] = (20 + pc_len + pw_len + salt_len) * 8;
1494
1495     digest[0] = SHA1M_A;
1496     digest[1] = SHA1M_B;
1497     digest[2] = SHA1M_C;
1498     digest[3] = SHA1M_D;
1499     digest[4] = SHA1M_E;
1500
1501     sha1_transform (w0, w1, w2, w3, digest);
1502   }
1503
1504   tmps[gid].digest_buf[0] = digest[0];
1505   tmps[gid].digest_buf[1] = digest[1];
1506   tmps[gid].digest_buf[2] = digest[2];
1507   tmps[gid].digest_buf[3] = digest[3];
1508   tmps[gid].digest_buf[4] = digest[4];
1509 }
1510
1511 __kernel void m05800_comp (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1512 {
1513   /**
1514    * modifier
1515    */
1516
1517   const u32 gid = get_global_id (0);
1518
1519   if (gid >= gid_max) return;
1520
1521   const u32 lid = get_local_id (0);
1522
1523   /**
1524    * digest
1525    */
1526
1527   const u32 r0 = tmps[gid].digest_buf[DGST_R0];
1528   const u32 r1 = tmps[gid].digest_buf[DGST_R1];
1529   const u32 r2 = tmps[gid].digest_buf[DGST_R2];
1530   const u32 r3 = tmps[gid].digest_buf[DGST_R3];
1531
1532   #define il_pos 0
1533
1534   #include COMPARE_M
1535 }