Initial commit
[hashcat.git] / amd / m05800.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE4
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE4
21 #endif
22
23 #define DGST_R0 0
24 #define DGST_R1 1
25 #define DGST_R2 2
26 #define DGST_R3 3
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
34 #endif
35
36 #ifdef  VECT_SIZE4
37 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
38 #endif
39
40 typedef struct
41 {
42   u32 dec;
43   u32 len;
44
45 } entry_t;
46
47 __constant entry_t pc[1024] =
48 {
49         0x00000030, 1, 0x00000031, 1, 0x00000032, 1, 0x00000033, 1, 0x00000034, 1, 0x00000035, 1, 0x00000036, 1, 0x00000037, 1,
50         0x00000038, 1, 0x00000039, 1, 0x00003031, 2, 0x00003131, 2, 0x00003231, 2, 0x00003331, 2, 0x00003431, 2, 0x00003531, 2,
51         0x00003631, 2, 0x00003731, 2, 0x00003831, 2, 0x00003931, 2, 0x00003032, 2, 0x00003132, 2, 0x00003232, 2, 0x00003332, 2,
52         0x00003432, 2, 0x00003532, 2, 0x00003632, 2, 0x00003732, 2, 0x00003832, 2, 0x00003932, 2, 0x00003033, 2, 0x00003133, 2,
53         0x00003233, 2, 0x00003333, 2, 0x00003433, 2, 0x00003533, 2, 0x00003633, 2, 0x00003733, 2, 0x00003833, 2, 0x00003933, 2,
54         0x00003034, 2, 0x00003134, 2, 0x00003234, 2, 0x00003334, 2, 0x00003434, 2, 0x00003534, 2, 0x00003634, 2, 0x00003734, 2,
55         0x00003834, 2, 0x00003934, 2, 0x00003035, 2, 0x00003135, 2, 0x00003235, 2, 0x00003335, 2, 0x00003435, 2, 0x00003535, 2,
56         0x00003635, 2, 0x00003735, 2, 0x00003835, 2, 0x00003935, 2, 0x00003036, 2, 0x00003136, 2, 0x00003236, 2, 0x00003336, 2,
57         0x00003436, 2, 0x00003536, 2, 0x00003636, 2, 0x00003736, 2, 0x00003836, 2, 0x00003936, 2, 0x00003037, 2, 0x00003137, 2,
58         0x00003237, 2, 0x00003337, 2, 0x00003437, 2, 0x00003537, 2, 0x00003637, 2, 0x00003737, 2, 0x00003837, 2, 0x00003937, 2,
59         0x00003038, 2, 0x00003138, 2, 0x00003238, 2, 0x00003338, 2, 0x00003438, 2, 0x00003538, 2, 0x00003638, 2, 0x00003738, 2,
60         0x00003838, 2, 0x00003938, 2, 0x00003039, 2, 0x00003139, 2, 0x00003239, 2, 0x00003339, 2, 0x00003439, 2, 0x00003539, 2,
61         0x00003639, 2, 0x00003739, 2, 0x00003839, 2, 0x00003939, 2, 0x00303031, 3, 0x00313031, 3, 0x00323031, 3, 0x00333031, 3,
62         0x00343031, 3, 0x00353031, 3, 0x00363031, 3, 0x00373031, 3, 0x00383031, 3, 0x00393031, 3, 0x00303131, 3, 0x00313131, 3,
63         0x00323131, 3, 0x00333131, 3, 0x00343131, 3, 0x00353131, 3, 0x00363131, 3, 0x00373131, 3, 0x00383131, 3, 0x00393131, 3,
64         0x00303231, 3, 0x00313231, 3, 0x00323231, 3, 0x00333231, 3, 0x00343231, 3, 0x00353231, 3, 0x00363231, 3, 0x00373231, 3,
65         0x00383231, 3, 0x00393231, 3, 0x00303331, 3, 0x00313331, 3, 0x00323331, 3, 0x00333331, 3, 0x00343331, 3, 0x00353331, 3,
66         0x00363331, 3, 0x00373331, 3, 0x00383331, 3, 0x00393331, 3, 0x00303431, 3, 0x00313431, 3, 0x00323431, 3, 0x00333431, 3,
67         0x00343431, 3, 0x00353431, 3, 0x00363431, 3, 0x00373431, 3, 0x00383431, 3, 0x00393431, 3, 0x00303531, 3, 0x00313531, 3,
68         0x00323531, 3, 0x00333531, 3, 0x00343531, 3, 0x00353531, 3, 0x00363531, 3, 0x00373531, 3, 0x00383531, 3, 0x00393531, 3,
69         0x00303631, 3, 0x00313631, 3, 0x00323631, 3, 0x00333631, 3, 0x00343631, 3, 0x00353631, 3, 0x00363631, 3, 0x00373631, 3,
70         0x00383631, 3, 0x00393631, 3, 0x00303731, 3, 0x00313731, 3, 0x00323731, 3, 0x00333731, 3, 0x00343731, 3, 0x00353731, 3,
71         0x00363731, 3, 0x00373731, 3, 0x00383731, 3, 0x00393731, 3, 0x00303831, 3, 0x00313831, 3, 0x00323831, 3, 0x00333831, 3,
72         0x00343831, 3, 0x00353831, 3, 0x00363831, 3, 0x00373831, 3, 0x00383831, 3, 0x00393831, 3, 0x00303931, 3, 0x00313931, 3,
73         0x00323931, 3, 0x00333931, 3, 0x00343931, 3, 0x00353931, 3, 0x00363931, 3, 0x00373931, 3, 0x00383931, 3, 0x00393931, 3,
74         0x00303032, 3, 0x00313032, 3, 0x00323032, 3, 0x00333032, 3, 0x00343032, 3, 0x00353032, 3, 0x00363032, 3, 0x00373032, 3,
75         0x00383032, 3, 0x00393032, 3, 0x00303132, 3, 0x00313132, 3, 0x00323132, 3, 0x00333132, 3, 0x00343132, 3, 0x00353132, 3,
76         0x00363132, 3, 0x00373132, 3, 0x00383132, 3, 0x00393132, 3, 0x00303232, 3, 0x00313232, 3, 0x00323232, 3, 0x00333232, 3,
77         0x00343232, 3, 0x00353232, 3, 0x00363232, 3, 0x00373232, 3, 0x00383232, 3, 0x00393232, 3, 0x00303332, 3, 0x00313332, 3,
78         0x00323332, 3, 0x00333332, 3, 0x00343332, 3, 0x00353332, 3, 0x00363332, 3, 0x00373332, 3, 0x00383332, 3, 0x00393332, 3,
79         0x00303432, 3, 0x00313432, 3, 0x00323432, 3, 0x00333432, 3, 0x00343432, 3, 0x00353432, 3, 0x00363432, 3, 0x00373432, 3,
80         0x00383432, 3, 0x00393432, 3, 0x00303532, 3, 0x00313532, 3, 0x00323532, 3, 0x00333532, 3, 0x00343532, 3, 0x00353532, 3,
81         0x00363532, 3, 0x00373532, 3, 0x00383532, 3, 0x00393532, 3, 0x00303632, 3, 0x00313632, 3, 0x00323632, 3, 0x00333632, 3,
82         0x00343632, 3, 0x00353632, 3, 0x00363632, 3, 0x00373632, 3, 0x00383632, 3, 0x00393632, 3, 0x00303732, 3, 0x00313732, 3,
83         0x00323732, 3, 0x00333732, 3, 0x00343732, 3, 0x00353732, 3, 0x00363732, 3, 0x00373732, 3, 0x00383732, 3, 0x00393732, 3,
84         0x00303832, 3, 0x00313832, 3, 0x00323832, 3, 0x00333832, 3, 0x00343832, 3, 0x00353832, 3, 0x00363832, 3, 0x00373832, 3,
85         0x00383832, 3, 0x00393832, 3, 0x00303932, 3, 0x00313932, 3, 0x00323932, 3, 0x00333932, 3, 0x00343932, 3, 0x00353932, 3,
86         0x00363932, 3, 0x00373932, 3, 0x00383932, 3, 0x00393932, 3, 0x00303033, 3, 0x00313033, 3, 0x00323033, 3, 0x00333033, 3,
87         0x00343033, 3, 0x00353033, 3, 0x00363033, 3, 0x00373033, 3, 0x00383033, 3, 0x00393033, 3, 0x00303133, 3, 0x00313133, 3,
88         0x00323133, 3, 0x00333133, 3, 0x00343133, 3, 0x00353133, 3, 0x00363133, 3, 0x00373133, 3, 0x00383133, 3, 0x00393133, 3,
89         0x00303233, 3, 0x00313233, 3, 0x00323233, 3, 0x00333233, 3, 0x00343233, 3, 0x00353233, 3, 0x00363233, 3, 0x00373233, 3,
90         0x00383233, 3, 0x00393233, 3, 0x00303333, 3, 0x00313333, 3, 0x00323333, 3, 0x00333333, 3, 0x00343333, 3, 0x00353333, 3,
91         0x00363333, 3, 0x00373333, 3, 0x00383333, 3, 0x00393333, 3, 0x00303433, 3, 0x00313433, 3, 0x00323433, 3, 0x00333433, 3,
92         0x00343433, 3, 0x00353433, 3, 0x00363433, 3, 0x00373433, 3, 0x00383433, 3, 0x00393433, 3, 0x00303533, 3, 0x00313533, 3,
93         0x00323533, 3, 0x00333533, 3, 0x00343533, 3, 0x00353533, 3, 0x00363533, 3, 0x00373533, 3, 0x00383533, 3, 0x00393533, 3,
94         0x00303633, 3, 0x00313633, 3, 0x00323633, 3, 0x00333633, 3, 0x00343633, 3, 0x00353633, 3, 0x00363633, 3, 0x00373633, 3,
95         0x00383633, 3, 0x00393633, 3, 0x00303733, 3, 0x00313733, 3, 0x00323733, 3, 0x00333733, 3, 0x00343733, 3, 0x00353733, 3,
96         0x00363733, 3, 0x00373733, 3, 0x00383733, 3, 0x00393733, 3, 0x00303833, 3, 0x00313833, 3, 0x00323833, 3, 0x00333833, 3,
97         0x00343833, 3, 0x00353833, 3, 0x00363833, 3, 0x00373833, 3, 0x00383833, 3, 0x00393833, 3, 0x00303933, 3, 0x00313933, 3,
98         0x00323933, 3, 0x00333933, 3, 0x00343933, 3, 0x00353933, 3, 0x00363933, 3, 0x00373933, 3, 0x00383933, 3, 0x00393933, 3,
99         0x00303034, 3, 0x00313034, 3, 0x00323034, 3, 0x00333034, 3, 0x00343034, 3, 0x00353034, 3, 0x00363034, 3, 0x00373034, 3,
100         0x00383034, 3, 0x00393034, 3, 0x00303134, 3, 0x00313134, 3, 0x00323134, 3, 0x00333134, 3, 0x00343134, 3, 0x00353134, 3,
101         0x00363134, 3, 0x00373134, 3, 0x00383134, 3, 0x00393134, 3, 0x00303234, 3, 0x00313234, 3, 0x00323234, 3, 0x00333234, 3,
102         0x00343234, 3, 0x00353234, 3, 0x00363234, 3, 0x00373234, 3, 0x00383234, 3, 0x00393234, 3, 0x00303334, 3, 0x00313334, 3,
103         0x00323334, 3, 0x00333334, 3, 0x00343334, 3, 0x00353334, 3, 0x00363334, 3, 0x00373334, 3, 0x00383334, 3, 0x00393334, 3,
104         0x00303434, 3, 0x00313434, 3, 0x00323434, 3, 0x00333434, 3, 0x00343434, 3, 0x00353434, 3, 0x00363434, 3, 0x00373434, 3,
105         0x00383434, 3, 0x00393434, 3, 0x00303534, 3, 0x00313534, 3, 0x00323534, 3, 0x00333534, 3, 0x00343534, 3, 0x00353534, 3,
106         0x00363534, 3, 0x00373534, 3, 0x00383534, 3, 0x00393534, 3, 0x00303634, 3, 0x00313634, 3, 0x00323634, 3, 0x00333634, 3,
107         0x00343634, 3, 0x00353634, 3, 0x00363634, 3, 0x00373634, 3, 0x00383634, 3, 0x00393634, 3, 0x00303734, 3, 0x00313734, 3,
108         0x00323734, 3, 0x00333734, 3, 0x00343734, 3, 0x00353734, 3, 0x00363734, 3, 0x00373734, 3, 0x00383734, 3, 0x00393734, 3,
109         0x00303834, 3, 0x00313834, 3, 0x00323834, 3, 0x00333834, 3, 0x00343834, 3, 0x00353834, 3, 0x00363834, 3, 0x00373834, 3,
110         0x00383834, 3, 0x00393834, 3, 0x00303934, 3, 0x00313934, 3, 0x00323934, 3, 0x00333934, 3, 0x00343934, 3, 0x00353934, 3,
111         0x00363934, 3, 0x00373934, 3, 0x00383934, 3, 0x00393934, 3, 0x00303035, 3, 0x00313035, 3, 0x00323035, 3, 0x00333035, 3,
112         0x00343035, 3, 0x00353035, 3, 0x00363035, 3, 0x00373035, 3, 0x00383035, 3, 0x00393035, 3, 0x00303135, 3, 0x00313135, 3,
113         0x00323135, 3, 0x00333135, 3, 0x00343135, 3, 0x00353135, 3, 0x00363135, 3, 0x00373135, 3, 0x00383135, 3, 0x00393135, 3,
114         0x00303235, 3, 0x00313235, 3, 0x00323235, 3, 0x00333235, 3, 0x00343235, 3, 0x00353235, 3, 0x00363235, 3, 0x00373235, 3,
115         0x00383235, 3, 0x00393235, 3, 0x00303335, 3, 0x00313335, 3, 0x00323335, 3, 0x00333335, 3, 0x00343335, 3, 0x00353335, 3,
116         0x00363335, 3, 0x00373335, 3, 0x00383335, 3, 0x00393335, 3, 0x00303435, 3, 0x00313435, 3, 0x00323435, 3, 0x00333435, 3,
117         0x00343435, 3, 0x00353435, 3, 0x00363435, 3, 0x00373435, 3, 0x00383435, 3, 0x00393435, 3, 0x00303535, 3, 0x00313535, 3,
118         0x00323535, 3, 0x00333535, 3, 0x00343535, 3, 0x00353535, 3, 0x00363535, 3, 0x00373535, 3, 0x00383535, 3, 0x00393535, 3,
119         0x00303635, 3, 0x00313635, 3, 0x00323635, 3, 0x00333635, 3, 0x00343635, 3, 0x00353635, 3, 0x00363635, 3, 0x00373635, 3,
120         0x00383635, 3, 0x00393635, 3, 0x00303735, 3, 0x00313735, 3, 0x00323735, 3, 0x00333735, 3, 0x00343735, 3, 0x00353735, 3,
121         0x00363735, 3, 0x00373735, 3, 0x00383735, 3, 0x00393735, 3, 0x00303835, 3, 0x00313835, 3, 0x00323835, 3, 0x00333835, 3,
122         0x00343835, 3, 0x00353835, 3, 0x00363835, 3, 0x00373835, 3, 0x00383835, 3, 0x00393835, 3, 0x00303935, 3, 0x00313935, 3,
123         0x00323935, 3, 0x00333935, 3, 0x00343935, 3, 0x00353935, 3, 0x00363935, 3, 0x00373935, 3, 0x00383935, 3, 0x00393935, 3,
124         0x00303036, 3, 0x00313036, 3, 0x00323036, 3, 0x00333036, 3, 0x00343036, 3, 0x00353036, 3, 0x00363036, 3, 0x00373036, 3,
125         0x00383036, 3, 0x00393036, 3, 0x00303136, 3, 0x00313136, 3, 0x00323136, 3, 0x00333136, 3, 0x00343136, 3, 0x00353136, 3,
126         0x00363136, 3, 0x00373136, 3, 0x00383136, 3, 0x00393136, 3, 0x00303236, 3, 0x00313236, 3, 0x00323236, 3, 0x00333236, 3,
127         0x00343236, 3, 0x00353236, 3, 0x00363236, 3, 0x00373236, 3, 0x00383236, 3, 0x00393236, 3, 0x00303336, 3, 0x00313336, 3,
128         0x00323336, 3, 0x00333336, 3, 0x00343336, 3, 0x00353336, 3, 0x00363336, 3, 0x00373336, 3, 0x00383336, 3, 0x00393336, 3,
129         0x00303436, 3, 0x00313436, 3, 0x00323436, 3, 0x00333436, 3, 0x00343436, 3, 0x00353436, 3, 0x00363436, 3, 0x00373436, 3,
130         0x00383436, 3, 0x00393436, 3, 0x00303536, 3, 0x00313536, 3, 0x00323536, 3, 0x00333536, 3, 0x00343536, 3, 0x00353536, 3,
131         0x00363536, 3, 0x00373536, 3, 0x00383536, 3, 0x00393536, 3, 0x00303636, 3, 0x00313636, 3, 0x00323636, 3, 0x00333636, 3,
132         0x00343636, 3, 0x00353636, 3, 0x00363636, 3, 0x00373636, 3, 0x00383636, 3, 0x00393636, 3, 0x00303736, 3, 0x00313736, 3,
133         0x00323736, 3, 0x00333736, 3, 0x00343736, 3, 0x00353736, 3, 0x00363736, 3, 0x00373736, 3, 0x00383736, 3, 0x00393736, 3,
134         0x00303836, 3, 0x00313836, 3, 0x00323836, 3, 0x00333836, 3, 0x00343836, 3, 0x00353836, 3, 0x00363836, 3, 0x00373836, 3,
135         0x00383836, 3, 0x00393836, 3, 0x00303936, 3, 0x00313936, 3, 0x00323936, 3, 0x00333936, 3, 0x00343936, 3, 0x00353936, 3,
136         0x00363936, 3, 0x00373936, 3, 0x00383936, 3, 0x00393936, 3, 0x00303037, 3, 0x00313037, 3, 0x00323037, 3, 0x00333037, 3,
137         0x00343037, 3, 0x00353037, 3, 0x00363037, 3, 0x00373037, 3, 0x00383037, 3, 0x00393037, 3, 0x00303137, 3, 0x00313137, 3,
138         0x00323137, 3, 0x00333137, 3, 0x00343137, 3, 0x00353137, 3, 0x00363137, 3, 0x00373137, 3, 0x00383137, 3, 0x00393137, 3,
139         0x00303237, 3, 0x00313237, 3, 0x00323237, 3, 0x00333237, 3, 0x00343237, 3, 0x00353237, 3, 0x00363237, 3, 0x00373237, 3,
140         0x00383237, 3, 0x00393237, 3, 0x00303337, 3, 0x00313337, 3, 0x00323337, 3, 0x00333337, 3, 0x00343337, 3, 0x00353337, 3,
141         0x00363337, 3, 0x00373337, 3, 0x00383337, 3, 0x00393337, 3, 0x00303437, 3, 0x00313437, 3, 0x00323437, 3, 0x00333437, 3,
142         0x00343437, 3, 0x00353437, 3, 0x00363437, 3, 0x00373437, 3, 0x00383437, 3, 0x00393437, 3, 0x00303537, 3, 0x00313537, 3,
143         0x00323537, 3, 0x00333537, 3, 0x00343537, 3, 0x00353537, 3, 0x00363537, 3, 0x00373537, 3, 0x00383537, 3, 0x00393537, 3,
144         0x00303637, 3, 0x00313637, 3, 0x00323637, 3, 0x00333637, 3, 0x00343637, 3, 0x00353637, 3, 0x00363637, 3, 0x00373637, 3,
145         0x00383637, 3, 0x00393637, 3, 0x00303737, 3, 0x00313737, 3, 0x00323737, 3, 0x00333737, 3, 0x00343737, 3, 0x00353737, 3,
146         0x00363737, 3, 0x00373737, 3, 0x00383737, 3, 0x00393737, 3, 0x00303837, 3, 0x00313837, 3, 0x00323837, 3, 0x00333837, 3,
147         0x00343837, 3, 0x00353837, 3, 0x00363837, 3, 0x00373837, 3, 0x00383837, 3, 0x00393837, 3, 0x00303937, 3, 0x00313937, 3,
148         0x00323937, 3, 0x00333937, 3, 0x00343937, 3, 0x00353937, 3, 0x00363937, 3, 0x00373937, 3, 0x00383937, 3, 0x00393937, 3,
149         0x00303038, 3, 0x00313038, 3, 0x00323038, 3, 0x00333038, 3, 0x00343038, 3, 0x00353038, 3, 0x00363038, 3, 0x00373038, 3,
150         0x00383038, 3, 0x00393038, 3, 0x00303138, 3, 0x00313138, 3, 0x00323138, 3, 0x00333138, 3, 0x00343138, 3, 0x00353138, 3,
151         0x00363138, 3, 0x00373138, 3, 0x00383138, 3, 0x00393138, 3, 0x00303238, 3, 0x00313238, 3, 0x00323238, 3, 0x00333238, 3,
152         0x00343238, 3, 0x00353238, 3, 0x00363238, 3, 0x00373238, 3, 0x00383238, 3, 0x00393238, 3, 0x00303338, 3, 0x00313338, 3,
153         0x00323338, 3, 0x00333338, 3, 0x00343338, 3, 0x00353338, 3, 0x00363338, 3, 0x00373338, 3, 0x00383338, 3, 0x00393338, 3,
154         0x00303438, 3, 0x00313438, 3, 0x00323438, 3, 0x00333438, 3, 0x00343438, 3, 0x00353438, 3, 0x00363438, 3, 0x00373438, 3,
155         0x00383438, 3, 0x00393438, 3, 0x00303538, 3, 0x00313538, 3, 0x00323538, 3, 0x00333538, 3, 0x00343538, 3, 0x00353538, 3,
156         0x00363538, 3, 0x00373538, 3, 0x00383538, 3, 0x00393538, 3, 0x00303638, 3, 0x00313638, 3, 0x00323638, 3, 0x00333638, 3,
157         0x00343638, 3, 0x00353638, 3, 0x00363638, 3, 0x00373638, 3, 0x00383638, 3, 0x00393638, 3, 0x00303738, 3, 0x00313738, 3,
158         0x00323738, 3, 0x00333738, 3, 0x00343738, 3, 0x00353738, 3, 0x00363738, 3, 0x00373738, 3, 0x00383738, 3, 0x00393738, 3,
159         0x00303838, 3, 0x00313838, 3, 0x00323838, 3, 0x00333838, 3, 0x00343838, 3, 0x00353838, 3, 0x00363838, 3, 0x00373838, 3,
160         0x00383838, 3, 0x00393838, 3, 0x00303938, 3, 0x00313938, 3, 0x00323938, 3, 0x00333938, 3, 0x00343938, 3, 0x00353938, 3,
161         0x00363938, 3, 0x00373938, 3, 0x00383938, 3, 0x00393938, 3, 0x00303039, 3, 0x00313039, 3, 0x00323039, 3, 0x00333039, 3,
162         0x00343039, 3, 0x00353039, 3, 0x00363039, 3, 0x00373039, 3, 0x00383039, 3, 0x00393039, 3, 0x00303139, 3, 0x00313139, 3,
163         0x00323139, 3, 0x00333139, 3, 0x00343139, 3, 0x00353139, 3, 0x00363139, 3, 0x00373139, 3, 0x00383139, 3, 0x00393139, 3,
164         0x00303239, 3, 0x00313239, 3, 0x00323239, 3, 0x00333239, 3, 0x00343239, 3, 0x00353239, 3, 0x00363239, 3, 0x00373239, 3,
165         0x00383239, 3, 0x00393239, 3, 0x00303339, 3, 0x00313339, 3, 0x00323339, 3, 0x00333339, 3, 0x00343339, 3, 0x00353339, 3,
166         0x00363339, 3, 0x00373339, 3, 0x00383339, 3, 0x00393339, 3, 0x00303439, 3, 0x00313439, 3, 0x00323439, 3, 0x00333439, 3,
167         0x00343439, 3, 0x00353439, 3, 0x00363439, 3, 0x00373439, 3, 0x00383439, 3, 0x00393439, 3, 0x00303539, 3, 0x00313539, 3,
168         0x00323539, 3, 0x00333539, 3, 0x00343539, 3, 0x00353539, 3, 0x00363539, 3, 0x00373539, 3, 0x00383539, 3, 0x00393539, 3,
169         0x00303639, 3, 0x00313639, 3, 0x00323639, 3, 0x00333639, 3, 0x00343639, 3, 0x00353639, 3, 0x00363639, 3, 0x00373639, 3,
170         0x00383639, 3, 0x00393639, 3, 0x00303739, 3, 0x00313739, 3, 0x00323739, 3, 0x00333739, 3, 0x00343739, 3, 0x00353739, 3,
171         0x00363739, 3, 0x00373739, 3, 0x00383739, 3, 0x00393739, 3, 0x00303839, 3, 0x00313839, 3, 0x00323839, 3, 0x00333839, 3,
172         0x00343839, 3, 0x00353839, 3, 0x00363839, 3, 0x00373839, 3, 0x00383839, 3, 0x00393839, 3, 0x00303939, 3, 0x00313939, 3,
173         0x00323939, 3, 0x00333939, 3, 0x00343939, 3, 0x00353939, 3, 0x00363939, 3, 0x00373939, 3, 0x00383939, 3, 0x00393939, 3,
174         0x30303031, 4, 0x31303031, 4, 0x32303031, 4, 0x33303031, 4, 0x34303031, 4, 0x35303031, 4, 0x36303031, 4, 0x37303031, 4,
175         0x38303031, 4, 0x39303031, 4, 0x30313031, 4, 0x31313031, 4, 0x32313031, 4, 0x33313031, 4, 0x34313031, 4, 0x35313031, 4,
176         0x36313031, 4, 0x37313031, 4, 0x38313031, 4, 0x39313031, 4, 0x30323031, 4, 0x31323031, 4, 0x32323031, 4, 0x33323031, 4,
177 };
178
179 static void append_word (u32x w0[4], u32x w1[4], const u32x append[4], const u32 offset)
180 {
181   switch (offset)
182   {
183     case 1:
184       w0[0] = w0[0]           | append[0] <<  8;
185       w0[1] = append[0] >> 24 | append[1] <<  8;
186       w0[2] = append[1] >> 24 | append[2] <<  8;
187       w0[3] = append[2] >> 24 | append[3] <<  8;
188       break;
189
190     case 2:
191       w0[0] = w0[0]           | append[0] << 16;
192       w0[1] = append[0] >> 16 | append[1] << 16;
193       w0[2] = append[1] >> 16 | append[2] << 16;
194       w0[3] = append[2] >> 16 | append[3] << 16;
195       break;
196
197     case 3:
198       w0[0] = w0[0]           | append[0] << 24;
199       w0[1] = append[0] >>  8 | append[1] << 24;
200       w0[2] = append[1] >>  8 | append[2] << 24;
201       w0[3] = append[2] >>  8 | append[3] << 24;
202       break;
203
204     case 4:
205       w0[1] = append[0];
206       w0[2] = append[1];
207       w0[3] = append[2];
208       w1[0] = append[3];
209       break;
210   }
211 }
212
213 static void append_salt (u32x w0[4], u32x w1[4], u32x w2[4], const u32 append[5], const u32 offset)
214 {
215   switch (offset)
216   {
217     case 2:
218       w0[0] = w0[0]           | append[0] << 16;
219       w0[1] = append[0] >> 16 | append[1] << 16;
220       w0[2] = append[1] >> 16 | append[2] << 16;
221       w0[3] = append[2] >> 16 | append[3] << 16;
222       w1[0] = append[3] >> 16 | append[4] << 16;
223       w1[1] = append[4] >> 16;
224       break;
225
226     case 3:
227       w0[0] = w0[0]           | append[0] << 24;
228       w0[1] = append[0] >>  8 | append[1] << 24;
229       w0[2] = append[1] >>  8 | append[2] << 24;
230       w0[3] = append[2] >>  8 | append[3] << 24;
231       w1[0] = append[3] >>  8 | append[4] << 24;
232       w1[1] = append[4] >>  8;
233       break;
234
235     case 4:
236       w0[1] = append[0];
237       w0[2] = append[1];
238       w0[3] = append[2];
239       w1[0] = append[3];
240       w1[1] = append[4];
241       break;
242
243     case 5:
244       w0[1] = w0[1]           | append[0] <<  8;
245       w0[2] = append[0] >> 24 | append[1] <<  8;
246       w0[3] = append[1] >> 24 | append[2] <<  8;
247       w1[0] = append[2] >> 24 | append[3] <<  8;
248       w1[1] = append[3] >> 24 | append[4] <<  8;
249       w1[2] = append[4] >> 24;
250       break;
251
252     case 6:
253       w0[1] = w0[1]           | append[0] << 16;
254       w0[2] = append[0] >> 16 | append[1] << 16;
255       w0[3] = append[1] >> 16 | append[2] << 16;
256       w1[0] = append[2] >> 16 | append[3] << 16;
257       w1[1] = append[3] >> 16 | append[4] << 16;
258       w1[2] = append[4] >> 16;
259       break;
260
261     case 7:
262       w0[1] = w0[1]           | append[0] << 24;
263       w0[2] = append[0] >>  8 | append[1] << 24;
264       w0[3] = append[1] >>  8 | append[2] << 24;
265       w1[0] = append[2] >>  8 | append[3] << 24;
266       w1[1] = append[3] >>  8 | append[4] << 24;
267       w1[2] = append[4] >>  8;
268       break;
269
270     case 8:
271       w0[2] = append[0];
272       w0[3] = append[1];
273       w1[0] = append[2];
274       w1[1] = append[3];
275       w1[2] = append[4];
276       break;
277
278     case 9:
279       w0[2] = w0[2]           | append[0] <<  8;
280       w0[3] = append[0] >> 24 | append[1] <<  8;
281       w1[0] = append[1] >> 24 | append[2] <<  8;
282       w1[1] = append[2] >> 24 | append[3] <<  8;
283       w1[2] = append[3] >> 24 | append[4] <<  8;
284       w1[3] = append[4] >> 24;
285       break;
286
287     case 10:
288       w0[2] = w0[2]           | append[0] << 16;
289       w0[3] = append[0] >> 16 | append[1] << 16;
290       w1[0] = append[1] >> 16 | append[2] << 16;
291       w1[1] = append[2] >> 16 | append[3] << 16;
292       w1[2] = append[3] >> 16 | append[4] << 16;
293       w1[3] = append[4] >> 16;
294       break;
295
296     case 11:
297       w0[2] = w0[2]           | append[0] << 24;
298       w0[3] = append[0] >>  8 | append[1] << 24;
299       w1[0] = append[1] >>  8 | append[2] << 24;
300       w1[1] = append[2] >>  8 | append[3] << 24;
301       w1[2] = append[3] >>  8 | append[4] << 24;
302       w1[3] = append[4] >>  8;
303       break;
304
305     case 12:
306       w0[3] = append[0];
307       w1[0] = append[1];
308       w1[1] = append[2];
309       w1[2] = append[3];
310       w1[3] = append[4];
311       break;
312
313     case 13:
314       w0[3] = w0[3]           | append[0] <<  8;
315       w1[0] = append[0] >> 24 | append[1] <<  8;
316       w1[1] = append[1] >> 24 | append[2] <<  8;
317       w1[2] = append[2] >> 24 | append[3] <<  8;
318       w1[3] = append[3] >> 24 | append[4] <<  8;
319       w2[0] = append[4] >> 24;
320       break;
321
322     case 14:
323       w0[3] = w0[3]           | append[0] << 16;
324       w1[0] = append[0] >> 16 | append[1] << 16;
325       w1[1] = append[1] >> 16 | append[2] << 16;
326       w1[2] = append[2] >> 16 | append[3] << 16;
327       w1[3] = append[3] >> 16 | append[4] << 16;
328       w2[0] = append[4] >> 16;
329       break;
330
331     case 15:
332       w0[3] = w0[3]           | append[0] << 24;
333       w1[0] = append[0] >>  8 | append[1] << 24;
334       w1[1] = append[1] >>  8 | append[2] << 24;
335       w1[2] = append[2] >>  8 | append[3] << 24;
336       w1[3] = append[3] >>  8 | append[4] << 24;
337       w2[0] = append[4] >>  8;
338       break;
339
340     case 16:
341       w1[0] = append[0];
342       w1[1] = append[1];
343       w1[2] = append[2];
344       w1[3] = append[3];
345       w2[0] = append[4];
346       break;
347
348     case 17:
349       w1[0] = w1[0]           | append[0] <<  8;
350       w1[1] = append[0] >> 24 | append[1] <<  8;
351       w1[2] = append[1] >> 24 | append[2] <<  8;
352       w1[3] = append[2] >> 24 | append[3] <<  8;
353       w2[0] = append[3] >> 24 | append[4] <<  8;
354       w2[1] = append[4] >> 24;
355       break;
356
357     case 18:
358       w1[0] = w1[0]           | append[0] << 16;
359       w1[1] = append[0] >> 16 | append[1] << 16;
360       w1[2] = append[1] >> 16 | append[2] << 16;
361       w1[3] = append[2] >> 16 | append[3] << 16;
362       w2[0] = append[3] >> 16 | append[4] << 16;
363       w2[1] = append[4] >> 16;
364       break;
365
366     case 19:
367       w1[0] = w1[0]           | append[0] << 24;
368       w1[1] = append[0] >>  8 | append[1] << 24;
369       w1[2] = append[1] >>  8 | append[2] << 24;
370       w1[3] = append[2] >>  8 | append[3] << 24;
371       w2[0] = append[3] >>  8 | append[4] << 24;
372       w2[1] = append[4] >>  8;
373       break;
374   }
375 }
376
377 static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5])
378 {
379   u32x A = digest[0];
380   u32x B = digest[1];
381   u32x C = digest[2];
382   u32x D = digest[3];
383   u32x E = digest[4];
384
385   u32x w0_t = w0[0];
386   u32x w1_t = w0[1];
387   u32x w2_t = w0[2];
388   u32x w3_t = w0[3];
389   u32x w4_t = w1[0];
390   u32x w5_t = w1[1];
391   u32x w6_t = w1[2];
392   u32x w7_t = w1[3];
393   u32x w8_t = w2[0];
394   u32x w9_t = w2[1];
395   u32x wa_t = w2[2];
396   u32x wb_t = w2[3];
397   u32x wc_t = w3[0];
398   u32x wd_t = w3[1];
399   u32x we_t = w3[2];
400   u32x wf_t = w3[3];
401
402   #undef K
403   #define K SHA1C00
404
405   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
406   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
407   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
408   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
409   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
410   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
411   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
412   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
413   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
414   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
415   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
416   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
417   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
418   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
419   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
420   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
421   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
422   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
423   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
424   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
425
426   #undef K
427   #define K SHA1C01
428
429   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
430   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
431   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
432   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
433   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
434   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
435   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
436   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
437   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
438   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
439   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
440   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
441   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
442   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
443   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
444   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
445   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
446   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
447   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
448   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
449
450   #undef K
451   #define K SHA1C02
452
453   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
454   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
455   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
456   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
457   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
458   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
459   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
460   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
461   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
462   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
463   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
464   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
465   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
466   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
467   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
468   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
469   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
470   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
471   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
472   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
473
474   #undef K
475   #define K SHA1C03
476
477   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
478   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
479   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
480   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
481   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
482   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
483   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
484   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
485   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
486   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
487   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
488   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
489   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
490   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
491   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
492   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
493   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
494   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
495   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
496   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
497
498   digest[0] += A;
499   digest[1] += B;
500   digest[2] += C;
501   digest[3] += D;
502   digest[4] += E;
503 }
504
505 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_init (__global pw_t *pws, __global gpu_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_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)
506 {
507   /**
508    * base
509    */
510
511   const u32 gid = get_global_id (0);
512
513   if (gid >= gid_max) return;
514
515   u32x word_buf[4];
516
517   word_buf[0] = pws[gid].i[ 0];
518   word_buf[1] = pws[gid].i[ 1];
519   word_buf[2] = pws[gid].i[ 2];
520   word_buf[3] = pws[gid].i[ 3];
521
522   const u32 pw_len = pws[gid].pw_len;
523
524   /**
525    * salt
526    */
527
528   u32 salt_len = salt_bufs[salt_pos].salt_len;
529
530   u32 salt_buf[5];
531
532   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
533   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
534   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
535   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
536   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
537
538   /**
539    * init
540    */
541
542   const u32 pc_len = 1;
543   const u32 pc_dec = 0x30;
544
545   u32x data0[4] = { 0, 0, 0, 0 };
546   u32x data1[4] = { 0, 0, 0, 0 };
547   u32x data2[4] = { 0, 0, 0, 0 };
548
549   data0[0] = pc_dec;
550
551   append_word (data0, data1, word_buf, pc_len);
552
553   append_salt (data0, data1, data2, salt_buf, pc_len + pw_len);
554
555   u32x w0[4];
556   u32x w1[4];
557   u32x w2[4];
558   u32x w3[4];
559
560   w0[0] = swap_workaround (data0[0]);
561   w0[1] = swap_workaround (data0[1]);
562   w0[2] = swap_workaround (data0[2]);
563   w0[3] = swap_workaround (data0[3]);
564   w1[0] = swap_workaround (data1[0]);
565   w1[1] = swap_workaround (data1[1]);
566   w1[2] = swap_workaround (data1[2]);
567   w1[3] = swap_workaround (data1[3]);
568   w2[0] = swap_workaround (data2[0]);
569   w2[1] = swap_workaround (data2[1]);
570   w2[2] = 0;
571   w2[3] = 0;
572   w3[0] = 0;
573   w3[1] = 0;
574   w3[2] = 0;
575   w3[3] = (pc_len + pw_len + salt_len) * 8;
576
577   u32x digest[5];
578
579   digest[0] = SHA1M_A;
580   digest[1] = SHA1M_B;
581   digest[2] = SHA1M_C;
582   digest[3] = SHA1M_D;
583   digest[4] = SHA1M_E;
584
585   sha1_transform (w0, w1, w2, w3, digest);
586
587   tmps[gid].digest_buf[0] = digest[0];
588   tmps[gid].digest_buf[1] = digest[1];
589   tmps[gid].digest_buf[2] = digest[2];
590   tmps[gid].digest_buf[3] = digest[3];
591   tmps[gid].digest_buf[4] = digest[4];
592 }
593
594 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_loop (__global pw_t *pws, __global gpu_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_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)
595 {
596   /**
597    * base
598    */
599
600   const u32 gid = get_global_id (0);
601
602   u32x word_buf[4];
603
604   word_buf[0] = pws[gid].i[ 0];
605   word_buf[1] = pws[gid].i[ 1];
606   word_buf[2] = pws[gid].i[ 2];
607   word_buf[3] = pws[gid].i[ 3];
608
609   const u32 pw_len = pws[gid].pw_len;
610
611   const u32 lid = get_local_id (0);
612
613   u32x digest[5];
614
615   digest[0] = tmps[gid].digest_buf[0];
616   digest[1] = tmps[gid].digest_buf[1];
617   digest[2] = tmps[gid].digest_buf[2];
618   digest[3] = tmps[gid].digest_buf[3];
619   digest[4] = tmps[gid].digest_buf[4];
620
621   /**
622    * cache precomputed conversion table in shared memory
623    */
624
625   __local entry_t s_pc[1024];
626
627   const u32 lid16 = lid * 16;
628
629   s_pc[lid16 +  0] = pc[lid16 +  0];
630   s_pc[lid16 +  1] = pc[lid16 +  1];
631   s_pc[lid16 +  2] = pc[lid16 +  2];
632   s_pc[lid16 +  3] = pc[lid16 +  3];
633   s_pc[lid16 +  4] = pc[lid16 +  4];
634   s_pc[lid16 +  5] = pc[lid16 +  5];
635   s_pc[lid16 +  6] = pc[lid16 +  6];
636   s_pc[lid16 +  7] = pc[lid16 +  7];
637   s_pc[lid16 +  8] = pc[lid16 +  8];
638   s_pc[lid16 +  9] = pc[lid16 +  9];
639   s_pc[lid16 + 10] = pc[lid16 + 10];
640   s_pc[lid16 + 11] = pc[lid16 + 11];
641   s_pc[lid16 + 12] = pc[lid16 + 12];
642   s_pc[lid16 + 13] = pc[lid16 + 13];
643   s_pc[lid16 + 14] = pc[lid16 + 14];
644   s_pc[lid16 + 15] = pc[lid16 + 15];
645
646   barrier (CLK_LOCAL_MEM_FENCE);
647
648   if (gid >= gid_max) return;
649
650   /**
651    * salt
652    */
653
654   u32 salt_len = salt_bufs[salt_pos].salt_len;
655
656   u32 salt_buf[5];
657
658   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
659   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
660   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
661   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
662   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
663
664   /**
665    * loop
666    */
667
668   for (u32 i = 0, j = loop_pos + 1; i < loop_cnt; i++, j++)
669   {
670     const u32 pc_len = s_pc[j].len;
671     const u32 pc_dec = s_pc[j].dec;
672
673     u32x data0[4] = { 0, 0, 0, 0 };
674     u32x data1[4] = { 0, 0, 0, 0 };
675     u32x data2[4] = { 0, 0, 0, 0 };
676
677     data0[0] = pc_dec;
678
679     append_word (data0, data1, word_buf, pc_len);
680
681     append_salt (data0, data1, data2, salt_buf, pc_len + pw_len);
682
683     u32x w0[4];
684     u32x w1[4];
685     u32x w2[4];
686     u32x w3[4];
687
688     w0[0] = digest[0];
689     w0[1] = digest[1];
690     w0[2] = digest[2];
691     w0[3] = digest[3];
692     w1[0] = digest[4];
693     w1[1] = swap_workaround (data0[0]);
694     w1[2] = swap_workaround (data0[1]);
695     w1[3] = swap_workaround (data0[2]);
696     w2[0] = swap_workaround (data0[3]);
697     w2[1] = swap_workaround (data1[0]);
698     w2[2] = swap_workaround (data1[1]);
699     w2[3] = swap_workaround (data1[2]);
700     w3[0] = swap_workaround (data1[3]);
701     w3[1] = swap_workaround (data2[0]);
702     w3[2] = 0;
703     w3[3] = (20 + pc_len + pw_len + salt_len) * 8;
704
705     digest[0] = SHA1M_A;
706     digest[1] = SHA1M_B;
707     digest[2] = SHA1M_C;
708     digest[3] = SHA1M_D;
709     digest[4] = SHA1M_E;
710
711     sha1_transform (w0, w1, w2, w3, digest);
712   }
713
714   tmps[gid].digest_buf[0] = digest[0];
715   tmps[gid].digest_buf[1] = digest[1];
716   tmps[gid].digest_buf[2] = digest[2];
717   tmps[gid].digest_buf[3] = digest[3];
718   tmps[gid].digest_buf[4] = digest[4];
719 }
720
721 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_comp (__global pw_t *pws, __global gpu_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_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)
722 {
723   /**
724    * modifier
725    */
726
727   const u32 gid = get_global_id (0);
728
729   if (gid >= gid_max) return;
730
731   const u32 lid = get_local_id (0);
732
733   /**
734    * digest
735    */
736
737   const u32x r0 = tmps[gid].digest_buf[DGST_R0];
738   const u32x r1 = tmps[gid].digest_buf[DGST_R1];
739   const u32x r2 = tmps[gid].digest_buf[DGST_R2];
740   const u32x r3 = tmps[gid].digest_buf[DGST_R3];
741
742   #define il_pos 0
743
744   #include VECT_COMPARE_M
745 }