mirror of
https://github.com/hashcat/hashcat.git
synced 2025-07-23 15:08:37 +00:00
152 lines
3.3 KiB
Common Lisp
152 lines
3.3 KiB
Common Lisp
|
|
/**
|
|
* Author......: Netherlands Forensic Institute
|
|
* License.....: MIT
|
|
*/
|
|
|
|
#ifdef KERNEL_STATIC
|
|
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
|
#include M2S(INCLUDE_PATH/inc_common.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_blake2b.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_argon2.cl)
|
|
#endif
|
|
|
|
#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl)
|
|
#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl)
|
|
|
|
typedef struct argon2_tmp
|
|
{
|
|
u32 state[4];
|
|
|
|
} argon2_tmp_t;
|
|
|
|
KERNEL_FQ KERNEL_FA void m34000_init (KERN_ATTR_TMPS_ESALT (argon2_tmp_t, argon2_options_t))
|
|
{
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
const u32 gd4 = gid / 4;
|
|
const u32 gm4 = gid % 4;
|
|
|
|
GLOBAL_AS void *V;
|
|
|
|
switch (gm4)
|
|
{
|
|
case 0: V = d_extra0_buf; break;
|
|
case 1: V = d_extra1_buf; break;
|
|
case 2: V = d_extra2_buf; break;
|
|
case 3: V = d_extra3_buf; break;
|
|
}
|
|
|
|
const argon2_options_t options = esalt_bufs[DIGESTS_OFFSET_HOST];
|
|
|
|
GLOBAL_AS argon2_block_t *argon2_block = get_argon2_block (&options, V, gd4);
|
|
|
|
argon2_init (&pws[gid], &salt_bufs[SALT_POS_HOST], &options, argon2_block);
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m34000_loop (KERN_ATTR_TMPS_ESALT (argon2_tmp_t, argon2_options_t))
|
|
{
|
|
const u64 gid = get_global_id (0);
|
|
const u64 bid = get_group_id (0);
|
|
const u64 lid = get_local_id (1);
|
|
const u64 lsz = get_local_size (1);
|
|
|
|
if (bid >= GID_CNT) return;
|
|
|
|
const u32 argon2_thread = get_local_id (0);
|
|
const u32 argon2_lsz = get_local_size (0);
|
|
|
|
#ifdef ARGON2_PARALLELISM
|
|
LOCAL_VK u64 shuffle_bufs[ARGON2_PARALLELISM][32];
|
|
#else
|
|
LOCAL_VK u64 shuffle_bufs[32][32];
|
|
#endif
|
|
|
|
LOCAL_AS u64 *shuffle_buf = shuffle_bufs[lid];
|
|
|
|
SYNC_THREADS();
|
|
|
|
const u32 bd4 = bid / 4;
|
|
const u32 bm4 = bid % 4;
|
|
|
|
GLOBAL_AS void *V;
|
|
|
|
switch (bm4)
|
|
{
|
|
case 0: V = d_extra0_buf; break;
|
|
case 1: V = d_extra1_buf; break;
|
|
case 2: V = d_extra2_buf; break;
|
|
case 3: V = d_extra3_buf; break;
|
|
}
|
|
|
|
argon2_options_t options = esalt_bufs[DIGESTS_OFFSET_HOST_BID];
|
|
|
|
#ifdef ARGON2_PARALLELISM
|
|
options.parallelism = ARGON2_PARALLELISM;
|
|
#endif
|
|
|
|
GLOBAL_AS argon2_block_t *argon2_block = get_argon2_block (&options, V, bd4);
|
|
|
|
argon2_pos_t pos;
|
|
|
|
pos.pass = (LOOP_POS / ARGON2_SYNC_POINTS);
|
|
pos.slice = (LOOP_POS % ARGON2_SYNC_POINTS);
|
|
|
|
for (u32 i = 0; i < LOOP_CNT; i++)
|
|
{
|
|
for (pos.lane = lid; pos.lane < options.parallelism; pos.lane += lsz)
|
|
{
|
|
argon2_fill_segment (argon2_block, &options, &pos, shuffle_buf, argon2_thread, argon2_lsz);
|
|
}
|
|
|
|
SYNC_THREADS ();
|
|
|
|
pos.slice++;
|
|
|
|
if (pos.slice == ARGON2_SYNC_POINTS)
|
|
{
|
|
pos.slice = 0;
|
|
pos.pass++;
|
|
}
|
|
}
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m34000_comp (KERN_ATTR_TMPS_ESALT (argon2_tmp_t, argon2_options_t))
|
|
{
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
const u32 gd4 = gid / 4;
|
|
const u32 gm4 = gid % 4;
|
|
|
|
GLOBAL_AS void *V;
|
|
|
|
switch (gm4)
|
|
{
|
|
case 0: V = d_extra0_buf; break;
|
|
case 1: V = d_extra1_buf; break;
|
|
case 2: V = d_extra2_buf; break;
|
|
case 3: V = d_extra3_buf; break;
|
|
}
|
|
|
|
argon2_options_t options = esalt_bufs[DIGESTS_OFFSET_HOST];
|
|
|
|
GLOBAL_AS argon2_block_t *argon2_block = get_argon2_block (&options, V, gd4);
|
|
|
|
u32 out[8];
|
|
|
|
argon2_final (argon2_block, &options, out);
|
|
|
|
const u32 r0 = out[0];
|
|
const u32 r1 = out[1];
|
|
const u32 r2 = out[2];
|
|
const u32 r3 = out[3];
|
|
|
|
#define il_pos 0
|
|
|
|
#include COMPARE_M
|
|
}
|