diff --git a/OpenCL/m06300-pure.cl b/OpenCL/m06300-pure.cl new file mode 100644 index 000000000..dbe156e8d --- /dev/null +++ b/OpenCL/m06300-pure.cl @@ -0,0 +1,253 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#include "inc_vendor.cl" +#include "inc_hash_constants.h" +#include "inc_hash_functions.cl" +#include "inc_types.cl" +#include "inc_common.cl" +#include "inc_hash_md5.cl" + +#define COMPARE_S "inc_comp_single.cl" +#define COMPARE_M "inc_comp_multi.cl" + +__kernel void m06300_init (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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); + + if (gid >= gid_max) return; + + /** + * init + */ + + const u32 pw_len = pws[gid].pw_len; + + const u32 pw_lenv = ceil ((float) pw_len / 4); + + u32 w[64] = { 0 }; + + for (int idx = 0; idx < pw_lenv; idx++) + { + w[idx] = pws[gid].i[idx]; + + barrier (CLK_GLOBAL_MEM_FENCE); + } + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 salt_lenv = ceil ((float) salt_len / 4); + + u32 s[64] = { 0 }; + + for (int idx = 0; idx < salt_lenv; idx++) + { + s[idx] = salt_bufs[salt_pos].salt_buf[idx]; + + barrier (CLK_GLOBAL_MEM_FENCE); + } + + /** + * prepare + */ + + md5_ctx_t md5_ctx1; + + md5_init (&md5_ctx1); + + md5_update (&md5_ctx1, w, pw_len); + + md5_update (&md5_ctx1, s, salt_len); + + md5_update (&md5_ctx1, w, pw_len); + + md5_final (&md5_ctx1); + + u32 final[16] = { 0 }; + + final[0] = md5_ctx1.h[0]; + final[1] = md5_ctx1.h[1]; + final[2] = md5_ctx1.h[2]; + final[3] = md5_ctx1.h[3]; + + md5_ctx_t md5_ctx; + + md5_init (&md5_ctx); + + md5_update (&md5_ctx, w, pw_len); + + md5_update (&md5_ctx, s, salt_len); + + int pl; + + for (pl = pw_len; pl > 16; pl -= 16) + { + md5_update (&md5_ctx, final, 16); + } + + truncate_block_4x4_le (final, pl); + + md5_update (&md5_ctx, final, pl); + + /* Then something really weird... */ + + for (int i = pw_len; i != 0; i >>= 1) + { + u32 t[16] = { 0 }; + + if (i & 1) + { + t[0] = 0; + } + else + { + t[0] = w[0] & 0xff; + } + + md5_update (&md5_ctx, t, 1); + } + + md5_final (&md5_ctx); + + tmps[gid].digest_buf[0] = md5_ctx.h[0]; + tmps[gid].digest_buf[1] = md5_ctx.h[1]; + tmps[gid].digest_buf[2] = md5_ctx.h[2]; + tmps[gid].digest_buf[3] = md5_ctx.h[3]; +} + +__kernel void m06300_loop (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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); + + if (gid >= gid_max) return; + + /** + * init + */ + + const u32 pw_len = pws[gid].pw_len; + + const u32 pw_lenv = ceil ((float) pw_len / 4); + + u32 w[64] = { 0 }; + + for (int idx = 0; idx < pw_lenv; idx++) + { + w[idx] = pws[gid].i[idx]; + + barrier (CLK_GLOBAL_MEM_FENCE); + } + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 salt_lenv = ceil ((float) salt_len / 4); + + u32 s[64] = { 0 }; + + for (int idx = 0; idx < salt_lenv; idx++) + { + s[idx] = salt_bufs[salt_pos].salt_buf[idx]; + + barrier (CLK_GLOBAL_MEM_FENCE); + } + + /** + * digest + */ + + u32 digest[16] = { 0 }; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + md5_ctx_t md5_ctx; + + md5_init (&md5_ctx); + + if (j & 1) + { + md5_update (&md5_ctx, w, pw_len); + } + else + { + md5_update (&md5_ctx, digest, 16); + } + + if (j % 3) + { + md5_update (&md5_ctx, s, salt_len); + } + + if (j % 7) + { + md5_update (&md5_ctx, w, pw_len); + } + + if (j & 1) + { + md5_update (&md5_ctx, digest, 16); + } + else + { + md5_update (&md5_ctx, w, pw_len); + } + + md5_final (&md5_ctx); + + digest[0] = md5_ctx.h[0]; + digest[1] = md5_ctx.h[1]; + digest[2] = md5_ctx.h[2]; + digest[3] = md5_ctx.h[3]; + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void m06300_comp (__global pw_t *pws, __global const kernel_rule_t *rules_buf, __global const pw_t *combs_buf, __global const bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global const u32 *bitmaps_buf_s1_a, __global const u32 *bitmaps_buf_s1_b, __global const u32 *bitmaps_buf_s1_c, __global const u32 *bitmaps_buf_s1_d, __global const u32 *bitmaps_buf_s2_a, __global const u32 *bitmaps_buf_s2_b, __global const u32 *bitmaps_buf_s2_c, __global const u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global const digest_t *digests_buf, __global u32 *hashes_shown, __global const salt_t *salt_bufs, __global const void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 r0 = tmps[gid].digest_buf[DGST_R0]; + const u32 r1 = tmps[gid].digest_buf[DGST_R1]; + const u32 r2 = tmps[gid].digest_buf[DGST_R2]; + const u32 r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include COMPARE_M +} diff --git a/OpenCL/m06300.cl b/OpenCL/m06300.cl index 9ab2b8b07..0645a12fd 100644 --- a/OpenCL/m06300.cl +++ b/OpenCL/m06300.cl @@ -781,7 +781,7 @@ __kernel void m06300_init (__global pw_t *pws, __global const kernel_rule_t *rul block_len += salt_len; - truncate_block (digest, pw_len); + truncate_block_4x4_le (digest, pw_len); memcat16 (block0, block1, block2, block3, block_len, digest);