From edcdf004a54f8379cac6f9643dddaf88bd3fc83a Mon Sep 17 00:00:00 2001 From: Sein Coray Date: Mon, 20 May 2019 08:53:43 +0200 Subject: [PATCH] Fixing issue when uncompressed pkzip hash is longer than MAX_LOCAL --- OpenCL/m17210_a0-pure.cl | 84 +++++++++++++++++++++++++++++++++++----- OpenCL/m17210_a1-pure.cl | 84 +++++++++++++++++++++++++++++++++++----- OpenCL/m17210_a3-pure.cl | 84 +++++++++++++++++++++++++++++++++++----- 3 files changed, 222 insertions(+), 30 deletions(-) diff --git a/OpenCL/m17210_a0-pure.cl b/OpenCL/m17210_a0-pure.cl index 086333702..3920527da 100644 --- a/OpenCL/m17210_a0-pure.cl +++ b/OpenCL/m17210_a0-pure.cl @@ -409,13 +409,45 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc; @@ -604,13 +636,45 @@ KERNEL_FQ void m17210_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc; diff --git a/OpenCL/m17210_a1-pure.cl b/OpenCL/m17210_a1-pure.cl index 1573fd3a4..de5d07d05 100644 --- a/OpenCL/m17210_a1-pure.cl +++ b/OpenCL/m17210_a1-pure.cl @@ -409,13 +409,45 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc; @@ -606,13 +638,45 @@ KERNEL_FQ void m17210_mxx (KERN_ATTR_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc; diff --git a/OpenCL/m17210_a3-pure.cl b/OpenCL/m17210_a3-pure.cl index 5a2939533..d5c4fe348 100644 --- a/OpenCL/m17210_a3-pure.cl +++ b/OpenCL/m17210_a3-pure.cl @@ -421,13 +421,45 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc; @@ -630,13 +662,45 @@ KERNEL_FQ void m17210_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) // global memory from here - for (u32 i = MAX_LOCAL * 4; i < data_length; i++) + for (u32 j = MAX_LOCAL, i = MAX_LOCAL * 4; i < data_length; j++, i += 4) { - update_key3 (key2, key3); - plain = esalt_bufs[digests_offset].hash.data[i] ^ key3; - update_key012 (key0, key1, key2, plain, l_crc32tab); + next = esalt_bufs[digests_offset].hash.data[j]; - crc = CRC32 (crc, plain, l_crc32tab); + if (data_length >= (i + 1)) + { + update_key3 (key2, key3); + plain = unpack_v8a_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 2)) + { + update_key3 (key2, key3); + plain = unpack_v8b_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 3)) + { + update_key3 (key2, key3); + plain = unpack_v8c_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } + + if (data_length >= (i + 4)) + { + update_key3 (key2, key3); + plain = unpack_v8d_from_v32_S (next) ^ key3; + update_key012 (key0, key1, key2, plain, l_crc32tab); + + crc = CRC32 (crc, plain, l_crc32tab); + } } const u32 r0 = ~crc;