bdcadac2c4f72c91197eebd76656e316b07014c6
[hashcat.git] / OpenCL / m00200_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MYSQL323_
7
8 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.c"
22
23 static void m00200m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
24 {
25   /**
26    * modifier
27    */
28
29   const u32 gid = get_global_id (0);
30   const u32 lid = get_local_id (0);
31
32   /**
33    * loop
34    */
35
36   u32 w0l = w[0];
37
38   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
39   {
40     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
41
42     const u32x w0 = w0l | w0r;
43
44     u32x w_t[16];
45
46     w_t[ 0] = w0;
47     w_t[ 1] = w[ 1];
48     w_t[ 2] = w[ 2];
49     w_t[ 3] = w[ 3];
50     w_t[ 4] = w[ 4];
51     w_t[ 5] = w[ 5];
52     w_t[ 6] = w[ 6];
53     w_t[ 7] = w[ 7];
54     w_t[ 8] = w[ 8];
55     w_t[ 9] = w[ 9];
56     w_t[10] = w[10];
57     w_t[11] = w[11];
58     w_t[12] = w[12];
59     w_t[13] = w[13];
60     w_t[14] = w[14];
61     w_t[15] = w[15];
62
63     u32x a = MYSQL323_A;
64     u32x b = MYSQL323_B;
65     u32x c = 0;
66     u32x d = 0;
67
68     u32x add = 7;
69
70     #define ROUND(v)                              \
71     {                                             \
72       a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \
73       b += (b << 8) ^ a;                          \
74       add += v;                                   \
75     }
76
77     int i;
78     int j;
79
80     for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1)
81     {
82       const u32x wj = w_t[j];
83
84       ROUND ((wj >>  0) & 0xff);
85       ROUND ((wj >>  8) & 0xff);
86       ROUND ((wj >> 16) & 0xff);
87       ROUND ((wj >> 24) & 0xff);
88     }
89
90     const u32x wj = w_t[j];
91
92     const u32 left = pw_len - i;
93
94     if (left == 3)
95     {
96       ROUND ((wj >>  0) & 0xff);
97       ROUND ((wj >>  8) & 0xff);
98       ROUND ((wj >> 16) & 0xff);
99     }
100     else if (left == 2)
101     {
102       ROUND ((wj >>  0) & 0xff);
103       ROUND ((wj >>  8) & 0xff);
104     }
105     else if (left == 1)
106     {
107       ROUND ((wj >>  0) & 0xff);
108     }
109
110     a &= 0x7fffffff;
111     b &= 0x7fffffff;
112
113     COMPARE_M_SIMD (a, b, c, d);
114   }
115 }
116
117 static void m00200s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
118 {
119   /**
120    * modifier
121    */
122
123   const u32 gid = get_global_id (0);
124   const u32 lid = get_local_id (0);
125
126   /**
127    * digest
128    */
129
130   const u32 search[4] =
131   {
132     digests_buf[digests_offset].digest_buf[DGST_R0],
133     digests_buf[digests_offset].digest_buf[DGST_R1],
134     digests_buf[digests_offset].digest_buf[DGST_R2],
135     digests_buf[digests_offset].digest_buf[DGST_R3]
136   };
137
138   /**
139    * loop
140    */
141
142   u32 w0l = w[0];
143
144   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
145   {
146     const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
147
148     const u32x w0 = w0l | w0r;
149
150     u32x w_t[16];
151
152     w_t[ 0] = w0;
153     w_t[ 1] = w[ 1];
154     w_t[ 2] = w[ 2];
155     w_t[ 3] = w[ 3];
156     w_t[ 4] = w[ 4];
157     w_t[ 5] = w[ 5];
158     w_t[ 6] = w[ 6];
159     w_t[ 7] = w[ 7];
160     w_t[ 8] = w[ 8];
161     w_t[ 9] = w[ 9];
162     w_t[10] = w[10];
163     w_t[11] = w[11];
164     w_t[12] = w[12];
165     w_t[13] = w[13];
166     w_t[14] = w[14];
167     w_t[15] = w[15];
168
169     u32x a = MYSQL323_A;
170     u32x b = MYSQL323_B;
171     u32x c = 0;
172     u32x d = 0;
173
174     u32x add = 7;
175
176     #define ROUND(v)                              \
177     {                                             \
178       a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \
179       b += (b << 8) ^ a;                          \
180       add += v;                                   \
181     }
182
183     int i;
184     int j;
185
186     for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1)
187     {
188       const u32x wj = w_t[j];
189
190       ROUND ((wj >>  0) & 0xff);
191       ROUND ((wj >>  8) & 0xff);
192       ROUND ((wj >> 16) & 0xff);
193       ROUND ((wj >> 24) & 0xff);
194     }
195
196     const u32x wj = w_t[j];
197
198     const u32 left = pw_len - i;
199
200     if (left == 3)
201     {
202       ROUND ((wj >>  0) & 0xff);
203       ROUND ((wj >>  8) & 0xff);
204       ROUND ((wj >> 16) & 0xff);
205     }
206     else if (left == 2)
207     {
208       ROUND ((wj >>  0) & 0xff);
209       ROUND ((wj >>  8) & 0xff);
210     }
211     else if (left == 1)
212     {
213       ROUND ((wj >>  0) & 0xff);
214     }
215
216     a &= 0x7fffffff;
217     b &= 0x7fffffff;
218
219     COMPARE_S_SIMD (a, b, c, d);
220   }
221 }
222
223 __kernel void m00200_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
224 {
225   /**
226    * base
227    */
228
229   const u32 gid = get_global_id (0);
230
231   if (gid >= gid_max) return;
232
233   u32 w[16];
234
235   w[ 0] = pws[gid].i[ 0];
236   w[ 1] = pws[gid].i[ 1];
237   w[ 2] = pws[gid].i[ 2];
238   w[ 3] = pws[gid].i[ 3];
239   w[ 4] = 0;
240   w[ 5] = 0;
241   w[ 6] = 0;
242   w[ 7] = 0;
243   w[ 8] = 0;
244   w[ 9] = 0;
245   w[10] = 0;
246   w[11] = 0;
247   w[12] = 0;
248   w[13] = 0;
249   w[14] = 0;
250   w[15] = 0;
251
252   const u32 pw_len = pws[gid].pw_len;
253
254   /**
255    * main
256    */
257
258   m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
259 }
260
261 __kernel void m00200_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
262 {
263   /**
264    * base
265    */
266
267   const u32 gid = get_global_id (0);
268
269   if (gid >= gid_max) return;
270
271   u32 w[16];
272
273   w[ 0] = pws[gid].i[ 0];
274   w[ 1] = pws[gid].i[ 1];
275   w[ 2] = pws[gid].i[ 2];
276   w[ 3] = pws[gid].i[ 3];
277   w[ 4] = pws[gid].i[ 4];
278   w[ 5] = pws[gid].i[ 5];
279   w[ 6] = pws[gid].i[ 6];
280   w[ 7] = pws[gid].i[ 7];
281   w[ 8] = 0;
282   w[ 9] = 0;
283   w[10] = 0;
284   w[11] = 0;
285   w[12] = 0;
286   w[13] = 0;
287   w[14] = 0;
288   w[15] = 0;
289
290   const u32 pw_len = pws[gid].pw_len;
291
292   /**
293    * main
294    */
295
296   m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
297 }
298
299 __kernel void m00200_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
300 {
301   /**
302    * base
303    */
304
305   const u32 gid = get_global_id (0);
306
307   if (gid >= gid_max) return;
308
309   u32 w[16];
310
311   w[ 0] = pws[gid].i[ 0];
312   w[ 1] = pws[gid].i[ 1];
313   w[ 2] = pws[gid].i[ 2];
314   w[ 3] = pws[gid].i[ 3];
315   w[ 4] = pws[gid].i[ 4];
316   w[ 5] = pws[gid].i[ 5];
317   w[ 6] = pws[gid].i[ 6];
318   w[ 7] = pws[gid].i[ 7];
319   w[ 8] = pws[gid].i[ 8];
320   w[ 9] = pws[gid].i[ 9];
321   w[10] = pws[gid].i[10];
322   w[11] = pws[gid].i[11];
323   w[12] = pws[gid].i[12];
324   w[13] = pws[gid].i[13];
325   w[14] = pws[gid].i[14];
326   w[15] = pws[gid].i[15];
327
328   const u32 pw_len = pws[gid].pw_len;
329
330   /**
331    * main
332    */
333
334   m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
335 }
336
337 __kernel void m00200_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
338 {
339   /**
340    * base
341    */
342
343   const u32 gid = get_global_id (0);
344
345   if (gid >= gid_max) return;
346
347   u32 w[16];
348
349   w[ 0] = pws[gid].i[ 0];
350   w[ 1] = pws[gid].i[ 1];
351   w[ 2] = pws[gid].i[ 2];
352   w[ 3] = pws[gid].i[ 3];
353   w[ 4] = 0;
354   w[ 5] = 0;
355   w[ 6] = 0;
356   w[ 7] = 0;
357   w[ 8] = 0;
358   w[ 9] = 0;
359   w[10] = 0;
360   w[11] = 0;
361   w[12] = 0;
362   w[13] = 0;
363   w[14] = 0;
364   w[15] = 0;
365
366   const u32 pw_len = pws[gid].pw_len;
367
368   /**
369    * main
370    */
371
372   m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
373 }
374
375 __kernel void m00200_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
376 {
377   /**
378    * base
379    */
380
381   const u32 gid = get_global_id (0);
382
383   if (gid >= gid_max) return;
384
385   u32 w[16];
386
387   w[ 0] = pws[gid].i[ 0];
388   w[ 1] = pws[gid].i[ 1];
389   w[ 2] = pws[gid].i[ 2];
390   w[ 3] = pws[gid].i[ 3];
391   w[ 4] = pws[gid].i[ 4];
392   w[ 5] = pws[gid].i[ 5];
393   w[ 6] = pws[gid].i[ 6];
394   w[ 7] = pws[gid].i[ 7];
395   w[ 8] = 0;
396   w[ 9] = 0;
397   w[10] = 0;
398   w[11] = 0;
399   w[12] = 0;
400   w[13] = 0;
401   w[14] = 0;
402   w[15] = 0;
403
404   const u32 pw_len = pws[gid].pw_len;
405
406   /**
407    * main
408    */
409
410   m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
411 }
412
413 __kernel void m00200_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __constant u32x * words_buf_r, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
414 {
415   /**
416    * base
417    */
418
419   const u32 gid = get_global_id (0);
420
421   if (gid >= gid_max) return;
422
423   u32 w[16];
424
425   w[ 0] = pws[gid].i[ 0];
426   w[ 1] = pws[gid].i[ 1];
427   w[ 2] = pws[gid].i[ 2];
428   w[ 3] = pws[gid].i[ 3];
429   w[ 4] = pws[gid].i[ 4];
430   w[ 5] = pws[gid].i[ 5];
431   w[ 6] = pws[gid].i[ 6];
432   w[ 7] = pws[gid].i[ 7];
433   w[ 8] = pws[gid].i[ 8];
434   w[ 9] = pws[gid].i[ 9];
435   w[10] = pws[gid].i[10];
436   w[11] = pws[gid].i[11];
437   w[12] = pws[gid].i[12];
438   w[13] = pws[gid].i[13];
439   w[14] = pws[gid].i[14];
440   w[15] = pws[gid].i[15];
441
442   const u32 pw_len = pws[gid].pw_len;
443
444   /**
445    * main
446    */
447
448   m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, 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_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
449 }