/**
- * Author......: Jens Steube <jens.steube@gmail.com>
+ * Authors.....: Jens Steube <jens.steube@gmail.com>
+ * Gabriele Gristina <matrix@hashcat.net>
+ *
* License.....: MIT
*/
#undef _SHA1_
-#include "types_ocl.c"
-#include "common.c"
+#include "OpenCL/types_ocl.c"
+#include "OpenCL/common.c"
-#define COMPARE_S "check_single_comp4.c"
-#define COMPARE_M "check_multi_comp4.c"
+#define COMPARE_S "OpenCL/check_single_comp4.c"
+#define COMPARE_M "OpenCL/check_multi_comp4.c"
__constant char lotus64_table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab,
};
-#ifdef VECT_SIZE1
-#define BOX(S,i) u32 ((S)[(i)])
-#endif
+#define BOX(S,i) (S)[(i)]
-#ifdef VECT_SIZE2
-#define BOX(S,i) u32 ((S)[(i).s0], (S)[(i).s1])
-#endif
+#define uint_to_hex_upper8(i) l_bin2asc[(i)]
-#ifdef VECT_SIZE4
-#define BOX(S,i) u32 ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3])
-#endif
-
-#ifdef VECT_SIZE1
-#define uint_to_hex_upper8(i) u32 (l_bin2asc[(i)])
-#endif
-
-#ifdef VECT_SIZE2
-#define uint_to_hex_upper8(i) u32 (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
-#endif
-
-#ifdef VECT_SIZE4
-#define uint_to_hex_upper8(i) u32 (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3])
-#endif
-
-static void lotus_mix (u32 *in, __local u32 s_lotus_magic_table[256])
+void lotus_mix (u32 *in, __local u32 *s_lotus_magic_table)
{
u32 p = 0;
}
}
-static void lotus_transform_password (u32 *in, u32 *out, __local u32 s_lotus_magic_table[256])
+void lotus_transform_password (u32 in[4], u32 out[4], __local u32 *s_lotus_magic_table)
{
u32 t = out[3] >> 24;
}
}
-static void pad (u32 w[4], const u32 len)
+void pad (u32 w[4], const u32 len)
{
const u32 val = 16 - len;
}
}
-static void mdtransform_norecalc (u32 state[4], u32 block[4], __local u32 s_lotus_magic_table[256])
+void mdtransform_norecalc (u32 state[4], u32 block[4], __local u32 *s_lotus_magic_table)
{
u32 x[12];
state[3] = x[3];
}
-static void mdtransform (u32 state[4], u32 checksum[4], u32 block[4], __local u32 s_lotus_magic_table[256])
+void mdtransform (u32 state[4], u32 checksum[4], u32 block[4], __local u32 *s_lotus_magic_table)
{
mdtransform_norecalc (state, block, s_lotus_magic_table);
lotus_transform_password (block, checksum, s_lotus_magic_table);
}
-static void domino_big_md (const u32 saved_key[16], const u32 size, u32 state[4], __local u32 s_lotus_magic_table[256])
+void domino_big_md (const u32 saved_key[16], const u32 size, u32 state[4], __local u32 *s_lotus_magic_table)
{
u32 checksum[4];
mdtransform_norecalc (state, checksum, s_lotus_magic_table);
}
-static void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
+void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
{
u32 A = digest[0];
u32 B = digest[1];
digest[4] += E;
}
-static void hmac_sha1_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[5], u32 opad[5])
+void hmac_sha1_pad (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[5], u32 opad[5])
{
w0[0] = w0[0] ^ 0x36363636;
w0[1] = w0[1] ^ 0x36363636;
sha1_transform (w0, w1, w2, w3, opad);
}
-static void hmac_sha1_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[5], u32 opad[5], u32 digest[5])
+void hmac_sha1_run (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 ipad[5], u32 opad[5], u32 digest[5])
{
digest[0] = ipad[0];
digest[1] = ipad[1];
sha1_transform (w0, w1, w2, w3, digest);
}
-static void base64_encode (u8 *base64_hash, const u32 len, const u8 *base64_plain)
+void base64_encode (u8 *base64_hash, const u32 len, const u8 *base64_plain)
{
u8 *out_ptr = (u8 *) base64_hash;
u8 *in_ptr = (u8 *) base64_plain;
}
}
-static void lotus6_base64_encode (u8 base64_hash[24], const u32 salt0, const u32 salt1, u32 a, u32 b, u32 c)
+void lotus6_base64_encode (u8 base64_hash[24], const u32 salt0, const u32 salt1, u32 a, u32 b, u32 c)
{
uchar4 salt0c = as_uchar4 (salt0);
uchar4 salt1c = as_uchar4 (salt1);
- #ifdef VECT_SIZE1
uchar4 ac;
uchar4 bc;
uchar4 cc;
ac = as_uchar4 (a);
bc = as_uchar4 (b);
cc = as_uchar4 (c);
- #endif
-
- #ifdef VECT_SIZE2
- uchar4 ac[2];
- uchar4 bc[2];
- uchar4 cc[2];
-
- ac[0] = as_uchar4 (a.s0);
- bc[0] = as_uchar4 (b.s0);
- cc[0] = as_uchar4 (c.s0);
-
- ac[1] = as_uchar4 (a.s1);
- bc[1] = as_uchar4 (b.s1);
- cc[1] = as_uchar4 (c.s1);
- #endif
u8 tmp[24]; // size 22 (=pw_len) is needed but base64 needs size divisible by 4
base64_plain[ 3] = salt0c.s3;
base64_plain[ 3] -= -4; // dont ask!
base64_plain[ 4] = salt1c.s0;
-
- #ifdef VECT_SIZE1
base64_plain[ 5] = ac.s0;
base64_plain[ 6] = ac.s1;
base64_plain[ 7] = ac.s2;
base64_hash[19] = tmp[19];
base64_hash[20] = tmp[20];
base64_hash[21] = ')';
- #endif
-
- #ifdef VECT_SIZE2
- base64_plain[ 5] = ac[0].s0;
- base64_plain[ 6] = ac[0].s1;
- base64_plain[ 7] = ac[0].s2;
- base64_plain[ 8] = ac[0].s3;
- base64_plain[ 9] = bc[0].s0;
- base64_plain[10] = bc[0].s1;
- base64_plain[11] = bc[0].s2;
- base64_plain[12] = bc[0].s3;
- base64_plain[13] = cc[0].s0;
- base64_plain[14] = cc[0].s1;
- base64_plain[15] = cc[0].s2;
-
- /*
- * base64 encode the $salt.$digest string
- */
-
- base64_encode (tmp + 2, 14, base64_plain);
-
- base64_hash[ 0].s0 = '(';
- base64_hash[ 1].s0 = 'G';
- base64_hash[ 2].s0 = tmp[ 2];
- base64_hash[ 3].s0 = tmp[ 3];
- base64_hash[ 4].s0 = tmp[ 4];
- base64_hash[ 5].s0 = tmp[ 5];
- base64_hash[ 6].s0 = tmp[ 6];
- base64_hash[ 7].s0 = tmp[ 7];
- base64_hash[ 8].s0 = tmp[ 8];
- base64_hash[ 9].s0 = tmp[ 9];
- base64_hash[10].s0 = tmp[10];
- base64_hash[11].s0 = tmp[11];
- base64_hash[12].s0 = tmp[12];
- base64_hash[13].s0 = tmp[13];
- base64_hash[14].s0 = tmp[14];
- base64_hash[15].s0 = tmp[15];
- base64_hash[16].s0 = tmp[16];
- base64_hash[17].s0 = tmp[17];
- base64_hash[18].s0 = tmp[18];
- base64_hash[19].s0 = tmp[19];
- base64_hash[20].s0 = tmp[20];
- base64_hash[21].s0 = ')';
-
- base64_plain[ 5] = ac[1].s0;
- base64_plain[ 6] = ac[1].s1;
- base64_plain[ 7] = ac[1].s2;
- base64_plain[ 8] = ac[1].s3;
- base64_plain[ 9] = bc[1].s0;
- base64_plain[10] = bc[1].s1;
- base64_plain[11] = bc[1].s2;
- base64_plain[12] = bc[1].s3;
- base64_plain[13] = cc[1].s0;
- base64_plain[14] = cc[1].s1;
- base64_plain[15] = cc[1].s2;
-
- /*
- * base64 encode the $salt.$digest string
- */
-
- base64_encode (tmp + 2, 14, base64_plain);
-
- base64_hash[ 0].s1 = '(';
- base64_hash[ 1].s1 = 'G';
- base64_hash[ 2].s1 = tmp[ 2];
- base64_hash[ 3].s1 = tmp[ 3];
- base64_hash[ 4].s1 = tmp[ 4];
- base64_hash[ 5].s1 = tmp[ 5];
- base64_hash[ 6].s1 = tmp[ 6];
- base64_hash[ 7].s1 = tmp[ 7];
- base64_hash[ 8].s1 = tmp[ 8];
- base64_hash[ 9].s1 = tmp[ 9];
- base64_hash[10].s1 = tmp[10];
- base64_hash[11].s1 = tmp[11];
- base64_hash[12].s1 = tmp[12];
- base64_hash[13].s1 = tmp[13];
- base64_hash[14].s1 = tmp[14];
- base64_hash[15].s1 = tmp[15];
- base64_hash[16].s1 = tmp[16];
- base64_hash[17].s1 = tmp[17];
- base64_hash[18].s1 = tmp[18];
- base64_hash[19].s1 = tmp[19];
- base64_hash[20].s1 = tmp[20];
- base64_hash[21].s1 = ')';
- #endif
-
}
-
-__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
+__kernel void m09100_init (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
{
/**
* base
const u32 gid = get_global_id (0);
const u32 lid = get_local_id (0);
+ const u32 lsz = get_local_size (0);
/**
- * bin2asc table
+ * sbox
*/
- __local u32 l_bin2asc[256];
-
- const u32 lid4 = lid * 4;
-
- const u32 lid40 = lid4 + 0;
- const u32 lid41 = lid4 + 1;
- const u32 lid42 = lid4 + 2;
- const u32 lid43 = lid4 + 3;
-
- const u32 v400 = (lid40 >> 0) & 15;
- const u32 v401 = (lid40 >> 4) & 15;
- const u32 v410 = (lid41 >> 0) & 15;
- const u32 v411 = (lid41 >> 4) & 15;
- const u32 v420 = (lid42 >> 0) & 15;
- const u32 v421 = (lid42 >> 4) & 15;
- const u32 v430 = (lid43 >> 0) & 15;
- const u32 v431 = (lid43 >> 4) & 15;
-
- l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8
- | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0;
- l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8
- | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0;
- l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8
- | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0;
- l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8
- | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0;
+ __local u32 s_lotus_magic_table[256];
- barrier (CLK_LOCAL_MEM_FENCE);
+ for (u32 i = lid; i < 256; i += lsz)
+ {
+ s_lotus_magic_table[i] = lotus_magic_table[i];
+ }
- /**
- * sbox
- */
+ __local u32 l_bin2asc[256];
- __local u32 s_lotus_magic_table[256];
+ for (u32 i = lid; i < 256; i += lsz)
+ {
+ const u32 i0 = (i >> 0) & 15;
+ const u32 i1 = (i >> 4) & 15;
- s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0];
- s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1];
- s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2];
- s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3];
+ l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 8
+ | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 0;
+ }
barrier (CLK_LOCAL_MEM_FENCE);
if (gid >= gid_max) return;
+ /**
+ * base
+ */
u32 w[16];
salt_buf3[3] = 0;
const u32 salt0 = salt_buf0[0];
- const u32 salt1 = salt_buf0[1] & 0xff | '(' << 8;
+ const u32 salt1 = (salt_buf0[1] & 0xff) | ('(' << 8);
/**
* Lotus 6 hash - SEC_pwddigest_V2
lotus6_base64_encode (base64_hash, salt_buf0[0], salt_buf0[1], a, b, c);
-
/**
* PBKDF2 - HMACSHA1 - 1st iteration
*/
- #ifdef VECT_SIZE1
u32 w0[4];
+ u32 w1[4];
+ u32 w2[4];
+ u32 w3[4];
w0[0] = (base64_hash[ 0] << 24) | (base64_hash[ 1] << 16) | (base64_hash[ 2] << 8) | base64_hash[ 3];
w0[1] = (base64_hash[ 4] << 24) | (base64_hash[ 5] << 16) | (base64_hash[ 6] << 8) | base64_hash[ 7];
w0[2] = (base64_hash[ 8] << 24) | (base64_hash[ 9] << 16) | (base64_hash[10] << 8) | base64_hash[11];
w0[3] = (base64_hash[12] << 24) | (base64_hash[13] << 16) | (base64_hash[14] << 8) | base64_hash[15];
-
- u32 w1[4];
-
w1[0] = (base64_hash[16] << 24) | (base64_hash[17] << 16) | (base64_hash[18] << 8) | base64_hash[19];
w1[1] = (base64_hash[20] << 24) | (base64_hash[21] << 16);
w1[2] = 0;
w1[3] = 0;
- #endif
-
- #ifdef VECT_SIZE2
- u32 w0[4];
-
- w0[0].s0 = (base64_hash[ 0].s0 << 24) | (base64_hash[ 1].s0 << 16) | (base64_hash[ 2].s0 << 8) | base64_hash[ 3].s0;
- w0[1].s0 = (base64_hash[ 4].s0 << 24) | (base64_hash[ 5].s0 << 16) | (base64_hash[ 6].s0 << 8) | base64_hash[ 7].s0;
- w0[2].s0 = (base64_hash[ 8].s0 << 24) | (base64_hash[ 9].s0 << 16) | (base64_hash[10].s0 << 8) | base64_hash[11].s0;
- w0[3].s0 = (base64_hash[12].s0 << 24) | (base64_hash[13].s0 << 16) | (base64_hash[14].s0 << 8) | base64_hash[15].s0;
-
- w0[0].s1 = (base64_hash[ 0].s1 << 24) | (base64_hash[ 1].s1 << 16) | (base64_hash[ 2].s1 << 8) | base64_hash[ 3].s1;
- w0[1].s1 = (base64_hash[ 4].s1 << 24) | (base64_hash[ 5].s1 << 16) | (base64_hash[ 6].s1 << 8) | base64_hash[ 7].s1;
- w0[2].s1 = (base64_hash[ 8].s1 << 24) | (base64_hash[ 9].s1 << 16) | (base64_hash[10].s1 << 8) | base64_hash[11].s1;
- w0[3].s1 = (base64_hash[12].s1 << 24) | (base64_hash[13].s1 << 16) | (base64_hash[14].s1 << 8) | base64_hash[15].s1;
-
- u32 w1[4];
-
- w1[0].s0 = (base64_hash[16].s0 << 24) | (base64_hash[17].s0 << 16) | (base64_hash[18].s0 << 8) | base64_hash[19].s0;
- w1[1].s0 = (base64_hash[20].s0 << 24) | (base64_hash[21].s0 << 16);
- w1[2].s0 = 0;
- w1[3].s0 = 0;
-
- w1[0].s1 = (base64_hash[16].s1 << 24) | (base64_hash[17].s1 << 16) | (base64_hash[18].s1 << 8) | base64_hash[19].s1;
- w1[1].s1 = (base64_hash[20].s1 << 24) | (base64_hash[21].s1 << 16);
- w1[2].s1 = 0;
- w1[3].s1 = 0;
- #endif
-
- u32 w2[4];
-
w2[0] = 0;
w2[1] = 0;
w2[2] = 0;
w2[3] = 0;
-
- u32 w3[4];
-
w3[0] = 0;
w3[1] = 0;
w3[2] = 0;
tmps[gid].out[4] = dgst[4];
}
-__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
+__kernel void m09100_loop (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
{
const u32 gid = get_global_id (0);
tmps[gid].out[4] = out[4];
}
-__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
+__kernel void m09100_comp (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_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 wpa_t *wpa_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)
{
/**
* base