1/**
2 * Author......: See docs/credits.txt
3 * License.....: MIT
4 */
5
6#ifdef KERNEL_STATIC
7#include "inc_vendor.h"
8#include "inc_types.h"
9#include "inc_platform.cl"
10#include "inc_common.cl"
11#include "inc_simd.cl"
12#include "inc_hash_sha1.cl"
13#include "inc_cipher_rc4.cl"
14#endif
15
16#define MIN_NULL_BYTES 10
17
18typedef struct oldoffice34
19{
20  u32 version;
21  u32 encryptedVerifier[4];
22  u32 encryptedVerifierHash[5];
23  u32 secondBlockData[8];
24  u32 secondBlockLen;
25  u32 rc4key[2];
26
27} oldoffice34_t;
28
29DECLSPEC void m09800m (LOCAL_AS u32 *S, u32 *w0, u32 *w1, u32 *w2, u32 *w3, const u32 pw_len, KERN_ATTR_ESALT (oldoffice34_t))
30{
31  /**
32   * modifier
33   */
34
35  const u64 gid = get_global_id (0);
36  const u64 lid = get_local_id (0);
37
38  /**
39   * salt
40   */
41
42  u32 salt_buf[4];
43
44  salt_buf[0] = salt_bufs[SALT_POS].salt_buf[0];
45  salt_buf[1] = salt_bufs[SALT_POS].salt_buf[1];
46  salt_buf[2] = salt_bufs[SALT_POS].salt_buf[2];
47  salt_buf[3] = salt_bufs[SALT_POS].salt_buf[3];
48
49  /**
50   * esalt
51   */
52
53  const u32 version = esalt_bufs[DIGESTS_OFFSET].version;
54
55  u32 encryptedVerifier[4];
56
57  encryptedVerifier[0] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[0];
58  encryptedVerifier[1] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[1];
59  encryptedVerifier[2] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[2];
60  encryptedVerifier[3] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[3];
61
62  /**
63   * loop
64   */
65
66  u32 w0l = w0[0];
67
68  for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
69  {
70    const u32 w0r = ix_create_bft (bfs_buf, il_pos);
71
72    const u32 w0lr = w0l | w0r;
73
74    /**
75     * sha1
76     */
77
78    const u32 pw_salt_len = pw_len + 16;
79
80    u32 w0_t[4];
81    u32 w1_t[4];
82    u32 w2_t[4];
83    u32 w3_t[4];
84
85    w0_t[0] = salt_buf[0];
86    w0_t[1] = salt_buf[1];
87    w0_t[2] = salt_buf[2];
88    w0_t[3] = salt_buf[3];
89    w1_t[0] = w0lr;
90    w1_t[1] = w0[1];
91    w1_t[2] = w0[2];
92    w1_t[3] = w0[3];
93    w2_t[0] = w1[0];
94    w2_t[1] = w1[1];
95    w2_t[2] = w1[2];
96    w2_t[3] = w1[3];
97    w3_t[0] = w2[0];
98    w3_t[1] = w2[1];
99    w3_t[2] = 0;
100    w3_t[3] = pw_salt_len * 8;
101
102    u32 pass_hash[5];
103
104    pass_hash[0] = SHA1M_A;
105    pass_hash[1] = SHA1M_B;
106    pass_hash[2] = SHA1M_C;
107    pass_hash[3] = SHA1M_D;
108    pass_hash[4] = SHA1M_E;
109
110    sha1_transform (w0_t, w1_t, w2_t, w3_t, pass_hash);
111
112    w0_t[0] = pass_hash[0];
113    w0_t[1] = pass_hash[1];
114    w0_t[2] = pass_hash[2];
115    w0_t[3] = pass_hash[3];
116    w1_t[0] = pass_hash[4];
117    w1_t[1] = 0;
118    w1_t[2] = 0x80000000;
119    w1_t[3] = 0;
120    w2_t[0] = 0;
121    w2_t[1] = 0;
122    w2_t[2] = 0;
123    w2_t[3] = 0;
124    w3_t[0] = 0;
125    w3_t[1] = 0;
126    w3_t[2] = 0;
127    w3_t[3] = (20 + 4) * 8;
128
129    u32 digest[5];
130
131    digest[0] = SHA1M_A;
132    digest[1] = SHA1M_B;
133    digest[2] = SHA1M_C;
134    digest[3] = SHA1M_D;
135    digest[4] = SHA1M_E;
136
137    sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
138
139    digest[0] = hc_swap32_S (digest[0]);
140    digest[1] = hc_swap32_S (digest[1]);
141    digest[2] = hc_swap32_S (digest[2]);
142    digest[3] = hc_swap32_S (digest[3]);
143
144    if (version == 3)
145    {
146      digest[1] &= 0xff;
147      digest[2]  = 0;
148      digest[3]  = 0;
149    }
150
151    rc4_init_128 (S, digest);
152
153    u32 out[4];
154
155    u8 j = rc4_next_16 (S, 0, 0, encryptedVerifier, out);
156
157    w0_t[0] = hc_swap32_S (out[0]);
158    w0_t[1] = hc_swap32_S (out[1]);
159    w0_t[2] = hc_swap32_S (out[2]);
160    w0_t[3] = hc_swap32_S (out[3]);
161    w1_t[0] = 0x80000000;
162    w1_t[1] = 0;
163    w1_t[2] = 0;
164    w1_t[3] = 0;
165    w2_t[0] = 0;
166    w2_t[1] = 0;
167    w2_t[2] = 0;
168    w2_t[3] = 0;
169    w3_t[0] = 0;
170    w3_t[1] = 0;
171    w3_t[2] = 0;
172    w3_t[3] = 16 * 8;
173
174    digest[0] = SHA1M_A;
175    digest[1] = SHA1M_B;
176    digest[2] = SHA1M_C;
177    digest[3] = SHA1M_D;
178    digest[4] = SHA1M_E;
179
180    sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
181
182    digest[0] = hc_swap32_S (digest[0]);
183    digest[1] = hc_swap32_S (digest[1]);
184    digest[2] = hc_swap32_S (digest[2]);
185    digest[3] = hc_swap32_S (digest[3]);
186
187    rc4_next_16 (S, 16, j, digest, out);
188
189    // initial compare
190
191    int digest_pos = find_hash (out, digests_cnt, &digests_buf[DIGESTS_OFFSET]);
192
193    if (digest_pos == -1) continue;
194
195    if (esalt_bufs[DIGESTS_OFFSET].secondBlockLen != 0)
196    {
197      w0[0] = pass_hash[0];
198      w0[1] = pass_hash[1];
199      w0[2] = pass_hash[2];
200      w0[3] = pass_hash[3];
201      w1[0] = pass_hash[4];
202      w1[1] = 0x01000000;
203      w1[2] = 0x80000000;
204      w1[3] = 0;
205      w2[0] = 0;
206      w2[1] = 0;
207      w2[2] = 0;
208      w2[3] = 0;
209      w3[0] = 0;
210      w3[1] = 0;
211      w3[2] = 0;
212      w3[3] = (20 + 4) * 8;
213
214      digest[0] = SHA1M_A;
215      digest[1] = SHA1M_B;
216      digest[2] = SHA1M_C;
217      digest[3] = SHA1M_D;
218      digest[4] = SHA1M_E;
219
220      sha1_transform (w0, w1, w2, w3, digest);
221
222      digest[0] = hc_swap32_S (digest[0]);
223      digest[1] = hc_swap32_S (digest[1]);
224      digest[2] = 0;
225      digest[3] = 0;
226
227      digest[1] &= 0xff; // only 40-bit key
228
229      // second block decrypt:
230
231      rc4_init_128 (S, digest);
232
233      u32 secondBlockData[4];
234
235      secondBlockData[0] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[0];
236      secondBlockData[1] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[1];
237      secondBlockData[2] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[2];
238      secondBlockData[3] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[3];
239
240      j = rc4_next_16 (S, 0, 0, secondBlockData, out);
241
242      int null_bytes = 0;
243
244      for (int k = 0; k < 4; k++)
245      {
246        if ((out[k] & 0x000000ff) == 0) null_bytes++;
247        if ((out[k] & 0x0000ff00) == 0) null_bytes++;
248        if ((out[k] & 0x00ff0000) == 0) null_bytes++;
249        if ((out[k] & 0xff000000) == 0) null_bytes++;
250      }
251
252      secondBlockData[0] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[4];
253      secondBlockData[1] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[5];
254      secondBlockData[2] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[6];
255      secondBlockData[3] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[7];
256
257      rc4_next_16 (S, 16, j, secondBlockData, out);
258
259      for (int k = 0; k < 4; k++)
260      {
261        if ((out[k] & 0x000000ff) == 0) null_bytes++;
262        if ((out[k] & 0x0000ff00) == 0) null_bytes++;
263        if ((out[k] & 0x00ff0000) == 0) null_bytes++;
264        if ((out[k] & 0xff000000) == 0) null_bytes++;
265      }
266
267      if (null_bytes < MIN_NULL_BYTES) continue;
268    }
269
270    const u32 final_hash_pos = DIGESTS_OFFSET + digest_pos;
271
272    if (hc_atomic_inc (&hashes_shown[final_hash_pos]) == 0)
273    {
274      mark_hash (plains_buf, d_return_buf, SALT_POS, digests_cnt, digest_pos, final_hash_pos, gid, il_pos, 0, 0);
275    }
276  }
277}
278
279DECLSPEC void m09800s (LOCAL_AS u32 *S, u32 *w0, u32 *w1, u32 *w2, u32 *w3, const u32 pw_len, KERN_ATTR_ESALT (oldoffice34_t))
280{
281  /**
282   * modifier
283   */
284
285  const u64 gid = get_global_id (0);
286  const u64 lid = get_local_id (0);
287
288  /**
289   * salt
290   */
291
292  u32 salt_buf[4];
293
294  salt_buf[0] = salt_bufs[SALT_POS].salt_buf[0];
295  salt_buf[1] = salt_bufs[SALT_POS].salt_buf[1];
296  salt_buf[2] = salt_bufs[SALT_POS].salt_buf[2];
297  salt_buf[3] = salt_bufs[SALT_POS].salt_buf[3];
298
299  /**
300   * esalt
301   */
302
303  const u32 version = esalt_bufs[DIGESTS_OFFSET].version;
304
305  u32 encryptedVerifier[4];
306
307  encryptedVerifier[0] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[0];
308  encryptedVerifier[1] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[1];
309  encryptedVerifier[2] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[2];
310  encryptedVerifier[3] = esalt_bufs[DIGESTS_OFFSET].encryptedVerifier[3];
311
312  /**
313   * digest
314   */
315
316  const u32 search[4] =
317  {
318    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R0],
319    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R1],
320    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R2],
321    digests_buf[DIGESTS_OFFSET].digest_buf[DGST_R3]
322  };
323
324  /**
325   * loop
326   */
327
328  u32 w0l = w0[0];
329
330  for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
331  {
332    const u32 w0r = ix_create_bft (bfs_buf, il_pos);
333
334    const u32 w0lr = w0l | w0r;
335
336    /**
337     * sha1
338     */
339
340    const u32 pw_salt_len = pw_len + 16;
341
342    u32 w0_t[4];
343    u32 w1_t[4];
344    u32 w2_t[4];
345    u32 w3_t[4];
346
347    w0_t[0] = salt_buf[0];
348    w0_t[1] = salt_buf[1];
349    w0_t[2] = salt_buf[2];
350    w0_t[3] = salt_buf[3];
351    w1_t[0] = w0lr;
352    w1_t[1] = w0[1];
353    w1_t[2] = w0[2];
354    w1_t[3] = w0[3];
355    w2_t[0] = w1[0];
356    w2_t[1] = w1[1];
357    w2_t[2] = w1[2];
358    w2_t[3] = w1[3];
359    w3_t[0] = w2[0];
360    w3_t[1] = w2[1];
361    w3_t[2] = 0;
362    w3_t[3] = pw_salt_len * 8;
363
364    u32 pass_hash[5];
365
366    pass_hash[0] = SHA1M_A;
367    pass_hash[1] = SHA1M_B;
368    pass_hash[2] = SHA1M_C;
369    pass_hash[3] = SHA1M_D;
370    pass_hash[4] = SHA1M_E;
371
372    sha1_transform (w0_t, w1_t, w2_t, w3_t, pass_hash);
373
374    w0_t[0] = pass_hash[0];
375    w0_t[1] = pass_hash[1];
376    w0_t[2] = pass_hash[2];
377    w0_t[3] = pass_hash[3];
378    w1_t[0] = pass_hash[4];
379    w1_t[1] = 0;
380    w1_t[2] = 0x80000000;
381    w1_t[3] = 0;
382    w2_t[0] = 0;
383    w2_t[1] = 0;
384    w2_t[2] = 0;
385    w2_t[3] = 0;
386    w3_t[0] = 0;
387    w3_t[1] = 0;
388    w3_t[2] = 0;
389    w3_t[3] = (20 + 4) * 8;
390
391    u32 digest[5];
392
393    digest[0] = SHA1M_A;
394    digest[1] = SHA1M_B;
395    digest[2] = SHA1M_C;
396    digest[3] = SHA1M_D;
397    digest[4] = SHA1M_E;
398
399    sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
400
401    digest[0] = hc_swap32_S (digest[0]);
402    digest[1] = hc_swap32_S (digest[1]);
403    digest[2] = hc_swap32_S (digest[2]);
404    digest[3] = hc_swap32_S (digest[3]);
405
406    if (version == 3)
407    {
408      digest[1] &= 0xff;
409      digest[2]  = 0;
410      digest[3]  = 0;
411    }
412
413    rc4_init_128 (S, digest);
414
415    u32 out[4];
416
417    u8 j = rc4_next_16 (S, 0, 0, encryptedVerifier, out);
418
419    w0_t[0] = hc_swap32_S (out[0]);
420    w0_t[1] = hc_swap32_S (out[1]);
421    w0_t[2] = hc_swap32_S (out[2]);
422    w0_t[3] = hc_swap32_S (out[3]);
423    w1_t[0] = 0x80000000;
424    w1_t[1] = 0;
425    w1_t[2] = 0;
426    w1_t[3] = 0;
427    w2_t[0] = 0;
428    w2_t[1] = 0;
429    w2_t[2] = 0;
430    w2_t[3] = 0;
431    w3_t[0] = 0;
432    w3_t[1] = 0;
433    w3_t[2] = 0;
434    w3_t[3] = 16 * 8;
435
436    digest[0] = SHA1M_A;
437    digest[1] = SHA1M_B;
438    digest[2] = SHA1M_C;
439    digest[3] = SHA1M_D;
440    digest[4] = SHA1M_E;
441
442    sha1_transform (w0_t, w1_t, w2_t, w3_t, digest);
443
444    digest[0] = hc_swap32_S (digest[0]);
445    digest[1] = hc_swap32_S (digest[1]);
446    digest[2] = hc_swap32_S (digest[2]);
447    digest[3] = hc_swap32_S (digest[3]);
448
449    rc4_next_16 (S, 16, j, digest, out);
450
451    // initial compare
452
453    if (out[0] != search[0]) continue;
454    if (out[1] != search[1]) continue;
455    if (out[2] != search[2]) continue;
456    if (out[3] != search[3]) continue;
457
458    if (esalt_bufs[DIGESTS_OFFSET].secondBlockLen != 0)
459    {
460      w0[0] = pass_hash[0];
461      w0[1] = pass_hash[1];
462      w0[2] = pass_hash[2];
463      w0[3] = pass_hash[3];
464      w1[0] = pass_hash[4];
465      w1[1] = 0x01000000;
466      w1[2] = 0x80000000;
467      w1[3] = 0;
468      w2[0] = 0;
469      w2[1] = 0;
470      w2[2] = 0;
471      w2[3] = 0;
472      w3[0] = 0;
473      w3[1] = 0;
474      w3[2] = 0;
475      w3[3] = (20 + 4) * 8;
476
477      digest[0] = SHA1M_A;
478      digest[1] = SHA1M_B;
479      digest[2] = SHA1M_C;
480      digest[3] = SHA1M_D;
481      digest[4] = SHA1M_E;
482
483      sha1_transform (w0, w1, w2, w3, digest);
484
485      digest[0] = hc_swap32_S (digest[0]);
486      digest[1] = hc_swap32_S (digest[1]);
487      digest[2] = 0;
488      digest[3] = 0;
489
490      digest[1] &= 0xff; // only 40-bit key
491
492      // second block decrypt:
493
494      rc4_init_128 (S, digest);
495
496      u32 secondBlockData[4];
497
498      secondBlockData[0] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[0];
499      secondBlockData[1] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[1];
500      secondBlockData[2] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[2];
501      secondBlockData[3] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[3];
502
503      j = rc4_next_16 (S, 0, 0, secondBlockData, out);
504
505      int null_bytes = 0;
506
507      for (int k = 0; k < 4; k++)
508      {
509        if ((out[k] & 0x000000ff) == 0) null_bytes++;
510        if ((out[k] & 0x0000ff00) == 0) null_bytes++;
511        if ((out[k] & 0x00ff0000) == 0) null_bytes++;
512        if ((out[k] & 0xff000000) == 0) null_bytes++;
513      }
514
515      secondBlockData[0] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[4];
516      secondBlockData[1] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[5];
517      secondBlockData[2] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[6];
518      secondBlockData[3] = esalt_bufs[DIGESTS_OFFSET].secondBlockData[7];
519
520      rc4_next_16 (S, 16, j, secondBlockData, out);
521
522      for (int k = 0; k < 4; k++)
523      {
524        if ((out[k] & 0x000000ff) == 0) null_bytes++;
525        if ((out[k] & 0x0000ff00) == 0) null_bytes++;
526        if ((out[k] & 0x00ff0000) == 0) null_bytes++;
527        if ((out[k] & 0xff000000) == 0) null_bytes++;
528      }
529
530      if (null_bytes < MIN_NULL_BYTES) continue;
531    }
532
533    if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET]) == 0)
534    {
535      mark_hash (plains_buf, d_return_buf, SALT_POS, digests_cnt, 0, DIGESTS_OFFSET + 0, gid, il_pos, 0, 0);
536    }
537  }
538}
539
540KERNEL_FQ void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t))
541{
542  /**
543   * base
544   */
545
546  const u64 gid = get_global_id (0);
547
548  if (gid >= gid_max) return;
549
550  u32 w0[4];
551
552  w0[0] = pws[gid].i[ 0];
553  w0[1] = pws[gid].i[ 1];
554  w0[2] = pws[gid].i[ 2];
555  w0[3] = pws[gid].i[ 3];
556
557  u32 w1[4];
558
559  w1[0] = 0;
560  w1[1] = 0;
561  w1[2] = 0;
562  w1[3] = 0;
563
564  u32 w2[4];
565
566  w2[0] = 0;
567  w2[1] = 0;
568  w2[2] = 0;
569  w2[3] = 0;
570
571  u32 w3[4];
572
573  w3[0] = 0;
574  w3[1] = 0;
575  w3[2] = 0;
576  w3[3] = 0;
577
578  const u32 pw_len = pws[gid].pw_len & 63;
579
580  /**
581   * main
582   */
583
584  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
585
586  m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
587}
588
589KERNEL_FQ void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t))
590{
591  /**
592   * base
593   */
594
595  const u64 gid = get_global_id (0);
596
597  if (gid >= gid_max) return;
598
599  u32 w0[4];
600
601  w0[0] = pws[gid].i[ 0];
602  w0[1] = pws[gid].i[ 1];
603  w0[2] = pws[gid].i[ 2];
604  w0[3] = pws[gid].i[ 3];
605
606  u32 w1[4];
607
608  w1[0] = pws[gid].i[ 4];
609  w1[1] = pws[gid].i[ 5];
610  w1[2] = pws[gid].i[ 6];
611  w1[3] = pws[gid].i[ 7];
612
613  u32 w2[4];
614
615  w2[0] = 0;
616  w2[1] = 0;
617  w2[2] = 0;
618  w2[3] = 0;
619
620  u32 w3[4];
621
622  w3[0] = 0;
623  w3[1] = 0;
624  w3[2] = 0;
625  w3[3] = 0;
626
627  const u32 pw_len = pws[gid].pw_len & 63;
628
629  /**
630   * main
631   */
632
633  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
634
635  m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
636}
637
638KERNEL_FQ void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t))
639{
640  /**
641   * base
642   */
643
644  const u64 gid = get_global_id (0);
645
646  if (gid >= gid_max) return;
647
648  u32 w0[4];
649
650  w0[0] = pws[gid].i[ 0];
651  w0[1] = pws[gid].i[ 1];
652  w0[2] = pws[gid].i[ 2];
653  w0[3] = pws[gid].i[ 3];
654
655  u32 w1[4];
656
657  w1[0] = pws[gid].i[ 4];
658  w1[1] = pws[gid].i[ 5];
659  w1[2] = pws[gid].i[ 6];
660  w1[3] = pws[gid].i[ 7];
661
662  u32 w2[4];
663
664  w2[0] = pws[gid].i[ 8];
665  w2[1] = pws[gid].i[ 9];
666  w2[2] = pws[gid].i[10];
667  w2[3] = pws[gid].i[11];
668
669  u32 w3[4];
670
671  w3[0] = pws[gid].i[12];
672  w3[1] = pws[gid].i[13];
673  w3[2] = 0;
674  w3[3] = 0;
675
676  const u32 pw_len = pws[gid].pw_len & 63;
677
678  /**
679   * main
680   */
681
682  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
683
684  m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
685}
686
687KERNEL_FQ void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t))
688{
689  /**
690   * base
691   */
692
693  const u64 gid = get_global_id (0);
694
695  if (gid >= gid_max) return;
696
697  u32 w0[4];
698
699  w0[0] = pws[gid].i[ 0];
700  w0[1] = pws[gid].i[ 1];
701  w0[2] = pws[gid].i[ 2];
702  w0[3] = pws[gid].i[ 3];
703
704  u32 w1[4];
705
706  w1[0] = 0;
707  w1[1] = 0;
708  w1[2] = 0;
709  w1[3] = 0;
710
711  u32 w2[4];
712
713  w2[0] = 0;
714  w2[1] = 0;
715  w2[2] = 0;
716  w2[3] = 0;
717
718  u32 w3[4];
719
720  w3[0] = 0;
721  w3[1] = 0;
722  w3[2] = 0;
723  w3[3] = 0;
724
725  const u32 pw_len = pws[gid].pw_len & 63;
726
727  /**
728   * main
729   */
730
731  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
732
733  m09800s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
734}
735
736KERNEL_FQ void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t))
737{
738  /**
739   * base
740   */
741
742  const u64 gid = get_global_id (0);
743
744  if (gid >= gid_max) return;
745
746  u32 w0[4];
747
748  w0[0] = pws[gid].i[ 0];
749  w0[1] = pws[gid].i[ 1];
750  w0[2] = pws[gid].i[ 2];
751  w0[3] = pws[gid].i[ 3];
752
753  u32 w1[4];
754
755  w1[0] = pws[gid].i[ 4];
756  w1[1] = pws[gid].i[ 5];
757  w1[2] = pws[gid].i[ 6];
758  w1[3] = pws[gid].i[ 7];
759
760  u32 w2[4];
761
762  w2[0] = 0;
763  w2[1] = 0;
764  w2[2] = 0;
765  w2[3] = 0;
766
767  u32 w3[4];
768
769  w3[0] = 0;
770  w3[1] = 0;
771  w3[2] = 0;
772  w3[3] = 0;
773
774  const u32 pw_len = pws[gid].pw_len & 63;
775
776  /**
777   * main
778   */
779
780  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
781
782  m09800s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
783}
784
785KERNEL_FQ void m09800_s16 (KERN_ATTR_ESALT (oldoffice34_t))
786{
787  /**
788   * base
789   */
790
791  const u64 gid = get_global_id (0);
792
793  if (gid >= gid_max) return;
794
795  u32 w0[4];
796
797  w0[0] = pws[gid].i[ 0];
798  w0[1] = pws[gid].i[ 1];
799  w0[2] = pws[gid].i[ 2];
800  w0[3] = pws[gid].i[ 3];
801
802  u32 w1[4];
803
804  w1[0] = pws[gid].i[ 4];
805  w1[1] = pws[gid].i[ 5];
806  w1[2] = pws[gid].i[ 6];
807  w1[3] = pws[gid].i[ 7];
808
809  u32 w2[4];
810
811  w2[0] = pws[gid].i[ 8];
812  w2[1] = pws[gid].i[ 9];
813  w2[2] = pws[gid].i[10];
814  w2[3] = pws[gid].i[11];
815
816  u32 w3[4];
817
818  w3[0] = pws[gid].i[12];
819  w3[1] = pws[gid].i[13];
820  w3[2] = 0;
821  w3[3] = 0;
822
823  const u32 pw_len = pws[gid].pw_len & 63;
824
825  /**
826   * main
827   */
828
829  LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
830
831  m09800s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, SALT_POS, loop_pos, loop_cnt, il_cnt, digests_cnt, DIGESTS_OFFSET, combs_mode, salt_repeat, pws_pos, gid_max);
832}
833