Merge branch 'hashcat:master' into master

pull/2914/head
therealartifex 3 years ago committed by GitHub
commit 0738820a89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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];

@ -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
}

@ -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

@ -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)
int hip_runtimeVersion;
if (hc_hipRuntimeGetVersion (hashcat_ctx, &hip_runtimeVersion) == -1) return -1;
backend_ctx->hip_runtimeVersion = hip_runtimeVersion;
if (hip_runtimeVersion < 1000)
{
event_log_error (hashcat_ctx, "Outdated AMD HIP driver version '%d' detected!", hip_driverVersion);
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;
event_log_warning (hashcat_ctx, "See hashcat.net for officially supported AMD HIP versions.");
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; \
}

@ -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;
}

@ -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;
}

@ -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;
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));
const size_t len = event_log_info (hashcat_ctx, "HIP API (HIP %d.%d)", hip_driverVersion / 100, hip_driverVersion % 10);
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 };

@ -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;

@ -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…
Cancel
Save