included speed improvements and feedback from atom applied to all 172xx kernel variants

pull/1962/head
Sein Coray 5 years ago
parent e4d8e4a7ad
commit 371991e079
No known key found for this signature in database
GPG Key ID: 44C4180EA69758EC

@ -61,11 +61,6 @@ any external components and dependencies which may be included with PKZIP Kernel
*/
#include "inc_vendor.h"
#include "inc_types.h"
#include "inc_common.cl"
#include "inc_simd.cl"
enum{
MZ_OK = 0,
MZ_STREAM_END = 1,
@ -193,6 +188,7 @@ void memcpy(void *dest, const void *src, size_t n){
}
}
void *memset(void *s, int c, u32 len){
u8 *dst = s;
while (len > 0) {
@ -209,6 +205,7 @@ void *memset(void *s, int c, u32 len){
#define MZ_DEFAULT_WINDOW_BITS 15
#define TINFL_LZ_DICT_SIZE 32768
#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
#define TINFL_MEMCPY_G(d, s, l, p) memcpy_g(d, s, l, p)
#define TINFL_MEMSET(p, c, l) memset(p, c, l)
#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
@ -293,7 +290,7 @@ enum
{ \
TINFL_CR_RETURN(state_index, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); \
} \
c = *pIn_buf_cur++; \
c = pIn_xor_byte (*pIn_buf_cur++, pStream); \
} \
MZ_MACRO_END
@ -310,7 +307,7 @@ enum
} \
else \
{ \
bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); \
bit_buf |= (((tinfl_bit_buf_t) pIn_xor_byte (pIn_buf_cur[0], pStream)) << num_bits) | (((tinfl_bit_buf_t) pIn_xor_byte (pIn_buf_cur[1], pStream)) << (num_bits + 8)); \
pIn_buf_cur += 2; \
num_bits += 16; \
} \
@ -416,11 +413,12 @@ typedef struct
int m_window_bits;
mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];
tinfl_status m_last_status;
} inflate_state;
typedef struct mz_stream_s
{
const unsigned char *next_in; /* pointer to next byte to read */
__global const unsigned char *next_in; /* pointer to next byte to read */
unsigned int avail_in; /* number of bytes available at next_in */
mz_ulong total_in; /* total number of bytes consumed so far */
@ -436,6 +434,15 @@ typedef struct mz_stream_s
int data_type; /* data_type (unused) */
mz_ulong adler; /* adler32 of the source or uncompressed data */
mz_ulong reserved; /* not used */
#ifdef CRC32_IN_INFLATE
u32 key0;
u32 key1;
u32 key2;
u32 crc32;
LOCAL_AS u32 *crc32tab;
#endif
} mz_stream;
typedef mz_stream *mz_streamp;
@ -451,9 +458,29 @@ int mz_inflateEnd(mz_streamp pStream);
int mz_inflateInit2(mz_streamp pStream, int window_bits, inflate_state*);
const mz_uint8 pIn_xor_byte (const mz_uint8 c, mz_streamp pStream)
{
mz_uint8 r = c;
u32 key3;
update_key3 (pStream->key2, key3);
u32 plain = c ^ key3;
update_key012 (pStream->key0, pStream->key1, pStream->key2, plain, pStream->crc32tab);
return (mz_uint8) plain;
}
tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
void memcpy_g(void *dest, __global const void *src, size_t n, mz_streamp pStream){
__global char *csrc = (__global char *)src;
char *cdest = (char *)dest;
for (int i=0; i<n; i++){
cdest[i] = pIn_xor_byte (csrc[i], pStream);
}
}
tinfl_status tinfl_decompress(tinfl_decompressor *r, __global const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags, mz_streamp pStream)
{
const int s_length_base[31] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 };
@ -466,7 +493,8 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
tinfl_status status = TINFL_STATUS_FAILED;
mz_uint32 num_bits, dist, counter, num_extra;
tinfl_bit_buf_t bit_buf;
const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
__global const mz_uint8 *pIn_buf_cur = pIn_buf_next;
__global const mz_uint8 *pIn_buf_end = pIn_buf_next + *pIn_buf_size;
mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
@ -540,7 +568,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
TINFL_CR_RETURN(38, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS);
}
n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n);
TINFL_MEMCPY_G(pOut_buf_cur, pIn_buf_cur, n, pStream);
pIn_buf_cur += n;
pOut_buf_cur += n;
counter -= (mz_uint)n;
@ -697,10 +725,10 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
mz_uint code_len;
if (num_bits < 30)
{
u32 num = *pIn_buf_cur;
u32 num = pIn_xor_byte (*pIn_buf_cur, pStream);
pIn_buf_cur++;
for(int i=1;i<4;i++){
num |= (*pIn_buf_cur) << 8*i;
num |= pIn_xor_byte (*pIn_buf_cur, pStream) << 8*i;
pIn_buf_cur++;
}
//bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits);
@ -978,14 +1006,20 @@ int mz_inflate(mz_streamp pStream, int flush)
decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF;
in_bytes = pStream->avail_in;
out_bytes = pStream->avail_out;
status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);
status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags, pStream);
for (int i = 0; i < out_bytes; i++)
{
pStream->crc32 = CRC32 (pStream->crc32, pStream->next_out[i], pStream->crc32tab);
}
pState->m_last_status = status;
pStream->next_in += (mz_uint)in_bytes;
pStream->avail_in -= (mz_uint)in_bytes;
pStream->total_in += (mz_uint)in_bytes;
pStream->adler = tinfl_get_adler32(&pState->m_decomp);
pStream->next_out += (mz_uint)out_bytes;
pStream->avail_out -= (mz_uint)out_bytes;
//pStream->next_out += (mz_uint)out_bytes;
//pStream->avail_out -= (mz_uint)out_bytes;
pStream->total_out += (mz_uint)out_bytes;
if (status < 0)
@ -1005,8 +1039,14 @@ int mz_inflate(mz_streamp pStream, int flush)
{
n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
pStream->next_out += n;
pStream->avail_out -= n;
for (int i = 0; i < n; i++)
{
pStream->crc32 = CRC32 (pStream->crc32, pStream->next_out[i], pStream->crc32tab);
}
//pStream->next_out += n;
//pStream->avail_out -= n;
pStream->total_out += n;
pState->m_dict_avail -= n;
pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
@ -1019,7 +1059,7 @@ int mz_inflate(mz_streamp pStream, int flush)
in_bytes = pStream->avail_in;
out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;
status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);
status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags, pStream);
pState->m_last_status = status;
pStream->next_in += (mz_uint)in_bytes;
@ -1031,8 +1071,14 @@ int mz_inflate(mz_streamp pStream, int flush)
n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
pStream->next_out += n;
pStream->avail_out -= n;
for (int i = 0; i < n; i++)
{
pStream->crc32 = CRC32 (pStream->crc32, pStream->next_out[i], pStream->crc32tab);
}
//pStream->next_out += n;
//pStream->avail_out -= n;
pStream->total_out += n;
pState->m_dict_avail -= n;
pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -91,14 +92,33 @@ Author: Sein Coray
#include "inc_rp.h"
#include "inc_rp.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_UNCOMPRESSED_LENGTH 4096
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct pkzip_hash
#define MAX_DATA (16 * 1024 * 1024)
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -111,16 +131,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_UNCOMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
typedef struct pkzip
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hash;
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
{
@ -128,48 +225,57 @@ __kernel void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
/**
* sbox, kbox
*/
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (gid >= gid_max) return;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* digest
*/
l_crc32tab[b] = remainder;
}
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]
};
barrier (CLK_LOCAL_MEM_FENCE);
/**
* prefetch from global memory
*/
if (gid >= gid_max) return;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
/**
* base
@ -181,157 +287,144 @@ __kernel void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* loop
*/
u32x key0, key1, key2;
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
pw_t tmp = PASTE_PW;
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
key0 = 0x12345678;
key1 = 0x23456789;
key2 = 0x34567890;
u32x key0 = 0x12345678;
u32x key1 = 0x23456789;
u32x key2 = 0x34567890;
for (u8 i = 0; i < tmp.pw_len; i++)
for (u32 i = 0, j = 0; i < tmp.pw_len; i += 4, j += 1)
{
key0 = CRC32( key0, (tmp.i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
if (tmp.pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (tmp.i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
{
continue;
}
u32 plain;
u32 key3;
u32 next;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = l_data[0];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
@ -341,49 +434,46 @@ __kernel void m17210_mxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
if (gid >= gid_max) return;
/**
* prefetch from global memory
*/
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
/**
* base
*/
@ -394,156 +484,152 @@ __kernel void m17210_mxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* loop
*/
u32x key0, key1, key2;
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
pw_t tmp = PASTE_PW;
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
key0 = 0x12345678;
key1 = 0x23456789;
key2 = 0x34567890;
u32x key0 = 0x12345678;
u32x key1 = 0x23456789;
u32x key2 = 0x34567890;
for (u8 i = 0; i < tmp.pw_len; i++)
for (u32 i = 0, j = 0; i < tmp.pw_len; i += 4, j += 1)
{
key0 = CRC32( key0, (tmp.i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
if (tmp.pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (tmp.i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
{
continue;
}
u32 plain;
u32 key3;
u32 next;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = l_data[0];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
next = l_data[1];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -89,14 +90,33 @@ Author: Sein Coray
#include "inc_common.cl"
#include "inc_simd.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_UNCOMPRESSED_LENGTH 4096
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct pkzip_hash
#define MAX_DATA (16 * 1024 * 1024)
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -109,16 +129,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_UNCOMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
typedef struct pkzip
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hash;
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17210_sxx (KERN_ATTR_ESALT (pkzip_t))
{
@ -126,212 +223,208 @@ __kernel void m17210_sxx (KERN_ATTR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
/**
* sbox, kbox
*/
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (gid >= gid_max) return;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* digest
*/
l_crc32tab[b] = remainder;
}
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]
};
barrier (CLK_LOCAL_MEM_FENCE);
/**
* prefetch from global memory
*/
if (gid >= gid_max) return;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
/**
* loop
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < pws[gid].pw_len; i++)
for (u32 i = 0, j = 0; i < pws[gid].pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (pws[gid].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pws[gid].pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (pws[gid].i[j]), l_crc32tab);
}
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
for (u8 i = 0; i < combs_buf[il_pos].pw_len; i++)
for (u32 i = 0, j = 0; i < combs_buf[il_pos].pw_len; i += 4, j += 1)
{
key0 = CRC32( key0, (combs_buf[il_pos].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
if (combs_buf[il_pos].pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
{
continue;
}
u32 plain;
u32 key3;
u32 next;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = l_data[0];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
@ -341,43 +434,30 @@ __kernel void m17210_mxx (KERN_ATTR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -385,167 +465,173 @@ __kernel void m17210_mxx (KERN_ATTR_ESALT (pkzip_t))
if (gid >= gid_max) return;
/**
* loop
* prefetch from global memory
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
/**
* loop
*/
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < pws[gid].pw_len; i++)
for (u32 i = 0, j = 0; i < pws[gid].pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (pws[gid].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pws[gid].pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (pws[gid].i[j]), l_crc32tab);
}
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
for (u8 i = 0; i < combs_buf[il_pos].pw_len; i++)
for (u32 i = 0, j = 0; i < combs_buf[il_pos].pw_len; i += 4, j += 1)
{
key0 = CRC32( key0, (combs_buf[il_pos].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
if (combs_buf[il_pos].pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
{
continue;
}
u32 plain;
u32 key3;
u32 next;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = l_data[0];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
next = l_data[1];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -89,14 +90,33 @@ Author: Sein Coray
#include "inc_common.cl"
#include "inc_simd.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_UNCOMPRESSED_LENGTH 4096
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct pkzip_hash
#define MAX_DATA (16 * 1024 * 1024)
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -109,16 +129,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_UNCOMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
typedef struct pkzip
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hash;
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
{
@ -126,48 +223,57 @@ __kernel void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
/**
* sbox, kbox
*/
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (gid >= gid_max) return;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* digest
*/
l_crc32tab[b] = remainder;
}
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]
};
barrier (CLK_LOCAL_MEM_FENCE);
/**
* prefetch from global memory
*/
if (gid >= gid_max) return;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
/**
* base
@ -186,158 +292,151 @@ __kernel void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* loop
*/
u32x key0, key1, key2;
u32 w0l = w[0];
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
{
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
const u32x w0 = w0l | w0r;
w[0] = w0;
key0 = 0x12345678;
key1 = 0x23456789;
key2 = 0x34567890;
u32x key0 = 0x12345678;
u32x key1 = 0x23456789;
u32x key2 = 0x34567890;
for (u8 i = 0; i < pw_len; i++)
{
key0 = CRC32( key0, (w[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
}
if (pw_len >= 1) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (w0), l_crc32tab);
if (pw_len >= 2) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (w0), l_crc32tab);
if (pw_len >= 3) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (w0), l_crc32tab);
if (pw_len >= 4) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (w0), l_crc32tab);
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1)
{
continue;
if (pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (w[j]), l_crc32tab);
}
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32 plain;
u32 key3;
u32 next;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
next = l_data[0];
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
@ -347,49 +446,46 @@ __kernel void m17210_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
barrier (CLK_LOCAL_MEM_FENCE);
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hash.data;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_data[MAX_LOCAL];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < MAX_LOCAL; i += lsz)
{
l_data[i] = data_ptr[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
if (gid >= gid_max) return;
/**
* prefetch from global memory
*/
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 checksum_from_crc = esalt_bufs[digests_offset].hash.checksum_from_crc;
const u32 checksum_from_timestamp = esalt_bufs[digests_offset].hash.checksum_from_timestamp;
const u32 crc32_final = esalt_bufs[digests_offset].hash.crc32;
const u32 data_length = esalt_bufs[digests_offset].hash.data_length;
/**
* base
*/
@ -407,157 +503,159 @@ __kernel void m17210_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* loop
*/
u32x key0, key1, key2;
u32 w0l = w[0];
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
{
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
const u32x w0 = w0l | w0r;
w[0] = w0;
key0 = 0x12345678;
key1 = 0x23456789;
key2 = 0x34567890;
u32x key0 = 0x12345678;
u32x key1 = 0x23456789;
u32x key2 = 0x34567890;
for (u8 i = 0; i < pw_len; i++)
{
key0 = CRC32( key0, (w[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
}
if (pw_len >= 1) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (w0), l_crc32tab);
if (pw_len >= 2) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (w0), l_crc32tab);
if (pw_len >= 3) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (w0), l_crc32tab);
if (pw_len >= 4) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (w0), l_crc32tab);
u8 plain;
u8 key3;
u16 temp;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hash.checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp & 0xff))
for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1)
{
continue;
if (pw_len >= (i + 1)) update_key012 (key0, key1, key2, unpack_v8a_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 2)) update_key012 (key0, key1, key2, unpack_v8b_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 3)) update_key012 (key0, key1, key2, unpack_v8c_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 4)) update_key012 (key0, key1, key2, unpack_v8d_from_v32_S (w[j]), l_crc32tab);
}
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32 plain;
u32 key3;
u32 next;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp^1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[11] ^ key3;
next = l_data[0];
if (plain != (esalt_bufs[digests_offset].hash.checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hash.checksum_from_timestamp >> 8))
{
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[12] ^ key3;
next = l_data[1];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = l_data[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((checksum_from_crc & 0xff) != plain) && ((checksum_from_timestamp & 0xff) != plain)) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (checksum_from_crc >> 8)) && (plain != (checksum_from_timestamp >> 8))) continue;
update_key012 (key0, key1, key2, plain, l_crc32tab);
u32x crc = 0xffffffff;
crc = CRC32(crc, plain);
for (unsigned int i = 13; i < esalt_bufs[digests_offset].hash.data_length; i++)
for (u32 i = 12, j = 3; i < data_length && j < MAX_LOCAL; i += 4, j += 1)
{
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
next = l_data[j];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
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);
}
crc = ~crc;
crc = CRC32 (crc, plain, l_crc32tab);
}
if (crc == esalt_bufs[digests_offset].hash.crc32)
{
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
if (data_length >= (i + 2))
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
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);
}
}
// global memory from here
for (u32 i = MAX_LOCAL * 4; i < data_length; i++)
{
update_key3 (key2, key3);
plain = esalt_bufs[digests_offset].hash.data[i] ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
crc = CRC32 (crc, plain, l_crc32tab);
}
const u32 r0 = ~crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -91,14 +92,33 @@ Author: Sein Coray
#include "inc_rp.h"
#include "inc_rp.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_COMPRESSED_LENGTH 2048
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct pkzip_hash
#define MAX_DATA (16 * 1024 * 1024)
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -111,16 +131,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
typedef struct pkzip
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hashes[8];
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
{
@ -128,43 +225,19 @@ __kernel void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -178,11 +251,15 @@ __kernel void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
COPY_PW (pws[gid]);
/**
* loop
* prefetch from global memory
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
/**
* loop
*/
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
@ -190,140 +267,112 @@ __kernel void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t))
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < tmp.pw_len; i++)
for (u32 i = 0, j = 0; i < tmp.pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (tmp.i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (tmp.pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (tmp.i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = data_ptr[2];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
/**
* digest
*/
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
const u32 search[4] =
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
esalt_bufs[digests_offset].hashes[0].checksum_from_crc,
0,
0,
0
};
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
}
@ -335,43 +384,19 @@ __kernel void m17230_mxx (KERN_ATTR_RULES_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -385,11 +410,15 @@ __kernel void m17230_mxx (KERN_ATTR_RULES_ESALT (pkzip_t))
COPY_PW (pws[gid]);
/**
* loop
* prefetch from global memory
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
/**
* loop
*/
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
@ -397,141 +426,110 @@ __kernel void m17230_mxx (KERN_ATTR_RULES_ESALT (pkzip_t))
tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len);
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < tmp.pw_len; i++)
for (u32 i = 0, j = 0; i < tmp.pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (tmp.i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (tmp.pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (tmp.i[j]), l_crc32tab);
if (tmp.pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (tmp.i[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -88,23 +89,34 @@ Author: Sein Coray
#include "inc_types.h"
#include "inc_common.cl"
#include "inc_simd.cl"
#include "inc_rp.h"
#include "inc_rp.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_COMPRESSED_LENGTH 2048
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct {
u8 op; /* operation, extra bits, table bits */
u8 bits; /* bits in this part of the code */
u16 val; /* offset in table or code value */
} code;
#define MAX_DATA (16 * 1024 * 1024)
typedef struct pkzip_hash
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -117,16 +129,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
} __attribute__((packed));
typedef struct pkzip
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hashes[8];
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17230_sxx (KERN_ATTR_ESALT (pkzip_t))
{
@ -134,43 +223,19 @@ __kernel void m17230_sxx (KERN_ATTR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -178,161 +243,136 @@ __kernel void m17230_sxx (KERN_ATTR_ESALT (pkzip_t))
if (gid >= gid_max) return;
/**
* loop
* prefetch from global memory
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
u32x key0init2, key1init2, key2init2;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
/**
* loop
*/
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < pws[gid].pw_len; i++)
for (u32 i = 0, j = 0; i < pws[gid].pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (pws[gid].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pws[gid].pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (pws[gid].i[j]), l_crc32tab);
}
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
key0init2 = key0init;
key1init2 = key1init;
key2init2 = key2init;
u32x key0init2 = key0init;
u32x key1init2 = key1init;
u32x key2init2 = key2init;
for (u8 i = 0; i < combs_buf[il_pos].pw_len; i++)
for (u32 i = 0, j = 0; i < combs_buf[il_pos].pw_len; i += 4, j += 1)
{
key0init2 = CRC32( key0init2, (combs_buf[il_pos].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init2 = (key1init2 + (key0init2 & 0xff)) * CONST + 1;
key2init2 = CRC32( key2init2, MSB(key1init2) );
if (combs_buf[il_pos].pw_len >= (i + 1)) update_key012 (key0init2, key1init2, key2init2, unpack_v8a_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 2)) update_key012 (key0init2, key1init2, key2init2, unpack_v8b_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 3)) update_key012 (key0init2, key1init2, key2init2, unpack_v8c_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 4)) update_key012 (key0init2, key1init2, key2init2, unpack_v8d_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
}
u8 abort = 0;
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init2;
key1 = key1init2;
key2 = key2init2;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init2;
u32x key1 = key1init2;
u32x key2 = key2init2;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[2];
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
/**
* digest
*/
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
const u32 search[4] =
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
esalt_bufs[digests_offset].hashes[0].checksum_from_crc,
0,
0,
0
};
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
}
@ -344,43 +384,19 @@ __kernel void m17230_mxx (KERN_ATTR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -388,162 +404,134 @@ __kernel void m17230_mxx (KERN_ATTR_ESALT (pkzip_t))
if (gid >= gid_max) return;
/**
* loop
* prefetch from global memory
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
u32x key0init2, key1init2, key2init2;
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
/**
* loop
*/
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
for (u8 i = 0; i < pws[gid].pw_len; i++)
for (u32 i = 0, j = 0; i < pws[gid].pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (pws[gid].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pws[gid].pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (pws[gid].i[j]), l_crc32tab);
if (pws[gid].pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (pws[gid].i[j]), l_crc32tab);
}
for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
{
key0init2 = key0init;
key1init2 = key1init;
key2init2 = key2init;
u32x key0init2 = key0init;
u32x key1init2 = key1init;
u32x key2init2 = key2init;
for (u8 i = 0; i < combs_buf[il_pos].pw_len; i++)
for (u32 i = 0, j = 0; i < combs_buf[il_pos].pw_len; i += 4, j += 1)
{
key0init2 = CRC32( key0init2, (combs_buf[il_pos].i[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init2 = (key1init2 + (key0init2 & 0xff)) * CONST + 1;
key2init2 = CRC32( key2init2, MSB(key1init2) );
if (combs_buf[il_pos].pw_len >= (i + 1)) update_key012 (key0init2, key1init2, key2init2, unpack_v8a_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 2)) update_key012 (key0init2, key1init2, key2init2, unpack_v8b_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 3)) update_key012 (key0init2, key1init2, key2init2, unpack_v8c_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
if (combs_buf[il_pos].pw_len >= (i + 4)) update_key012 (key0init2, key1init2, key2init2, unpack_v8d_from_v32_S (combs_buf[il_pos].i[j]), l_crc32tab);
}
u8 abort = 0;
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init2;
key1 = key1init2;
key2 = key2init2;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init2;
u32x key1 = key1init2;
u32x key2 = key2init2;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -88,17 +89,34 @@ Author: Sein Coray
#include "inc_types.h"
#include "inc_common.cl"
#include "inc_simd.cl"
#include "inc_rp.h"
#include "inc_rp.cl"
#define CRC32(x,c) (((x)>>8)^l_crc32tab[((x)^(c))&0xff])
#define MSB(x) ((x)>>24)
#define CONST 0x08088405
#define POLYNOMIAL 0xEDB88320
#define MAX_LOCAL 512 // too much leaves no room for compiler optimizations, simply benchmark to find a good trade-off - make it as big as possible
#define TMPSIZ 32
#define MAX_COMPRESSED_LENGTH 2048
#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff])
#define MSB(x) ((x) >> 24)
#define CONST 0x08088405
typedef struct pkzip_hash
#define MAX_DATA (16 * 1024 * 1024)
#define update_key012(k0,k1,k2,c,t) \
{ \
(k0) = CRC32 ((k0), c, (t)); \
(k1) = ((k1) + ((k0) & 0xff)) * CONST + 1; \
(k2) = CRC32 ((k2), MSB (k1), (t)); \
}
#define update_key3(k2,k3) \
{ \
const u32 temp = ((k2) & 0xffff) | 3; \
\
(k3) = ((temp * (temp ^ 1)) >> 8) & 0xff; \
}
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -111,16 +129,93 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
typedef struct pkzip
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hashes[8];
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
CONSTANT_AS u32a crc32tab[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
__kernel void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
{
@ -128,43 +223,19 @@ __kernel void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -184,154 +255,138 @@ __kernel void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
w[idx] = pws[gid].i[idx];
}
/**
* prefetch from global memory
*/
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
/**
* loop
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
u32 w0l = w[0];
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
{
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
const u32x w0 = w0l | w0r;
w[0] = w0;
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
if (pw_len >= 1) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (w0), l_crc32tab);
if (pw_len >= 2) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (w0), l_crc32tab);
if (pw_len >= 3) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (w0), l_crc32tab);
if (pw_len >= 4) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (w0), l_crc32tab);
for (u8 i = 0; i < pw_len; i++)
for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (w[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (w[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
next = data_ptr[2];
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
/**
* digest
*/
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
const u32 search[4] =
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
esalt_bufs[digests_offset].hashes[0].checksum_from_crc,
0,
0,
0
};
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
COMPARE_S_SIMD (r0, r1, r2, r3);
}
}
}
@ -343,43 +398,19 @@ __kernel void m17230_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
* modifier
*/
const u64 lid = get_local_id (0);
const u64 gid = get_global_id (0);
const u64 lid = get_local_id (0);
const u64 lsz = get_local_size (0);
__local u32 l_crc32tab[0x100];
u32 remainder;
u32 b = 0;
u8 set = 0;
for (u32 b = 0; b < 256; b++)
{
remainder = b;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
/**
* sbox, kbox
*/
if (remainder & 1) remainder = (remainder >> 1) ^ POLYNOMIAL;
else remainder >>= 1;
LOCAL_AS u32 l_crc32tab[256];
l_crc32tab[b] = remainder;
for (u64 i = lid; i < 256; i += lsz)
{
l_crc32tab[i] = crc32tab[i];
}
barrier (CLK_LOCAL_MEM_FENCE);
@ -399,155 +430,136 @@ __kernel void m17230_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t))
w[idx] = pws[gid].i[idx];
}
/**
* prefetch from global memory
*/
const u32 checksum_size = esalt_bufs[digests_offset].checksum_size;
const u32 hash_count = esalt_bufs[digests_offset].hash_count;
/**
* loop
*/
u32x key0, key1, key2;
u32x key0init, key1init, key2init;
u32 w0l = w[0];
for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
{
const u32x w0r = words_buf_r[il_pos / VECT_SIZE];
const u32x w0 = w0l | w0r;
w[0] = w0;
key0init = 0x12345678;
key1init = 0x23456789;
key2init = 0x34567890;
u32x key0init = 0x12345678;
u32x key1init = 0x23456789;
u32x key2init = 0x34567890;
if (pw_len >= 1) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (w0), l_crc32tab);
if (pw_len >= 2) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (w0), l_crc32tab);
if (pw_len >= 3) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (w0), l_crc32tab);
if (pw_len >= 4) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (w0), l_crc32tab);
for (u8 i = 0; i < pw_len; i++)
for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1)
{
key0init = CRC32( key0init, (w[i >> 2] >> ((i & 3) << 3)) & 0xff );
key1init = (key1init + (key0init & 0xff)) * CONST + 1;
key2init = CRC32( key2init, MSB(key1init) );
if (pw_len >= (i + 1)) update_key012 (key0init, key1init, key2init, unpack_v8a_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 2)) update_key012 (key0init, key1init, key2init, unpack_v8b_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 3)) update_key012 (key0init, key1init, key2init, unpack_v8c_from_v32_S (w[j]), l_crc32tab);
if (pw_len >= (i + 4)) update_key012 (key0init, key1init, key2init, unpack_v8d_from_v32_S (w[j]), l_crc32tab);
}
u8 plain;
u8 key3;
u16 temp;
u32 plain;
u32 key3;
u32 next;
for (u8 idx = 0; idx < esalt_bufs[digests_offset].hash_count; idx++)
for (u32 idx = 0; idx < hash_count; idx++)
{
key0 = key0init;
key1 = key1init;
key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[0] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[1] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[2] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[3] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[4] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[5] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[6] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[7] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[8] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[9] ^ key3;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[10] ^ key3;
if (esalt_bufs[digests_offset].checksum_size == 2 && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff))
{
idx = 0xfe;
continue;
}
__global u32 *data_ptr = (__global u32 *) esalt_bufs[digests_offset].hashes[idx].data;
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
u32x key0 = key0init;
u32x key1 = key1init;
u32x key2 = key2init;
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[11] ^ key3;
next = data_ptr[0];
if (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8) && plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))
{
idx = 0xfe;
continue;
}
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[1];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
key0 = CRC32( key0, plain );
key1 = (key1 + (key0 & 0xff)) * CONST + 1;
key2 = CRC32( key2, MSB(key1) );
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
temp = (key2 & 0xffff) | 3;
key3 = ((temp * (temp ^ 1)) >> 8) & 0xff;
plain = esalt_bufs[digests_offset].hashes[idx].data[12] ^ key3;
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
if ((plain & 6) == 0 || (plain & 6) == 6)
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[2];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8b_from_v32_S (next) ^ key3;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8c_from_v32_S (next) ^ key3;
if ((checksum_size == 2) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_crc & 0xff) != plain) && ((esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp & 0xff) != plain)) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
update_key3 (key2, key3);
plain = unpack_v8d_from_v32_S (next) ^ key3;
if ((plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_crc >> 8)) && (plain != (esalt_bufs[digests_offset].hashes[idx].checksum_from_timestamp >> 8))) break;
update_key012 (key0, key1, key2, plain, l_crc32tab);
next = data_ptr[3];
update_key3 (key2, key3);
plain = unpack_v8a_from_v32_S (next) ^ key3;
if ((plain & 6) == 0 || (plain & 6) == 6) break;
if (idx + 1 == esalt_bufs[digests_offset].hash_count)
{
idx = 0xfe;
continue;
}
const u32 r0 = esalt_bufs[digests_offset].hashes[0].checksum_from_crc;
const u32 r1 = 0;
const u32 r2 = 0;
const u32 r3 = 0;
if (idx + 1 == esalt_bufs[digests_offset].hash_count){ \
if (atomic_inc (&hashes_shown[digests_offset]) == 0)
{
mark_hash (plains_buf, d_return_buf, salt_pos, digests_cnt, 0, digests_offset + 0, gid, il_pos, 0, 0);
}
COMPARE_M_SIMD (r0, r1, r2, r3);
}
}
}
}
#undef MAX_LOCAL
#undef TMPSIZ
#undef CRC32
#undef MSB
#undef CONST
#undef MAX_DATA
#undef update_key012
#undef update_key3

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -92,10 +93,10 @@ Author: Sein Coray
#include "shared.h"
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL;
static const u32 DGST_POS0 = 1;
static const u32 DGST_POS1 = 2;
static const u32 DGST_POS2 = 3;
static const u32 DGST_POS3 = 4;
static const u32 DGST_POS0 = 0;
static const u32 DGST_POS1 = 1;
static const u32 DGST_POS2 = 2;
static const u32 DGST_POS3 = 3;
static const u32 DGST_SIZE = DGST_SIZE_4_4;
static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE;
static const char *HASH_NAME = "PKZIP (Compressed)";
@ -106,28 +107,12 @@ static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
static const char *ST_PASS = "hashcat";
static const char *ST_HASH = "$pkzip2$1*1*2*0*e3*1c5*eda7a8de*0*28*8*e3*eda7*5096*a9fc1f4e951c8fb3031a6f903e5f4e3211c8fdc4671547bf77f6f682afbfcc7475d83898985621a7af9bccd1349d1976500a68c48f630b7f22d7a0955524d768e34868880461335417ddd149c65a917c0eb0a4bf7224e24a1e04cf4ace5eef52205f4452e66ded937db9545f843a68b1e84a2e933cc05fb36d3db90e6c5faf1bee2249fdd06a7307849902a8bb24ec7e8a0886a4544ca47979a9dfeefe034bdfc5bd593904cfe9a5309dd199d337d3183f307c2cb39622549a5b9b8b485b7949a4803f63f67ca427a0640ad3793a519b2476c52198488e3e2e04cac202d624fb7d13c2*$/pkzip2$";
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
#define MAX_COMPRESSED_LENGTH 2048
#define MAX_UNCOMPRESSED_LENGTH 4096
#define MAX_DATA (16 * 1024 * 1024)
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; }
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
typedef struct pkzip_hash
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -140,16 +125,43 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
typedef struct pkzip
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hash;
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
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; }
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)
{
@ -215,7 +227,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
p = strtok(NULL, "*");
if (p == NULL) return PARSER_HASH_LENGTH;
pkzip->hash.uncompressed_length = strtoul(p, NULL, 16);
if (pkzip->hash.compressed_length > MAX_COMPRESSED_LENGTH || pkzip->hash.uncompressed_length > MAX_UNCOMPRESSED_LENGTH)
if (pkzip->hash.compressed_length > MAX_DATA)
{
return PARSER_TOKEN_LENGTH;
}
@ -262,26 +274,25 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
hex_to_binary(p, strlen(p), (char *) &(pkzip->hash.data));
// fake salt
salt->salt_buf[0] = pkzip->hash.data[ 3] << 24 | pkzip->hash.data[ 2] << 16 | pkzip->hash.data[ 1] << 8 | pkzip->hash.data[ 0];
salt->salt_buf[1] = pkzip->hash.data[ 7] << 24 | pkzip->hash.data[ 6] << 16 | pkzip->hash.data[ 5] << 8 | pkzip->hash.data[ 4];
salt->salt_buf[2] = pkzip->hash.data[11] << 24 | pkzip->hash.data[10] << 16 | pkzip->hash.data[ 9] << 8 | pkzip->hash.data[ 8];
salt->salt_buf[3] = pkzip->hash.data[15] << 24 | pkzip->hash.data[14] << 16 | pkzip->hash.data[13] << 8 | pkzip->hash.data[ 12];
u32 *ptr = (u32 *) pkzip->hash.data;
salt->salt_buf[0] = ptr[0];
salt->salt_buf[1] = ptr[1];
salt->salt_buf[2] = ptr[2];
salt->salt_buf[3] = ptr[3];
salt->salt_len = 16;
// fake hash
digest[0] = pkzip->hash.data[ 0] << 24 | pkzip->hash.data[ 1] << 16 | pkzip->hash.data[ 2] << 8 | pkzip->hash.data[ 3];
digest[1] = pkzip->hash.data[ 4] << 24 | pkzip->hash.data[ 5] << 16 | pkzip->hash.data[ 6] << 8 | pkzip->hash.data[ 7];
digest[2] = pkzip->hash.data[ 8] << 24 | pkzip->hash.data[ 9] << 16 | pkzip->hash.data[10] << 8 | pkzip->hash.data[11];
digest[3] = pkzip->hash.data[12] << 24 | pkzip->hash.data[13] << 16 | pkzip->hash.data[14] << 8 | pkzip->hash.data[15];
digest[0] = pkzip->hash.crc32;
digest[1] = 0;
digest[2] = 0;
digest[3] = 0;
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 u32 *digest = (const u32 *) digest_buf;
const pkzip_t *pkzip = (const pkzip_t *) esalt_buf;
int out_len = 0;
@ -352,10 +363,11 @@ void module_init (module_ctx_t *module_ctx)
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_outfile = 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;
@ -380,6 +392,7 @@ void module_init (module_ctx_t *module_ctx)
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;

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -92,41 +93,26 @@ Author: Sein Coray
#include "shared.h"
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL;
static const u32 DGST_POS0 = 1;
static const u32 DGST_POS1 = 2;
static const u32 DGST_POS2 = 3;
static const u32 DGST_POS3 = 4;
static const u32 DGST_POS0 = 0;
static const u32 DGST_POS1 = 1;
static const u32 DGST_POS2 = 2;
static const u32 DGST_POS3 = 3;
static const u32 DGST_SIZE = DGST_SIZE_4_4;
static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE;
static const char *HASH_NAME = "PKZIP (Uncompressed)";
static const u64 KERN_TYPE = 17210;
static const u32 OPTI_TYPE = 0;
static const u64 OPTS_TYPE = OPTS_TYPE_PT_NEVERCRACK;
static const u64 OPTS_TYPE = OPTS_TYPE_PT_NEVERCRACK; // nevercrack is required because it's quite likely that a collision is found which will not necessarily work as password for the archive
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
static const char *ST_PASS = "hashcat";
static const char *ST_HASH = "$pkzip2$1*1*2*0*1d1*1c5*eda7a8de*0*28*0*1d1*eda7*5096*1dea673da43d9fc7e2be1a1f4f664269fceb6cb88723a97408ae1fe07f774d31d1442ea8485081e63f919851ca0b7588d5e3442317fff19fe547a4ef97492ed75417c427eea3c4e146e16c100a2f8b6abd7e5988dc967e5a0e51f641401605d673630ea52ebb04da4b388489901656532c9aa474ca090dbac7cf8a21428d57b42a71da5f3d83fed927361e5d385ca8e480a6d42dea5b4bf497d3a24e79fc7be37c8d1721238cbe9e1ea3ae1eb91fc02aabdf33070d718d5105b70b3d7f3d2c28b3edd822e89a5abc0c8fee117c7fbfbfd4b4c8e130977b75cb0b1da080bfe1c0859e6483c42f459c8069d45a76220e046e6c2a2417392fd87e4aa4a2559eaab3baf78a77a1b94d8c8af16a977b4bb45e3da211838ad044f209428dba82666bf3d54d4eed82c64a9b3444a44746b9e398d0516a2596d84243b4a1d7e87d9843f38e45b6be67fd980107f3ad7b8453d87300e6c51ac9f5e3f6c3b702654440c543b1d808b62f7a313a83b31a6faaeedc2620de7057cd0df80f70346fe2d4dccc318f0b5ed128bcf0643e63d754bb05f53afb2b0fa90b34b538b2ad3648209dff587df4fa18698e4fa6d858ad44aa55d2bba3b08dfdedd3e28b8b7caf394d5d9d95e452c2ab1c836b9d74538c2f0d24b9b577*$/pkzip2$";
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
#define MAX_DATA (16 * 1024 * 1024)
#define MAX_UNCOMPRESSED_LENGTH 4096
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
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; }
typedef struct pkzip_hash
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -139,16 +125,43 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_UNCOMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
typedef struct pkzip
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hash;
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
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; }
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)
{
@ -214,7 +227,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
p = strtok(NULL, "*");
if (p == NULL) return PARSER_HASH_LENGTH;
pkzip->hash.uncompressed_length = strtoul(p, NULL, 16);
if (pkzip->hash.uncompressed_length > MAX_UNCOMPRESSED_LENGTH)
if (pkzip->hash.uncompressed_length > MAX_DATA)
{
return PARSER_TOKEN_LENGTH;
}
@ -261,18 +274,19 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
hex_to_binary(p, strlen(p), (char *) &(pkzip->hash.data));
// fake salt
salt->salt_buf[0] = pkzip->hash.data[ 3] << 24 | pkzip->hash.data[ 2] << 16 | pkzip->hash.data[ 1] << 8 | pkzip->hash.data[ 0];
salt->salt_buf[1] = pkzip->hash.data[ 7] << 24 | pkzip->hash.data[ 6] << 16 | pkzip->hash.data[ 5] << 8 | pkzip->hash.data[ 4];
salt->salt_buf[2] = pkzip->hash.data[11] << 24 | pkzip->hash.data[10] << 16 | pkzip->hash.data[ 9] << 8 | pkzip->hash.data[ 8];
salt->salt_buf[3] = pkzip->hash.data[15] << 24 | pkzip->hash.data[14] << 16 | pkzip->hash.data[13] << 8 | pkzip->hash.data[ 12];
u32 *ptr = (u32 *) pkzip->hash.data;
salt->salt_buf[0] = ptr[0];
salt->salt_buf[1] = ptr[1];
salt->salt_buf[2] = ptr[2];
salt->salt_buf[3] = ptr[3];
salt->salt_len = 16;
// fake hash
digest[0] = pkzip->hash.data[ 0] << 24 | pkzip->hash.data[ 1] << 16 | pkzip->hash.data[ 2] << 8 | pkzip->hash.data[ 3];
digest[1] = pkzip->hash.data[ 4] << 24 | pkzip->hash.data[ 5] << 16 | pkzip->hash.data[ 6] << 8 | pkzip->hash.data[ 7];
digest[2] = pkzip->hash.data[ 8] << 24 | pkzip->hash.data[ 9] << 16 | pkzip->hash.data[10] << 8 | pkzip->hash.data[11];
digest[3] = pkzip->hash.data[12] << 24 | pkzip->hash.data[13] << 16 | pkzip->hash.data[14] << 8 | pkzip->hash.data[15];
digest[0] = pkzip->hash.crc32;
digest[1] = 0;
digest[2] = 0;
digest[3] = 0;
return (PARSER_OK);
}
@ -354,10 +368,11 @@ void module_init (module_ctx_t *module_ctx)
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_outfile = 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;
@ -382,6 +397,7 @@ void module_init (module_ctx_t *module_ctx)
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;

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -92,11 +93,11 @@ Author: Sein Coray
#include "shared.h"
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL;
static const u32 DGST_POS0 = 1;
static const u32 DGST_POS1 = 2;
static const u32 DGST_POS2 = 3;
static const u32 DGST_POS3 = 4;
static const u32 DGST_SIZE = DGST_SIZE_4_4;
static const u32 DGST_POS0 = 0;
static const u32 DGST_POS1 = 1;
static const u32 DGST_POS2 = 2;
static const u32 DGST_POS3 = 3;
static const u32 DGST_SIZE = DGST_SIZE_4_8;
static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE;
static const char *HASH_NAME = "PKZIP (Compressed Multi-File)";
static const u64 KERN_TYPE = 17220;
@ -106,28 +107,12 @@ static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
static const char *ST_PASS = "hashcat";
static const char *ST_HASH = "$pkzip2$3*1*1*0*8*24*a425*8827*d1730095cd829e245df04ebba6c52c0573d49d3bbeab6cb385b7fa8a28dcccd3098bfdd7*1*0*8*24*2a74*882a*51281ac874a60baedc375ca645888d29780e20d4076edd1e7154a99bde982152a736311f*2*0*e3*1c5*eda7a8de*0*29*8*e3*eda7*5096*1455781b59707f5151139e018bdcfeebfc89bc37e372883a7ec0670a5eafc622feb338f9b021b6601a674094898a91beac70e41e675f77702834ca6156111a1bf7361bc9f3715d77dfcdd626634c68354c6f2e5e0a7b1e1ce84a44e632d0f6e36019feeab92fb7eac9dda8df436e287aafece95d042059a1b27d533c5eab62c1c559af220dc432f2eb1a38a70f29e8f3cb5a207704274d1e305d7402180fd47e026522792f5113c52a116d5bb25b67074ffd6f4926b221555234aabddc69775335d592d5c7d22462b75de1259e8342a9ba71cb06223d13c7f51f13be2ad76352c3b8ed*$/pkzip2$";
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
#define MAX_COMPRESSED_LENGTH 2048
#define MAX_UNCOMPRESSED_LENGTH 4096
#define MAX_DATA (16 * 1024 * 1024)
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; }
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
typedef struct pkzip_hash
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -140,16 +125,43 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
typedef struct pkzip
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hashes[8];
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
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; }
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)
{
@ -217,7 +229,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
p = strtok(NULL, "*");
if (p == NULL) return PARSER_HASH_LENGTH;
pkzip->hashes[i].uncompressed_length = strtoul(p, NULL, 16);
if (pkzip->hashes[i].compressed_length > MAX_COMPRESSED_LENGTH || pkzip->hashes[i].uncompressed_length > MAX_UNCOMPRESSED_LENGTH)
if (pkzip->hashes[i].compressed_length > MAX_DATA)
{
return PARSER_TOKEN_LENGTH;
}
@ -264,20 +276,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
hex_to_binary(p, strlen(p), (char *) &(pkzip->hashes[i].data));
// fake salt
salt->salt_buf[0] ^= pkzip->hashes[i].data[ 3] << 24 | pkzip->hashes[i].data[ 2] << 16 | pkzip->hashes[i].data[ 1] << 8 | pkzip->hashes[i].data[ 0];
salt->salt_buf[1] ^= pkzip->hashes[i].data[ 7] << 24 | pkzip->hashes[i].data[ 6] << 16 | pkzip->hashes[i].data[ 5] << 8 | pkzip->hashes[i].data[ 4];
salt->salt_buf[2] ^= pkzip->hashes[i].data[11] << 24 | pkzip->hashes[i].data[10] << 16 | pkzip->hashes[i].data[ 9] << 8 | pkzip->hashes[i].data[ 8];
salt->salt_buf[3] ^= pkzip->hashes[i].data[15] << 24 | pkzip->hashes[i].data[14] << 16 | pkzip->hashes[i].data[13] << 8 | pkzip->hashes[i].data[ 12];
salt->salt_len = 16;
// fake hash
digest[0] ^= pkzip->hashes[i].data[ 0] << 24 | pkzip->hashes[i].data[ 1] << 16 | pkzip->hashes[i].data[ 2] << 8 | pkzip->hashes[i].data[ 3];
digest[1] ^= pkzip->hashes[i].data[ 4] << 24 | pkzip->hashes[i].data[ 5] << 16 | pkzip->hashes[i].data[ 6] << 8 | pkzip->hashes[i].data[ 7];
digest[2] ^= pkzip->hashes[i].data[ 8] << 24 | pkzip->hashes[i].data[ 9] << 16 | pkzip->hashes[i].data[10] << 8 | pkzip->hashes[i].data[11];
digest[3] ^= pkzip->hashes[i].data[12] << 24 | pkzip->hashes[i].data[13] << 16 | pkzip->hashes[i].data[14] << 8 | pkzip->hashes[i].data[15];
u32 *ptr = (u32 *) pkzip->hashes[i].data;
salt->salt_buf[i] = ptr[0];
if (i == 0) digest[i] = pkzip->hashes[i].checksum_from_crc;
}
salt->salt_len = pkzip->hash_count << 2;
return (PARSER_OK);
}
@ -358,10 +365,11 @@ void module_init (module_ctx_t *module_ctx)
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_outfile = 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;
@ -386,6 +394,7 @@ void module_init (module_ctx_t *module_ctx)
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;

