1/*
2
3PKZIP Kernels for Hashcat (c) 2018, European Union
4
5PKZIP Kernels for Hashcat has been developed by the Joint Research Centre of the European Commission.
6It is released as open source software under the MIT License.
7
8PKZIP Kernels for Hashcat makes use of a primary external components, which continue to be subject
9to the terms and conditions stipulated in the respective licences they have been released under. These
10external components include, but are not necessarily limited to, the following:
11
12-----
13
141. Hashcat: MIT License
15
16Copyright (c) 2015-2018 Jens Steube
17
18Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
19associated documentation files (the "Software"), to deal in the Software without restriction, including
20without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
21copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to
22the following conditions:
23
24The above copyright notice and this permission notice shall be included in all copies or substantial
25portions of the Software.
26
27THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
28LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
29NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
30WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
31SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
33-----
34
35The European Union disclaims all liability related to or arising out of the use made by third parties of
36any external components and dependencies which may be included with PKZIP Kernels for Hashcat.
37
38-----
39
40The MIT License
41
42Copyright (c) 2018, EUROPEAN UNION
43
44Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
45documentation files (the "Software"), to deal in the Software without restriction, including without
46limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
47the Software, and to permit persons to whom the Software is furnished to do so, subject to the following
48conditions:
49
50The above copyright notice and this permission notice shall be included in all copies or substantial
51portions of the Software.
52
53THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
54LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
55NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
56WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
57SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
58
59Author:              Sein Coray
60Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
61
62*/
63
64#include "inc_vendor.h"
65#include "inc_types.h"
66#include "inc_platform.cl"
67#include "inc_common.cl"
68#include "inc_simd.cl"
69#include "inc_rp.h"
70#include "inc_rp.cl"
71
72typedef struct pkzip_extra
73{
74  u32 buf[2];
75  u32 len;
76
77} pkzip_extra_t;
78
79#define MSB(x)          ((x) >> 24)
80#define CRC32(x,c,t)    (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
81#define INVCRC32(x,c,t) (((x) << 8) ^ (t)[(x) >> 24] ^ ((c) & 0xff))
82#define INVCONST        0xd94fa8cd
83#define KEY0INIT        0x12345678
84#define KEY1INIT        0x23456789
85#define KEY2INIT        0x34567890
86
87#define inv_update_key012(k0,k1,k2,c,t)         \
88  (k2) = INVCRC32 ((k2), MSB (k1), (t));        \
89  (k1) = ((k1) - 1) * INVCONST - ((k0) & 0xff); \
90  (k0) = INVCRC32 ((k0), (c), (t));
91
92CONSTANT_VK u32a crc32tab[256] =
93{
94  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
95  0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
96  0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
97  0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
98  0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
99  0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
100  0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
101  0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
102  0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
103  0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
104  0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
105  0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
106  0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
107  0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
108  0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
109  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
110  0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
111  0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
112  0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
113  0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
114  0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
115  0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
116  0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
117  0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
118  0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
119  0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
120  0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
121  0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
122  0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
123  0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
124  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
125  0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
126  0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
127  0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
128  0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
129  0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
130  0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
131  0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
132  0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
133  0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
134  0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
135  0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
136  0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
137  0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
138  0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
139  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
140  0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
141  0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
142  0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
143  0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
144  0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
145  0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
146  0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
147  0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
148  0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
149  0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
150  0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
151  0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
152  0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
153  0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
154  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
155  0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
156  0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
157  0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
158};
159
160CONSTANT_VK u32a icrc32tab[256] =
161{
162  0x00000000, 0xdb710641, 0x6d930ac3, 0xb6e20c82,
163  0xdb261586, 0x005713c7, 0xb6b51f45, 0x6dc41904,
164  0x6d3d2d4d, 0xb64c2b0c, 0x00ae278e, 0xdbdf21cf,
165  0xb61b38cb, 0x6d6a3e8a, 0xdb883208, 0x00f93449,
166  0xda7a5a9a, 0x010b5cdb, 0xb7e95059, 0x6c985618,
167  0x015c4f1c, 0xda2d495d, 0x6ccf45df, 0xb7be439e,
168  0xb74777d7, 0x6c367196, 0xdad47d14, 0x01a57b55,
169  0x6c616251, 0xb7106410, 0x01f26892, 0xda836ed3,
170  0x6f85b375, 0xb4f4b534, 0x0216b9b6, 0xd967bff7,
171  0xb4a3a6f3, 0x6fd2a0b2, 0xd930ac30, 0x0241aa71,
172  0x02b89e38, 0xd9c99879, 0x6f2b94fb, 0xb45a92ba,
173  0xd99e8bbe, 0x02ef8dff, 0xb40d817d, 0x6f7c873c,
174  0xb5ffe9ef, 0x6e8eefae, 0xd86ce32c, 0x031de56d,
175  0x6ed9fc69, 0xb5a8fa28, 0x034af6aa, 0xd83bf0eb,
176  0xd8c2c4a2, 0x03b3c2e3, 0xb551ce61, 0x6e20c820,
177  0x03e4d124, 0xd895d765, 0x6e77dbe7, 0xb506dda6,
178  0xdf0b66ea, 0x047a60ab, 0xb2986c29, 0x69e96a68,
179  0x042d736c, 0xdf5c752d, 0x69be79af, 0xb2cf7fee,
180  0xb2364ba7, 0x69474de6, 0xdfa54164, 0x04d44725,
181  0x69105e21, 0xb2615860, 0x048354e2, 0xdff252a3,
182  0x05713c70, 0xde003a31, 0x68e236b3, 0xb39330f2,
183  0xde5729f6, 0x05262fb7, 0xb3c42335, 0x68b52574,
184  0x684c113d, 0xb33d177c, 0x05df1bfe, 0xdeae1dbf,
185  0xb36a04bb, 0x681b02fa, 0xdef90e78, 0x05880839,
186  0xb08ed59f, 0x6bffd3de, 0xdd1ddf5c, 0x066cd91d,
187  0x6ba8c019, 0xb0d9c658, 0x063bcada, 0xdd4acc9b,
188  0xddb3f8d2, 0x06c2fe93, 0xb020f211, 0x6b51f450,
189  0x0695ed54, 0xdde4eb15, 0x6b06e797, 0xb077e1d6,
190  0x6af48f05, 0xb1858944, 0x076785c6, 0xdc168387,
191  0xb1d29a83, 0x6aa39cc2, 0xdc419040, 0x07309601,
192  0x07c9a248, 0xdcb8a409, 0x6a5aa88b, 0xb12baeca,
193  0xdcefb7ce, 0x079eb18f, 0xb17cbd0d, 0x6a0dbb4c,
194  0x6567cb95, 0xbe16cdd4, 0x08f4c156, 0xd385c717,
195  0xbe41de13, 0x6530d852, 0xd3d2d4d0, 0x08a3d291,
196  0x085ae6d8, 0xd32be099, 0x65c9ec1b, 0xbeb8ea5a,
197  0xd37cf35e, 0x080df51f, 0xbeeff99d, 0x659effdc,
198  0xbf1d910f, 0x646c974e, 0xd28e9bcc, 0x09ff9d8d,
199  0x643b8489, 0xbf4a82c8, 0x09a88e4a, 0xd2d9880b,
200  0xd220bc42, 0x0951ba03, 0xbfb3b681, 0x64c2b0c0,
201  0x0906a9c4, 0xd277af85, 0x6495a307, 0xbfe4a546,
202  0x0ae278e0, 0xd1937ea1, 0x67717223, 0xbc007462,
203  0xd1c46d66, 0x0ab56b27, 0xbc5767a5, 0x672661e4,
204  0x67df55ad, 0xbcae53ec, 0x0a4c5f6e, 0xd13d592f,
205  0xbcf9402b, 0x6788466a, 0xd16a4ae8, 0x0a1b4ca9,
206  0xd098227a, 0x0be9243b, 0xbd0b28b9, 0x667a2ef8,
207  0x0bbe37fc, 0xd0cf31bd, 0x662d3d3f, 0xbd5c3b7e,
208  0xbda50f37, 0x66d40976, 0xd03605f4, 0x0b4703b5,
209  0x66831ab1, 0xbdf21cf0, 0x0b101072, 0xd0611633,
210  0xba6cad7f, 0x611dab3e, 0xd7ffa7bc, 0x0c8ea1fd,
211  0x614ab8f9, 0xba3bbeb8, 0x0cd9b23a, 0xd7a8b47b,
212  0xd7518032, 0x0c208673, 0xbac28af1, 0x61b38cb0,
213  0x0c7795b4, 0xd70693f5, 0x61e49f77, 0xba959936,
214  0x6016f7e5, 0xbb67f1a4, 0x0d85fd26, 0xd6f4fb67,
215  0xbb30e263, 0x6041e422, 0xd6a3e8a0, 0x0dd2eee1,
216  0x0d2bdaa8, 0xd65adce9, 0x60b8d06b, 0xbbc9d62a,
217  0xd60dcf2e, 0x0d7cc96f, 0xbb9ec5ed, 0x60efc3ac,
218  0xd5e91e0a, 0x0e98184b, 0xb87a14c9, 0x630b1288,
219  0x0ecf0b8c, 0xd5be0dcd, 0x635c014f, 0xb82d070e,
220  0xb8d43347, 0x63a53506, 0xd5473984, 0x0e363fc5,
221  0x63f226c1, 0xb8832080, 0x0e612c02, 0xd5102a43,
222  0x0f934490, 0xd4e242d1, 0x62004e53, 0xb9714812,
223  0xd4b55116, 0x0fc45757, 0xb9265bd5, 0x62575d94,
224  0x62ae69dd, 0xb9df6f9c, 0x0f3d631e, 0xd44c655f,
225  0xb9887c5b, 0x62f97a1a, 0xd41b7698, 0x0f6a70d9,
226};
227
228CONSTANT_VK u32a lsbk0[256] =
229{
230  0x00, 0x56, 0xac, 0x21, 0x77, 0xcd, 0x42, 0x98,
231  0xee, 0x0d, 0x63, 0xb9, 0x2e, 0x84, 0xda, 0x4f,
232  0xa5, 0xfb, 0x1a, 0x70, 0xc6, 0x3b, 0x91, 0xe7,
233  0x06, 0x5c, 0xb2, 0x27, 0x7d, 0xd3, 0x48, 0x9e,
234  0xf4, 0x13, 0x69, 0xbf, 0x34, 0x8a, 0xe0, 0x55,
235  0xab, 0x20, 0x76, 0xcc, 0x41, 0x97, 0xed, 0x0c,
236  0x62, 0xb8, 0x2d, 0x83, 0xd9, 0x4e, 0xa4, 0xfa,
237  0x19, 0x6f, 0xc5, 0x3a, 0x90, 0xe6, 0x05, 0x5b,
238  0xb1, 0x26, 0x7c, 0xd2, 0x47, 0x9d, 0xf3, 0x12,
239  0x68, 0xbe, 0x33, 0x89, 0xdf, 0x54, 0xaa, 0x1f,
240  0x75, 0xcb, 0x40, 0x96, 0xec, 0x0b, 0x61, 0xb7,
241  0x2c, 0x82, 0xd8, 0x4d, 0xa3, 0xf9, 0x18, 0x6e,
242  0xc4, 0x39, 0x8f, 0xe5, 0x04, 0x5a, 0xb0, 0x25,
243  0x7b, 0xd1, 0x46, 0x9c, 0xf2, 0x11, 0x67, 0xbd,
244  0x32, 0x88, 0xde, 0x53, 0xa9, 0xff, 0x1e, 0x74,
245  0xca, 0x3f, 0x95, 0xeb, 0x0a, 0x60, 0xb6, 0x2b,
246  0x81, 0xd7, 0x4c, 0xa2, 0xf8, 0x17, 0x6d, 0xc3,
247  0x38, 0x8e, 0xe4, 0x03, 0x59, 0xaf, 0x24, 0x7a,
248  0xd0, 0x45, 0x9b, 0xf1, 0x10, 0x66, 0xbc, 0x31,
249  0x87, 0xdd, 0x52, 0xa8, 0xfe, 0x1d, 0x73, 0xc9,
250  0x3e, 0x94, 0xea, 0x09, 0x5f, 0xb5, 0x2a, 0x80,
251  0xd6, 0x4b, 0xa1, 0xf7, 0x16, 0x6c, 0xc2, 0x37,
252  0x8d, 0xe3, 0x02, 0x58, 0xae, 0x23, 0x79, 0xcf,
253  0x44, 0x9a, 0xf0, 0x0f, 0x65, 0xbb, 0x30, 0x86,
254  0xdc, 0x51, 0xa7, 0xfd, 0x1c, 0x72, 0xc8, 0x3d,
255  0x93, 0xe9, 0x08, 0x5e, 0xb4, 0x29, 0x7f, 0xd5,
256  0x4a, 0xa0, 0xf6, 0x15, 0x6b, 0xc1, 0x36, 0x8c,
257  0xe2, 0x01, 0x57, 0xad, 0x22, 0x78, 0xce, 0x43,
258  0x99, 0xef, 0x0e, 0x64, 0xba, 0x2f, 0x85, 0xdb,
259  0x50, 0xa6, 0xfc, 0x1b, 0x71, 0xc7, 0x3c, 0x92,
260  0xe8, 0x07, 0x5d, 0xb3, 0x28, 0x7e, 0xd4, 0x49,
261  0x9f, 0xf5, 0x14, 0x6a, 0xc0, 0x35, 0x8b, 0xe1
262};
263
264CONSTANT_VK int lsbk0_count0[256] =
265{
266    0,   2,   3,   3,   4,   6,   6,   7,
267    8,   9,  11,  12,  12,  13,  15,  15,
268   16,  17,  18,  20,  21,  21,  22,  24,
269   25,  26,  27,  27,  29,  30,  30,  31,
270   33,  34,  35,  36,  36,  38,  39,  39,
271   40,  41,  42,  43,  44,  44,  46,  47,
272   48,  49,  50,  50,  52,  53,  53,  54,
273   56,  57,  58,  59,  59,  61,  62,  63,
274   64,  65,  66,  67,  68,  68,  70,  71,
275   72,  73,  74,  75,  76,  77,  77,  79,
276   79,  80,  81,  82,  83,  84,  85,  86,
277   88,  88,  89,  90,  91,  92,  93,  94,
278   95,  97,  97,  98,  99, 100, 101, 103,
279  103, 104, 105, 106, 107, 108, 109, 110,
280  112, 112, 113, 114, 115, 116, 117, 118,
281  119, 121, 121, 122, 123, 124, 126, 127,
282  127, 128, 130, 130, 131, 132, 133, 135,
283  136, 136, 137, 139, 140, 141, 142, 142,
284  144, 145, 145, 146, 148, 149, 150, 151,
285  151, 152, 154, 154, 155, 156, 157, 159,
286  160, 160, 161, 163, 164, 165, 166, 166,
287  168, 169, 169, 170, 172, 173, 174, 175,
288  175, 177, 178, 179, 180, 181, 182, 183,
289  184, 184, 186, 187, 188, 189, 190, 191,
290  192, 193, 193, 195, 196, 197, 198, 199,
291  200, 201, 202, 203, 204, 205, 206, 207,
292  208, 208, 210, 211, 212, 213, 214, 215,
293  216, 217, 218, 220, 220, 221, 222, 223,
294  224, 225, 226, 227, 229, 229, 230, 231,
295  232, 233, 234, 235, 236, 238, 238, 239,
296  240, 241, 243, 244, 244, 245, 247, 247,
297  248, 249, 250, 252, 253, 253, 254, 255
298};
299
300CONSTANT_VK int lsbk0_count1[256] =
301{
302    2,   3,   3,   4,   6,   6,   7,   8,
303    9,  11,  12,  12,  13,  15,  15,  16,
304   17,  18,  20,  21,  21,  22,  24,  25,
305   26,  27,  27,  29,  30,  30,  31,  33,
306   34,  35,  36,  36,  38,  39,  39,  40,
307   41,  42,  43,  44,  44,  46,  47,  48,
308   49,  50,  50,  52,  53,  53,  54,  56,
309   57,  58,  59,  59,  61,  62,  63,  64,
310   65,  66,  67,  68,  68,  70,  71,  72,
311   73,  74,  75,  76,  77,  77,  79,  79,
312   80,  81,  82,  83,  84,  85,  86,  88,
313   88,  89,  90,  91,  92,  93,  94,  95,
314   97,  97,  98,  99, 100, 101, 103, 103,
315  104, 105, 106, 107, 108, 109, 110, 112,
316  112, 113, 114, 115, 116, 117, 118, 119,
317  121, 121, 122, 123, 124, 126, 127, 127,
318  128, 130, 130, 131, 132, 133, 135, 136,
319  136, 137, 139, 140, 141, 142, 142, 144,
320  145, 145, 146, 148, 149, 150, 151, 151,
321  152, 154, 154, 155, 156, 157, 159, 160,
322  160, 161, 163, 164, 165, 166, 166, 168,
323  169, 169, 170, 172, 173, 174, 175, 175,
324  177, 178, 179, 180, 181, 182, 183, 184,
325  184, 186, 187, 188, 189, 190, 191, 192,
326  193, 193, 195, 196, 197, 198, 199, 200,
327  201, 202, 203, 204, 205, 206, 207, 208,
328  208, 210, 211, 212, 213, 214, 215, 216,
329  217, 218, 220, 220, 221, 222, 223, 224,
330  225, 226, 227, 229, 229, 230, 231, 232,
331  233, 234, 235, 236, 238, 238, 239, 240,
332  241, 243, 244, 244, 245, 247, 247, 248,
333  249, 250, 252, 253, 253, 254, 255, 256
334};
335
336DECLSPEC int derivelast6bytes (const u32x k0, const u32x k1, const u32x k2, u32 *password, LOCAL_AS u32 *l_crc32tab, LOCAL_AS u32 *l_icrc32tab, LOCAL_AS u32 *l_lsbk0, LOCAL_AS int *l_lsbk0_count0, LOCAL_AS int *l_lsbk0_count1)
337{
338  // step 1
339  const u32 k2_1 = INVCRC32 (k2,   (k1   >> 24), l_icrc32tab);
340  const u32 k1_1 = (k1 - 1) * INVCONST - (k0 & 0xff);
341  const u32 k2_2 = INVCRC32 (k2_1, (k1_1 >> 24), l_icrc32tab);
342
343  // step 2
344  u32 k2_3 = INVCRC32 (k2_2, 0, l_icrc32tab);
345  u32 k2_4 = INVCRC32 (k2_3, 0, l_icrc32tab);
346  u32 k2_5 = INVCRC32 (k2_4, 0, l_icrc32tab);
347
348  // step 3
349  const u32 k1_5 = ((u32)((0x90)        ^ l_icrc32tab[(k2_5 >> 24)])) << 24;
350            k2_5 = CRC32 (KEY2INIT, (k1_5 >> 24), l_crc32tab);
351  const u32 k1_4 = ((u32)((k2_5 & 0xFF) ^ l_icrc32tab[(k2_4 >> 24)])) << 24;
352            k2_4 = CRC32 (k2_5    , (k1_4 >> 24), l_crc32tab);
353  const u32 k1_3 = ((u32)((k2_4 & 0xFF) ^ l_icrc32tab[(k2_3 >> 24)])) << 24;
354            k2_3 = CRC32 (k2_4    , (k1_3 >> 24), l_crc32tab);
355  const u32 k1_2 = ((u32)((k2_3 & 0xFF) ^ l_icrc32tab[(k2_2 >> 24)])) << 24;
356
357  // step 5.2
358
359  #define IDX(x) ((x) & 0xff)
360
361  const u32 rhs_step1_0 = (k1_1 - 1) * INVCONST;
362
363  u32 diff0 = ((rhs_step1_0 - 1) * INVCONST - (k1_3 & 0xff000000)) >> 24;
364
365  for (int c0 = 0; c0 < 2; c0++, diff0--)
366  {
367    for (int i0 = l_lsbk0_count0[IDX (diff0)]; i0 < l_lsbk0_count1[IDX (diff0)]; i0++)
368    {
369      if (((rhs_step1_0 - l_lsbk0[i0]) >> 24) != (k1_2 >> 24)) continue;
370
371      const u32 rhs_step1_1 = (rhs_step1_0 - l_lsbk0[i0] - 1) * INVCONST;
372
373      u32 diff1 = ((rhs_step1_1 - 1) * INVCONST - (k1_4 & 0xff000000)) >> 24;
374
375      for (int c1 = 0; c1 < 2; c1++, diff1--)
376      {
377        for (int i1 = l_lsbk0_count0[IDX (diff1)]; i1 < l_lsbk0_count1[IDX (diff1)]; i1++)
378        {
379          if (((rhs_step1_1 - l_lsbk0[i1]) >> 24) != (k1_3 >> 24)) continue;
380
381          const u32 rhs_step1_2 = (rhs_step1_1 - l_lsbk0[i1] - 1) * INVCONST;
382
383          u32 diff2 = ((rhs_step1_2 - 1) * INVCONST - (k1_5 & 0xff000000)) >> 24;
384
385          for (int c2 = 0; c2 < 2; c2++, diff2--)
386          {
387            for (int i2 = l_lsbk0_count0[IDX (diff2)]; i2 < l_lsbk0_count1[IDX (diff2)]; i2++)
388            {
389              if (((rhs_step1_2 - l_lsbk0[i2]) >> 24) != (k1_4 >> 24)) continue;
390
391              const u32 rhs_step1_3 = (rhs_step1_2 - l_lsbk0[i2] - 1) * INVCONST;
392
393              u32 diff3 = ((rhs_step1_3 - 1) * INVCONST - (0x23000000)) >> 24;
394
395              for (int c3 = 0; c3 < 2; c3++, diff3--)
396              {
397                for (int i3 = l_lsbk0_count0[IDX (diff3)]; i3 < l_lsbk0_count1[IDX (diff3)]; i3++)
398                {
399                  if (((rhs_step1_3 - l_lsbk0[i3]) >> 24) != (k1_5 >> 24)) continue;
400
401                  const u32 rhs_step1_4 = (rhs_step1_3 - l_lsbk0[i3] - 1) * INVCONST;
402
403                  u32 diff4 = ((rhs_step1_4 - 1) * INVCONST - (0x05000000)) >> 24;
404
405                  for (int c4 = 0; c4 < 2; c4++, diff4--)
406                  {
407                    for (int i4 = l_lsbk0_count0[IDX (diff4)]; i4 < l_lsbk0_count1[IDX (diff4)]; i4++)
408                    {
409                      if ((rhs_step1_4 - l_lsbk0[i4]) != KEY1INIT) continue;
410
411                      u32 kk;
412
413                      u32 t5 = ((l_lsbk0[i0]) ^ l_icrc32tab[k0 >> 24]) & 0xff;
414
415                      kk = INVCRC32 (k0, t5, l_icrc32tab);
416
417                      u32 t4 = ((l_lsbk0[i1]) ^ l_icrc32tab[kk >> 24]) & 0xff;
418
419                      kk = INVCRC32 (kk, t4, l_icrc32tab);
420
421                      u32 t3 = ((l_lsbk0[i2]) ^ l_icrc32tab[kk >> 24]) & 0xff;
422
423                      kk = INVCRC32 (kk, t3, l_icrc32tab);
424
425                      u32 t2 = ((l_lsbk0[i3]) ^ l_icrc32tab[kk >> 24]) & 0xff;
426
427                      kk = INVCRC32 (kk, t2, l_icrc32tab);
428
429                      u32 t1 = ((l_lsbk0[i4]) ^ l_icrc32tab[kk >> 24]) & 0xff;
430
431                      kk = INVCRC32 (kk, t1, l_icrc32tab);
432
433                      u32 t0 = ((KEY0INIT)    ^ l_icrc32tab[kk >> 24]) & 0xff;
434
435                      if (INVCRC32 (kk, t0, l_icrc32tab) == KEY0INIT)
436                      {
437                        // found
438
439                        password[0] = t0 <<  0
440                                    | t1 <<  8
441                                    | t2 << 16
442                                    | t3 << 24;
443
444                        password[1] = t4 <<  0
445                                    | t5 <<  8;
446
447                        return 1;
448                      }
449                    }
450                  }
451                }
452              }
453            }
454          }
455        }
456      }
457    }
458  }
459
460  #undef IDX0
461  #undef IDX1
462
463  // not found
464
465  return 0;
466}
467
468KERNEL_FQ void m20510_sxx (KERN_ATTR_RULES ())
469{
470  /**
471   * modifier
472   */
473
474  const u64 gid = get_global_id (0);
475  const u64 lid = get_local_id (0);
476  const u64 lsz = get_local_size (0);
477
478  /**
479   * sbox, kbox
480   */
481
482  LOCAL_VK u32 l_crc32tab[256];
483
484  for (int i = lid; i < 256; i += lsz)
485  {
486    l_crc32tab[i] = crc32tab[i];
487  }
488
489  LOCAL_VK u32 l_icrc32tab[256];
490
491  for (int i = lid; i < 256; i += lsz)
492  {
493    l_icrc32tab[i] = icrc32tab[i];
494  }
495
496  LOCAL_VK u32 l_lsbk0[256];
497
498  for (int i = lid; i < 256; i += lsz)
499  {
500    l_lsbk0[i] = lsbk0[i];
501  }
502
503  LOCAL_VK int l_lsbk0_count0[256];
504  LOCAL_VK int l_lsbk0_count1[256];
505
506  for (int i = lid; i < 256; i += lsz)
507  {
508    l_lsbk0_count0[i] = lsbk0_count0[i];
509    l_lsbk0_count1[i] = lsbk0_count1[i];
510  }
511
512  SYNC_THREADS ();
513
514  if (gid >= gid_max) return;
515
516  /**
517   * digest
518   */
519
520  const u32 search[4] =
521  {
522    KEY0INIT, // static initial values
523    KEY1INIT, // should remain unchanged
524    KEY2INIT,
525    0
526  };
527
528  /**
529   * base
530   */
531
532  COPY_PW (pws[gid]);
533
534  /**
535   * reverse
536   */
537
538  u32 prep0 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[0]);
539  u32 prep1 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[1]);
540  u32 prep2 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[2]);
541
542  /**
543   * loop
544   */
545
546  for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
547  {
548    pw_t t = PASTE_PW;
549
550    t.pw_len = apply_rules (rules_buf[il_pos].cmds, t.i, t.pw_len);
551
552    u32x key0 = prep0;
553    u32x key1 = prep1;
554    u32x key2 = prep2;
555
556    for (int pos = t.pw_len - 1; pos >= 0; pos--)
557    {
558      const u32 tt = hc_bfe_S (t.i[pos / 4], (pos & 3) * 8, 8);
559
560      inv_update_key012 (key0, key1, key2, tt, l_icrc32tab);
561    }
562
563    u32 password[2];
564
565    if (derivelast6bytes (key0, key1, key2, password, l_crc32tab, l_icrc32tab, l_lsbk0, l_lsbk0_count0, l_lsbk0_count1) == 1)
566    {
567      GLOBAL_AS pkzip_extra_t *pkzip_extra = (GLOBAL_AS pkzip_extra_t *) tmps;
568
569      pkzip_extra[gid].buf[0] = password[0];
570      pkzip_extra[gid].buf[1] = password[1];
571
572      pkzip_extra[gid].len = 6;
573
574      const u32x r0 = KEY0INIT;
575      const u32x r1 = KEY1INIT;
576      const u32x r2 = KEY2INIT;
577      const u32x r3 = 0;
578
579      COMPARE_S_SIMD (r0, r1, r2, r3);
580    }
581  }
582}
583
584KERNEL_FQ void m20510_mxx (KERN_ATTR_RULES ())
585{
586  /**
587   * modifier
588   */
589
590  const u64 gid = get_global_id (0);
591  const u64 lid = get_local_id (0);
592  const u64 lsz = get_local_size (0);
593
594  /**
595   * NOT AVAILABLE
596   */
597}
598
599#undef MSB
600#undef CRC32
601#undef INVCRC32
602#undef INVCONST
603#undef KEY0INIT
604#undef KEY1INIT
605#undef KEY2INIT
606#undef inv_update_key012
607