mirror of
https://github.com/hashcat/hashcat.git
synced 2025-07-08 15:48:15 +00:00

Updated kernel declarations from "KERNEL_FQ void HC_ATTR_SEQ" to "KERNEL_FQ KERNEL_FA void". Please update your custom plugin kernels accordingly. Added spilling size as a factor in calculating usable memory per device. This is based on undocumented variables and may not be 100% accurate, but it works well in practice. Added a compiler hint to scrypt-based kernels indicating the guaranteed maximum thread count per kernel invocation. Removed redundant kernel code 29800, as it is identical to 27700, and updated the plugin.
742 lines
16 KiB
Common Lisp
742 lines
16 KiB
Common Lisp
/**
|
|
* Author......: See docs/credits.txt
|
|
* License.....: MIT
|
|
*/
|
|
|
|
//too much register pressure
|
|
//#define NEW_SIMD_CODE
|
|
|
|
#ifdef KERNEL_STATIC
|
|
#include M2S(INCLUDE_PATH/inc_vendor.h)
|
|
#include M2S(INCLUDE_PATH/inc_types.h)
|
|
#include M2S(INCLUDE_PATH/inc_platform.cl)
|
|
#include M2S(INCLUDE_PATH/inc_common.cl)
|
|
#include M2S(INCLUDE_PATH/inc_simd.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_md4.cl)
|
|
#include M2S(INCLUDE_PATH/inc_hash_md5.cl)
|
|
#include M2S(INCLUDE_PATH/inc_cipher_rc4.cl)
|
|
#endif
|
|
|
|
typedef struct krb5asrep
|
|
{
|
|
u32 account_info[512];
|
|
u32 checksum[4];
|
|
u32 edata2[5120];
|
|
u32 edata2_len;
|
|
u32 format;
|
|
|
|
} krb5asrep_t;
|
|
|
|
DECLSPEC void hmac_md5_pad (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *ipad, PRIVATE_AS u32 *opad)
|
|
{
|
|
w0[0] = w0[0] ^ 0x36363636;
|
|
w0[1] = w0[1] ^ 0x36363636;
|
|
w0[2] = w0[2] ^ 0x36363636;
|
|
w0[3] = w0[3] ^ 0x36363636;
|
|
w1[0] = w1[0] ^ 0x36363636;
|
|
w1[1] = w1[1] ^ 0x36363636;
|
|
w1[2] = w1[2] ^ 0x36363636;
|
|
w1[3] = w1[3] ^ 0x36363636;
|
|
w2[0] = w2[0] ^ 0x36363636;
|
|
w2[1] = w2[1] ^ 0x36363636;
|
|
w2[2] = w2[2] ^ 0x36363636;
|
|
w2[3] = w2[3] ^ 0x36363636;
|
|
w3[0] = w3[0] ^ 0x36363636;
|
|
w3[1] = w3[1] ^ 0x36363636;
|
|
w3[2] = w3[2] ^ 0x36363636;
|
|
w3[3] = w3[3] ^ 0x36363636;
|
|
|
|
ipad[0] = MD5M_A;
|
|
ipad[1] = MD5M_B;
|
|
ipad[2] = MD5M_C;
|
|
ipad[3] = MD5M_D;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
|
|
w0[0] = w0[0] ^ 0x6a6a6a6a;
|
|
w0[1] = w0[1] ^ 0x6a6a6a6a;
|
|
w0[2] = w0[2] ^ 0x6a6a6a6a;
|
|
w0[3] = w0[3] ^ 0x6a6a6a6a;
|
|
w1[0] = w1[0] ^ 0x6a6a6a6a;
|
|
w1[1] = w1[1] ^ 0x6a6a6a6a;
|
|
w1[2] = w1[2] ^ 0x6a6a6a6a;
|
|
w1[3] = w1[3] ^ 0x6a6a6a6a;
|
|
w2[0] = w2[0] ^ 0x6a6a6a6a;
|
|
w2[1] = w2[1] ^ 0x6a6a6a6a;
|
|
w2[2] = w2[2] ^ 0x6a6a6a6a;
|
|
w2[3] = w2[3] ^ 0x6a6a6a6a;
|
|
w3[0] = w3[0] ^ 0x6a6a6a6a;
|
|
w3[1] = w3[1] ^ 0x6a6a6a6a;
|
|
w3[2] = w3[2] ^ 0x6a6a6a6a;
|
|
w3[3] = w3[3] ^ 0x6a6a6a6a;
|
|
|
|
opad[0] = MD5M_A;
|
|
opad[1] = MD5M_B;
|
|
opad[2] = MD5M_C;
|
|
opad[3] = MD5M_D;
|
|
|
|
md5_transform (w0, w1, w2, w3, opad);
|
|
}
|
|
|
|
DECLSPEC void hmac_md5_run (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *ipad, PRIVATE_AS u32 *opad, PRIVATE_AS u32 *digest)
|
|
{
|
|
digest[0] = ipad[0];
|
|
digest[1] = ipad[1];
|
|
digest[2] = ipad[2];
|
|
digest[3] = ipad[3];
|
|
|
|
md5_transform (w0, w1, w2, w3, digest);
|
|
|
|
w0[0] = digest[0];
|
|
w0[1] = digest[1];
|
|
w0[2] = digest[2];
|
|
w0[3] = digest[3];
|
|
w1[0] = 0x80;
|
|
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] = (64 + 16) * 8;
|
|
w3[3] = 0;
|
|
|
|
digest[0] = opad[0];
|
|
digest[1] = opad[1];
|
|
digest[2] = opad[2];
|
|
digest[3] = opad[3];
|
|
|
|
md5_transform (w0, w1, w2, w3, digest);
|
|
}
|
|
|
|
DECLSPEC int decrypt_and_check (LOCAL_AS u32 *S, PRIVATE_AS u32 *data, GLOBAL_AS const u32 *edata2, const u32 edata2_len, PRIVATE_AS const u32 *K2, PRIVATE_AS const u32 *checksum, const u64 lid)
|
|
{
|
|
rc4_init_128 (S, data, lid);
|
|
|
|
u32 out0[4];
|
|
|
|
/*
|
|
8 first bytes are nonce, then ASN1 structs (DER encoding: TLV)
|
|
|
|
The first byte is always 0x79 (01 1 11001, where 01 = "class=APPLICATION", 1 = "form=constructed", 11001 is application type 25)
|
|
The next byte is the length:
|
|
|
|
if length < 128 bytes:
|
|
length is on 1 byte, and the next byte is 0x30 (class=SEQUENCE)
|
|
else if length <= 256:
|
|
length is on 2 bytes, the first byte is 0x81, and the third byte is 0x30 (class=SEQUENCE)
|
|
else if length > 256:
|
|
length is on 3 bytes, the first byte is 0x82, and the fourth byte is 0x30 (class=SEQUENCE)
|
|
*/
|
|
|
|
rc4_next_16_global (S, 0, 0, edata2 + 0, out0, lid);
|
|
|
|
if (((out0[2] & 0x00ff80ff) != 0x00300079) &&
|
|
((out0[2] & 0xFF00FFFF) != 0x30008179) &&
|
|
((out0[2] & 0x0000FFFF) != 0x00008279 || (out0[3] & 0x000000FF) != 0x00000030))
|
|
return 0;
|
|
|
|
rc4_init_128 (S, data, lid);
|
|
|
|
u8 i = 0;
|
|
u8 j = 0;
|
|
|
|
// init hmac
|
|
|
|
u32 w0[4];
|
|
u32 w1[4];
|
|
u32 w2[4];
|
|
u32 w3[4];
|
|
|
|
w0[0] = K2[0];
|
|
w0[1] = K2[1];
|
|
w0[2] = K2[2];
|
|
w0[3] = K2[3];
|
|
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;
|
|
|
|
u32 ipad[4];
|
|
u32 opad[4];
|
|
|
|
hmac_md5_pad (w0, w1, w2, w3, ipad, opad);
|
|
|
|
int edata2_left;
|
|
|
|
for (edata2_left = edata2_len; edata2_left >= 64; edata2_left -= 64)
|
|
{
|
|
j = rc4_next_16_global (S, i, j, edata2, w0, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w1, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w2, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w3, lid); i += 16; edata2 += 4;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
|
|
w0[0] = 0;
|
|
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;
|
|
|
|
if (edata2_left < 16)
|
|
{
|
|
j = rc4_next_16_global (S, i, j, edata2, w0, lid); i += 16; edata2 += 4;
|
|
|
|
truncate_block_4x4_le_S (w0, edata2_left & 0xf);
|
|
|
|
append_0x80_1x4 (w0, edata2_left & 0xf);
|
|
|
|
w3[2] = (64 + edata2_len) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
else if (edata2_left < 32)
|
|
{
|
|
j = rc4_next_16_global (S, i, j, edata2, w0, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w1, lid); i += 16; edata2 += 4;
|
|
|
|
truncate_block_4x4_le_S (w1, edata2_left & 0xf);
|
|
|
|
append_0x80_1x4 (w1, edata2_left & 0xf);
|
|
|
|
w3[2] = (64 + edata2_len) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
else if (edata2_left < 48)
|
|
{
|
|
j = rc4_next_16_global (S, i, j, edata2, w0, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w1, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w2, lid); i += 16; edata2 += 4;
|
|
|
|
truncate_block_4x4_le_S (w2, edata2_left & 0xf);
|
|
|
|
append_0x80_1x4 (w2, edata2_left & 0xf);
|
|
|
|
w3[2] = (64 + edata2_len) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
else
|
|
{
|
|
j = rc4_next_16_global (S, i, j, edata2, w0, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w1, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w2, lid); i += 16; edata2 += 4;
|
|
j = rc4_next_16_global (S, i, j, edata2, w3, lid); i += 16; edata2 += 4;
|
|
|
|
truncate_block_4x4_le_S (w3, edata2_left & 0xf);
|
|
|
|
append_0x80_1x4 (w3, edata2_left & 0xf);
|
|
|
|
if (edata2_left < 56)
|
|
{
|
|
w3[2] = (64 + edata2_len) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
else
|
|
{
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
|
|
w0[0] = 0;
|
|
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] = (64 + edata2_len) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, ipad);
|
|
}
|
|
}
|
|
|
|
w0[0] = ipad[0];
|
|
w0[1] = ipad[1];
|
|
w0[2] = ipad[2];
|
|
w0[3] = ipad[3];
|
|
w1[0] = 0x80;
|
|
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] = (64 + 16) * 8;
|
|
w3[3] = 0;
|
|
|
|
md5_transform (w0, w1, w2, w3, opad);
|
|
|
|
if (checksum[0] != opad[0]) return 0;
|
|
if (checksum[1] != opad[1]) return 0;
|
|
if (checksum[2] != opad[2]) return 0;
|
|
if (checksum[3] != opad[3]) return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, const u32 pw_len, PRIVATE_AS const u32 *checksum, PRIVATE_AS u32 *digest, PRIVATE_AS u32 *K2)
|
|
{
|
|
/**
|
|
* pads
|
|
*/
|
|
|
|
u32 w0_t[4];
|
|
u32 w1_t[4];
|
|
u32 w2_t[4];
|
|
u32 w3_t[4];
|
|
|
|
w0_t[0] = w0[0];
|
|
w0_t[1] = w0[1];
|
|
w0_t[2] = w0[2];
|
|
w0_t[3] = w0[3];
|
|
w1_t[0] = w1[0];
|
|
w1_t[1] = w1[1];
|
|
w1_t[2] = w1[2];
|
|
w1_t[3] = w1[3];
|
|
w2_t[0] = 0;
|
|
w2_t[1] = 0;
|
|
w2_t[2] = 0;
|
|
w2_t[3] = 0;
|
|
w3_t[0] = 0;
|
|
w3_t[1] = 0;
|
|
w3_t[2] = 0;
|
|
w3_t[3] = 0;
|
|
|
|
// K=MD4(Little_indian(UNICODE(pwd))
|
|
|
|
append_0x80_2x4 (w0_t, w1_t, pw_len);
|
|
|
|
make_utf16le (w1_t, w2_t, w3_t);
|
|
make_utf16le (w0_t, w0_t, w1_t);
|
|
|
|
w3_t[2] = pw_len * 8 * 2;
|
|
w3_t[3] = 0;
|
|
|
|
digest[0] = MD4M_A;
|
|
digest[1] = MD4M_B;
|
|
digest[2] = MD4M_C;
|
|
digest[3] = MD4M_D;
|
|
|
|
md4_transform (w0_t, w1_t, w2_t, w3_t, digest);
|
|
|
|
// K1=MD5_HMAC(K,1); with 2 encoded as little indian on 4 bytes (02000000 in hexa);
|
|
|
|
w0_t[0] = digest[0];
|
|
w0_t[1] = digest[1];
|
|
w0_t[2] = digest[2];
|
|
w0_t[3] = digest[3];
|
|
w1_t[0] = 0;
|
|
w1_t[1] = 0;
|
|
w1_t[2] = 0;
|
|
w1_t[3] = 0;
|
|
w2_t[0] = 0;
|
|
w2_t[1] = 0;
|
|
w2_t[2] = 0;
|
|
w2_t[3] = 0;
|
|
w3_t[0] = 0;
|
|
w3_t[1] = 0;
|
|
w3_t[2] = 0;
|
|
w3_t[3] = 0;
|
|
|
|
u32 ipad[4];
|
|
u32 opad[4];
|
|
|
|
hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
|
|
|
|
w0_t[0] = 8;
|
|
w0_t[1] = 0x80;
|
|
w0_t[2] = 0;
|
|
w0_t[3] = 0;
|
|
w1_t[0] = 0;
|
|
w1_t[1] = 0;
|
|
w1_t[2] = 0;
|
|
w1_t[3] = 0;
|
|
w2_t[0] = 0;
|
|
w2_t[1] = 0;
|
|
w2_t[2] = 0;
|
|
w2_t[3] = 0;
|
|
w3_t[0] = 0;
|
|
w3_t[1] = 0;
|
|
w3_t[2] = (64 + 4) * 8;
|
|
w3_t[3] = 0;
|
|
|
|
hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
|
|
|
|
// K2 = K1;
|
|
|
|
K2[0] = digest[0];
|
|
K2[1] = digest[1];
|
|
K2[2] = digest[2];
|
|
K2[3] = digest[3];
|
|
|
|
// K3=MD5_HMAC(K1,checksum);
|
|
|
|
w0_t[0] = digest[0];
|
|
w0_t[1] = digest[1];
|
|
w0_t[2] = digest[2];
|
|
w0_t[3] = digest[3];
|
|
w1_t[0] = 0;
|
|
w1_t[1] = 0;
|
|
w1_t[2] = 0;
|
|
w1_t[3] = 0;
|
|
w2_t[0] = 0;
|
|
w2_t[1] = 0;
|
|
w2_t[2] = 0;
|
|
w2_t[3] = 0;
|
|
w3_t[0] = 0;
|
|
w3_t[1] = 0;
|
|
w3_t[2] = 0;
|
|
w3_t[3] = 0;
|
|
|
|
hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
|
|
|
|
w0_t[0] = checksum[0];
|
|
w0_t[1] = checksum[1];
|
|
w0_t[2] = checksum[2];
|
|
w0_t[3] = checksum[3];
|
|
w1_t[0] = 0x80;
|
|
w1_t[1] = 0;
|
|
w1_t[2] = 0;
|
|
w1_t[3] = 0;
|
|
w2_t[0] = 0;
|
|
w2_t[1] = 0;
|
|
w2_t[2] = 0;
|
|
w2_t[3] = 0;
|
|
w3_t[0] = 0;
|
|
w3_t[1] = 0;
|
|
w3_t[2] = (64 + 16) * 8;
|
|
w3_t[3] = 0;
|
|
|
|
hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
/**
|
|
* modifier
|
|
*/
|
|
|
|
const u64 lid = get_local_id (0);
|
|
|
|
/**
|
|
* base
|
|
*/
|
|
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
u32 pw_buf0[4];
|
|
u32 pw_buf1[4];
|
|
|
|
pw_buf0[0] = pws[gid].i[0];
|
|
pw_buf0[1] = pws[gid].i[1];
|
|
pw_buf0[2] = pws[gid].i[2];
|
|
pw_buf0[3] = pws[gid].i[3];
|
|
pw_buf1[0] = pws[gid].i[4];
|
|
pw_buf1[1] = pws[gid].i[5];
|
|
pw_buf1[2] = pws[gid].i[6];
|
|
pw_buf1[3] = pws[gid].i[7];
|
|
|
|
const u32 pw_l_len = pws[gid].pw_len & 63;
|
|
|
|
/**
|
|
* shared
|
|
*/
|
|
|
|
LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
|
|
|
|
/**
|
|
* salt
|
|
*/
|
|
|
|
u32 checksum[4];
|
|
|
|
checksum[0] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[0];
|
|
checksum[1] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[1];
|
|
checksum[2] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[2];
|
|
checksum[3] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[3];
|
|
|
|
/**
|
|
* loop
|
|
*/
|
|
|
|
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE)
|
|
{
|
|
const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63;
|
|
|
|
const u32x pw_len = (pw_l_len + pw_r_len) & 63;
|
|
|
|
/**
|
|
* concat password candidate
|
|
*/
|
|
|
|
u32x wordl0[4] = { 0 };
|
|
u32x wordl1[4] = { 0 };
|
|
u32x wordl2[4] = { 0 };
|
|
u32x wordl3[4] = { 0 };
|
|
|
|
wordl0[0] = pw_buf0[0];
|
|
wordl0[1] = pw_buf0[1];
|
|
wordl0[2] = pw_buf0[2];
|
|
wordl0[3] = pw_buf0[3];
|
|
wordl1[0] = pw_buf1[0];
|
|
wordl1[1] = pw_buf1[1];
|
|
wordl1[2] = pw_buf1[2];
|
|
wordl1[3] = pw_buf1[3];
|
|
|
|
u32x wordr0[4] = { 0 };
|
|
u32x wordr1[4] = { 0 };
|
|
u32x wordr2[4] = { 0 };
|
|
u32x wordr3[4] = { 0 };
|
|
|
|
wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
|
|
wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
|
|
wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
|
|
wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
|
|
wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
|
|
wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
|
|
wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
|
|
wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
|
|
|
|
if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT)
|
|
{
|
|
switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
|
|
}
|
|
else
|
|
{
|
|
switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
|
|
}
|
|
|
|
u32x w0[4];
|
|
u32x w1[4];
|
|
|
|
w0[0] = wordl0[0] | wordr0[0];
|
|
w0[1] = wordl0[1] | wordr0[1];
|
|
w0[2] = wordl0[2] | wordr0[2];
|
|
w0[3] = wordl0[3] | wordr0[3];
|
|
w1[0] = wordl1[0] | wordr1[0];
|
|
w1[1] = wordl1[1] | wordr1[1];
|
|
w1[2] = wordl1[2] | wordr1[2];
|
|
w1[3] = wordl1[3] | wordr1[3];
|
|
|
|
/**
|
|
* kerberos
|
|
*/
|
|
|
|
u32 digest[4];
|
|
|
|
u32 K2[4];
|
|
|
|
kerb_prepare (w0, w1, pw_len, checksum, digest, K2);
|
|
|
|
u32 tmp[4];
|
|
|
|
tmp[0] = digest[0];
|
|
tmp[1] = digest[1];
|
|
tmp[2] = digest[2];
|
|
tmp[3] = digest[3];
|
|
|
|
if (decrypt_and_check (S, tmp, esalt_bufs[DIGESTS_OFFSET_HOST].edata2, esalt_bufs[DIGESTS_OFFSET_HOST].edata2_len, K2, checksum, lid) == 1)
|
|
{
|
|
if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0)
|
|
{
|
|
mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, il_pos, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_m16 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
/**
|
|
* modifier
|
|
*/
|
|
|
|
const u64 lid = get_local_id (0);
|
|
|
|
/**
|
|
* base
|
|
*/
|
|
|
|
const u64 gid = get_global_id (0);
|
|
|
|
if (gid >= GID_CNT) return;
|
|
|
|
u32 pw_buf0[4];
|
|
u32 pw_buf1[4];
|
|
|
|
pw_buf0[0] = pws[gid].i[0];
|
|
pw_buf0[1] = pws[gid].i[1];
|
|
pw_buf0[2] = pws[gid].i[2];
|
|
pw_buf0[3] = pws[gid].i[3];
|
|
pw_buf1[0] = pws[gid].i[4];
|
|
pw_buf1[1] = pws[gid].i[5];
|
|
pw_buf1[2] = pws[gid].i[6];
|
|
pw_buf1[3] = pws[gid].i[7];
|
|
|
|
const u32 pw_l_len = pws[gid].pw_len & 63;
|
|
|
|
/**
|
|
* shared
|
|
*/
|
|
|
|
LOCAL_VK u32 S[64 * FIXED_LOCAL_SIZE];
|
|
|
|
/**
|
|
* salt
|
|
*/
|
|
|
|
u32 checksum[4];
|
|
|
|
checksum[0] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[0];
|
|
checksum[1] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[1];
|
|
checksum[2] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[2];
|
|
checksum[3] = esalt_bufs[DIGESTS_OFFSET_HOST].checksum[3];
|
|
|
|
/**
|
|
* loop
|
|
*/
|
|
|
|
for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE)
|
|
{
|
|
const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63;
|
|
|
|
const u32x pw_len = (pw_l_len + pw_r_len) & 63;
|
|
|
|
/**
|
|
* concat password candidate
|
|
*/
|
|
|
|
u32x wordl0[4] = { 0 };
|
|
u32x wordl1[4] = { 0 };
|
|
u32x wordl2[4] = { 0 };
|
|
u32x wordl3[4] = { 0 };
|
|
|
|
wordl0[0] = pw_buf0[0];
|
|
wordl0[1] = pw_buf0[1];
|
|
wordl0[2] = pw_buf0[2];
|
|
wordl0[3] = pw_buf0[3];
|
|
wordl1[0] = pw_buf1[0];
|
|
wordl1[1] = pw_buf1[1];
|
|
wordl1[2] = pw_buf1[2];
|
|
wordl1[3] = pw_buf1[3];
|
|
|
|
u32x wordr0[4] = { 0 };
|
|
u32x wordr1[4] = { 0 };
|
|
u32x wordr2[4] = { 0 };
|
|
u32x wordr3[4] = { 0 };
|
|
|
|
wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
|
|
wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
|
|
wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
|
|
wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
|
|
wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
|
|
wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
|
|
wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
|
|
wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
|
|
|
|
if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT)
|
|
{
|
|
switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len);
|
|
}
|
|
else
|
|
{
|
|
switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len);
|
|
}
|
|
|
|
u32x w0[4];
|
|
u32x w1[4];
|
|
|
|
w0[0] = wordl0[0] | wordr0[0];
|
|
w0[1] = wordl0[1] | wordr0[1];
|
|
w0[2] = wordl0[2] | wordr0[2];
|
|
w0[3] = wordl0[3] | wordr0[3];
|
|
w1[0] = wordl1[0] | wordr1[0];
|
|
w1[1] = wordl1[1] | wordr1[1];
|
|
w1[2] = wordl1[2] | wordr1[2];
|
|
w1[3] = wordl1[3] | wordr1[3];
|
|
|
|
/**
|
|
* kerberos
|
|
*/
|
|
|
|
u32 digest[4];
|
|
|
|
u32 K2[4];
|
|
|
|
kerb_prepare (w0, w1, pw_len, checksum, digest, K2);
|
|
|
|
u32 tmp[4];
|
|
|
|
tmp[0] = digest[0];
|
|
tmp[1] = digest[1];
|
|
tmp[2] = digest[2];
|
|
tmp[3] = digest[3];
|
|
|
|
if (decrypt_and_check (S, tmp, esalt_bufs[DIGESTS_OFFSET_HOST].edata2, esalt_bufs[DIGESTS_OFFSET_HOST].edata2_len, K2, checksum, lid) == 1)
|
|
{
|
|
if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0)
|
|
{
|
|
mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, il_pos, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
}
|
|
|
|
KERNEL_FQ KERNEL_FA void m18200_s16 (KERN_ATTR_ESALT (krb5asrep_t))
|
|
{
|
|
}
|