@ -80,7 +80,8 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Sein Coray
Author: Sein Coray
Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g=
*/
@ -92,11 +93,11 @@ Author: Sein Coray
#include "shared.h"
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL;
static const u32 DGST_POS0 = 1;
static const u32 DGST_POS1 = 2;
static const u32 DGST_POS2 = 3;
static const u32 DGST_POS3 = 4;
static const u32 DGST_SIZE = DGST_SIZE_4_4;
static const u32 DGST_POS0 = 0;
static const u32 DGST_POS1 = 1;
static const u32 DGST_POS2 = 2;
static const u32 DGST_POS3 = 3;
static const u32 DGST_SIZE = DGST_SIZE_4_8;
static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE;
static const char *HASH_NAME = "PKZIP (Compressed Multi-File Checksum-Only)";
static const u64 KERN_TYPE = 17230;
@ -106,27 +107,12 @@ static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
static const char *ST_PASS = "hashcat";
static const char *ST_HASH = "$pkzip2$8*1*1*0*8*24*a425*8827*3bd479d541019c2f32395046b8fbca7e1dca218b9b5414975be49942c3536298e9cc939e*1*0*8*24*2a74*882a*537af57c30fd9fd4b3eefa9ce55b6bff3bbfada237a7c1dace8ebf3bb0de107426211da3*1*0*8*24*2a74*882a*5f406b4858d3489fd4a6a6788798ac9b924b5d0ca8b8e5a6371739c9edcfd28c82f75316*1*0*8*24*2a74*882a*1843aca546b2ea68bd844d1e99d4f74d86417248eb48dd5e956270e42a331c18ea13f5ed*1*0*8*24*2a74*882a*aca3d16543bbfb2e5d2659f63802e0fa5b33e0a1f8ae47334019b4f0b6045d3d8eda3af1*1*0*8*24*2a74*882a*fbe0efc9e10ae1fc9b169bd060470bf3e39f09f8d83bebecd5216de02b81e35fe7e7b2f2*1*0*8*24*2a74*882a*537886dbabffbb7cac77deb01dc84760894524e6966183b4478a4ef56f0c657375a235a1*1*0*8*24*eda7*5096*40eb30ef1ddd9b77b894ed46abf199b480f1e5614fde510855f92ae7b8026a11f80e4d5f*$/pkzip2$";
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
#define MAX_COMPRESSED_LENGTH 2048
#define MAX_DATA (16 * 1024 * 1024)
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; }
// this is required to force mingw to accept the packed attribute
#pragma pack(push,1)
typedef struct pkzip_hash
struct pkzip_hash
{
u8 data_type_enum;
u8 magic_type_enum;
@ -139,16 +125,43 @@ typedef struct pkzip_hash
u32 data_length;
u16 checksum_from_crc;
u16 checksum_from_timestamp;
u8 data[MAX_COMPRESSED_LENGTH];
} pkzip_hash_t;
u8 data[MAX_DATA];
typedef struct pkzip
} __attribute__((packed));
typedef struct pkzip_hash pkzip_hash_t;
struct pkzip
{
u8 hash_count;
u8 checksum_size;
u8 version;
pkzip_hash_t hashes[8];
} pkzip_t;
} __attribute__((packed));
typedef struct pkzip pkzip_t;
#pragma pack(pop)
static const char *SIGNATURE_PKZIP_V1 = "$pkzip$";
static const char *SIGNATURE_PKZIP_V2 = "$pkzip2$";
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; }
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)
{
@ -217,7 +230,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
p = strtok(NULL, "*");
if (p == NULL) return PARSER_HASH_LENGTH;
pkzip->hashes[i].uncompressed_length = strtoul(p, NULL, 16);
if (pkzip->hashes[i].compressed_length > MAX_COMPRESSED_LENGTH)
if (pkzip->hashes[i].compressed_length > MAX_DATA)
{
return PARSER_TOKEN_LENGTH;
}
@ -264,20 +277,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
hex_to_binary(p, strlen(p), (char *) &(pkzip->hashes[i].data));
// fake salt
salt->salt_buf[0] ^= pkzip->hashes[i].data[ 3] << 24 | pkzip->hashes[i].data[ 2] << 16 | pkzip->hashes[i].data[ 1] << 8 | pkzip->hashes[i].data[ 0];
salt->salt_buf[1] ^= pkzip->hashes[i].data[ 7] << 24 | pkzip->hashes[i].data[ 6] << 16 | pkzip->hashes[i].data[ 5] << 8 | pkzip->hashes[i].data[ 4];
salt->salt_buf[2] ^= pkzip->hashes[i].data[11] << 24 | pkzip->hashes[i].data[10] << 16 | pkzip->hashes[i].data[ 9] << 8 | pkzip->hashes[i].data[ 8];
salt->salt_buf[3] ^= pkzip->hashes[i].data[15] << 24 | pkzip->hashes[i].data[14] << 16 | pkzip->hashes[i].data[13] << 8 | pkzip->hashes[i].data[ 12];
salt->salt_len = 16;
// fake hash
digest[0] ^= pkzip->hashes[i].data[ 0] << 24 | pkzip->hashes[i].data[ 1] << 16 | pkzip->hashes[i].data[ 2] << 8 | pkzip->hashes[i].data[ 3];
digest[1] ^= pkzip->hashes[i].data[ 4] << 24 | pkzip->hashes[i].data[ 5] << 16 | pkzip->hashes[i].data[ 6] << 8 | pkzip->hashes[i].data[ 7];
digest[2] ^= pkzip->hashes[i].data[ 8] << 24 | pkzip->hashes[i].data[ 9] << 16 | pkzip->hashes[i].data[10] << 8 | pkzip->hashes[i].data[11];
digest[3] ^= pkzip->hashes[i].data[12] << 24 | pkzip->hashes[i].data[13] << 16 | pkzip->hashes[i].data[14] << 8 | pkzip->hashes[i].data[15];
u32 *ptr = (u32 *) pkzip->hashes[i].data;
salt->salt_buf[i] = ptr[0];
if (i == 0) digest[i] = pkzip->hashes[i].checksum_from_crc;
}
salt->salt_len = pkzip->hash_count << 2;
return (PARSER_OK);
}
@ -358,10 +366,11 @@ void module_init (module_ctx_t *module_ctx)
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_outfile = 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;
@ -386,6 +395,7 @@ void module_init (module_ctx_t *module_ctx)
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;

Loading…
Cancel
Save