mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-22 08:08:10 +00:00
Merge branch 'hashcat:master' into master
This commit is contained in:
commit
0738820a89
@ -1483,7 +1483,7 @@ DECLSPEC u32 hc_bytealign_S (const u32 a, const u32 b, const int c)
|
||||
return r;
|
||||
}
|
||||
|
||||
#if HAS_VPERM
|
||||
#if HAS_VPERM == 1
|
||||
DECLSPEC u32x hc_byte_perm (const u32x a, const u32x b, const int c)
|
||||
{
|
||||
u32x r = 0;
|
||||
@ -1533,7 +1533,7 @@ DECLSPEC u32 hc_byte_perm_S (const u32 a, const u32 b, const int c)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAS_VADD3
|
||||
#if HAS_VADD3 == 1
|
||||
DECLSPEC u32x hc_add3 (const u32x a, const u32x b, const u32x c)
|
||||
{
|
||||
/*
|
||||
@ -2781,7 +2781,7 @@ DECLSPEC void make_utf16be (const u32x *in, u32x *out1, u32x *out2)
|
||||
out1[1] = hc_byte_perm (in[0], 0, 0x3727);
|
||||
out1[0] = hc_byte_perm (in[0], 0, 0x1707);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm (in[3], 0, 0x03070207);
|
||||
out2[2] = hc_byte_perm (in[3], 0, 0x01070007);
|
||||
@ -2819,7 +2819,7 @@ DECLSPEC void make_utf16beN (const u32x *in, u32x *out1, u32x *out2)
|
||||
out1[1] = hc_byte_perm (in[0], 0, 0x1707);
|
||||
out1[0] = hc_byte_perm (in[0], 0, 0x3727);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm (in[3], 0, 0x01070007);
|
||||
out2[2] = hc_byte_perm (in[3], 0, 0x03070207);
|
||||
@ -2857,7 +2857,7 @@ DECLSPEC void make_utf16le (const u32x *in, u32x *out1, u32x *out2)
|
||||
out1[1] = hc_byte_perm (in[0], 0, 0x7372);
|
||||
out1[0] = hc_byte_perm (in[0], 0, 0x7170);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm (in[3], 0, 0x07030702);
|
||||
out2[2] = hc_byte_perm (in[3], 0, 0x07010700);
|
||||
@ -2895,7 +2895,7 @@ DECLSPEC void make_utf16leN (const u32x *in, u32x *out1, u32x *out2)
|
||||
out1[1] = hc_byte_perm (in[0], 0, 0x7170);
|
||||
out1[0] = hc_byte_perm (in[0], 0, 0x7372);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm (in[3], 0, 0x07010700);
|
||||
out2[2] = hc_byte_perm (in[3], 0, 0x07030702);
|
||||
@ -2929,7 +2929,7 @@ DECLSPEC void undo_utf16be (const u32x *in1, const u32x *in2, u32x *out)
|
||||
out[2] = hc_byte_perm (in2[0], in2[1], 0x4602);
|
||||
out[3] = hc_byte_perm (in2[2], in2[3], 0x4602);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out[0] = hc_byte_perm (in1[0], in1[1], 0x04060002);
|
||||
out[1] = hc_byte_perm (in1[2], in1[3], 0x04060002);
|
||||
@ -2959,7 +2959,7 @@ DECLSPEC void undo_utf16le (const u32x *in1, const u32x *in2, u32x *out)
|
||||
out[2] = hc_byte_perm (in2[0], in2[1], 0x6420);
|
||||
out[3] = hc_byte_perm (in2[2], in2[3], 0x6420);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && defined HAS_VPERM == 1
|
||||
|
||||
out[0] = hc_byte_perm (in1[0], in1[1], 0x06040200);
|
||||
out[1] = hc_byte_perm (in1[2], in1[3], 0x06040200);
|
||||
@ -36561,7 +36561,7 @@ DECLSPEC void make_utf16be_S (const u32 *in, u32 *out1, u32 *out2)
|
||||
out1[1] = hc_byte_perm_S (in[0], 0, 0x3727);
|
||||
out1[0] = hc_byte_perm_S (in[0], 0, 0x1707);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm_S (in[3], 0, 0x03070207);
|
||||
out2[2] = hc_byte_perm_S (in[3], 0, 0x01070007);
|
||||
@ -36599,7 +36599,7 @@ DECLSPEC void make_utf16le_S (const u32 *in, u32 *out1, u32 *out2)
|
||||
out1[1] = hc_byte_perm_S (in[0], 0, 0x7372);
|
||||
out1[0] = hc_byte_perm_S (in[0], 0, 0x7170);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
out2[3] = hc_byte_perm_S (in[3], 0, 0x07030702);
|
||||
out2[2] = hc_byte_perm_S (in[3], 0, 0x07010700);
|
||||
@ -36633,7 +36633,7 @@ DECLSPEC void undo_utf16be_S (const u32 *in1, const u32 *in2, u32 *out)
|
||||
out[2] = hc_byte_perm_S (in2[0], in2[1], 0x4602);
|
||||
out[3] = hc_byte_perm_S (in2[2], in2[3], 0x4602);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
out[0] = hc_byte_perm_S (in1[0], in1[1], 0x04060002);
|
||||
out[1] = hc_byte_perm_S (in1[2], in1[3], 0x04060002);
|
||||
@ -36663,7 +36663,7 @@ DECLSPEC void undo_utf16le_S (const u32 *in1, const u32 *in2, u32 *out)
|
||||
out[2] = hc_byte_perm_S (in2[0], in2[1], 0x6420);
|
||||
out[3] = hc_byte_perm_S (in2[2], in2[3], 0x6420);
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
out[0] = hc_byte_perm_S (in1[0], in1[1], 0x06040200);
|
||||
out[1] = hc_byte_perm_S (in1[2], in1[3], 0x06040200);
|
||||
|
@ -24,7 +24,7 @@ DECLSPEC u64 blake2b_rot16_S (const u64 a)
|
||||
|
||||
return out.v64;
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
vconv64_t in;
|
||||
|
||||
@ -98,7 +98,7 @@ DECLSPEC u64 blake2b_rot24_S (const u64 a)
|
||||
|
||||
return out.v64;
|
||||
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM
|
||||
#elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1
|
||||
|
||||
vconv64_t in;
|
||||
|
||||
|
@ -77,7 +77,7 @@ typedef u64 u64x;
|
||||
#define make_u64x (u64)
|
||||
|
||||
#else
|
||||
#if defined IS_CUDA
|
||||
#if defined IS_CUDA || defined IS_HIP
|
||||
|
||||
#if VECT_SIZE == 2
|
||||
|
||||
|
@ -32,6 +32,11 @@
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 16 // 16 * 4 = 64 > 32, also has to be multiple of 64
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 64
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (64 * 64) / 4 = 1024
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
typedef struct hmac_md5_tmp
|
||||
{
|
||||
u32 tmp_md5[SNMPV3_TMP_ELEMS];
|
||||
@ -189,10 +194,7 @@ KERNEL_FQ void m25000_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t))
|
||||
|
||||
const int pw_len64 = pw_len * 64;
|
||||
|
||||
#define SNMPV3_TMP_ELEMS_OPT 1024 // 1024 = (64 max pw length * 64) / sizeof (u32)
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
if (pw_len < 64)
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp_shared[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
|
@ -30,6 +30,11 @@
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 16 // 16 * 4 = 64 > 32, also has to be multiple of 64
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 64
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (64 * 64) / 4 = 1024
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
typedef struct hmac_md5_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
@ -147,13 +152,10 @@ KERNEL_FQ void m25100_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t))
|
||||
|
||||
const int pw_len64 = pw_len * 64;
|
||||
|
||||
#define SNMPV3_TMP_ELEMS_OPT 1024 // 1024 = (64 max pw length * 64) / sizeof (u32)
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
if (pw_len < 64)
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
for (int i = 0; i < pw_len64 / 4; i++)
|
||||
{
|
||||
tmp[i] = tmps[gid].tmp[i];
|
||||
|
@ -30,6 +30,11 @@
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 16 // 16 * 4 = 64 > 32, also has to be multiple of 64
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 64
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (64 * 64) / 4 = 1024
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
typedef struct hmac_sha1_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
@ -149,13 +154,10 @@ KERNEL_FQ void m25200_loop (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t))
|
||||
|
||||
const int pw_len64 = pw_len * 64;
|
||||
|
||||
#define SNMPV3_TMP_ELEMS_OPT 1024 // 1024 = (64 max pw length * 64) / sizeof (u32)
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
if (pw_len < 64)
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
for (int i = 0; i < pw_len64 / 4; i++)
|
||||
{
|
||||
tmp[i] = tmps[gid].tmp[i];
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include "inc_hash_md5.cl"
|
||||
#endif
|
||||
|
||||
DECLSPEC u32x MurmurHash_w0 (const u32 seed, const u32x w0, const u32x *w, const int pw_len)
|
||||
DECLSPEC u32x MurmurHash_w0 (const u32 seed, const u32x w0, const u32 *w, const int pw_len)
|
||||
{
|
||||
u32x hash = seed;
|
||||
|
||||
|
@ -30,6 +30,11 @@
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 16 // 16 * 4 = 64 > 32, also has to be multiple of 64
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 64
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (64 * 64) / 4 = 1024
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
typedef struct hmac_sha224_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
@ -155,10 +160,7 @@ KERNEL_FQ void m26700_loop (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t))
|
||||
|
||||
const int pw_len64 = pw_len * 64;
|
||||
|
||||
#define SNMPV3_TMP_ELEMS_OPT 1024 // 1024 = (64 max pw length * 64) / sizeof (u32)
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
if (pw_len < 64)
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
|
@ -30,6 +30,11 @@
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 16 // 16 * 4 = 64 > 32, also has to be multiple of 64
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 64
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (64 * 64) / 4 = 1024
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
typedef struct hmac_sha256_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
@ -155,10 +160,7 @@ KERNEL_FQ void m26800_loop (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t))
|
||||
|
||||
const int pw_len64 = pw_len * 64;
|
||||
|
||||
#define SNMPV3_TMP_ELEMS_OPT 1024 // 1024 = (64 max pw length * 64) / sizeof (u32)
|
||||
// for pw length > 64 we use global memory reads
|
||||
|
||||
if (pw_len < 64)
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
|
495
OpenCL/m26900-pure.cl
Normal file
495
OpenCL/m26900-pure.cl
Normal file
@ -0,0 +1,495 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_simd.cl"
|
||||
#include "inc_hash_sha384.cl"
|
||||
#endif
|
||||
|
||||
#define COMPARE_S "inc_comp_single.cl"
|
||||
#define COMPARE_M "inc_comp_multi.cl"
|
||||
|
||||
#define SNMPV3_SALT_MAX 1500
|
||||
#define SNMPV3_ENGINEID_MAX 34
|
||||
#define SNMPV3_MSG_AUTH_PARAMS_MAX 32
|
||||
#define SNMPV3_ROUNDS 1048576
|
||||
#define SNMPV3_MAX_PW_LENGTH 128
|
||||
|
||||
#define SNMPV3_TMP_ELEMS 8192 // 8192 = (256 (max pw length) * SNMPV3_MAX_PW_LENGTH) / sizeof (u32)
|
||||
#define SNMPV3_HASH_ELEMS 8
|
||||
|
||||
#define SNMPV3_MAX_SALT_ELEMS 512 // 512 * 4 = 2048 > 1500, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 32 // 32 * 4 = 128 > 34, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 32
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (32 * 128) / 4 = 1024
|
||||
// for pw length > 32 we use global memory reads
|
||||
|
||||
typedef struct hmac_sha384_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
u64 h[SNMPV3_HASH_ELEMS];
|
||||
|
||||
} hmac_sha384_tmp_t;
|
||||
|
||||
typedef struct snmpv3
|
||||
{
|
||||
u32 salt_buf[SNMPV3_MAX_SALT_ELEMS];
|
||||
u32 salt_len;
|
||||
|
||||
u32 engineID_buf[SNMPV3_MAX_ENGINE_ELEMS];
|
||||
u32 engineID_len;
|
||||
|
||||
u32 packet_number[SNMPV3_MAX_PNUM_ELEMS];
|
||||
|
||||
} snmpv3_t;
|
||||
|
||||
KERNEL_FQ void m26900_init (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32 w[128] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
u8 *src_ptr = (u8 *) w;
|
||||
|
||||
// password 128 times, also swapped
|
||||
|
||||
u32 dst_buf[32];
|
||||
|
||||
u8 *dst_ptr = (u8 *) dst_buf;
|
||||
|
||||
int tmp_idx = 0;
|
||||
|
||||
for (int i = 0; i < 128; i++)
|
||||
{
|
||||
for (u32 j = 0; j < pw_len; j++)
|
||||
{
|
||||
const int dst_idx = tmp_idx & 127;
|
||||
|
||||
dst_ptr[dst_idx] = src_ptr[j];
|
||||
|
||||
// write to global memory every time 64 byte are written into cache
|
||||
|
||||
if (dst_idx == 127)
|
||||
{
|
||||
const int tmp_idx4 = (tmp_idx - 127) / 4;
|
||||
|
||||
tmps[gid].tmp[tmp_idx4 + 0] = hc_swap32_S (dst_buf[ 0]);
|
||||
tmps[gid].tmp[tmp_idx4 + 1] = hc_swap32_S (dst_buf[ 1]);
|
||||
tmps[gid].tmp[tmp_idx4 + 2] = hc_swap32_S (dst_buf[ 2]);
|
||||
tmps[gid].tmp[tmp_idx4 + 3] = hc_swap32_S (dst_buf[ 3]);
|
||||
tmps[gid].tmp[tmp_idx4 + 4] = hc_swap32_S (dst_buf[ 4]);
|
||||
tmps[gid].tmp[tmp_idx4 + 5] = hc_swap32_S (dst_buf[ 5]);
|
||||
tmps[gid].tmp[tmp_idx4 + 6] = hc_swap32_S (dst_buf[ 6]);
|
||||
tmps[gid].tmp[tmp_idx4 + 7] = hc_swap32_S (dst_buf[ 7]);
|
||||
tmps[gid].tmp[tmp_idx4 + 8] = hc_swap32_S (dst_buf[ 8]);
|
||||
tmps[gid].tmp[tmp_idx4 + 9] = hc_swap32_S (dst_buf[ 9]);
|
||||
tmps[gid].tmp[tmp_idx4 + 10] = hc_swap32_S (dst_buf[10]);
|
||||
tmps[gid].tmp[tmp_idx4 + 11] = hc_swap32_S (dst_buf[11]);
|
||||
tmps[gid].tmp[tmp_idx4 + 12] = hc_swap32_S (dst_buf[12]);
|
||||
tmps[gid].tmp[tmp_idx4 + 13] = hc_swap32_S (dst_buf[13]);
|
||||
tmps[gid].tmp[tmp_idx4 + 14] = hc_swap32_S (dst_buf[14]);
|
||||
tmps[gid].tmp[tmp_idx4 + 15] = hc_swap32_S (dst_buf[15]);
|
||||
tmps[gid].tmp[tmp_idx4 + 16] = hc_swap32_S (dst_buf[16]);
|
||||
tmps[gid].tmp[tmp_idx4 + 17] = hc_swap32_S (dst_buf[17]);
|
||||
tmps[gid].tmp[tmp_idx4 + 18] = hc_swap32_S (dst_buf[18]);
|
||||
tmps[gid].tmp[tmp_idx4 + 19] = hc_swap32_S (dst_buf[19]);
|
||||
tmps[gid].tmp[tmp_idx4 + 20] = hc_swap32_S (dst_buf[20]);
|
||||
tmps[gid].tmp[tmp_idx4 + 21] = hc_swap32_S (dst_buf[21]);
|
||||
tmps[gid].tmp[tmp_idx4 + 22] = hc_swap32_S (dst_buf[22]);
|
||||
tmps[gid].tmp[tmp_idx4 + 23] = hc_swap32_S (dst_buf[23]);
|
||||
tmps[gid].tmp[tmp_idx4 + 24] = hc_swap32_S (dst_buf[24]);
|
||||
tmps[gid].tmp[tmp_idx4 + 25] = hc_swap32_S (dst_buf[25]);
|
||||
tmps[gid].tmp[tmp_idx4 + 26] = hc_swap32_S (dst_buf[26]);
|
||||
tmps[gid].tmp[tmp_idx4 + 27] = hc_swap32_S (dst_buf[27]);
|
||||
tmps[gid].tmp[tmp_idx4 + 28] = hc_swap32_S (dst_buf[28]);
|
||||
tmps[gid].tmp[tmp_idx4 + 29] = hc_swap32_S (dst_buf[29]);
|
||||
tmps[gid].tmp[tmp_idx4 + 30] = hc_swap32_S (dst_buf[30]);
|
||||
tmps[gid].tmp[tmp_idx4 + 31] = hc_swap32_S (dst_buf[31]);
|
||||
}
|
||||
|
||||
tmp_idx++;
|
||||
}
|
||||
}
|
||||
|
||||
// hash
|
||||
|
||||
tmps[gid].h[0] = SHA384M_A;
|
||||
tmps[gid].h[1] = SHA384M_B;
|
||||
tmps[gid].h[2] = SHA384M_C;
|
||||
tmps[gid].h[3] = SHA384M_D;
|
||||
tmps[gid].h[4] = SHA384M_E;
|
||||
tmps[gid].h[5] = SHA384M_F;
|
||||
tmps[gid].h[6] = SHA384M_G;
|
||||
tmps[gid].h[7] = SHA384M_H;
|
||||
}
|
||||
|
||||
KERNEL_FQ void m26900_loop (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
u64 h[8];
|
||||
|
||||
h[0] = tmps[gid].h[0];
|
||||
h[1] = tmps[gid].h[1];
|
||||
h[2] = tmps[gid].h[2];
|
||||
h[3] = tmps[gid].h[3];
|
||||
h[4] = tmps[gid].h[4];
|
||||
h[5] = tmps[gid].h[5];
|
||||
h[6] = tmps[gid].h[6];
|
||||
h[7] = tmps[gid].h[7];
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
const int pw_len128 = pw_len * 128;
|
||||
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
for (int i = 0; i < pw_len128 / 4; i++)
|
||||
{
|
||||
tmp[i] = tmps[gid].tmp[i];
|
||||
}
|
||||
|
||||
for (u32 i = 0, j = loop_pos; i < loop_cnt; i += 128, j += 128)
|
||||
{
|
||||
const int idx = (j % pw_len128) / 4; // the optimization trick is to be able to do this
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = tmp[idx + 0];
|
||||
w0[1] = tmp[idx + 1];
|
||||
w0[2] = tmp[idx + 2];
|
||||
w0[3] = tmp[idx + 3];
|
||||
w1[0] = tmp[idx + 4];
|
||||
w1[1] = tmp[idx + 5];
|
||||
w1[2] = tmp[idx + 6];
|
||||
w1[3] = tmp[idx + 7];
|
||||
w2[0] = tmp[idx + 8];
|
||||
w2[1] = tmp[idx + 9];
|
||||
w2[2] = tmp[idx + 10];
|
||||
w2[3] = tmp[idx + 11];
|
||||
w3[0] = tmp[idx + 12];
|
||||
w3[1] = tmp[idx + 13];
|
||||
w3[2] = tmp[idx + 14];
|
||||
w3[3] = tmp[idx + 15];
|
||||
w4[0] = tmp[idx + 16];
|
||||
w4[1] = tmp[idx + 17];
|
||||
w4[2] = tmp[idx + 18];
|
||||
w4[3] = tmp[idx + 19];
|
||||
w5[0] = tmp[idx + 20];
|
||||
w5[1] = tmp[idx + 21];
|
||||
w5[2] = tmp[idx + 22];
|
||||
w5[3] = tmp[idx + 23];
|
||||
w6[0] = tmp[idx + 24];
|
||||
w6[1] = tmp[idx + 25];
|
||||
w6[2] = tmp[idx + 26];
|
||||
w6[3] = tmp[idx + 27];
|
||||
w7[0] = tmp[idx + 28];
|
||||
w7[1] = tmp[idx + 29];
|
||||
w7[2] = tmp[idx + 30];
|
||||
w7[3] = tmp[idx + 31];
|
||||
|
||||
sha384_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (u32 i = 0, j = loop_pos; i < loop_cnt; i += 128, j += 128)
|
||||
{
|
||||
const int idx = (j % pw_len128) / 4; // the optimization trick is to be able to do this
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = tmps[gid].tmp[idx + 0];
|
||||
w0[1] = tmps[gid].tmp[idx + 1];
|
||||
w0[2] = tmps[gid].tmp[idx + 2];
|
||||
w0[3] = tmps[gid].tmp[idx + 3];
|
||||
w1[0] = tmps[gid].tmp[idx + 4];
|
||||
w1[1] = tmps[gid].tmp[idx + 5];
|
||||
w1[2] = tmps[gid].tmp[idx + 6];
|
||||
w1[3] = tmps[gid].tmp[idx + 7];
|
||||
w2[0] = tmps[gid].tmp[idx + 8];
|
||||
w2[1] = tmps[gid].tmp[idx + 9];
|
||||
w2[2] = tmps[gid].tmp[idx + 10];
|
||||
w2[3] = tmps[gid].tmp[idx + 11];
|
||||
w3[0] = tmps[gid].tmp[idx + 12];
|
||||
w3[1] = tmps[gid].tmp[idx + 13];
|
||||
w3[2] = tmps[gid].tmp[idx + 14];
|
||||
w3[3] = tmps[gid].tmp[idx + 15];
|
||||
w4[0] = tmps[gid].tmp[idx + 16];
|
||||
w4[1] = tmps[gid].tmp[idx + 17];
|
||||
w4[2] = tmps[gid].tmp[idx + 18];
|
||||
w4[3] = tmps[gid].tmp[idx + 19];
|
||||
w5[0] = tmps[gid].tmp[idx + 20];
|
||||
w5[1] = tmps[gid].tmp[idx + 21];
|
||||
w5[2] = tmps[gid].tmp[idx + 22];
|
||||
w5[3] = tmps[gid].tmp[idx + 23];
|
||||
w6[0] = tmps[gid].tmp[idx + 24];
|
||||
w6[1] = tmps[gid].tmp[idx + 25];
|
||||
w6[2] = tmps[gid].tmp[idx + 26];
|
||||
w6[3] = tmps[gid].tmp[idx + 27];
|
||||
w7[0] = tmps[gid].tmp[idx + 28];
|
||||
w7[1] = tmps[gid].tmp[idx + 29];
|
||||
w7[2] = tmps[gid].tmp[idx + 30];
|
||||
w7[3] = tmps[gid].tmp[idx + 31];
|
||||
|
||||
sha384_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
}
|
||||
}
|
||||
|
||||
tmps[gid].h[0] = h[0];
|
||||
tmps[gid].h[1] = h[1];
|
||||
tmps[gid].h[2] = h[2];
|
||||
tmps[gid].h[3] = h[3];
|
||||
tmps[gid].h[4] = h[4];
|
||||
tmps[gid].h[5] = h[5];
|
||||
tmps[gid].h[6] = h[6];
|
||||
tmps[gid].h[7] = h[7];
|
||||
}
|
||||
|
||||
KERNEL_FQ void m26900_comp (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = 0x80000000;
|
||||
w0[1] = 0;
|
||||
w0[2] = 0;
|
||||
w0[3] = 0;
|
||||
w1[0] = 0;
|
||||
w1[1] = 0;
|
||||
w1[2] = 0;
|
||||
w1[3] = 0;
|
||||
w2[0] = 0;
|
||||
w2[1] = 0;
|
||||
w2[2] = 0;
|
||||
w2[3] = 0;
|
||||
w3[0] = 0;
|
||||
w3[1] = 0;
|
||||
w3[2] = 0;
|
||||
w3[3] = 0;
|
||||
w4[0] = 0;
|
||||
w4[1] = 0;
|
||||
w4[2] = 0;
|
||||
w4[3] = 0;
|
||||
w5[0] = 0;
|
||||
w5[1] = 0;
|
||||
w5[2] = 0;
|
||||
w5[3] = 0;
|
||||
w6[0] = 0;
|
||||
w6[1] = 0;
|
||||
w6[2] = 0;
|
||||
w6[3] = 0;
|
||||
w7[0] = 0;
|
||||
w7[1] = 0;
|
||||
w7[2] = 0;
|
||||
w7[3] = 1048576 * 8;
|
||||
|
||||
u64 h[8];
|
||||
|
||||
h[0] = tmps[gid].h[0];
|
||||
h[1] = tmps[gid].h[1];
|
||||
h[2] = tmps[gid].h[2];
|
||||
h[3] = tmps[gid].h[3];
|
||||
h[4] = tmps[gid].h[4];
|
||||
h[5] = tmps[gid].h[5];
|
||||
h[6] = tmps[gid].h[6];
|
||||
h[7] = tmps[gid].h[7];
|
||||
|
||||
sha384_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
|
||||
sha384_ctx_t ctx;
|
||||
|
||||
sha384_init (&ctx);
|
||||
|
||||
u32 w[32];
|
||||
|
||||
w[ 0] = h32_from_64_S (h[0]);
|
||||
w[ 1] = l32_from_64_S (h[0]);
|
||||
w[ 2] = h32_from_64_S (h[1]);
|
||||
w[ 3] = l32_from_64_S (h[1]);
|
||||
w[ 4] = h32_from_64_S (h[2]);
|
||||
w[ 5] = l32_from_64_S (h[2]);
|
||||
w[ 6] = h32_from_64_S (h[3]);
|
||||
w[ 7] = l32_from_64_S (h[3]);
|
||||
w[ 8] = h32_from_64_S (h[4]);
|
||||
w[ 9] = l32_from_64_S (h[4]);
|
||||
w[10] = h32_from_64_S (h[5]);
|
||||
w[11] = l32_from_64_S (h[5]);
|
||||
w[12] = 0;
|
||||
w[13] = 0;
|
||||
w[14] = 0;
|
||||
w[15] = 0;
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha384_update (&ctx, w, 48);
|
||||
|
||||
sha384_update_global_swap (&ctx, esalt_bufs[DIGESTS_OFFSET].engineID_buf, esalt_bufs[DIGESTS_OFFSET].engineID_len);
|
||||
|
||||
w[ 0] = h32_from_64_S (h[0]);
|
||||
w[ 1] = l32_from_64_S (h[0]);
|
||||
w[ 2] = h32_from_64_S (h[1]);
|
||||
w[ 3] = l32_from_64_S (h[1]);
|
||||
w[ 4] = h32_from_64_S (h[2]);
|
||||
w[ 5] = l32_from_64_S (h[2]);
|
||||
w[ 6] = h32_from_64_S (h[3]);
|
||||
w[ 7] = l32_from_64_S (h[3]);
|
||||
w[ 8] = h32_from_64_S (h[4]);
|
||||
w[ 9] = l32_from_64_S (h[4]);
|
||||
w[10] = h32_from_64_S (h[5]);
|
||||
w[11] = l32_from_64_S (h[5]);
|
||||
w[12] = 0;
|
||||
w[13] = 0;
|
||||
w[14] = 0;
|
||||
w[15] = 0;
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha384_update (&ctx, w, 48);
|
||||
|
||||
sha384_final (&ctx);
|
||||
|
||||
w[ 0] = h32_from_64_S (ctx.h[0]);
|
||||
w[ 1] = l32_from_64_S (ctx.h[0]);
|
||||
w[ 2] = h32_from_64_S (ctx.h[1]);
|
||||
w[ 3] = l32_from_64_S (ctx.h[1]);
|
||||
w[ 4] = h32_from_64_S (ctx.h[2]);
|
||||
w[ 5] = l32_from_64_S (ctx.h[2]);
|
||||
w[ 6] = h32_from_64_S (ctx.h[3]);
|
||||
w[ 7] = l32_from_64_S (ctx.h[3]);
|
||||
w[ 8] = h32_from_64_S (ctx.h[4]);
|
||||
w[ 9] = l32_from_64_S (ctx.h[4]);
|
||||
w[10] = h32_from_64_S (ctx.h[5]);
|
||||
w[11] = l32_from_64_S (ctx.h[5]);
|
||||
w[12] = 0;
|
||||
w[13] = 0;
|
||||
w[14] = 0;
|
||||
w[15] = 0;
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha384_hmac_ctx_t hmac_ctx;
|
||||
|
||||
sha384_hmac_init (&hmac_ctx, w, 48);
|
||||
|
||||
sha384_hmac_update_global_swap (&hmac_ctx, esalt_bufs[DIGESTS_OFFSET].salt_buf, esalt_bufs[DIGESTS_OFFSET].salt_len);
|
||||
|
||||
sha384_hmac_final (&hmac_ctx);
|
||||
|
||||
const u32 r0 = l32_from_64 (hmac_ctx.opad.h[1]);
|
||||
const u32 r1 = h32_from_64 (hmac_ctx.opad.h[1]);
|
||||
const u32 r2 = l32_from_64 (hmac_ctx.opad.h[0]);
|
||||
const u32 r3 = h32_from_64 (hmac_ctx.opad.h[0]);
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
495
OpenCL/m27300-pure.cl
Normal file
495
OpenCL/m27300-pure.cl
Normal file
@ -0,0 +1,495 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
//#define NEW_SIMD_CODE
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include "inc_vendor.h"
|
||||
#include "inc_types.h"
|
||||
#include "inc_platform.cl"
|
||||
#include "inc_common.cl"
|
||||
#include "inc_simd.cl"
|
||||
#include "inc_hash_sha512.cl"
|
||||
#endif
|
||||
|
||||
#define COMPARE_S "inc_comp_single.cl"
|
||||
#define COMPARE_M "inc_comp_multi.cl"
|
||||
|
||||
#define SNMPV3_SALT_MAX 1500
|
||||
#define SNMPV3_ENGINEID_MAX 34
|
||||
#define SNMPV3_MSG_AUTH_PARAMS_MAX 48
|
||||
#define SNMPV3_ROUNDS 1048576
|
||||
#define SNMPV3_MAX_PW_LENGTH 128
|
||||
|
||||
#define SNMPV3_TMP_ELEMS 8192 // 8192 = (256 (max pw length) * SNMPV3_MAX_PW_LENGTH) / sizeof (u32)
|
||||
#define SNMPV3_HASH_ELEMS 8
|
||||
|
||||
#define SNMPV3_MAX_SALT_ELEMS 512 // 512 * 4 = 2048 > 1500, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 32 // 32 * 4 = 128 > 34, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
#define SNMPV3_MAX_PW_LENGTH_OPT 32
|
||||
#define SNMPV3_TMP_ELEMS_OPT ((SNMPV3_MAX_PW_LENGTH_OPT * SNMPV3_MAX_PW_LENGTH) / 4)
|
||||
// (32 * 128) / 4 = 1024
|
||||
// for pw length > 32 we use global memory reads
|
||||
|
||||
typedef struct hmac_sha512_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
u64 h[SNMPV3_HASH_ELEMS];
|
||||
|
||||
} hmac_sha512_tmp_t;
|
||||
|
||||
typedef struct snmpv3
|
||||
{
|
||||
u32 salt_buf[SNMPV3_MAX_SALT_ELEMS];
|
||||
u32 salt_len;
|
||||
|
||||
u32 engineID_buf[SNMPV3_MAX_ENGINE_ELEMS];
|
||||
u32 engineID_len;
|
||||
|
||||
u32 packet_number[SNMPV3_MAX_PNUM_ELEMS];
|
||||
|
||||
} snmpv3_t;
|
||||
|
||||
KERNEL_FQ void m27300_init (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
u32 w[128] = { 0 };
|
||||
|
||||
for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1)
|
||||
{
|
||||
w[idx] = pws[gid].i[idx];
|
||||
}
|
||||
|
||||
u8 *src_ptr = (u8 *) w;
|
||||
|
||||
// password 128 times, also swapped
|
||||
|
||||
u32 dst_buf[32];
|
||||
|
||||
u8 *dst_ptr = (u8 *) dst_buf;
|
||||
|
||||
int tmp_idx = 0;
|
||||
|
||||
for (int i = 0; i < 128; i++)
|
||||
{
|
||||
for (u32 j = 0; j < pw_len; j++)
|
||||
{
|
||||
const int dst_idx = tmp_idx & 127;
|
||||
|
||||
dst_ptr[dst_idx] = src_ptr[j];
|
||||
|
||||
// write to global memory every time 64 byte are written into cache
|
||||
|
||||
if (dst_idx == 127)
|
||||
{
|
||||
const int tmp_idx4 = (tmp_idx - 127) / 4;
|
||||
|
||||
tmps[gid].tmp[tmp_idx4 + 0] = hc_swap32_S (dst_buf[ 0]);
|
||||
tmps[gid].tmp[tmp_idx4 + 1] = hc_swap32_S (dst_buf[ 1]);
|
||||
tmps[gid].tmp[tmp_idx4 + 2] = hc_swap32_S (dst_buf[ 2]);
|
||||
tmps[gid].tmp[tmp_idx4 + 3] = hc_swap32_S (dst_buf[ 3]);
|
||||
tmps[gid].tmp[tmp_idx4 + 4] = hc_swap32_S (dst_buf[ 4]);
|
||||
tmps[gid].tmp[tmp_idx4 + 5] = hc_swap32_S (dst_buf[ 5]);
|
||||
tmps[gid].tmp[tmp_idx4 + 6] = hc_swap32_S (dst_buf[ 6]);
|
||||
tmps[gid].tmp[tmp_idx4 + 7] = hc_swap32_S (dst_buf[ 7]);
|
||||
tmps[gid].tmp[tmp_idx4 + 8] = hc_swap32_S (dst_buf[ 8]);
|
||||
tmps[gid].tmp[tmp_idx4 + 9] = hc_swap32_S (dst_buf[ 9]);
|
||||
tmps[gid].tmp[tmp_idx4 + 10] = hc_swap32_S (dst_buf[10]);
|
||||
tmps[gid].tmp[tmp_idx4 + 11] = hc_swap32_S (dst_buf[11]);
|
||||
tmps[gid].tmp[tmp_idx4 + 12] = hc_swap32_S (dst_buf[12]);
|
||||
tmps[gid].tmp[tmp_idx4 + 13] = hc_swap32_S (dst_buf[13]);
|
||||
tmps[gid].tmp[tmp_idx4 + 14] = hc_swap32_S (dst_buf[14]);
|
||||
tmps[gid].tmp[tmp_idx4 + 15] = hc_swap32_S (dst_buf[15]);
|
||||
tmps[gid].tmp[tmp_idx4 + 16] = hc_swap32_S (dst_buf[16]);
|
||||
tmps[gid].tmp[tmp_idx4 + 17] = hc_swap32_S (dst_buf[17]);
|
||||
tmps[gid].tmp[tmp_idx4 + 18] = hc_swap32_S (dst_buf[18]);
|
||||
tmps[gid].tmp[tmp_idx4 + 19] = hc_swap32_S (dst_buf[19]);
|
||||
tmps[gid].tmp[tmp_idx4 + 20] = hc_swap32_S (dst_buf[20]);
|
||||
tmps[gid].tmp[tmp_idx4 + 21] = hc_swap32_S (dst_buf[21]);
|
||||
tmps[gid].tmp[tmp_idx4 + 22] = hc_swap32_S (dst_buf[22]);
|
||||
tmps[gid].tmp[tmp_idx4 + 23] = hc_swap32_S (dst_buf[23]);
|
||||
tmps[gid].tmp[tmp_idx4 + 24] = hc_swap32_S (dst_buf[24]);
|
||||
tmps[gid].tmp[tmp_idx4 + 25] = hc_swap32_S (dst_buf[25]);
|
||||
tmps[gid].tmp[tmp_idx4 + 26] = hc_swap32_S (dst_buf[26]);
|
||||
tmps[gid].tmp[tmp_idx4 + 27] = hc_swap32_S (dst_buf[27]);
|
||||
tmps[gid].tmp[tmp_idx4 + 28] = hc_swap32_S (dst_buf[28]);
|
||||
tmps[gid].tmp[tmp_idx4 + 29] = hc_swap32_S (dst_buf[29]);
|
||||
tmps[gid].tmp[tmp_idx4 + 30] = hc_swap32_S (dst_buf[30]);
|
||||
tmps[gid].tmp[tmp_idx4 + 31] = hc_swap32_S (dst_buf[31]);
|
||||
}
|
||||
|
||||
tmp_idx++;
|
||||
}
|
||||
}
|
||||
|
||||
// hash
|
||||
|
||||
tmps[gid].h[0] = SHA512M_A;
|
||||
tmps[gid].h[1] = SHA512M_B;
|
||||
tmps[gid].h[2] = SHA512M_C;
|
||||
tmps[gid].h[3] = SHA512M_D;
|
||||
tmps[gid].h[4] = SHA512M_E;
|
||||
tmps[gid].h[5] = SHA512M_F;
|
||||
tmps[gid].h[6] = SHA512M_G;
|
||||
tmps[gid].h[7] = SHA512M_H;
|
||||
}
|
||||
|
||||
KERNEL_FQ void m27300_loop (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* base
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
u64 h[8];
|
||||
|
||||
h[0] = tmps[gid].h[0];
|
||||
h[1] = tmps[gid].h[1];
|
||||
h[2] = tmps[gid].h[2];
|
||||
h[3] = tmps[gid].h[3];
|
||||
h[4] = tmps[gid].h[4];
|
||||
h[5] = tmps[gid].h[5];
|
||||
h[6] = tmps[gid].h[6];
|
||||
h[7] = tmps[gid].h[7];
|
||||
|
||||
const u32 pw_len = pws[gid].pw_len;
|
||||
|
||||
const int pw_len128 = pw_len * 128;
|
||||
|
||||
if (pw_len <= SNMPV3_MAX_PW_LENGTH_OPT)
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS_OPT];
|
||||
|
||||
for (int i = 0; i < pw_len128 / 4; i++)
|
||||
{
|
||||
tmp[i] = tmps[gid].tmp[i];
|
||||
}
|
||||
|
||||
for (u32 i = 0, j = loop_pos; i < loop_cnt; i += 128, j += 128)
|
||||
{
|
||||
const int idx = (j % pw_len128) / 4; // the optimization trick is to be able to do this
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = tmp[idx + 0];
|
||||
w0[1] = tmp[idx + 1];
|
||||
w0[2] = tmp[idx + 2];
|
||||
w0[3] = tmp[idx + 3];
|
||||
w1[0] = tmp[idx + 4];
|
||||
w1[1] = tmp[idx + 5];
|
||||
w1[2] = tmp[idx + 6];
|
||||
w1[3] = tmp[idx + 7];
|
||||
w2[0] = tmp[idx + 8];
|
||||
w2[1] = tmp[idx + 9];
|
||||
w2[2] = tmp[idx + 10];
|
||||
w2[3] = tmp[idx + 11];
|
||||
w3[0] = tmp[idx + 12];
|
||||
w3[1] = tmp[idx + 13];
|
||||
w3[2] = tmp[idx + 14];
|
||||
w3[3] = tmp[idx + 15];
|
||||
w4[0] = tmp[idx + 16];
|
||||
w4[1] = tmp[idx + 17];
|
||||
w4[2] = tmp[idx + 18];
|
||||
w4[3] = tmp[idx + 19];
|
||||
w5[0] = tmp[idx + 20];
|
||||
w5[1] = tmp[idx + 21];
|
||||
w5[2] = tmp[idx + 22];
|
||||
w5[3] = tmp[idx + 23];
|
||||
w6[0] = tmp[idx + 24];
|
||||
w6[1] = tmp[idx + 25];
|
||||
w6[2] = tmp[idx + 26];
|
||||
w6[3] = tmp[idx + 27];
|
||||
w7[0] = tmp[idx + 28];
|
||||
w7[1] = tmp[idx + 29];
|
||||
w7[2] = tmp[idx + 30];
|
||||
w7[3] = tmp[idx + 31];
|
||||
|
||||
sha512_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (u32 i = 0, j = loop_pos; i < loop_cnt; i += 128, j += 128)
|
||||
{
|
||||
const int idx = (j % pw_len128) / 4; // the optimization trick is to be able to do this
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = tmps[gid].tmp[idx + 0];
|
||||
w0[1] = tmps[gid].tmp[idx + 1];
|
||||
w0[2] = tmps[gid].tmp[idx + 2];
|
||||
w0[3] = tmps[gid].tmp[idx + 3];
|
||||
w1[0] = tmps[gid].tmp[idx + 4];
|
||||
w1[1] = tmps[gid].tmp[idx + 5];
|
||||
w1[2] = tmps[gid].tmp[idx + 6];
|
||||
w1[3] = tmps[gid].tmp[idx + 7];
|
||||
w2[0] = tmps[gid].tmp[idx + 8];
|
||||
w2[1] = tmps[gid].tmp[idx + 9];
|
||||
w2[2] = tmps[gid].tmp[idx + 10];
|
||||
w2[3] = tmps[gid].tmp[idx + 11];
|
||||
w3[0] = tmps[gid].tmp[idx + 12];
|
||||
w3[1] = tmps[gid].tmp[idx + 13];
|
||||
w3[2] = tmps[gid].tmp[idx + 14];
|
||||
w3[3] = tmps[gid].tmp[idx + 15];
|
||||
w4[0] = tmps[gid].tmp[idx + 16];
|
||||
w4[1] = tmps[gid].tmp[idx + 17];
|
||||
w4[2] = tmps[gid].tmp[idx + 18];
|
||||
w4[3] = tmps[gid].tmp[idx + 19];
|
||||
w5[0] = tmps[gid].tmp[idx + 20];
|
||||
w5[1] = tmps[gid].tmp[idx + 21];
|
||||
w5[2] = tmps[gid].tmp[idx + 22];
|
||||
w5[3] = tmps[gid].tmp[idx + 23];
|
||||
w6[0] = tmps[gid].tmp[idx + 24];
|
||||
w6[1] = tmps[gid].tmp[idx + 25];
|
||||
w6[2] = tmps[gid].tmp[idx + 26];
|
||||
w6[3] = tmps[gid].tmp[idx + 27];
|
||||
w7[0] = tmps[gid].tmp[idx + 28];
|
||||
w7[1] = tmps[gid].tmp[idx + 29];
|
||||
w7[2] = tmps[gid].tmp[idx + 30];
|
||||
w7[3] = tmps[gid].tmp[idx + 31];
|
||||
|
||||
sha512_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
}
|
||||
}
|
||||
|
||||
tmps[gid].h[0] = h[0];
|
||||
tmps[gid].h[1] = h[1];
|
||||
tmps[gid].h[2] = h[2];
|
||||
tmps[gid].h[3] = h[3];
|
||||
tmps[gid].h[4] = h[4];
|
||||
tmps[gid].h[5] = h[5];
|
||||
tmps[gid].h[6] = h[6];
|
||||
tmps[gid].h[7] = h[7];
|
||||
}
|
||||
|
||||
KERNEL_FQ void m27300_comp (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t))
|
||||
{
|
||||
/**
|
||||
* modifier
|
||||
*/
|
||||
|
||||
const u64 gid = get_global_id (0);
|
||||
|
||||
if (gid >= gid_max) return;
|
||||
|
||||
u32 w0[4];
|
||||
u32 w1[4];
|
||||
u32 w2[4];
|
||||
u32 w3[4];
|
||||
u32 w4[4];
|
||||
u32 w5[4];
|
||||
u32 w6[4];
|
||||
u32 w7[4];
|
||||
|
||||
w0[0] = 0x80000000;
|
||||
w0[1] = 0;
|
||||
w0[2] = 0;
|
||||
w0[3] = 0;
|
||||
w1[0] = 0;
|
||||
w1[1] = 0;
|
||||
w1[2] = 0;
|
||||
w1[3] = 0;
|
||||
w2[0] = 0;
|
||||
w2[1] = 0;
|
||||
w2[2] = 0;
|
||||
w2[3] = 0;
|
||||
w3[0] = 0;
|
||||
w3[1] = 0;
|
||||
w3[2] = 0;
|
||||
w3[3] = 0;
|
||||
w4[0] = 0;
|
||||
w4[1] = 0;
|
||||
w4[2] = 0;
|
||||
w4[3] = 0;
|
||||
w5[0] = 0;
|
||||
w5[1] = 0;
|
||||
w5[2] = 0;
|
||||
w5[3] = 0;
|
||||
w6[0] = 0;
|
||||
w6[1] = 0;
|
||||
w6[2] = 0;
|
||||
w6[3] = 0;
|
||||
w7[0] = 0;
|
||||
w7[1] = 0;
|
||||
w7[2] = 0;
|
||||
w7[3] = 1048576 * 8;
|
||||
|
||||
u64 h[8];
|
||||
|
||||
h[0] = tmps[gid].h[0];
|
||||
h[1] = tmps[gid].h[1];
|
||||
h[2] = tmps[gid].h[2];
|
||||
h[3] = tmps[gid].h[3];
|
||||
h[4] = tmps[gid].h[4];
|
||||
h[5] = tmps[gid].h[5];
|
||||
h[6] = tmps[gid].h[6];
|
||||
h[7] = tmps[gid].h[7];
|
||||
|
||||
sha512_transform (w0, w1, w2, w3, w4, w5, w6, w7, h);
|
||||
|
||||
sha512_ctx_t ctx;
|
||||
|
||||
sha512_init (&ctx);
|
||||
|
||||
u32 w[32];
|
||||
|
||||
w[ 0] = h32_from_64_S (h[0]);
|
||||
w[ 1] = l32_from_64_S (h[0]);
|
||||
w[ 2] = h32_from_64_S (h[1]);
|
||||
w[ 3] = l32_from_64_S (h[1]);
|
||||
w[ 4] = h32_from_64_S (h[2]);
|
||||
w[ 5] = l32_from_64_S (h[2]);
|
||||
w[ 6] = h32_from_64_S (h[3]);
|
||||
w[ 7] = l32_from_64_S (h[3]);
|
||||
w[ 8] = h32_from_64_S (h[4]);
|
||||
w[ 9] = l32_from_64_S (h[4]);
|
||||
w[10] = h32_from_64_S (h[5]);
|
||||
w[11] = l32_from_64_S (h[5]);
|
||||
w[12] = h32_from_64_S (h[6]);
|
||||
w[13] = l32_from_64_S (h[6]);
|
||||
w[14] = h32_from_64_S (h[7]);
|
||||
w[15] = l32_from_64_S (h[7]);
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha512_update (&ctx, w, 64);
|
||||
|
||||
sha512_update_global_swap (&ctx, esalt_bufs[DIGESTS_OFFSET].engineID_buf, esalt_bufs[DIGESTS_OFFSET].engineID_len);
|
||||
|
||||
w[ 0] = h32_from_64_S (h[0]);
|
||||
w[ 1] = l32_from_64_S (h[0]);
|
||||
w[ 2] = h32_from_64_S (h[1]);
|
||||
w[ 3] = l32_from_64_S (h[1]);
|
||||
w[ 4] = h32_from_64_S (h[2]);
|
||||
w[ 5] = l32_from_64_S (h[2]);
|
||||
w[ 6] = h32_from_64_S (h[3]);
|
||||
w[ 7] = l32_from_64_S (h[3]);
|
||||
w[ 8] = h32_from_64_S (h[4]);
|
||||
w[ 9] = l32_from_64_S (h[4]);
|
||||
w[10] = h32_from_64_S (h[5]);
|
||||
w[11] = l32_from_64_S (h[5]);
|
||||
w[12] = h32_from_64_S (h[6]);
|
||||
w[13] = l32_from_64_S (h[6]);
|
||||
w[14] = h32_from_64_S (h[7]);
|
||||
w[15] = l32_from_64_S (h[7]);
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha512_update (&ctx, w, 64);
|
||||
|
||||
sha512_final (&ctx);
|
||||
|
||||
w[ 0] = h32_from_64_S (ctx.h[0]);
|
||||
w[ 1] = l32_from_64_S (ctx.h[0]);
|
||||
w[ 2] = h32_from_64_S (ctx.h[1]);
|
||||
w[ 3] = l32_from_64_S (ctx.h[1]);
|
||||
w[ 4] = h32_from_64_S (ctx.h[2]);
|
||||
w[ 5] = l32_from_64_S (ctx.h[2]);
|
||||
w[ 6] = h32_from_64_S (ctx.h[3]);
|
||||
w[ 7] = l32_from_64_S (ctx.h[3]);
|
||||
w[ 8] = h32_from_64_S (ctx.h[4]);
|
||||
w[ 9] = l32_from_64_S (ctx.h[4]);
|
||||
w[10] = h32_from_64_S (ctx.h[5]);
|
||||
w[11] = l32_from_64_S (ctx.h[5]);
|
||||
w[12] = h32_from_64_S (ctx.h[6]);
|
||||
w[13] = l32_from_64_S (ctx.h[6]);
|
||||
w[14] = h32_from_64_S (ctx.h[7]);
|
||||
w[15] = l32_from_64_S (ctx.h[7]);
|
||||
w[16] = 0;
|
||||
w[17] = 0;
|
||||
w[18] = 0;
|
||||
w[19] = 0;
|
||||
w[20] = 0;
|
||||
w[21] = 0;
|
||||
w[22] = 0;
|
||||
w[23] = 0;
|
||||
w[24] = 0;
|
||||
w[25] = 0;
|
||||
w[26] = 0;
|
||||
w[27] = 0;
|
||||
w[28] = 0;
|
||||
w[29] = 0;
|
||||
w[30] = 0;
|
||||
w[31] = 0;
|
||||
|
||||
sha512_hmac_ctx_t hmac_ctx;
|
||||
|
||||
sha512_hmac_init (&hmac_ctx, w, 64);
|
||||
|
||||
sha512_hmac_update_global_swap (&hmac_ctx, esalt_bufs[DIGESTS_OFFSET].salt_buf, esalt_bufs[DIGESTS_OFFSET].salt_len);
|
||||
|
||||
sha512_hmac_final (&hmac_ctx);
|
||||
|
||||
const u32 r0 = l32_from_64 (hmac_ctx.opad.h[1]);
|
||||
const u32 r1 = h32_from_64 (hmac_ctx.opad.h[1]);
|
||||
const u32 r2 = l32_from_64 (hmac_ctx.opad.h[0]);
|
||||
const u32 r3 = h32_from_64 (hmac_ctx.opad.h[0]);
|
||||
|
||||
#define il_pos 0
|
||||
|
||||
#ifdef KERNEL_STATIC
|
||||
#include COMPARE_M
|
||||
#endif
|
||||
}
|
@ -4,48 +4,64 @@
|
||||
## Features
|
||||
##
|
||||
|
||||
- Added option --multiply-accel-disable (short: -M) to disable multiply the kernel-accel with the multiprocessor count automatism
|
||||
- HIP Backend: Added support to support HIP 4.4 and later, but added check to rule out older versions because they are incompatible
|
||||
- Added option --multiply-accel-disable (short: -M) to disable multiplying of the kernel accel with the multiprocessor count
|
||||
- Added rule function '3' to change the case of the first letter after the occurrence of N of character X
|
||||
- Added support for auto tuning --kernel-threads (-T) at startup
|
||||
- Added support for HIP version 4.3 or later and removed support for older HIP versions as they are not compatible
|
||||
|
||||
##
|
||||
## Bugs
|
||||
##
|
||||
|
||||
- Fixed buffer overflow in Stargazer Stellar Wallet XLM module in hash_encode() if a hash was cracked
|
||||
- Fixed autotune unitialized tmps variable for slow hashes by calling _init kernel before calling _loop kernel
|
||||
- Fixed datatype in function sha384_hmac_init_vector_128() that could come into effect if vector datatype was manually set
|
||||
- Fixed false negative in all VeraCrypt hash-modes if both conditions are met: 1. use CPU for cracking and 2. PIM range was used
|
||||
- Fixed multiple buffer overflow in DPAPI masterkey file v1 and v2 module
|
||||
- Fixed out-of-boundary read in input_tokenizer() if the signature in the hash is longer than the length of the plugins' signature constant
|
||||
- Fixed out-of-boundary read in Stuffit5 module in hash_decode()
|
||||
- Fixed broken support for --generate-rules-func-min which was ignored under certain conditions
|
||||
- Fixed buffer overflow in DPAPI masterkey file v1/v2 module in hash_encode() and hash_decode()
|
||||
- Fixed buffer overflow in Stargazer Stellar Wallet XLM module in hash_encode() when a hash was cracked
|
||||
- Fixed false negative in all VeraCrypt hash modes if both conditions are met: 1. Use CPU for cracking and 2. PIM area was used
|
||||
- Fixed invalid data type in the sha384_hmac_init_vector_128() function that take effect if the vector data type was specified manually
|
||||
- Fixed out-of-boundary read in input_tokenizer() if the signature in the hash is longer than the length of the plugin's signature constant
|
||||
- Fixed out-of-boundary read in the Stuffit5 module in hash_decode()
|
||||
- Fixed random rule generator option --generate-rules-func-min by fixing switch() case to not select a not existing option group type
|
||||
- Fixed syntax check of HAS_VPERM macro in several kernel includes causing invalid error message for AMD GPUs on Windows
|
||||
- Fixed uninitialized tmps variable in autotune for slow hashes by calling _init and _prepare kernel before calling _loop kernel
|
||||
|
||||
##
|
||||
## Improvements
|
||||
## Performance
|
||||
##
|
||||
|
||||
- AMD GPUs: Add inline assembly code for md5crypt/sha256crypt, PDF 1.7, 7-Zip, RAR3, Samsung Android and Windows Phone 8+
|
||||
- AMD GPUs: On Apple OpenCL platform, we ask for the preferred kernel thread size rather than hard-coding 32
|
||||
- Blake Kernels: Optimize BLAKE2B_ROUND() 64 bit rotates giving a 5% performance increase
|
||||
- Blowfish Kernels: Backport optimizations reducing bank conflicts from bcrypt to Password Safe v2 and Open Document Format (ODF) 1.1
|
||||
- Brain Session: Adds hashconfig specific opti_type and opts_type parameters to hashcat session computation to cover features like -O and -M
|
||||
- Kernel Threads: Use warp size / wavefront size query instead of hardcoded values as base for kernel threads
|
||||
- Shared Memory: Calculate kernel dynamic memory size based on CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN
|
||||
- Slow Kernels: Set some of the slowest kernels to OPTS_TYPE_MP_MULTI_DISABLE
|
||||
- AMD GPUs: Add inline assembly code for md5crypt, sha256crypt, PDF 1.7, 7-Zip, RAR3, Samsung Android and Windows Phone 8+
|
||||
- AMD GPUs: On the Apple OpenCL platform, we ask for the preferred kernel thread size rather than hard-coding 32
|
||||
- Backend Interface: Replace most of the blocking Compute API functions with asynchronous ones to improve GPU utilization
|
||||
- Blake Kernels: Optimize 3/4 BLAKE2B_ROUND() 64-bit rotations with inline assembly hc_byte_perm_S() calls
|
||||
- Blowfish Kernels: Backport optimizations to reduce bank conflicts from bcrypt to Password Safe v2 and Open Document Format (ODF) 1.1
|
||||
- ECC secp256k1: The inline assembly code for AMD GPUs has been removed as the latest JIT compilers optimize it with the same efficiency
|
||||
- HIP Kernels: Enable vector data types for HIP kernels for functionality and performance
|
||||
- Kernel threads: Use warp size / wavefront size query instead of hard-coded values as the basis for kernel threads
|
||||
- SCRYPT Kernels: Improve Hashcat.hctune entries for many NV and AMD GPUs for hash mode 8900, 9300, 15700 and 22700
|
||||
- Tuning Database: Add new module function module_extra_tuningdb_block() to extend hashcat.hctune content from a module
|
||||
|
||||
##
|
||||
## Technical
|
||||
##
|
||||
|
||||
- ADL: Updated support for AMD Display Library to 15.0, updated datatypes and added support for OverDrive 7 and 8 based GPUs
|
||||
- AMD Driver: Updated requirement for AMD Linux driver to ROCm 4.4 or later because of new HIP Interface
|
||||
- AMD Driver: Updated requirement for AMD Windows driver to Adrenalin 21.2.1 or later because of new ADL library
|
||||
- Commandline: Throw an error if separator character given by the user with -p option is not exactly 1 byte
|
||||
- ECC secp256k1: Removed the inline assembly code for AMD GPUs because the latest JIT compilers optimize it with the same efficiency
|
||||
- HIP Kernels: Got rid of hip/hip_runtime.h dependancy to enable more easy integration of the HIP backend on Windows
|
||||
- Kernel Cache: Add kernel threads into hash computation which is later used in the kernel cache filename
|
||||
- Memory Management: Refactored the code responsible for limiting kernel accel in order to avoid out of -host- memory situations
|
||||
- SCRYPT Kernels: Add more optimized values for some new NV/AMD GPUs
|
||||
- 7-Zip Hook: Increase supported data length from 320kb to 8mb
|
||||
- 7-Zip Hook: Increase the supported data length from 320kb to 8mb
|
||||
- ADL: Updated support for AMD Display Library to 15.0, updated data types
|
||||
- AMD Driver: Updated requirements for AMD Linux drivers to ROCm 4.3 or later due to new HIP interface
|
||||
- AMD Driver: Updated requirements for AMD Windows drivers to Adrenalin 21.2.1 or later due to new ADL library
|
||||
- Backend Interface: Implement gpu_bzero() as a gpu_memset() replacement, since all gpu_memset() operations used 0 as the value
|
||||
- Backend Interface: Improve the query kernel's dynamic memory size based on DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN instead of BF
|
||||
- Brain Session: Adds hashconfig-specific opti_type and opts_type parameters to the session calculation to enable cover functions like -O
|
||||
- Commandline: Throw an error if the separator specified by the user with the -p option is not exactly 1 byte
|
||||
- Constants: Make const char * pointers actually const char * const pointers
|
||||
- Filehandling: Use const char for fopen mode to fix -Wwrite-strings warnings
|
||||
- Hardware Monitor: Added support for OverDrive 7 and 8 based GPUs
|
||||
- HIP Kernels: Dependency on hip/hip runtime.h has been removed to enable easier integration of the HIP backend under Windows
|
||||
- Kernel cache: Add kernel threads for hash calculation, which will later be used in the file name of the kernel cache
|
||||
- Memory Management: Refactored the code responsible for limiting kernel accel with the goal to avoid low host memory situations
|
||||
- OpenCL Runtime: Workaround for Intel OpenCL runtime: segmentation fault when compiling hc_enc_next() / hc_enc_next_global()
|
||||
- RC4 Kernels: Use improved native thread derivation for RC4-based hash modes 7500, 13100, 18200, 25400
|
||||
- Shared Memory: Calculate the dynamic memory size of the kernel based on CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN
|
||||
- Slow kernels: Set some of the slowest kernels to OPTS_TYPE_MP_MULTI_DISABLE to make it easier to handle small word lists
|
||||
- Vendor Discovery: Add "Intel" as a valid vendor name for GPUs on macOS
|
||||
|
||||
##
|
||||
## Algorithms
|
||||
@ -56,6 +72,8 @@
|
||||
- Added hash-mode: SNMPv3 HMAC-SHA1-96
|
||||
- Added hash-mode: SNMPv3 HMAC-SHA224-128
|
||||
- Added hash-mode: SNMPv3 HMAC-SHA256-192
|
||||
- Added hash-mode: SNMPv3 HMAC-SHA384-256
|
||||
- Added hash-mode: SNMPv3 HMAC-SHA512-384
|
||||
|
||||
* changes v6.2.2 -> v6.2.3
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
hashcat v6.2.3
|
||||
==============
|
||||
|
||||
AMD GPUs on Linux require "AMD ROCm" (4.4 or later)
|
||||
AMD GPUs on Linux require "AMD ROCm" (4.3 or later)
|
||||
AMD GPUs on Windows require "AMD Radeon Adrenalin 2020 Edition" (21.2.1 or later)
|
||||
Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
|
||||
NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or later)
|
||||
@ -158,8 +158,10 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or
|
||||
- SNMPv3 HMAC-MD5-96/HMAC-SHA1-96
|
||||
- SNMPv3 HMAC-MD5-96
|
||||
- SNMPv3 HMAC-SHA1-96
|
||||
- SNMPv3 HMAC-SHA256-192
|
||||
- SNMPv3 HMAC-SHA224-128
|
||||
- SNMPv3 HMAC-SHA256-192
|
||||
- SNMPv3 HMAC-SHA384-256
|
||||
- SNMPv3 HMAC-SHA512-384
|
||||
- WPA-EAPOL-PBKDF2
|
||||
- WPA-EAPOL-PMK
|
||||
- WPA-PBKDF2-PMKID+EAPOL
|
||||
|
@ -128,6 +128,7 @@ int hc_hipModuleGetFunction (hashcat_ctx_t *hashcat_ctx, hipFunction_t *hfu
|
||||
int hc_hipModuleGetGlobal (hashcat_ctx_t *hashcat_ctx, hipDeviceptr_t *dptr, size_t *bytes, hipModule_t hmod, const char *name);
|
||||
int hc_hipModuleLoadDataEx (hashcat_ctx_t *hashcat_ctx, hipModule_t *module, const void *image, unsigned int numOptions, hipJitOption *options, void **optionValues);
|
||||
int hc_hipModuleUnload (hashcat_ctx_t *hashcat_ctx, hipModule_t hmod);
|
||||
int hc_hipRuntimeGetVersion (hashcat_ctx_t *hashcat_ctx, int *runtimeVersion);
|
||||
int hc_hipStreamCreate (hashcat_ctx_t *hashcat_ctx, hipStream_t *phStream, unsigned int Flags);
|
||||
int hc_hipStreamDestroy (hashcat_ctx_t *hashcat_ctx, hipStream_t hStream);
|
||||
int hc_hipStreamSynchronize (hashcat_ctx_t *hashcat_ctx, hipStream_t hStream);
|
||||
|
@ -344,7 +344,6 @@ typedef enum hipJitOption {
|
||||
|
||||
// stop: hip_runtime_api.h
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#define HIPAPI __stdcall
|
||||
#else
|
||||
@ -387,6 +386,7 @@ typedef hipError_t (HIP_API_CALL *HIP_HIPMODULEGETFUNCTION) (hipFunction_t
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPMODULEGETGLOBAL) (hipDeviceptr_t *, size_t *, hipModule_t, const char *);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPMODULELOADDATAEX) (hipModule_t *, const void *, unsigned int, hipJitOption *, void **);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPMODULEUNLOAD) (hipModule_t);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPRUNTIMEGETVERSION) (int *);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMCREATE) (hipStream_t *, unsigned int);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMDESTROY) (hipStream_t);
|
||||
typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMSYNCHRONIZE) (hipStream_t);
|
||||
@ -429,6 +429,7 @@ typedef struct hc_hip_lib
|
||||
HIP_HIPMODULEGETGLOBAL hipModuleGetGlobal;
|
||||
HIP_HIPMODULELOADDATAEX hipModuleLoadDataEx;
|
||||
HIP_HIPMODULEUNLOAD hipModuleUnload;
|
||||
HIP_HIPRUNTIMEGETVERSION hipRuntimeGetVersion;
|
||||
HIP_HIPSTREAMCREATE hipStreamCreate;
|
||||
HIP_HIPSTREAMDESTROY hipStreamDestroy;
|
||||
HIP_HIPSTREAMSYNCHRONIZE hipStreamSynchronize;
|
||||
|
@ -464,6 +464,8 @@ typedef enum dgst_size
|
||||
DGST_SIZE_4_32 = (32 * sizeof (u32)), // 128 !!!
|
||||
DGST_SIZE_4_64 = (64 * sizeof (u32)), // 256
|
||||
DGST_SIZE_8_2 = (2 * sizeof (u64)), // 16 !!!
|
||||
DGST_SIZE_8_4 = (4 * sizeof (u64)), // 32 !!!
|
||||
DGST_SIZE_8_6 = (6 * sizeof (u64)), // 48 !!!
|
||||
DGST_SIZE_8_8 = (8 * sizeof (u64)), // 64 !!!
|
||||
DGST_SIZE_8_16 = (16 * sizeof (u64)), // 128 !!!
|
||||
DGST_SIZE_8_25 = (25 * sizeof (u64)) // 200
|
||||
@ -1728,6 +1730,7 @@ typedef struct backend_ctx
|
||||
int rc_hip_init;
|
||||
int rc_hiprtc_init;
|
||||
|
||||
int hip_runtimeVersion;
|
||||
int hip_driverVersion;
|
||||
|
||||
// opencl
|
||||
|
116
src/backend.c
116
src/backend.c
@ -2434,9 +2434,6 @@ int hip_init (hashcat_ctx_t *hashcat_ctx)
|
||||
hip->lib = hc_dlopen ("amdhip64.dll");
|
||||
#else
|
||||
hip->lib = hc_dlopen ("libamdhip64.so");
|
||||
|
||||
//TODO: grab the 4 from the major RT version
|
||||
if (hip->lib == NULL) hip->lib = hc_dlopen ("libamdhip64.so.4.2.40200");
|
||||
#endif
|
||||
|
||||
if (hip->lib == NULL) return -1;
|
||||
@ -2498,6 +2495,7 @@ int hip_init (hashcat_ctx_t *hashcat_ctx)
|
||||
HC_LOAD_FUNC_HIP (hip, hipModuleGetGlobal, hipModuleGetGlobal, HIP_HIPMODULEGETGLOBAL, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipModuleLoadDataEx, hipModuleLoadDataEx, HIP_HIPMODULELOADDATAEX, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipModuleUnload, hipModuleUnload, HIP_HIPMODULEUNLOAD, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipRuntimeGetVersion, hipRuntimeGetVersion, HIP_HIPRUNTIMEGETVERSION, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipStreamCreate, hipStreamCreate, HIP_HIPSTREAMCREATE, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipStreamDestroy, hipStreamDestroy, HIP_HIPSTREAMDESTROY, HIP, 1);
|
||||
HC_LOAD_FUNC_HIP (hip, hipStreamSynchronize, hipStreamSynchronize, HIP_HIPSTREAMSYNCHRONIZE, HIP, 1);
|
||||
@ -3388,6 +3386,33 @@ int hc_hipModuleUnload (hashcat_ctx_t *hashcat_ctx, hipModule_t hmod)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hc_hipRuntimeGetVersion (hashcat_ctx_t *hashcat_ctx, int *runtimeVersion)
|
||||
{
|
||||
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
||||
|
||||
HIP_PTR *hip = (HIP_PTR *) backend_ctx->hip;
|
||||
|
||||
const hipError_t HIP_err = hip->hipRuntimeGetVersion (runtimeVersion);
|
||||
|
||||
if (HIP_err != hipSuccess)
|
||||
{
|
||||
const char *pStr = NULL;
|
||||
|
||||
if (hip->hipGetErrorString (HIP_err, &pStr) == hipSuccess)
|
||||
{
|
||||
event_log_error (hashcat_ctx, "hipRuntimeGetVersion(): %s", pStr);
|
||||
}
|
||||
else
|
||||
{
|
||||
event_log_error (hashcat_ctx, "hipRuntimeGetVersion(): %d", HIP_err);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hc_hipStreamCreate (hashcat_ctx_t *hashcat_ctx, hipStream_t *phStream, unsigned int Flags)
|
||||
{
|
||||
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
||||
@ -7058,23 +7083,70 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
backend_ctx->hip_driverVersion = hip_driverVersion;
|
||||
|
||||
if (hip_driverVersion < 404)
|
||||
{
|
||||
event_log_error (hashcat_ctx, "Outdated AMD HIP driver version '%d' detected!", hip_driverVersion);
|
||||
int hip_runtimeVersion;
|
||||
|
||||
event_log_warning (hashcat_ctx, "See hashcat.net for officially supported AMD HIP versions.");
|
||||
if (hc_hipRuntimeGetVersion (hashcat_ctx, &hip_runtimeVersion) == -1) return -1;
|
||||
|
||||
backend_ctx->hip_runtimeVersion = hip_runtimeVersion;
|
||||
|
||||
if (hip_runtimeVersion < 1000)
|
||||
{
|
||||
if (hip_runtimeVersion < 404)
|
||||
{
|
||||
event_log_warning (hashcat_ctx, "Unsupported AMD HIP runtime version '%d' detected! Falling back to OpenCL...", hip_runtimeVersion);
|
||||
event_log_warning (hashcat_ctx, NULL);
|
||||
|
||||
rc_hip_init = -1;
|
||||
rc_hiprtc_init = -1;
|
||||
|
||||
backend_ctx->rc_hip_init = rc_hip_init;
|
||||
backend_ctx->rc_hiprtc_init = rc_hiprtc_init;
|
||||
|
||||
backend_ctx->hip = NULL;
|
||||
backend_ctx->hiprtc = NULL;
|
||||
|
||||
// if we call this, opencl stops working?! so we just zero the pointer
|
||||
// this causes a memleak and an open filehandle but what can we do?
|
||||
// hip_close (hashcat_ctx);
|
||||
// hiprtc_close (hashcat_ctx);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// we need to wait for 4.4 to be released to continue here
|
||||
// ignore this backend
|
||||
|
||||
event_log_warning (hashcat_ctx, "Unsupported AMD HIP runtime version '%d' detected! Falling back to OpenCL...", hip_runtimeVersion);
|
||||
event_log_warning (hashcat_ctx, NULL);
|
||||
|
||||
return -1;
|
||||
rc_hip_init = -1;
|
||||
rc_hiprtc_init = -1;
|
||||
|
||||
backend_ctx->rc_hip_init = rc_hip_init;
|
||||
backend_ctx->rc_hiprtc_init = rc_hiprtc_init;
|
||||
|
||||
backend_ctx->hip = NULL;
|
||||
|
||||
// if we call this, opencl stops working?! so we just zero the pointer
|
||||
// this causes a memleak and an open filehandle but what can we do?
|
||||
// hip_close (hashcat_ctx);
|
||||
// hiprtc_close (hashcat_ctx);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rc_hip_init = -1;
|
||||
rc_hip_init = -1;
|
||||
rc_hiprtc_init = -1;
|
||||
|
||||
hip_close (hashcat_ctx);
|
||||
hiprtc_close (hashcat_ctx);
|
||||
backend_ctx->rc_hip_init = rc_hip_init;
|
||||
backend_ctx->rc_hiprtc_init = rc_hiprtc_init;
|
||||
|
||||
backend_ctx->hip = NULL;
|
||||
|
||||
// if we call this, opencl stops working?! so we just zero the pointer
|
||||
// this causes a memleak and an open filehandle but what can we do?
|
||||
// hip_close (hashcat_ctx);
|
||||
// hiprtc_close (hashcat_ctx);
|
||||
}
|
||||
}
|
||||
|
||||
@ -7110,7 +7182,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
#if defined (__linux__)
|
||||
event_log_warning (hashcat_ctx, "* AMD GPUs on Linux require this driver:");
|
||||
event_log_warning (hashcat_ctx, " \"AMD ROCm\" (4.4 or later)");
|
||||
event_log_warning (hashcat_ctx, " \"AMD ROCm\" (4.3 or later)");
|
||||
#elif defined (_WIN)
|
||||
event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this driver:");
|
||||
event_log_warning (hashcat_ctx, " \"AMD Radeon Adrenalin 2020 Edition\" (21.2.1 or later)");
|
||||
@ -7435,7 +7507,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
#if defined (__linux__)
|
||||
event_log_warning (hashcat_ctx, "* AMD GPUs on Linux require this driver:");
|
||||
event_log_warning (hashcat_ctx, " \"AMD ROCm\" (4.4 or later)");
|
||||
event_log_warning (hashcat_ctx, " \"AMD ROCm\" (4.3 or later)");
|
||||
#elif defined (_WIN)
|
||||
event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this driver:");
|
||||
event_log_warning (hashcat_ctx, " \"AMD Radeon Adrenalin 2020 Edition\" (21.2.1 or later)");
|
||||
@ -8178,14 +8250,14 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
|
||||
{
|
||||
if ((user_options->force == false) && (user_options->backend_info == false))
|
||||
{
|
||||
// HIPDA does not support query nvidia driver version, therefore no driver checks here
|
||||
// CUDA does not support query nvidia driver version, therefore no driver checks here
|
||||
// IF needed, could be retrieved using nvmlSystemGetDriverVersion()
|
||||
|
||||
if (device_param->sm_major < 5)
|
||||
{
|
||||
if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: This hardware has outdated HIPDA compute capability (%u.%u).", device_id + 1, device_param->sm_major, device_param->sm_minor);
|
||||
if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: This hardware has outdated CUDA compute capability (%u.%u).", device_id + 1, device_param->sm_major, device_param->sm_minor);
|
||||
if (user_options->quiet == false) event_log_warning (hashcat_ctx, " For modern OpenCL performance, upgrade to hardware that supports");
|
||||
if (user_options->quiet == false) event_log_warning (hashcat_ctx, " HIPDA compute capability version 5.0 (Maxwell) or higher.");
|
||||
if (user_options->quiet == false) event_log_warning (hashcat_ctx, " CUDA compute capability version 5.0 (Maxwell) or higher.");
|
||||
}
|
||||
|
||||
if (device_param->kernel_exec_timeout != 0)
|
||||
@ -10298,6 +10370,14 @@ static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_p
|
||||
|
||||
hc_asprintf (&hiprtc_options[0], "--gpu-max-threads-per-block=%d", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max);
|
||||
|
||||
/* 4.3 linux
|
||||
hiprtc_options[1] = "-I";
|
||||
hiprtc_options[2] = "/opt/rocm/hip/bin/include";
|
||||
hiprtc_options[3] = "-I";
|
||||
hiprtc_options[4] = "/opt/rocm/include";
|
||||
hiprtc_options[5] = "-I";
|
||||
*/
|
||||
|
||||
hiprtc_options[1] = "-nocudainc";
|
||||
hiprtc_options[2] = "-nocudalib";
|
||||
hiprtc_options[3] = "";
|
||||
@ -11320,7 +11400,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx)
|
||||
const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY, "%d-%d-%d-%d-%u-%s-%s-%s-%u",
|
||||
backend_ctx->comptime,
|
||||
backend_ctx->cuda_driver_version,
|
||||
backend_ctx->hip_driverVersion,
|
||||
backend_ctx->hip_runtimeVersion,
|
||||
device_param->is_opencl,
|
||||
device_param->opencl_platform_vendor_id,
|
||||
device_param->device_name,
|
||||
@ -11662,7 +11742,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx)
|
||||
const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY, "%d-%d-%d-%d-%u-%s-%s-%s-%d-%u-%u-%u-%s",
|
||||
backend_ctx->comptime,
|
||||
backend_ctx->cuda_driver_version,
|
||||
backend_ctx->hip_driverVersion,
|
||||
backend_ctx->hip_runtimeVersion,
|
||||
device_param->is_opencl,
|
||||
device_param->opencl_platform_vendor_id,
|
||||
device_param->device_name,
|
||||
|
@ -314,7 +314,8 @@ int check_hash (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, pla
|
||||
void *tmps = NULL;
|
||||
|
||||
cl_event opencl_event;
|
||||
int rc;
|
||||
|
||||
int rc = -1;
|
||||
|
||||
if (hashconfig->opts_type & OPTS_TYPE_COPY_TMPS)
|
||||
{
|
||||
@ -556,7 +557,8 @@ int check_cracked (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param)
|
||||
user_options_t *user_options = hashcat_ctx->user_options;
|
||||
|
||||
u32 num_cracked = 0;
|
||||
int rc;
|
||||
|
||||
int rc = -1;
|
||||
|
||||
if (device_param->is_cuda == true)
|
||||
{
|
||||
|
@ -129,7 +129,7 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx)
|
||||
#define CHECK_DEFINED(func) \
|
||||
if ((func) == NULL) \
|
||||
{ \
|
||||
event_log_error (hashcat_ctx, "Missing symbol definitions. Old template?"); \
|
||||
event_log_error (hashcat_ctx, "Missing symbol definitions module for in hash-mode '%d'. Old template?", user_options->hash_mode); \
|
||||
\
|
||||
return -1; \
|
||||
}
|
||||
|
382
src/modules/module_26900.c
Normal file
382
src/modules/module_26900.c
Normal file
@ -0,0 +1,382 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "modules.h"
|
||||
#include "bitops.h"
|
||||
#include "convert.h"
|
||||
#include "shared.h"
|
||||
#include "memory.h"
|
||||
#include "emu_inc_hash_sha1.h"
|
||||
|
||||
static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL;
|
||||
static const u32 DGST_POS0 = 2;
|
||||
static const u32 DGST_POS1 = 3;
|
||||
static const u32 DGST_POS2 = 0;
|
||||
static const u32 DGST_POS3 = 1;
|
||||
static const u32 DGST_SIZE = DGST_SIZE_8_4;
|
||||
static const u32 HASH_CATEGORY = HASH_CATEGORY_NETWORK_PROTOCOL;
|
||||
static const char *HASH_NAME = "SNMPv3 HMAC-SHA384-256";
|
||||
static const u64 KERN_TYPE = 26900;
|
||||
static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE
|
||||
| OPTI_TYPE_USES_BITS_64;
|
||||
static const u64 OPTS_TYPE = OPTS_TYPE_PT_GENERATE_BE;
|
||||
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
|
||||
static const char *ST_PASS = "hashcat1";
|
||||
static const char *ST_HASH = "$SNMPv3$5$45889431$3081a70201033011020455c0c85c020300ffe30401010201030450304e041180001f88808106d566db57fd600000000002011002020118040e6d61747269785f5348412d333834042000000000000000000000000000000000000000000000000000000000000000000400303d041180001f88808106d566db57fd60000000000400a226020411b3c3590201000201003018301606082b06010201010200060a2b06010401bf0803020a$80001f88808106d566db57fd60$89424907553231aaa27055f4b3b0a97c626ed4cdc4b660d903765b607af792a5";
|
||||
|
||||
u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; }
|
||||
u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; }
|
||||
u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; }
|
||||
u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; }
|
||||
u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; }
|
||||
u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; }
|
||||
u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; }
|
||||
const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; }
|
||||
u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; }
|
||||
u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; }
|
||||
u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; }
|
||||
u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; }
|
||||
const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; }
|
||||
const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; }
|
||||
|
||||
static const char *SIGNATURE_SNMPV3 = "$SNMPv3$5$";
|
||||
|
||||
#define SNMPV3_SALT_MAX 1500
|
||||
#define SNMPV3_ENGINEID_MAX 34
|
||||
#define SNMPV3_MSG_AUTH_PARAMS_LEN 32
|
||||
#define SNMPV3_ROUNDS 1048576
|
||||
#define SNMPV3_MAX_PW_LENGTH 128
|
||||
|
||||
#define SNMPV3_TMP_ELEMS 8192 // 8192 = (256 (max pw length) * SNMPV3_MAX_PW_LENGTH) / sizeof (u32)
|
||||
#define SNMPV3_HASH_ELEMS 8
|
||||
|
||||
#define SNMPV3_MAX_SALT_ELEMS 512 // 512 * 4 = 2048 > 1500, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 32 // 32 * 4 = 128 > 34, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
typedef struct hmac_sha384_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
u64 h[SNMPV3_HASH_ELEMS];
|
||||
|
||||
} hmac_sha384_tmp_t;
|
||||
|
||||
typedef struct snmpv3
|
||||
{
|
||||
u32 salt_buf[SNMPV3_MAX_SALT_ELEMS];
|
||||
u32 salt_len;
|
||||
|
||||
u32 engineID_buf[SNMPV3_MAX_ENGINE_ELEMS];
|
||||
u32 engineID_len;
|
||||
|
||||
u32 packet_number[SNMPV3_MAX_PNUM_ELEMS];
|
||||
|
||||
} snmpv3_t;
|
||||
|
||||
u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u32 pw_min = 8;
|
||||
|
||||
return pw_min;
|
||||
}
|
||||
|
||||
bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param)
|
||||
{
|
||||
if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
|
||||
{
|
||||
// self-test failed
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param)
|
||||
{
|
||||
char *jit_build_options = NULL;
|
||||
|
||||
// Extra treatment for Apple systems
|
||||
if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
|
||||
{
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
// HIP
|
||||
if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP)
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
// ROCM
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true))
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u64 esalt_size = (const u64) sizeof (snmpv3_t);
|
||||
|
||||
return esalt_size;
|
||||
}
|
||||
|
||||
u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u64 tmp_size = (const u64) sizeof (hmac_sha384_tmp_t);
|
||||
|
||||
return tmp_size;
|
||||
}
|
||||
|
||||
u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
// we need to fix iteration count to guarantee the loop count is a multiple of SNMPV3_MAX_PW_LENGTH
|
||||
// 2k calls to sha384_transform typically is enough to overtime pcie bottleneck
|
||||
|
||||
const u32 kernel_loops_min = 2048 * SNMPV3_MAX_PW_LENGTH;
|
||||
|
||||
return kernel_loops_min;
|
||||
}
|
||||
|
||||
u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u32 kernel_loops_max = 2048 * SNMPV3_MAX_PW_LENGTH;
|
||||
|
||||
return kernel_loops_max;
|
||||
}
|
||||
|
||||
int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len)
|
||||
{
|
||||
u64 *digest = (u64 *) digest_buf;
|
||||
|
||||
snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf;
|
||||
|
||||
token_t token;
|
||||
|
||||
token.token_cnt = 5;
|
||||
token.signatures_cnt = 1;
|
||||
token.signatures_buf[0] = SIGNATURE_SNMPV3;
|
||||
|
||||
token.len[0] = 10;
|
||||
token.attr[0] = TOKEN_ATTR_FIXED_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_SIGNATURE;
|
||||
|
||||
// packet number
|
||||
token.len_min[1] = 1;
|
||||
token.len_max[1] = 8;
|
||||
token.sep[1] = '$';
|
||||
token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_DIGIT;
|
||||
// salt
|
||||
token.len_min[2] = SNMPV3_MSG_AUTH_PARAMS_LEN * 2;
|
||||
token.len_max[2] = SNMPV3_SALT_MAX * 2;
|
||||
token.sep[2] = '$';
|
||||
token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
// engineid
|
||||
token.len_min[3] = 26;
|
||||
token.len_max[3] = SNMPV3_ENGINEID_MAX;
|
||||
token.sep[3] = '$';
|
||||
token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
// digest
|
||||
token.len[4] = SNMPV3_MSG_AUTH_PARAMS_LEN * 2;
|
||||
token.sep[4] = '$';
|
||||
token.attr[4] = TOKEN_ATTR_FIXED_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token);
|
||||
|
||||
if (rc_tokenizer != PARSER_OK) return (rc_tokenizer);
|
||||
|
||||
// packet number
|
||||
|
||||
const u8 *packet_number_pos = token.buf[1];
|
||||
const int packet_number_len = token.len[1];
|
||||
|
||||
memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number));
|
||||
|
||||
strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len);
|
||||
|
||||
// salt
|
||||
|
||||
const u8 *salt_pos = token.buf[2];
|
||||
const int salt_len = token.len[2];
|
||||
|
||||
u8 *salt_ptr = (u8 *) snmpv3->salt_buf;
|
||||
|
||||
snmpv3->salt_len = hex_decode (salt_pos, salt_len, salt_ptr);
|
||||
|
||||
salt->salt_iter = SNMPV3_ROUNDS;
|
||||
|
||||
// handle unique salts detection
|
||||
|
||||
sha1_ctx_t sha1_ctx;
|
||||
|
||||
sha1_init (&sha1_ctx);
|
||||
sha1_update (&sha1_ctx, snmpv3->salt_buf, snmpv3->salt_len);
|
||||
sha1_final (&sha1_ctx);
|
||||
|
||||
// store sha1(snmpv3->salt_buf) in salt_buf
|
||||
|
||||
salt->salt_len = 20;
|
||||
|
||||
memcpy (salt->salt_buf, sha1_ctx.h, salt->salt_len);
|
||||
|
||||
// engineid
|
||||
|
||||
const u8 *engineID_pos = token.buf[3];
|
||||
const int engineID_len = token.len[3];
|
||||
|
||||
memset (snmpv3->engineID_buf, 0, sizeof (snmpv3->engineID_buf));
|
||||
|
||||
u8 *engineID_ptr = (u8 *) snmpv3->engineID_buf;
|
||||
|
||||
hex_decode (engineID_pos, engineID_len, engineID_ptr);
|
||||
|
||||
// force len to 17, zero padding
|
||||
snmpv3->engineID_len = SNMPV3_ENGINEID_MAX / 2;
|
||||
|
||||
// digest
|
||||
|
||||
const u8 *hash_pos = token.buf[4];
|
||||
|
||||
digest[0] = hex_to_u64 (hash_pos + 0);
|
||||
digest[1] = hex_to_u64 (hash_pos + 16);
|
||||
digest[2] = hex_to_u64 (hash_pos + 32);
|
||||
digest[3] = hex_to_u64 (hash_pos + 48);
|
||||
|
||||
digest[0] = byte_swap_64 (digest[0]);
|
||||
digest[1] = byte_swap_64 (digest[1]);
|
||||
digest[2] = byte_swap_64 (digest[2]);
|
||||
digest[3] = byte_swap_64 (digest[3]);
|
||||
|
||||
return (PARSER_OK);
|
||||
}
|
||||
|
||||
int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size)
|
||||
{
|
||||
const u64 *digest = (const u64 *) digest_buf;
|
||||
|
||||
snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf;
|
||||
|
||||
u8 *out_buf = (u8 *) line_buf;
|
||||
|
||||
int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number);
|
||||
|
||||
out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len);
|
||||
|
||||
out_buf[out_len] = '$';
|
||||
|
||||
out_len++;
|
||||
|
||||
out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len);
|
||||
|
||||
out_buf[out_len] = '$';
|
||||
|
||||
out_len++;
|
||||
|
||||
u64 digest_tmp[4];
|
||||
|
||||
digest_tmp[0] = byte_swap_64 (digest[0]);
|
||||
digest_tmp[1] = byte_swap_64 (digest[1]);
|
||||
digest_tmp[2] = byte_swap_64 (digest[2]);
|
||||
digest_tmp[3] = byte_swap_64 (digest[3]);
|
||||
|
||||
u64_to_hex (digest_tmp[0], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[1], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[2], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[3], out_buf + out_len); out_len += 16;
|
||||
|
||||
out_buf[out_len] = 0;
|
||||
|
||||
return out_len;
|
||||
}
|
||||
|
||||
void module_init (module_ctx_t *module_ctx)
|
||||
{
|
||||
module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT;
|
||||
module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT;
|
||||
|
||||
module_ctx->module_attack_exec = module_attack_exec;
|
||||
module_ctx->module_benchmark_esalt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_mask = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_build_plain_postprocess = MODULE_DEFAULT;
|
||||
module_ctx->module_deep_comp_kernel = MODULE_DEFAULT;
|
||||
module_ctx->module_dgst_pos0 = module_dgst_pos0;
|
||||
module_ctx->module_dgst_pos1 = module_dgst_pos1;
|
||||
module_ctx->module_dgst_pos2 = module_dgst_pos2;
|
||||
module_ctx->module_dgst_pos3 = module_dgst_pos3;
|
||||
module_ctx->module_dgst_size = module_dgst_size;
|
||||
module_ctx->module_dictstat_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_esalt_size = module_esalt_size;
|
||||
module_ctx->module_extra_buffer_size = MODULE_DEFAULT;
|
||||
module_ctx->module_extra_tmp_size = MODULE_DEFAULT;
|
||||
module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT;
|
||||
module_ctx->module_forced_outfile_format = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_count = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_parse = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_save = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode = module_hash_decode;
|
||||
module_ctx->module_hash_encode_status = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode = module_hash_encode;
|
||||
module_ctx->module_hash_init_selftest = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_mode = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_category = module_hash_category;
|
||||
module_ctx->module_hash_name = module_hash_name;
|
||||
module_ctx->module_hashes_count_min = MODULE_DEFAULT;
|
||||
module_ctx->module_hashes_count_max = MODULE_DEFAULT;
|
||||
module_ctx->module_hlfmt_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_init = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_term = MODULE_DEFAULT;
|
||||
module_ctx->module_hook12 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook23 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_salt_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_size = MODULE_DEFAULT;
|
||||
module_ctx->module_jit_build_options = module_jit_build_options;
|
||||
module_ctx->module_jit_cache_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_loops_max = module_kernel_loops_max;
|
||||
module_ctx->module_kernel_loops_min = module_kernel_loops_min;
|
||||
module_ctx->module_kernel_threads_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_threads_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kern_type = module_kern_type;
|
||||
module_ctx->module_kern_type_dynamic = MODULE_DEFAULT;
|
||||
module_ctx->module_opti_type = module_opti_type;
|
||||
module_ctx->module_opts_type = module_opts_type;
|
||||
module_ctx->module_outfile_check_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_custom_check = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT;
|
||||
module_ctx->module_pwdump_column = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_max = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_min = module_pw_min;
|
||||
module_ctx->module_salt_max = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_min = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_type = module_salt_type;
|
||||
module_ctx->module_separator = MODULE_DEFAULT;
|
||||
module_ctx->module_st_hash = module_st_hash;
|
||||
module_ctx->module_st_pass = module_st_pass;
|
||||
module_ctx->module_tmp_size = module_tmp_size;
|
||||
module_ctx->module_unstable_warning = module_unstable_warning;
|
||||
module_ctx->module_warmup_disable = MODULE_DEFAULT;
|
||||
}
|
390
src/modules/module_27300.c
Normal file
390
src/modules/module_27300.c
Normal file
@ -0,0 +1,390 @@
|
||||
/**
|
||||
* Author......: See docs/credits.txt
|
||||
* License.....: MIT
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "modules.h"
|
||||
#include "bitops.h"
|
||||
#include "convert.h"
|
||||
#include "shared.h"
|
||||
#include "memory.h"
|
||||
#include "emu_inc_hash_sha1.h"
|
||||
|
||||
static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL;
|
||||
static const u32 DGST_POS0 = 2;
|
||||
static const u32 DGST_POS1 = 3;
|
||||
static const u32 DGST_POS2 = 0;
|
||||
static const u32 DGST_POS3 = 1;
|
||||
static const u32 DGST_SIZE = DGST_SIZE_8_6;
|
||||
static const u32 HASH_CATEGORY = HASH_CATEGORY_NETWORK_PROTOCOL;
|
||||
static const char *HASH_NAME = "SNMPv3 HMAC-SHA512-384";
|
||||
static const u64 KERN_TYPE = 27300;
|
||||
static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE
|
||||
| OPTI_TYPE_USES_BITS_64;
|
||||
static const u64 OPTS_TYPE = OPTS_TYPE_PT_GENERATE_BE;
|
||||
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
|
||||
static const char *ST_PASS = "hashcat1";
|
||||
static const char *ST_HASH = "$SNMPv3$6$45889431$3081b702010330110204367c80d4020300ffe30401010201030460305e041180001f88808106d566db57fd600000000002011002020118040e6d61747269785f5348412d35313204300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400303d041180001f88808106d566db57fd60000000000400a22602046ea3546f0201000201003018301606082b06010201010200060a2b06010401bf0803020a$80001f88808106d566db57fd6000000000$9e4681768d5dee9e2d0ca7380dfa19f0a0f805c550142b889af548f5506c2c3587df980707600b58d97ed1beaa9feaf9";
|
||||
|
||||
u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; }
|
||||
u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; }
|
||||
u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; }
|
||||
u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; }
|
||||
u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; }
|
||||
u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; }
|
||||
u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; }
|
||||
const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; }
|
||||
u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; }
|
||||
u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; }
|
||||
u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; }
|
||||
u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; }
|
||||
const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; }
|
||||
const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; }
|
||||
|
||||
static const char *SIGNATURE_SNMPV3 = "$SNMPv3$6$";
|
||||
|
||||
#define SNMPV3_SALT_MAX 1500
|
||||
#define SNMPV3_ENGINEID_MAX 34
|
||||
#define SNMPV3_MSG_AUTH_PARAMS_LEN 48
|
||||
#define SNMPV3_ROUNDS 1048576
|
||||
#define SNMPV3_MAX_PW_LENGTH 128
|
||||
|
||||
#define SNMPV3_TMP_ELEMS 8192 // 8192 = (256 (max pw length) * SNMPV3_MAX_PW_LENGTH) / sizeof (u32)
|
||||
#define SNMPV3_HASH_ELEMS 8
|
||||
|
||||
#define SNMPV3_MAX_SALT_ELEMS 512 // 512 * 4 = 2048 > 1500, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_ENGINE_ELEMS 32 // 32 * 4 = 128 > 34, also has to be multiple of SNMPV3_MAX_PW_LENGTH
|
||||
#define SNMPV3_MAX_PNUM_ELEMS 4 // 4 * 4 = 16 > 9
|
||||
|
||||
typedef struct hmac_sha512_tmp
|
||||
{
|
||||
u32 tmp[SNMPV3_TMP_ELEMS];
|
||||
u64 h[SNMPV3_HASH_ELEMS];
|
||||
|
||||
} hmac_sha512_tmp_t;
|
||||
|
||||
typedef struct snmpv3
|
||||
{
|
||||
u32 salt_buf[SNMPV3_MAX_SALT_ELEMS];
|
||||
u32 salt_len;
|
||||
|
||||
u32 engineID_buf[SNMPV3_MAX_ENGINE_ELEMS];
|
||||
u32 engineID_len;
|
||||
|
||||
u32 packet_number[SNMPV3_MAX_PNUM_ELEMS];
|
||||
|
||||
} snmpv3_t;
|
||||
|
||||
u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u32 pw_min = 8;
|
||||
|
||||
return pw_min;
|
||||
}
|
||||
|
||||
bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param)
|
||||
{
|
||||
if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
|
||||
{
|
||||
// self-test failed
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param)
|
||||
{
|
||||
char *jit_build_options = NULL;
|
||||
|
||||
// Extra treatment for Apple systems
|
||||
if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE)
|
||||
{
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
// HIP
|
||||
if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP)
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
// ROCM
|
||||
if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true))
|
||||
{
|
||||
hc_asprintf (&jit_build_options, "-D _unroll");
|
||||
}
|
||||
|
||||
return jit_build_options;
|
||||
}
|
||||
|
||||
u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u64 esalt_size = (const u64) sizeof (snmpv3_t);
|
||||
|
||||
return esalt_size;
|
||||
}
|
||||
|
||||
u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u64 tmp_size = (const u64) sizeof (hmac_sha512_tmp_t);
|
||||
|
||||
return tmp_size;
|
||||
}
|
||||
|
||||
u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
// we need to fix iteration count to guarantee the loop count is a multiple of SNMPV3_MAX_PW_LENGTH
|
||||
// 2k calls to sha512_transform typically is enough to overtime pcie bottleneck
|
||||
|
||||
const u32 kernel_loops_min = 2048 * SNMPV3_MAX_PW_LENGTH;
|
||||
|
||||
return kernel_loops_min;
|
||||
}
|
||||
|
||||
u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra)
|
||||
{
|
||||
const u32 kernel_loops_max = 2048 * SNMPV3_MAX_PW_LENGTH;
|
||||
|
||||
return kernel_loops_max;
|
||||
}
|
||||
|
||||
int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len)
|
||||
{
|
||||
u64 *digest = (u64 *) digest_buf;
|
||||
|
||||
snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf;
|
||||
|
||||
token_t token;
|
||||
|
||||
token.token_cnt = 5;
|
||||
token.signatures_cnt = 1;
|
||||
token.signatures_buf[0] = SIGNATURE_SNMPV3;
|
||||
|
||||
token.len[0] = 10;
|
||||
token.attr[0] = TOKEN_ATTR_FIXED_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_SIGNATURE;
|
||||
|
||||
// packet number
|
||||
token.len_min[1] = 1;
|
||||
token.len_max[1] = 8;
|
||||
token.sep[1] = '$';
|
||||
token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_DIGIT;
|
||||
// salt
|
||||
token.len_min[2] = SNMPV3_MSG_AUTH_PARAMS_LEN * 2;
|
||||
token.len_max[2] = SNMPV3_SALT_MAX * 2;
|
||||
token.sep[2] = '$';
|
||||
token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
// engineid
|
||||
token.len_min[3] = 26;
|
||||
token.len_max[3] = SNMPV3_ENGINEID_MAX;
|
||||
token.sep[3] = '$';
|
||||
token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
// digest
|
||||
token.len[4] = SNMPV3_MSG_AUTH_PARAMS_LEN * 2;
|
||||
token.sep[4] = '$';
|
||||
token.attr[4] = TOKEN_ATTR_FIXED_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_HEX;
|
||||
|
||||
const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token);
|
||||
|
||||
if (rc_tokenizer != PARSER_OK) return (rc_tokenizer);
|
||||
|
||||
// packet number
|
||||
|
||||
const u8 *packet_number_pos = token.buf[1];
|
||||
const int packet_number_len = token.len[1];
|
||||
|
||||
memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number));
|
||||
|
||||
strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len);
|
||||
|
||||
// salt
|
||||
|
||||
const u8 *salt_pos = token.buf[2];
|
||||
const int salt_len = token.len[2];
|
||||
|
||||
u8 *salt_ptr = (u8 *) snmpv3->salt_buf;
|
||||
|
||||
snmpv3->salt_len = hex_decode (salt_pos, salt_len, salt_ptr);
|
||||
|
||||
salt->salt_iter = SNMPV3_ROUNDS;
|
||||
|
||||
// handle unique salts detection
|
||||
|
||||
sha1_ctx_t sha1_ctx;
|
||||
|
||||
sha1_init (&sha1_ctx);
|
||||
sha1_update (&sha1_ctx, snmpv3->salt_buf, snmpv3->salt_len);
|
||||
sha1_final (&sha1_ctx);
|
||||
|
||||
// store sha1(snmpv3->salt_buf) in salt_buf
|
||||
|
||||
salt->salt_len = 20;
|
||||
|
||||
memcpy (salt->salt_buf, sha1_ctx.h, salt->salt_len);
|
||||
|
||||
// engineid
|
||||
|
||||
const u8 *engineID_pos = token.buf[3];
|
||||
const int engineID_len = token.len[3];
|
||||
|
||||
memset (snmpv3->engineID_buf, 0, sizeof (snmpv3->engineID_buf));
|
||||
|
||||
u8 *engineID_ptr = (u8 *) snmpv3->engineID_buf;
|
||||
|
||||
hex_decode (engineID_pos, engineID_len, engineID_ptr);
|
||||
|
||||
// force len to 17, zero padding
|
||||
snmpv3->engineID_len = SNMPV3_ENGINEID_MAX / 2;
|
||||
|
||||
// digest
|
||||
|
||||
const u8 *hash_pos = token.buf[4];
|
||||
|
||||
digest[0] = hex_to_u64 (hash_pos + 0);
|
||||
digest[1] = hex_to_u64 (hash_pos + 16);
|
||||
digest[2] = hex_to_u64 (hash_pos + 32);
|
||||
digest[3] = hex_to_u64 (hash_pos + 48);
|
||||
digest[4] = hex_to_u64 (hash_pos + 64);
|
||||
digest[5] = hex_to_u64 (hash_pos + 80);
|
||||
|
||||
digest[0] = byte_swap_64 (digest[0]);
|
||||
digest[1] = byte_swap_64 (digest[1]);
|
||||
digest[2] = byte_swap_64 (digest[2]);
|
||||
digest[3] = byte_swap_64 (digest[3]);
|
||||
digest[4] = byte_swap_64 (digest[4]);
|
||||
digest[5] = byte_swap_64 (digest[5]);
|
||||
|
||||
return (PARSER_OK);
|
||||
}
|
||||
|
||||
int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size)
|
||||
{
|
||||
const u64 *digest = (const u64 *) digest_buf;
|
||||
|
||||
snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf;
|
||||
|
||||
u8 *out_buf = (u8 *) line_buf;
|
||||
|
||||
int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number);
|
||||
|
||||
out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len);
|
||||
|
||||
out_buf[out_len] = '$';
|
||||
|
||||
out_len++;
|
||||
|
||||
out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len);
|
||||
|
||||
out_buf[out_len] = '$';
|
||||
|
||||
out_len++;
|
||||
|
||||
u64 digest_tmp[6];
|
||||
|
||||
digest_tmp[0] = byte_swap_64 (digest[0]);
|
||||
digest_tmp[1] = byte_swap_64 (digest[1]);
|
||||
digest_tmp[2] = byte_swap_64 (digest[2]);
|
||||
digest_tmp[3] = byte_swap_64 (digest[3]);
|
||||
digest_tmp[4] = byte_swap_64 (digest[4]);
|
||||
digest_tmp[5] = byte_swap_64 (digest[5]);
|
||||
|
||||
u64_to_hex (digest_tmp[0], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[1], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[2], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[3], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[4], out_buf + out_len); out_len += 16;
|
||||
u64_to_hex (digest_tmp[5], out_buf + out_len); out_len += 16;
|
||||
|
||||
out_buf[out_len] = 0;
|
||||
|
||||
return out_len;
|
||||
}
|
||||
|
||||
void module_init (module_ctx_t *module_ctx)
|
||||
{
|
||||
module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT;
|
||||
module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT;
|
||||
|
||||
module_ctx->module_attack_exec = module_attack_exec;
|
||||
module_ctx->module_benchmark_esalt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_mask = MODULE_DEFAULT;
|
||||
module_ctx->module_benchmark_salt = MODULE_DEFAULT;
|
||||
module_ctx->module_build_plain_postprocess = MODULE_DEFAULT;
|
||||
module_ctx->module_deep_comp_kernel = MODULE_DEFAULT;
|
||||
module_ctx->module_dgst_pos0 = module_dgst_pos0;
|
||||
module_ctx->module_dgst_pos1 = module_dgst_pos1;
|
||||
module_ctx->module_dgst_pos2 = module_dgst_pos2;
|
||||
module_ctx->module_dgst_pos3 = module_dgst_pos3;
|
||||
module_ctx->module_dgst_size = module_dgst_size;
|
||||
module_ctx->module_dictstat_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_esalt_size = module_esalt_size;
|
||||
module_ctx->module_extra_buffer_size = MODULE_DEFAULT;
|
||||
module_ctx->module_extra_tmp_size = MODULE_DEFAULT;
|
||||
module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT;
|
||||
module_ctx->module_forced_outfile_format = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_count = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_parse = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_binary_save = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_decode = module_hash_decode;
|
||||
module_ctx->module_hash_encode_status = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode_potfile = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_encode = module_hash_encode;
|
||||
module_ctx->module_hash_init_selftest = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_mode = MODULE_DEFAULT;
|
||||
module_ctx->module_hash_category = module_hash_category;
|
||||
module_ctx->module_hash_name = module_hash_name;
|
||||
module_ctx->module_hashes_count_min = MODULE_DEFAULT;
|
||||
module_ctx->module_hashes_count_max = MODULE_DEFAULT;
|
||||
module_ctx->module_hlfmt_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_init = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_extra_param_term = MODULE_DEFAULT;
|
||||
module_ctx->module_hook12 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook23 = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_salt_size = MODULE_DEFAULT;
|
||||
module_ctx->module_hook_size = MODULE_DEFAULT;
|
||||
module_ctx->module_jit_build_options = module_jit_build_options;
|
||||
module_ctx->module_jit_cache_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_accel_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_loops_max = module_kernel_loops_max;
|
||||
module_ctx->module_kernel_loops_min = module_kernel_loops_min;
|
||||
module_ctx->module_kernel_threads_max = MODULE_DEFAULT;
|
||||
module_ctx->module_kernel_threads_min = MODULE_DEFAULT;
|
||||
module_ctx->module_kern_type = module_kern_type;
|
||||
module_ctx->module_kern_type_dynamic = MODULE_DEFAULT;
|
||||
module_ctx->module_opti_type = module_opti_type;
|
||||
module_ctx->module_opts_type = module_opts_type;
|
||||
module_ctx->module_outfile_check_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_custom_check = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_disable = MODULE_DEFAULT;
|
||||
module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT;
|
||||
module_ctx->module_pwdump_column = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_max = MODULE_DEFAULT;
|
||||
module_ctx->module_pw_min = module_pw_min;
|
||||
module_ctx->module_salt_max = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_min = MODULE_DEFAULT;
|
||||
module_ctx->module_salt_type = module_salt_type;
|
||||
module_ctx->module_separator = MODULE_DEFAULT;
|
||||
module_ctx->module_st_hash = module_st_hash;
|
||||
module_ctx->module_st_pass = module_st_pass;
|
||||
module_ctx->module_tmp_size = module_tmp_size;
|
||||
module_ctx->module_unstable_warning = module_unstable_warning;
|
||||
module_ctx->module_warmup_disable = MODULE_DEFAULT;
|
||||
}
|
2
src/rp.c
2
src/rp.c
@ -141,7 +141,7 @@ int generate_random_rule (char rule_buf[RP_RULE_SIZE], const u32 rp_gen_func_min
|
||||
u32 p1 = 0;
|
||||
u32 p2 = 0;
|
||||
|
||||
switch ((char) get_random_num (0, 9))
|
||||
switch ((char) get_random_num (0, 8))
|
||||
{
|
||||
case 0:
|
||||
r = get_random_num (0, sizeof (grp_op_nop));
|
||||
|
@ -818,10 +818,22 @@ void backend_info (hashcat_ctx_t *hashcat_ctx)
|
||||
event_log_info (hashcat_ctx, NULL);
|
||||
|
||||
int hip_devices_cnt = backend_ctx->hip_devices_cnt;
|
||||
int hip_driverVersion = backend_ctx->hip_driverVersion;
|
||||
int hip_runtimeVersion = backend_ctx->hip_runtimeVersion;
|
||||
|
||||
event_log_info (hashcat_ctx, "HIP.Version.: %d.%d", hip_driverVersion / 100, hip_driverVersion % 10);
|
||||
event_log_info (hashcat_ctx, NULL);
|
||||
if (hip_runtimeVersion > 1000)
|
||||
{
|
||||
int hip_version_major = (hip_runtimeVersion - 0) / 10000000;
|
||||
int hip_version_minor = (hip_runtimeVersion - (hip_version_major * 10000000)) / 100000;
|
||||
int hip_version_patch = (hip_runtimeVersion - (hip_version_major * 10000000) - (hip_version_minor * 100000));
|
||||
|
||||
event_log_info (hashcat_ctx, "HIP.Version.: %d.%d.%d", hip_version_major, hip_version_minor, hip_version_patch);
|
||||
event_log_info (hashcat_ctx, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
event_log_info (hashcat_ctx, "HIP.Version.: %d.%d", hip_runtimeVersion / 100, hip_runtimeVersion % 10);
|
||||
event_log_info (hashcat_ctx, NULL);
|
||||
}
|
||||
|
||||
for (int hip_devices_idx = 0; hip_devices_idx < hip_devices_cnt; hip_devices_idx++)
|
||||
{
|
||||
@ -1014,10 +1026,23 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
if (backend_ctx->hip)
|
||||
{
|
||||
int hip_devices_cnt = backend_ctx->hip_devices_cnt;
|
||||
int hip_driverVersion = backend_ctx->hip_driverVersion;
|
||||
int hip_devices_cnt = backend_ctx->hip_devices_cnt;
|
||||
int hip_runtimeVersion = backend_ctx->hip_runtimeVersion;
|
||||
|
||||
const size_t len = event_log_info (hashcat_ctx, "HIP API (HIP %d.%d)", hip_driverVersion / 100, hip_driverVersion % 10);
|
||||
size_t len;
|
||||
|
||||
if (hip_runtimeVersion > 1000)
|
||||
{
|
||||
int hip_version_major = (hip_runtimeVersion - 0) / 10000000;
|
||||
int hip_version_minor = (hip_runtimeVersion - (hip_version_major * 10000000)) / 100000;
|
||||
int hip_version_patch = (hip_runtimeVersion - (hip_version_major * 10000000) - (hip_version_minor * 100000));
|
||||
|
||||
len = event_log_info (hashcat_ctx, "HIP API (HIP %d.%d.%d)", hip_version_major, hip_version_minor, hip_version_patch);
|
||||
}
|
||||
else
|
||||
{
|
||||
len = event_log_info (hashcat_ctx, "HIP API (HIP %d.%d)", hip_runtimeVersion / 100, hip_runtimeVersion % 10);
|
||||
}
|
||||
|
||||
char line[HCBUFSIZ_TINY] = { 0 };
|
||||
|
||||
|
85
tools/test_modules/m26900.pm
Normal file
85
tools/test_modules/m26900.pm
Normal file
@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
##
|
||||
## Author......: See docs/credits.txt
|
||||
## License.....: MIT
|
||||
##
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Digest::SHA qw (sha384 sha384_hex hmac_sha384_hex);
|
||||
#use Digest::HMAC qw (hmac hmac_hex);
|
||||
|
||||
sub module_constraints { [[8, 256], [64, 3000], [-1, -1], [-1, -1], [-1, -1]] }
|
||||
|
||||
sub module_generate_hash
|
||||
{
|
||||
my $word = shift;
|
||||
my $salt = shift;
|
||||
my $pkt_num = shift // int(rand(100000000));
|
||||
my $engineID = shift // random_hex_string(26, 34);
|
||||
|
||||
# padding engineID: fill with zero
|
||||
|
||||
my $pad_len = 34 - length ($engineID);
|
||||
|
||||
$engineID = join '', $engineID, "0" x $pad_len;
|
||||
|
||||
# make salt even if needed
|
||||
|
||||
if (length($salt) %2 == 1)
|
||||
{
|
||||
$salt = $salt . "8";
|
||||
}
|
||||
|
||||
my $string1 = $word x 1048576;
|
||||
|
||||
$string1 = substr ($string1, 0, 1048576);
|
||||
|
||||
my $sha384_digest1 = sha384_hex ($string1);
|
||||
|
||||
my $buf = join '', $sha384_digest1, $engineID, $sha384_digest1;
|
||||
|
||||
my $sha384_digest2 = sha384(pack("H*", $buf));
|
||||
|
||||
my $digest = hmac_sha384_hex (pack("H*", $salt), $sha384_digest2);
|
||||
|
||||
$digest = substr ($digest, 0, 64);
|
||||
|
||||
my $hash = "\$SNMPv3\$5\$" . $pkt_num . "\$" . $salt . "\$" . $engineID . "\$" . $digest;
|
||||
|
||||
return $hash;
|
||||
}
|
||||
|
||||
sub module_verify_hash
|
||||
{
|
||||
my $line = shift;
|
||||
|
||||
my $idx = index ($line, ':');
|
||||
|
||||
return unless $idx >= 0;
|
||||
|
||||
my $hash = substr ($line, 0, $idx);
|
||||
my $word = substr ($line, $idx + 1);
|
||||
|
||||
return unless length ($word) gt 0;
|
||||
return unless substr ($hash, 0, 10) eq '$SNMPv3$5$';
|
||||
|
||||
my (undef, $signature, $version, $pkt_num, $salt, $engineID, $digest) = split '\$', $hash;
|
||||
|
||||
return unless defined $signature;
|
||||
return unless defined $version;
|
||||
return unless defined $pkt_num;
|
||||
return unless defined $salt;
|
||||
return unless defined $engineID;
|
||||
return unless defined $digest;
|
||||
|
||||
my $word_packed = pack_if_HEX_notation ($word);
|
||||
|
||||
my $new_hash = module_generate_hash ($word_packed, $salt, $pkt_num, $engineID);
|
||||
|
||||
return ($new_hash, $word);
|
||||
}
|
||||
|
||||
1;
|
84
tools/test_modules/m27300.pm
Normal file
84
tools/test_modules/m27300.pm
Normal file
@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
##
|
||||
## Author......: See docs/credits.txt
|
||||
## License.....: MIT
|
||||
##
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Digest::SHA qw (sha512 sha512_hex hmac_sha512_hex);
|
||||
|
||||
sub module_constraints { [[8, 256], [96, 3000], [-1, -1], [-1, -1], [-1, -1]] }
|
||||
|
||||
sub module_generate_hash
|
||||
{
|
||||
my $word = shift;
|
||||
my $salt = shift;
|
||||
my $pkt_num = shift // int(rand(100000000));
|
||||
my $engineID = shift // random_hex_string(26, 34);
|
||||
|
||||
# padding engineID: fill with zero
|
||||
|
||||
my $pad_len = 34 - length ($engineID);
|
||||
|
||||
$engineID = join '', $engineID, "0" x $pad_len;
|
||||
|
||||
# make salt even if needed
|
||||
|
||||
if (length($salt) %2 == 1)
|
||||
{
|
||||
$salt = $salt . "8";
|
||||
}
|
||||
|
||||
my $string1 = $word x 1048576;
|
||||
|
||||
$string1 = substr ($string1, 0, 1048576);
|
||||
|
||||
my $sha512_digest1 = sha512_hex ($string1);
|
||||
|
||||
my $buf = join '', $sha512_digest1, $engineID, $sha512_digest1;
|
||||
|
||||
my $sha512_digest2 = sha512(pack("H*", $buf));
|
||||
|
||||
my $digest = hmac_sha512_hex (pack("H*", $salt), $sha512_digest2);
|
||||
|
||||
$digest = substr ($digest, 0, 96);
|
||||
|
||||
my $hash = "\$SNMPv3\$6\$" . $pkt_num . "\$" . $salt . "\$" . $engineID . "\$" . $digest;
|
||||
|
||||
return $hash;
|
||||
}
|
||||
|
||||
sub module_verify_hash
|
||||
{
|
||||
my $line = shift;
|
||||
|
||||
my $idx = index ($line, ':');
|
||||
|
||||
return unless $idx >= 0;
|
||||
|
||||
my $hash = substr ($line, 0, $idx);
|
||||
my $word = substr ($line, $idx + 1);
|
||||
|
||||
return unless length ($word) gt 0;
|
||||
return unless substr ($hash, 0, 10) eq '$SNMPv3$6$';
|
||||
|
||||
my (undef, $signature, $version, $pkt_num, $salt, $engineID, $digest) = split '\$', $hash;
|
||||
|
||||
return unless defined $signature;
|
||||
return unless defined $version;
|
||||
return unless defined $pkt_num;
|
||||
return unless defined $salt;
|
||||
return unless defined $engineID;
|
||||
return unless defined $digest;
|
||||
|
||||
my $word_packed = pack_if_HEX_notation ($word);
|
||||
|
||||
my $new_hash = module_generate_hash ($word_packed, $salt, $pkt_num, $engineID);
|
||||
|
||||
return ($new_hash, $word);
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in New Issue
Block a user