From 0f73c778d5e468cd92df4b61d04618f092e60aa7 Mon Sep 17 00:00:00 2001 From: Jens Steube Date: Sat, 16 Apr 2016 11:50:48 +0200 Subject: [PATCH] Optimized -m 8300 (DNSSEC) cracking performance in -a 3 mode --- OpenCL/m08300_a3.cl | 178 +++++++++++++++++--------------------------- src/oclHashcat.c | 2 +- src/shared.c | 6 ++ 3 files changed, 77 insertions(+), 109 deletions(-) diff --git a/OpenCL/m08300_a3.cl b/OpenCL/m08300_a3.cl index 0adf4ed..9fe5936 100644 --- a/OpenCL/m08300_a3.cl +++ b/OpenCL/m08300_a3.cl @@ -166,35 +166,31 @@ static void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le u32 salt_buf0[4]; u32 salt_buf1[4]; - salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; - salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; - salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; - salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; - salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; - salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; - salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; - salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[4]; - domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; - domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; - domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; - domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; - domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; - domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; - domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 0]); + domain_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 1]); + domain_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 2]); + domain_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 3]); + domain_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 4]); + domain_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 5]); + domain_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 6]); domain_buf1[3] = 0; const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; - /** - * salt - */ - u32 s0[4]; u32 s1[4]; u32 s2[4]; @@ -217,7 +213,7 @@ static void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le s3[2] = 0; s3[3] = 0; - switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_len); + switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len); w0[0] |= s0[0]; w0[1] |= s0[1]; @@ -253,7 +249,7 @@ static void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le s3[2] = 0; s3[3] = 0; - switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_len + domain_len + 1); + switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len + domain_len + 1); w0[0] |= s0[0]; w0[1] |= s0[1]; @@ -306,31 +302,16 @@ static void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le w3_t[2] = w3[2]; w3_t[3] = w3[3]; - switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, 1); + switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 1); - w0_t[0] |= pw_len & 0xff; + w0_t[0] |= (pw_len & 0xff) << 24; + w3_t[2] = 0; + w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; /** * sha1 */ - w0_t[0] = swap32 (w0_t[0]); - w0_t[1] = swap32 (w0_t[1]); - w0_t[2] = swap32 (w0_t[2]); - w0_t[3] = swap32 (w0_t[3]); - w1_t[0] = swap32 (w1_t[0]); - w1_t[1] = swap32 (w1_t[1]); - w1_t[2] = swap32 (w1_t[2]); - w1_t[3] = swap32 (w1_t[3]); - w2_t[0] = swap32 (w2_t[0]); - w2_t[1] = swap32 (w2_t[1]); - w2_t[2] = swap32 (w2_t[2]); - w2_t[3] = swap32 (w2_t[3]); - w3_t[0] = swap32 (w3_t[0]); - w3_t[1] = swap32 (w3_t[1]); - w3_t[2] = 0; - w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; - u32x digest[5]; digest[0] = SHA1M_A; @@ -350,14 +331,14 @@ static void m08300m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le w0_t[2] = digest[2]; w0_t[3] = digest[3]; w1_t[0] = digest[4]; - w1_t[1] = swap32 (salt_buf0[0]); - w1_t[2] = swap32 (salt_buf0[1]); - w1_t[3] = swap32 (salt_buf0[2]); - w2_t[0] = swap32 (salt_buf0[3]); - w2_t[1] = swap32 (salt_buf1[0]); - w2_t[2] = swap32 (salt_buf1[1]); - w2_t[3] = swap32 (salt_buf1[2]); - w3_t[0] = swap32 (salt_buf1[3]); + w1_t[1] = salt_buf0[0]; + w1_t[2] = salt_buf0[1]; + w1_t[3] = salt_buf0[2]; + w2_t[0] = salt_buf0[3]; + w2_t[1] = salt_buf1[0]; + w2_t[2] = salt_buf1[1]; + w2_t[3] = salt_buf1[2]; + w3_t[0] = salt_buf1[3]; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = (20 + salt_len) * 8; @@ -384,18 +365,6 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le const u32 gid = get_global_id (0); const u32 lid = get_local_id (0); - /** - * digest - */ - - const u32 search[4] = - { - digests_buf[digests_offset].digest_buf[DGST_R0], - digests_buf[digests_offset].digest_buf[DGST_R1], - digests_buf[digests_offset].digest_buf[DGST_R2], - digests_buf[digests_offset].digest_buf[DGST_R3] - }; - /** * salt */ @@ -405,35 +374,31 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le u32 salt_buf0[4]; u32 salt_buf1[4]; - salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; - salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; - salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; - salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; - salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; - salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; - salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; - salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap32_S (salt_bufs[salt_pos].salt_buf[ 7]); const u32 salt_len = salt_bufs[salt_pos].salt_len; u32 domain_buf0[4]; u32 domain_buf1[4]; - domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; - domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; - domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; - domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; - domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; - domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; - domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf0[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 0]); + domain_buf0[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 1]); + domain_buf0[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 2]); + domain_buf0[3] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 3]); + domain_buf1[0] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 4]); + domain_buf1[1] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 5]); + domain_buf1[2] = swap32_S (salt_bufs[salt_pos].salt_buf_pc[ 6]); domain_buf1[3] = 0; const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; - /** - * salt - */ - u32 s0[4]; u32 s1[4]; u32 s2[4]; @@ -456,7 +421,7 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le s3[2] = 0; s3[3] = 0; - switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_len); + switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len); w0[0] |= s0[0]; w0[1] |= s0[1]; @@ -492,7 +457,7 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le s3[2] = 0; s3[3] = 0; - switch_buffer_by_offset_le_S (s0, s1, s2, s3, pw_len + domain_len + 1); + switch_buffer_by_offset_be_S (s0, s1, s2, s3, pw_len + domain_len + 1); w0[0] |= s0[0]; w0[1] |= s0[1]; @@ -511,6 +476,18 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le w3[2] |= s3[2]; w3[3] |= s3[3]; + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + /** * loop */ @@ -545,31 +522,16 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le w3_t[2] = w3[2]; w3_t[3] = w3[3]; - switch_buffer_by_offset_le (w0_t, w1_t, w2_t, w3_t, 1); + switch_buffer_by_offset_be (w0_t, w1_t, w2_t, w3_t, 1); - w0_t[0] |= pw_len & 0xff; + w0_t[0] |= (pw_len & 0xff) << 24; + w3_t[2] = 0; + w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; /** * sha1 */ - w0_t[0] = swap32 (w0_t[0]); - w0_t[1] = swap32 (w0_t[1]); - w0_t[2] = swap32 (w0_t[2]); - w0_t[3] = swap32 (w0_t[3]); - w1_t[0] = swap32 (w1_t[0]); - w1_t[1] = swap32 (w1_t[1]); - w1_t[2] = swap32 (w1_t[2]); - w1_t[3] = swap32 (w1_t[3]); - w2_t[0] = swap32 (w2_t[0]); - w2_t[1] = swap32 (w2_t[1]); - w2_t[2] = swap32 (w2_t[2]); - w2_t[3] = swap32 (w2_t[3]); - w3_t[0] = swap32 (w3_t[0]); - w3_t[1] = swap32 (w3_t[1]); - w3_t[2] = 0; - w3_t[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; - u32x digest[5]; digest[0] = SHA1M_A; @@ -589,14 +551,14 @@ static void m08300s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le w0_t[2] = digest[2]; w0_t[3] = digest[3]; w1_t[0] = digest[4]; - w1_t[1] = swap32 (salt_buf0[0]); - w1_t[2] = swap32 (salt_buf0[1]); - w1_t[3] = swap32 (salt_buf0[2]); - w2_t[0] = swap32 (salt_buf0[3]); - w2_t[1] = swap32 (salt_buf1[0]); - w2_t[2] = swap32 (salt_buf1[1]); - w2_t[3] = swap32 (salt_buf1[2]); - w3_t[0] = swap32 (salt_buf1[3]); + w1_t[1] = salt_buf0[0]; + w1_t[2] = salt_buf0[1]; + w1_t[3] = salt_buf0[2]; + w2_t[0] = salt_buf0[3]; + w2_t[1] = salt_buf1[0]; + w2_t[2] = salt_buf1[1]; + w2_t[3] = salt_buf1[2]; + w3_t[0] = salt_buf1[3]; w3_t[1] = 0; w3_t[2] = 0; w3_t[3] = (20 + salt_len) * 8; diff --git a/src/oclHashcat.c b/src/oclHashcat.c index 1793ab7..4cd299a 100644 --- a/src/oclHashcat.c +++ b/src/oclHashcat.c @@ -9329,7 +9329,7 @@ int main (int argc, char **argv) case 8300: hash_type = HASH_TYPE_SHA1; salt_type = SALT_TYPE_EMBEDDED; attack_exec = ATTACK_EXEC_INSIDE_KERNEL; - opts_type = OPTS_TYPE_PT_GENERATE_LE + opts_type = OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_ST_HEX | OPTS_TYPE_ST_ADD80; kern_type = KERN_TYPE_NSEC3; diff --git a/src/shared.c b/src/shared.c index bd272bd..bc415de 100644 --- a/src/shared.c +++ b/src/shared.c @@ -7238,6 +7238,12 @@ void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos) { char digest_buf_c[34] = { 0 }; + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c); digest_buf_c[32] = 0; -- 2.25.1