Merge pull request #156 from gm4tr1x/master
authorJens Steube <jens.steube@gmail.com>
Wed, 27 Jan 2016 17:51:28 +0000 (18:51 +0100)
committerJens Steube <jens.steube@gmail.com>
Wed, 27 Jan 2016 17:51:28 +0000 (18:51 +0100)
Updated test.sh (support for osx and some fixes)

27 files changed:
OpenCL/m00000_a3.cl
OpenCL/m00010_a3.cl
OpenCL/m00020_a3.cl
OpenCL/m00400.cl
OpenCL/m00500.cl
OpenCL/m01600.cl
OpenCL/m02400_a3.cl
OpenCL/m02410_a3.cl
OpenCL/m02500.cl
OpenCL/m06300.cl
OpenCL/m07700_a3.cl
OpenCL/m07800_a3.cl
OpenCL/m10100_a3.cl
OpenCL/m10500.cl
OpenCL/m11900.cl
OpenCL/m12900.cl
OpenCL/m13000.cl
OpenCL/rp.c
include/common.h
include/ext_OpenCL.h
include/shared.h
include/types.h
src/Makefile
src/ext_OpenCL.c
src/oclHashcat.c
src/rp_kernel_on_cpu.c
src/shared.c

index cedf592..0f6ef0d 100644 (file)
@@ -130,7 +130,7 @@ static void m00000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
@@ -350,7 +350,7 @@ static void m00000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
     const u32x pre_b = b_rev - (pre_a ^ pre_cd);
     const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d);
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
index 677fc5a..8374a99 100644 (file)
@@ -187,7 +187,7 @@ static void m00010m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
@@ -407,7 +407,7 @@ static void m00010s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
     const u32x pre_b = b_rev - (pre_a ^ pre_cd);
     const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d);
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
index 0efc98a..cae883f 100644 (file)
@@ -169,7 +169,7 @@ static void m00020m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le
      * md5
      */
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
@@ -409,7 +409,7 @@ static void m00020s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le
      * md5
      */
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
index b69a816..f4dc23c 100644 (file)
@@ -44,7 +44,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = 0;
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 8b2a821..5bd5d90 100644 (file)
@@ -46,7 +46,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = 0;
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 9fb95b0..d0b3036 100644 (file)
@@ -47,7 +47,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = 0;
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 62cc114..b734ecc 100644 (file)
@@ -120,7 +120,7 @@ static void m02400m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
@@ -316,7 +316,7 @@ static void m02400s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
index 20edd68..8f12d1e 100644 (file)
@@ -165,7 +165,7 @@ static void m02410m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
@@ -406,7 +406,7 @@ static void m02410s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     const u32x w0 = w0l | w0r;
 
-    u32x tmp2;
+    //u32x tmp2;
 
     u32x a = MD5M_A;
     u32x b = MD5M_B;
index 9128f29..d75ad78 100644 (file)
@@ -44,7 +44,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = w3[3];
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 34457de..f83abff 100644 (file)
@@ -44,7 +44,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = 0;
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 0bc3b13..566f77c 100644 (file)
@@ -784,7 +784,7 @@ __kernel void m07700_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -837,7 +837,7 @@ __kernel void m07700_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -894,7 +894,7 @@ __kernel void m07700_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -947,7 +947,7 @@ __kernel void m07700_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
index ad5144a..f8afa5e 100644 (file)
@@ -351,7 +351,7 @@ static void m07800m (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le
 
     u32 final_len = pw_len;
 
-    int i;
+    u32 i;
 
     // append MagicArray
 
@@ -582,7 +582,7 @@ static void m07800s (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_le
 
     u32 final_len = pw_len;
 
-    int i;
+    u32 i;
 
     // append MagicArray
 
@@ -654,7 +654,7 @@ __kernel void m07800_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -707,7 +707,7 @@ __kernel void m07800_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -764,7 +764,7 @@ __kernel void m07800_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
@@ -817,7 +817,7 @@ __kernel void m07800_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    * modifier
    */
 
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   u32 w0[4];
 
index 076615c..d32e959 100644 (file)
@@ -89,7 +89,7 @@ static void m10100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     v0 ^= m;
 
-    int i;
+    u32 i;
     int j;
 
     for (i = 8, j = 2; i <= pw_len; i += 8, j += 2)
@@ -187,7 +187,7 @@ static void m10100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global k
 
     v0 ^= m;
 
-    int i;
+    u32 i;
     int j;
 
     for (i = 8, j = 2; i <= pw_len; i += 8, j += 2)
index 4f6f1fe..2b51321 100644 (file)
@@ -176,7 +176,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = w3[3];
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
@@ -259,7 +259,7 @@ __kernel void m10500_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
    */
 
   const u32 gid = get_global_id (0);
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   if (gid >= gid_max) return;
 
@@ -290,9 +290,8 @@ __kernel void m10500_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
    * shared
    */
 
-  __local RC4_KEY rc4_keys[64];
-
-  __local RC4_KEY *rc4_key = &rc4_keys[lid];
+  //__local RC4_KEY rc4_keys[64];
+  //__local RC4_KEY *rc4_key = &rc4_keys[lid];
 
   /**
    * U_buf
index f87cfd0..466a035 100644 (file)
@@ -45,7 +45,7 @@ static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], co
   u32 we_t = w3[2];
   u32 wf_t = w3[3];
 
-  u32 tmp2;
+  //u32 tmp2;
 
   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
index 386b7a2..a2232af 100644 (file)
@@ -235,7 +235,7 @@ __kernel void m12900_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
    */
 
   const u32 gid = get_global_id (0);
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   if (gid >= gid_max) return;
 
@@ -271,7 +271,7 @@ __kernel void m12900_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
   w3[2] = pws[gid].i[14];
   w3[3] = pws[gid].i[15];
 
-  const u32 pw_len = pws[gid].pw_len;
+  //const u32 pw_len = pws[gid].pw_len;
 
   w0[0] = swap32 (w0[0]);
   w0[1] = swap32 (w0[1]);
index 39d864b..dce6e9f 100644 (file)
@@ -235,7 +235,7 @@ __kernel void m13000_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
    */
 
   const u32 gid = get_global_id (0);
-  const u32 lid = get_local_id (0);
+  //const u32 lid = get_local_id (0);
 
   if (gid >= gid_max) return;
 
@@ -271,7 +271,7 @@ __kernel void m13000_init (__global pw_t *pws, __global kernel_rule_t *rules_buf
   w3[2] = pws[gid].i[14];
   w3[3] = pws[gid].i[15];
 
-  const u32 pw_len = pws[gid].pw_len;
+  //const u32 pw_len = pws[gid].pw_len;
 
   w0[0] = swap32 (w0[0]);
   w0[1] = swap32 (w0[1]);
index 4abd26d..4c29dcd 100644 (file)
@@ -3,6 +3,10 @@
  * License.....: MIT
  */
 
+u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len);
+u32 apply_rules (const __global u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len);
+u32 apply_rules_vect (const u32 pw_buf0[4], const u32 pw_buf1[4], const u32 pw_len, const __global kernel_rule_t *rules_buf, const u32 il_pos, u32x w0[4], u32x w1[4]);
+
 static u32 generate_cmask (u32 buf)
 {
   const u32 rmask = ((buf & 0x40404040) >> 1)
index 3e70394..680ddbe 100644 (file)
@@ -46,6 +46,8 @@
 #include <mach-o/dyld.h>
 #endif
 
+typedef void *OCL_LIB;
+
 #ifdef HAVE_HWMON
 typedef void *HM_LIB;
 #endif
@@ -78,6 +80,8 @@ typedef UINT64 uint64_t;
 typedef HINSTANCE HM_LIB;
 #endif
 
+typedef HINSTANCE OCL_LIB;
+
 #define mkdir(name,mode) mkdir (name)
 
 #endif // _WIN
index 5ba3fa6..d6db43a 100644 (file)
@@ -1,5 +1,7 @@
 /**
- * Author......: Jens Steube <jens.steube@gmail.com>
+ * Authors.....: Jens Steube <jens.steube@gmail.com>
+ *               Gabriele Gristina <matrix@hashcat.net>
+ *
  * License.....: MIT
  */
 
 // #include <CL/cl_ext.h> // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPU
 #endif
 
-void hc_clBuildProgram (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data);
-cl_mem hc_clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr);
-cl_command_queue hc_clCreateCommandQueue (cl_context context, cl_device_id device, cl_command_queue_properties properties);
-//cl_command_queue hc_clCreateCommandQueueWithProperties (cl_context context, cl_device_id device, const cl_queue_properties *properties);
-cl_context hc_clCreateContext (cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data);
-cl_kernel hc_clCreateKernel (cl_program program, const char *kernel_name);
-cl_program hc_clCreateProgramWithSource (cl_context context, cl_uint count, const char **strings, const size_t *lengths);
-cl_program hc_clCreateProgramWithBinary (cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status);
-void hc_clEnqueueNDRangeKernel (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clEnqueueReadBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clEnqueueWriteBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clEnqueueCopyBuffer (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clFlush (cl_command_queue command_queue);
-void hc_clFinish (cl_command_queue command_queue);
-void hc_clGetDeviceIDs (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices);
-void hc_clGetDeviceInfo (cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
-void hc_clGetPlatformIDs (cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms);
-void hc_clGetPlatformInfo (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
-void hc_clReleaseCommandQueue (cl_command_queue command_queue);
-void hc_clReleaseContext (cl_context context);
-void hc_clReleaseKernel (cl_kernel kernel);
-void hc_clReleaseMemObject (cl_mem mem);
-void hc_clReleaseProgram (cl_program program);
-void hc_clSetKernelArg (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value);
-void *hc_clEnqueueMapBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clEnqueueUnmapMemObject (cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clEnqueueFillBuffer (cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
-void hc_clGetKernelWorkGroupInfo (cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
+#include <shared.h>
+
+typedef cl_mem (*OCL_CLCREATEBUFFER)                 (cl_context, cl_mem_flags, size_t, void *, cl_int *);
+typedef cl_command_queue (*OCL_CLCREATECOMMANDQUEUE) (cl_context, cl_device_id, cl_command_queue_properties, cl_int *);
+typedef cl_context (*OCL_CLCREATECONTEXT)            (const cl_context_properties *, cl_uint, const cl_device_id *, void (CL_CALLBACK *)(const char *, const void *, size_t, void *), void *, cl_int *);
+typedef cl_kernel (*OCL_CLCREATEKERNEL)              (cl_program, const char *, cl_int *);
+typedef cl_program (*OCL_CLCREATEPROGRAMWITHSOURCE)  (cl_context, cl_uint, const char **, const size_t *, cl_int *);
+typedef cl_program (*OCL_CLCREATEPROGRAMWITHBINARY)  (cl_context, cl_uint, const cl_device_id *, const size_t *, const unsigned char **, cl_int *, cl_int *);
+typedef cl_int (*OCL_CLBUILDPROGRAM)                 (cl_program, cl_uint, const cl_device_id *, const char *, void (CL_CALLBACK *)(cl_program, void *), void *);
+typedef cl_int (*OCL_CLENQUEUENDRANGEKERNEL)         (cl_command_queue, cl_kernel, cl_uint, const size_t *, const size_t *, const size_t *, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLENQUEUEREADBUFFER)            (cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLENQUEUEWRITEBUFFER)           (cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void *, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLENQUEUECOPYBUFFER)            (cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLFLUSH)                        (cl_command_queue);
+typedef cl_int (*OCL_CLFINISH)                       (cl_command_queue);
+typedef cl_int (*OCL_CLGETDEVICEIDS)                 (cl_platform_id, cl_device_type, cl_uint, cl_device_id *, cl_uint *);
+typedef cl_int (*OCL_CLGETDEVICEINFO)                (cl_device_id, cl_device_info, size_t, void *, size_t *);
+typedef cl_int (*OCL_CLGETPLATFORMIDS)               (cl_uint, cl_platform_id *, cl_uint *);
+typedef cl_int (*OCL_CLGETPLATFORMINFO)              (cl_platform_id, cl_platform_info, size_t, void *, size_t *);
+typedef cl_int (*OCL_CLRELEASECOMMANDQUEUE)          (cl_command_queue);
+typedef cl_int (*OCL_CLRELEASECONTEXT)               (cl_context);
+typedef cl_int (*OCL_CLRELEASEKERNEL)                (cl_kernel);
+typedef cl_int (*OCL_CLRELEASEMEMOBJECT)             (cl_mem);
+typedef cl_int (*OCL_CLRELEASEPROGRAM)               (cl_program);
+typedef cl_int (*OCL_CLSETKERNELARG)                 (cl_kernel, cl_uint, size_t, const void *);
+typedef void * (*OCL_CLENQUEUEMAPBUFFER)             (cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event *, cl_event *, cl_int *);
+typedef cl_int (*OCL_CLENQUEUEUNMAPMEMOBJECT)        (cl_command_queue, cl_mem, void *, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLENQUEUEFILLBUFFER)            (cl_command_queue, cl_mem, const void *, size_t, size_t, size_t, cl_uint, const cl_event *, cl_event *);
+typedef cl_int (*OCL_CLGETKERNELWORKGROUPINFO)       (cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, void *, size_t *);
+typedef cl_int (*OCL_CLGETPROGRAMBUILDINFO)          (cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *);
+typedef cl_int (*OCL_CLGETPROGRAMINFO)               (cl_program, cl_program_info, size_t, void *, size_t *);
+typedef cl_int (*OCL_CLGETEVENTINFO)                 (cl_event, cl_event_info, size_t, void *, size_t *);
+
+typedef struct
+{
+  OCL_LIB lib;
+
+  OCL_CLBUILDPROGRAM clBuildProgram;
+  OCL_CLCREATEBUFFER clCreateBuffer;
+  OCL_CLCREATECOMMANDQUEUE clCreateCommandQueue;
+  OCL_CLCREATECONTEXT clCreateContext;
+  OCL_CLCREATEKERNEL clCreateKernel;
+  OCL_CLCREATEPROGRAMWITHBINARY clCreateProgramWithBinary;
+  OCL_CLCREATEPROGRAMWITHSOURCE clCreateProgramWithSource;
+  OCL_CLENQUEUECOPYBUFFER clEnqueueCopyBuffer;
+  OCL_CLENQUEUEFILLBUFFER clEnqueueFillBuffer;
+  OCL_CLENQUEUEMAPBUFFER clEnqueueMapBuffer;
+  OCL_CLENQUEUENDRANGEKERNEL clEnqueueNDRangeKernel;
+  OCL_CLENQUEUEREADBUFFER clEnqueueReadBuffer;
+  OCL_CLENQUEUEUNMAPMEMOBJECT clEnqueueUnmapMemObject;
+  OCL_CLENQUEUEWRITEBUFFER clEnqueueWriteBuffer;
+  OCL_CLFINISH clFinish;
+  OCL_CLFLUSH clFlush;
+  OCL_CLGETDEVICEIDS clGetDeviceIDs;
+  OCL_CLGETDEVICEINFO clGetDeviceInfo;
+  OCL_CLGETEVENTINFO clGetEventInfo;
+  OCL_CLGETKERNELWORKGROUPINFO clGetKernelWorkGroupInfo;
+  OCL_CLGETPLATFORMIDS clGetPlatformIDs;
+  OCL_CLGETPLATFORMINFO clGetPlatformInfo;
+  OCL_CLGETPROGRAMBUILDINFO clGetProgramBuildInfo;
+  OCL_CLGETPROGRAMINFO clGetProgramInfo;
+  OCL_CLRELEASECOMMANDQUEUE clReleaseCommandQueue;
+  OCL_CLRELEASECONTEXT clReleaseContext;
+  OCL_CLRELEASEKERNEL clReleaseKernel;
+  OCL_CLRELEASEMEMOBJECT clReleaseMemObject;
+  OCL_CLRELEASEPROGRAM clReleaseProgram;
+  OCL_CLSETKERNELARG clSetKernelArg;
 
+} hc_opencl_lib_t;
+
+#define OCL_PTR hc_opencl_lib_t
+
+void ocl_init (OCL_PTR *ocl);
+void ocl_close (OCL_PTR *ocl);
+
+cl_mem hc_clCreateBuffer (OCL_PTR *ocl, cl_context context, cl_mem_flags flags, size_t size, void *host_ptr);
+cl_command_queue hc_clCreateCommandQueue (OCL_PTR *ocl, cl_context context, cl_device_id device, cl_command_queue_properties properties);
+//cl_command_queue hc_clCreateCommandQueueWithProperties (cl_context context, cl_device_id device, const cl_queue_properties *properties);
+cl_context hc_clCreateContext (OCL_PTR *ocl, cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data);
+cl_kernel hc_clCreateKernel (OCL_PTR *ocl, cl_program program, const char *kernel_name);
+cl_program hc_clCreateProgramWithSource (OCL_PTR *ocl, cl_context context, cl_uint count, const char **strings, const size_t *lengths);
+cl_program hc_clCreateProgramWithBinary (OCL_PTR *ocl, cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status);
+void hc_clBuildProgram (OCL_PTR *ocl, cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data);
+void hc_clEnqueueNDRangeKernel (OCL_PTR *ocl, cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clEnqueueReadBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clEnqueueWriteBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clEnqueueCopyBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clFlush (OCL_PTR *ocl, cl_command_queue command_queue);
+void hc_clFinish (OCL_PTR *ocl, cl_command_queue command_queue);
+void hc_clGetDeviceIDs (OCL_PTR *ocl, cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices);
+void hc_clGetDeviceInfo (OCL_PTR *ocl, cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
+void hc_clGetPlatformIDs (OCL_PTR *ocl, cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms);
+void hc_clGetPlatformInfo (OCL_PTR *ocl, cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
+void hc_clReleaseCommandQueue (OCL_PTR *ocl, cl_command_queue command_queue);
+void hc_clReleaseContext (OCL_PTR *ocl, cl_context context);
+void hc_clReleaseKernel (OCL_PTR *ocl, cl_kernel kernel);
+void hc_clReleaseMemObject (OCL_PTR *ocl, cl_mem mem);
+void hc_clReleaseProgram (OCL_PTR *ocl, cl_program program);
+void hc_clSetKernelArg (OCL_PTR *ocl, cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value);
+void *hc_clEnqueueMapBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clEnqueueUnmapMemObject (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clEnqueueFillBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event);
+void hc_clGetKernelWorkGroupInfo (OCL_PTR *ocl, cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
+void hc_clGetProgramBuildInfo (OCL_PTR *ocl, cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
+void hc_clGetProgramInfo (OCL_PTR *ocl, cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t * param_value_size_ret);
+void hc_clGetEventInfo (OCL_PTR *ocl, cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret);
 #endif
index f126986..e92abe4 100644 (file)
@@ -1,5 +1,7 @@
 /**
- * Author......: Jens Steube <jens.steube@gmail.com>
+ * Authors.....: Jens Steube <jens.steube@gmail.com>
+ *               Gabriele Gristina <matrix@hashcat.net>
+ *
  * License.....: MIT
  */
 
 
 #endif
 
+/**
+ * libraries stuff
+ */
+
+#ifdef _WIN
+#define hc_dlopen LoadLibrary
+#define hc_dlclose FreeLibrary
+#define hc_dlsym GetProcAddress
+#else
+#define hc_dlopen dlopen
+#define hc_dlclose dlclose
+#define hc_dlsym dlsym
+#endif
+
 /**
  * system stuff
  */
 
 #define CL_VENDOR_NV          "NVIDIA Corporation"
 #define CL_VENDOR_AMD         "Advanced Micro Devices, Inc."
+#define CL_VENDOR_APPLE       "Apple"
 #define CL_VENDOR_POCL        "The pocl project"
 
 #define VENDOR_ID_AMD         4098
 #define VENDOR_ID_NV          4318
+#define VENDOR_ID_APPLE       16925952
 #define VENDOR_ID_GENERIC     9999
 
 #define BLOCK_SIZE            64
@@ -165,9 +183,49 @@ extern hc_thread_mutex_t mux_display;
 #define PW_LENGTH_MAX_7400    15
 
 /**
- * device accel / loops macro
+ * device accel macro
  */
 
+#ifdef OSX
+#define KERNEL_ACCEL_5000    16
+#define KERNEL_ACCEL_6100    1
+#define KERNEL_ACCEL_6211    4
+#define KERNEL_ACCEL_6231    1
+#define KERNEL_ACCEL_6241    4
+#define KERNEL_ACCEL_8200    1
+#define KERNEL_ACCEL_8700    2
+#define KERNEL_ACCEL_9500    1
+#define KERNEL_ACCEL_9600    1
+#define KERNEL_ACCEL_10500   4
+#define KERNEL_ACCEL_11300   1
+#define KERNEL_ACCEL_11600   1
+#define KERNEL_ACCEL_11700   1
+#define KERNEL_ACCEL_11800   1
+#define KERNEL_ACCEL_12200   1
+#define KERNEL_ACCEL_12400   1
+#define KERNEL_ACCEL_12500   1
+#define KERNEL_ACCEL_13000   1
+#else
+#define KERNEL_ACCEL_5000    64
+#define KERNEL_ACCEL_6100    8
+#define KERNEL_ACCEL_6211    16
+#define KERNEL_ACCEL_6231    4
+#define KERNEL_ACCEL_6241    32
+#define KERNEL_ACCEL_8200    2
+#define KERNEL_ACCEL_8700    8
+#define KERNEL_ACCEL_9500    8
+#define KERNEL_ACCEL_9600    2
+#define KERNEL_ACCEL_10500   64
+#define KERNEL_ACCEL_11300   2
+#define KERNEL_ACCEL_11600   2
+#define KERNEL_ACCEL_11700   4
+#define KERNEL_ACCEL_11800   4
+#define KERNEL_ACCEL_12200   2
+#define KERNEL_ACCEL_12400   64
+#define KERNEL_ACCEL_12500   8
+#define KERNEL_ACCEL_13000   8
+#endif // OSX
+
 #define KERNEL_ACCEL_0       128
 #define KERNEL_ACCEL_10      128
 #define KERNEL_ACCEL_11      128
@@ -250,7 +308,6 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_4700    64
 #define KERNEL_ACCEL_4800    128
 #define KERNEL_ACCEL_4900    64
-#define KERNEL_ACCEL_5000    64
 #define KERNEL_ACCEL_5100    64
 #define KERNEL_ACCEL_5200    8
 #define KERNEL_ACCEL_5300    32
@@ -260,17 +317,13 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_5700    64
 #define KERNEL_ACCEL_5800    8
 #define KERNEL_ACCEL_6000    64
-#define KERNEL_ACCEL_6100    8
-#define KERNEL_ACCEL_6211    16
 #define KERNEL_ACCEL_6212    8
 #define KERNEL_ACCEL_6213    8
 #define KERNEL_ACCEL_6221    4
 #define KERNEL_ACCEL_6222    4
 #define KERNEL_ACCEL_6223    4
-#define KERNEL_ACCEL_6231    4
 #define KERNEL_ACCEL_6232    4
 #define KERNEL_ACCEL_6233    4
-#define KERNEL_ACCEL_6241    32
 #define KERNEL_ACCEL_6242    16
 #define KERNEL_ACCEL_6243    16
 #define KERNEL_ACCEL_6300    8
@@ -291,12 +344,10 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_7900    2
 #define KERNEL_ACCEL_8000    8
 #define KERNEL_ACCEL_8100    64
-#define KERNEL_ACCEL_8200    2
 #define KERNEL_ACCEL_8300    64
 #define KERNEL_ACCEL_8400    64
 #define KERNEL_ACCEL_8500    64
 #define KERNEL_ACCEL_8600    8
-#define KERNEL_ACCEL_8700    8
 #define KERNEL_ACCEL_8800    8
 #define KERNEL_ACCEL_8900    16
 #define KERNEL_ACCEL_9000    2
@@ -304,8 +355,6 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_9200    2
 #define KERNEL_ACCEL_9300    2
 #define KERNEL_ACCEL_9400    8
-#define KERNEL_ACCEL_9500    8
-#define KERNEL_ACCEL_9600    2
 #define KERNEL_ACCEL_9700    8
 #define KERNEL_ACCEL_9710    8
 #define KERNEL_ACCEL_9720    8
@@ -320,7 +369,6 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_10400   8
 #define KERNEL_ACCEL_10410   8
 #define KERNEL_ACCEL_10420   8
-#define KERNEL_ACCEL_10500   64
 #define KERNEL_ACCEL_10600   64
 #define KERNEL_ACCEL_10700   1
 #define KERNEL_ACCEL_10800   64
@@ -328,25 +376,143 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_ACCEL_11000   64
 #define KERNEL_ACCEL_11100   64
 #define KERNEL_ACCEL_11200   64
-#define KERNEL_ACCEL_11300   2
 #define KERNEL_ACCEL_11400   8
 #define KERNEL_ACCEL_11500   128
-#define KERNEL_ACCEL_11600   2
-#define KERNEL_ACCEL_11700   4
-#define KERNEL_ACCEL_11800   4
 #define KERNEL_ACCEL_11900   2
 #define KERNEL_ACCEL_12000   2
 #define KERNEL_ACCEL_12100   2
-#define KERNEL_ACCEL_12200   2
 #define KERNEL_ACCEL_12300   2
-#define KERNEL_ACCEL_12400   64
-#define KERNEL_ACCEL_12500   8
 #define KERNEL_ACCEL_12600   32
 #define KERNEL_ACCEL_12700   64
 #define KERNEL_ACCEL_12800   64
 #define KERNEL_ACCEL_12900   8
-#define KERNEL_ACCEL_13000   8
 
+/**
+ * device loops macro
+ */
+
+#ifdef OSX
+#define KERNEL_LOOPS_0       2
+#define KERNEL_LOOPS_10      2
+#define KERNEL_LOOPS_11      2
+#define KERNEL_LOOPS_12      2
+#define KERNEL_LOOPS_20      2
+#define KERNEL_LOOPS_21      2
+#define KERNEL_LOOPS_22      2
+#define KERNEL_LOOPS_23      2
+#define KERNEL_LOOPS_30      2
+#define KERNEL_LOOPS_40      2
+#define KERNEL_LOOPS_50      2
+#define KERNEL_LOOPS_60      2
+#define KERNEL_LOOPS_100     2
+#define KERNEL_LOOPS_101     2
+#define KERNEL_LOOPS_110     2
+#define KERNEL_LOOPS_111     2
+#define KERNEL_LOOPS_112     2
+#define KERNEL_LOOPS_120     2
+#define KERNEL_LOOPS_121     2
+#define KERNEL_LOOPS_122     2
+#define KERNEL_LOOPS_124     2
+#define KERNEL_LOOPS_130     2
+#define KERNEL_LOOPS_131     2
+#define KERNEL_LOOPS_132     2
+#define KERNEL_LOOPS_133     2
+#define KERNEL_LOOPS_140     2
+#define KERNEL_LOOPS_141     2
+#define KERNEL_LOOPS_150     2
+#define KERNEL_LOOPS_160     2
+#define KERNEL_LOOPS_190     2
+#define KERNEL_LOOPS_200     2
+#define KERNEL_LOOPS_300     2
+#define KERNEL_LOOPS_900     2
+#define KERNEL_LOOPS_1000    2
+#define KERNEL_LOOPS_1100    2
+#define KERNEL_LOOPS_1400    2
+#define KERNEL_LOOPS_1410    2
+#define KERNEL_LOOPS_1420    2
+#define KERNEL_LOOPS_1421    2
+#define KERNEL_LOOPS_1430    2
+#define KERNEL_LOOPS_1440    2
+#define KERNEL_LOOPS_1441    2
+#define KERNEL_LOOPS_1450    2
+#define KERNEL_LOOPS_1460    2
+#define KERNEL_LOOPS_1700    2
+#define KERNEL_LOOPS_1710    2
+#define KERNEL_LOOPS_1711    2
+#define KERNEL_LOOPS_1720    2
+#define KERNEL_LOOPS_1722    2
+#define KERNEL_LOOPS_1730    2
+#define KERNEL_LOOPS_1731    2
+#define KERNEL_LOOPS_1740    2
+#define KERNEL_LOOPS_1750    2
+#define KERNEL_LOOPS_1760    2
+#define KERNEL_LOOPS_2400    2
+#define KERNEL_LOOPS_2410    2
+#define KERNEL_LOOPS_2600    2
+#define KERNEL_LOOPS_2611    2
+#define KERNEL_LOOPS_2612    2
+#define KERNEL_LOOPS_2711    2
+#define KERNEL_LOOPS_2811    2
+#define KERNEL_LOOPS_3100    2
+#define KERNEL_LOOPS_3200    4
+#define KERNEL_LOOPS_3710    2
+#define KERNEL_LOOPS_3711    2
+#define KERNEL_LOOPS_3800    2
+#define KERNEL_LOOPS_4300    2
+#define KERNEL_LOOPS_4400    2
+#define KERNEL_LOOPS_4500    2
+#define KERNEL_LOOPS_4700    2
+#define KERNEL_LOOPS_4800    2
+#define KERNEL_LOOPS_4900    2
+#define KERNEL_LOOPS_5000    2
+#define KERNEL_LOOPS_5100    2
+#define KERNEL_LOOPS_5300    2
+#define KERNEL_LOOPS_5400    2
+#define KERNEL_LOOPS_5500    2
+#define KERNEL_LOOPS_5600    2
+#define KERNEL_LOOPS_5700    2
+#define KERNEL_LOOPS_6000    2
+#define KERNEL_LOOPS_6100    2
+#define KERNEL_LOOPS_6231    2
+#define KERNEL_LOOPS_6232    2
+#define KERNEL_LOOPS_6233    2
+#define KERNEL_LOOPS_6900    2
+#define KERNEL_LOOPS_7300    2
+#define KERNEL_LOOPS_7500    2
+#define KERNEL_LOOPS_7600    2
+#define KERNEL_LOOPS_7700    2
+#define KERNEL_LOOPS_7800    2
+#define KERNEL_LOOPS_8000    2
+#define KERNEL_LOOPS_8100    2
+#define KERNEL_LOOPS_8300    2
+#define KERNEL_LOOPS_8400    2
+#define KERNEL_LOOPS_8500    2
+#define KERNEL_LOOPS_8600    2
+#define KERNEL_LOOPS_8700    4
+#define KERNEL_LOOPS_9700    2
+#define KERNEL_LOOPS_9710    8
+#define KERNEL_LOOPS_9720    8
+#define KERNEL_LOOPS_9800    2
+#define KERNEL_LOOPS_9810    2
+#define KERNEL_LOOPS_9820    2
+#define KERNEL_LOOPS_9900    2
+#define KERNEL_LOOPS_10100   2
+#define KERNEL_LOOPS_10200   2
+#define KERNEL_LOOPS_10400   2
+#define KERNEL_LOOPS_10410   2
+#define KERNEL_LOOPS_10420   2
+#define KERNEL_LOOPS_10600   2
+#define KERNEL_LOOPS_10700   2
+#define KERNEL_LOOPS_10800   2
+#define KERNEL_LOOPS_11000   2
+#define KERNEL_LOOPS_11100   2
+#define KERNEL_LOOPS_11200   2
+#define KERNEL_LOOPS_11400   2
+#define KERNEL_LOOPS_11500   2
+#define KERNEL_LOOPS_11700   8
+#define KERNEL_LOOPS_11800   8
+#define KERNEL_LOOPS_12600   2
+#else
 #define KERNEL_LOOPS_0       256
 #define KERNEL_LOOPS_10      256
 #define KERNEL_LOOPS_11      256
@@ -379,11 +545,7 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_LOOPS_190     128
 #define KERNEL_LOOPS_200     128
 #define KERNEL_LOOPS_300     64
-#define KERNEL_LOOPS_400     256
-#define KERNEL_LOOPS_500     256
-#define KERNEL_LOOPS_501     256
 #define KERNEL_LOOPS_900     256
-#define KERNEL_LOOPS_910     256
 #define KERNEL_LOOPS_1000    256
 #define KERNEL_LOOPS_1100    128
 #define KERNEL_LOOPS_1400    64
@@ -395,8 +557,6 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_LOOPS_1441    64
 #define KERNEL_LOOPS_1450    32
 #define KERNEL_LOOPS_1460    32
-#define KERNEL_LOOPS_1500    256
-#define KERNEL_LOOPS_1600    256
 #define KERNEL_LOOPS_1700    32
 #define KERNEL_LOOPS_1710    32
 #define KERNEL_LOOPS_1711    32
@@ -407,17 +567,13 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_LOOPS_1740    32
 #define KERNEL_LOOPS_1750    16
 #define KERNEL_LOOPS_1760    16
-#define KERNEL_LOOPS_1800    16
-#define KERNEL_LOOPS_2100    256
 #define KERNEL_LOOPS_2400    256
 #define KERNEL_LOOPS_2410    256
-#define KERNEL_LOOPS_2500    256
 #define KERNEL_LOOPS_2600    128
 #define KERNEL_LOOPS_2611    128
 #define KERNEL_LOOPS_2612    128
 #define KERNEL_LOOPS_2711    64
 #define KERNEL_LOOPS_2811    64
-#define KERNEL_LOOPS_3000    256
 #define KERNEL_LOOPS_3100    16
 #define KERNEL_LOOPS_3200    16
 #define KERNEL_LOOPS_3710    128
@@ -431,88 +587,101 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_LOOPS_4900    128
 #define KERNEL_LOOPS_5000    64
 #define KERNEL_LOOPS_5100    256
-#define KERNEL_LOOPS_5200    256
 #define KERNEL_LOOPS_5300    32
 #define KERNEL_LOOPS_5400    32
 #define KERNEL_LOOPS_5500    128
 #define KERNEL_LOOPS_5600    64
 #define KERNEL_LOOPS_5700    64
-#define KERNEL_LOOPS_5800    256
 #define KERNEL_LOOPS_6000    64
 #define KERNEL_LOOPS_6100    64
-#define KERNEL_LOOPS_6211    200
-#define KERNEL_LOOPS_6212    200
-#define KERNEL_LOOPS_6213    200
-#define KERNEL_LOOPS_6221    200
-#define KERNEL_LOOPS_6222    200
-#define KERNEL_LOOPS_6223    200
 #define KERNEL_LOOPS_6231    200
 #define KERNEL_LOOPS_6232    200
 #define KERNEL_LOOPS_6233    200
-#define KERNEL_LOOPS_6241    200
-#define KERNEL_LOOPS_6242    200
-#define KERNEL_LOOPS_6243    200
-#define KERNEL_LOOPS_6300    256
-#define KERNEL_LOOPS_6400    256
-#define KERNEL_LOOPS_6500    256
-#define KERNEL_LOOPS_6600    200
-#define KERNEL_LOOPS_6700    256
-#define KERNEL_LOOPS_6800    200
 #define KERNEL_LOOPS_6900    64
-#define KERNEL_LOOPS_7100    256
-#define KERNEL_LOOPS_7200    200
 #define KERNEL_LOOPS_7300    64
-#define KERNEL_LOOPS_7400    200
 #define KERNEL_LOOPS_7500    16
 #define KERNEL_LOOPS_7600    128
 #define KERNEL_LOOPS_7700    128
 #define KERNEL_LOOPS_7800    64
-#define KERNEL_LOOPS_7900    256
 #define KERNEL_LOOPS_8000    64
 #define KERNEL_LOOPS_8100    128
-#define KERNEL_LOOPS_8200    200
 #define KERNEL_LOOPS_8300    64
 #define KERNEL_LOOPS_8400    64
 #define KERNEL_LOOPS_8500    16
 #define KERNEL_LOOPS_8600    16
 #define KERNEL_LOOPS_8700    16
-#define KERNEL_LOOPS_8800    256
-#define KERNEL_LOOPS_8900    1
-#define KERNEL_LOOPS_9000    16
-#define KERNEL_LOOPS_9100    256
-#define KERNEL_LOOPS_9200    200
-#define KERNEL_LOOPS_9300    1
-#define KERNEL_LOOPS_9400    200
-#define KERNEL_LOOPS_9500    200
-#define KERNEL_LOOPS_9600    200
 #define KERNEL_LOOPS_9700    200
 #define KERNEL_LOOPS_9710    200
 #define KERNEL_LOOPS_9720    200
 #define KERNEL_LOOPS_9800    200
-#define KERNEL_LOOPS_9810    200
 #define KERNEL_LOOPS_9820    200
+#define KERNEL_LOOPS_9810    200
 #define KERNEL_LOOPS_9900    256
-#define KERNEL_LOOPS_10000   200
 #define KERNEL_LOOPS_10100   512
 #define KERNEL_LOOPS_10200   64
-#define KERNEL_LOOPS_10300   128
 #define KERNEL_LOOPS_10400   256
 #define KERNEL_LOOPS_10410   256
 #define KERNEL_LOOPS_10420   256
-#define KERNEL_LOOPS_10500   64
 #define KERNEL_LOOPS_10600   64
 #define KERNEL_LOOPS_10700   64
 #define KERNEL_LOOPS_10800   32
-#define KERNEL_LOOPS_10900   200
 #define KERNEL_LOOPS_11000   256
 #define KERNEL_LOOPS_11100   128
 #define KERNEL_LOOPS_11200   128
-#define KERNEL_LOOPS_11300   256
 #define KERNEL_LOOPS_11400   128
 #define KERNEL_LOOPS_11500   256
-#define KERNEL_LOOPS_11600   512
 #define KERNEL_LOOPS_11700   64
 #define KERNEL_LOOPS_11800   64
+#define KERNEL_LOOPS_12600   32
+#endif // OSX
+
+#define KERNEL_LOOPS_400     256
+#define KERNEL_LOOPS_500     256
+#define KERNEL_LOOPS_501     256
+#define KERNEL_LOOPS_910     256
+#define KERNEL_LOOPS_1500    256
+#define KERNEL_LOOPS_1600    256
+#define KERNEL_LOOPS_1800    16
+#define KERNEL_LOOPS_2100    256
+#define KERNEL_LOOPS_2500    256
+#define KERNEL_LOOPS_3000    256
+#define KERNEL_LOOPS_5200    256
+#define KERNEL_LOOPS_5800    256
+#define KERNEL_LOOPS_6211    200
+#define KERNEL_LOOPS_6212    200
+#define KERNEL_LOOPS_6213    200
+#define KERNEL_LOOPS_6221    200
+#define KERNEL_LOOPS_6222    200
+#define KERNEL_LOOPS_6223    200
+#define KERNEL_LOOPS_6241    200
+#define KERNEL_LOOPS_6242    200
+#define KERNEL_LOOPS_6243    200
+#define KERNEL_LOOPS_6300    256
+#define KERNEL_LOOPS_6400    256
+#define KERNEL_LOOPS_6500    256
+#define KERNEL_LOOPS_6600    200
+#define KERNEL_LOOPS_6700    256
+#define KERNEL_LOOPS_6800    200
+#define KERNEL_LOOPS_7100    256
+#define KERNEL_LOOPS_7200    200
+#define KERNEL_LOOPS_7400    200
+#define KERNEL_LOOPS_7900    256
+#define KERNEL_LOOPS_8200    200
+#define KERNEL_LOOPS_8800    256
+#define KERNEL_LOOPS_8900    1
+#define KERNEL_LOOPS_9000    16
+#define KERNEL_LOOPS_9100    256
+#define KERNEL_LOOPS_9200    200
+#define KERNEL_LOOPS_9300    1
+#define KERNEL_LOOPS_9400    200
+#define KERNEL_LOOPS_9500    200
+#define KERNEL_LOOPS_9600    200
+#define KERNEL_LOOPS_10000   200
+#define KERNEL_LOOPS_10300   128
+#define KERNEL_LOOPS_10500   64
+#define KERNEL_LOOPS_10900   200
+#define KERNEL_LOOPS_11300   256
+#define KERNEL_LOOPS_11600   512
 #define KERNEL_LOOPS_11900   200
 #define KERNEL_LOOPS_12000   200
 #define KERNEL_LOOPS_12100   200
@@ -520,7 +689,6 @@ extern hc_thread_mutex_t mux_display;
 #define KERNEL_LOOPS_12300   256
 #define KERNEL_LOOPS_12400   256
 #define KERNEL_LOOPS_12500   256
-#define KERNEL_LOOPS_12600   32
 #define KERNEL_LOOPS_12700   10
 #define KERNEL_LOOPS_12800   100
 #define KERNEL_LOOPS_12900   64
@@ -1469,14 +1637,14 @@ extern hc_thread_mutex_t mux_display;
  */
 
 #define DGST_SIZE_0                 0
-#define DGST_SIZE_4_2               (2  * sizeof (uint))        // 8
-#define DGST_SIZE_4_4               (4  * sizeof (uint))        // 16
-#define DGST_SIZE_4_5               (5  * sizeof (uint))        // 20
-#define DGST_SIZE_4_6               (6  * sizeof (uint))        // 24
-#define DGST_SIZE_4_8               (8  * sizeof (uint))        // 32
-#define DGST_SIZE_4_16              (16 * sizeof (uint))        // 64 !!!
-#define DGST_SIZE_4_32              (32 * sizeof (uint))        // 128 !!!
-#define DGST_SIZE_4_64              (64 * sizeof (uint))        // 256
+#define DGST_SIZE_4_2               (2  * sizeof (uint))   // 8
+#define DGST_SIZE_4_4               (4  * sizeof (uint))   // 16
+#define DGST_SIZE_4_5               (5  * sizeof (uint))   // 20
+#define DGST_SIZE_4_6               (6  * sizeof (uint))   // 24
+#define DGST_SIZE_4_8               (8  * sizeof (uint))   // 32
+#define DGST_SIZE_4_16              (16 * sizeof (uint))   // 64 !!!
+#define DGST_SIZE_4_32              (32 * sizeof (uint))   // 128 !!!
+#define DGST_SIZE_4_64              (64 * sizeof (uint))   // 256
 #define DGST_SIZE_8_8               (8  * sizeof (u64))    // 64 !!!
 #define DGST_SIZE_8_16              (16 * sizeof (u64))    // 128 !!!
 #define DGST_SIZE_8_25              (25 * sizeof (u64))    // 200
index 636cea9..ac7611a 100644 (file)
@@ -39,22 +39,22 @@ typedef struct
 
 typedef struct
 {
-  int   V;
-  int   R;
-  int   P;
+  int  V;
+  int  R;
+  int  P;
 
-  int   enc_md;
+  int  enc_md;
 
-  uint  id_buf[8];
-  uint  u_buf[32];
-  uint  o_buf[32];
+  uint id_buf[8];
+  uint u_buf[32];
+  uint o_buf[32];
 
-  int   id_len;
-  int   o_len;
-  int   u_len;
+  int  id_len;
+  int  o_len;
+  int  u_len;
 
-  uint  rc4key[2];
-  uint  rc4data[2];
+  uint rc4key[2];
+  uint rc4data[2];
 
 } pdf_t;
 
@@ -161,7 +161,7 @@ typedef struct
 
 typedef struct
 {
-  u8 cipher[1040];
+  u8   cipher[1040];
 
 } agilekey_t;
 
@@ -239,10 +239,10 @@ typedef struct
   {
     uint dgst32[16];
     u64  dgst64[8];
-  };
+  } d;
 
-  uint  dgst_len;
-  uint  W_len;
+  uint dgst_len;
+  uint W_len;
 
 } pdf17l8_tmp_t;
 
@@ -260,10 +260,10 @@ typedef struct
 
 typedef struct
 {
-  u64 l_alt_result[8];
+  u64  l_alt_result[8];
 
-  u64 l_p_bytes[2];
-  u64 l_s_bytes[2];
+  u64  l_p_bytes[2];
+  u64  l_s_bytes[2];
 
 } sha512crypt_tmp_t;
 
@@ -288,7 +288,7 @@ typedef struct
 
 typedef struct
 {
-  u64 dgst[8];
+  u64  dgst[8];
 
 } bitcoin_wallet_tmp_t;
 
@@ -362,11 +362,11 @@ typedef struct
 
 typedef struct
 {
-  u64 ipad[8];
-  u64 opad[8];
+  u64  ipad[8];
+  u64  opad[8];
 
-  u64 dgst[32];
-  u64 out[32];
+  u64  dgst[32];
+  u64  out[32];
 
 } tc64_tmp_t;
 
@@ -415,11 +415,11 @@ typedef struct
 
 typedef struct
 {
-  u64 ipad[8];
-  u64 opad[8];
+  u64  ipad[8];
+  u64  opad[8];
 
-  u64 dgst[8];
-  u64 out[8];
+  u64  dgst[8];
+  u64  out[8];
 
 } sha512aix_tmp_t;
 
@@ -435,7 +435,7 @@ typedef struct
 
 typedef struct
 {
-  u64 digest_buf[8];
+  u64  digest_buf[8];
 
 } drupal7_tmp_t;
 
@@ -463,7 +463,7 @@ typedef struct
 
 typedef struct
 {
-  u64 out[8];
+  u64  out[8];
 
 } office2013_tmp_t;
 
@@ -475,57 +475,57 @@ typedef struct
 
 typedef struct
 {
-  u32 ipad[4];
-  u32 opad[4];
+  u32  ipad[4];
+  u32  opad[4];
 
-  u32 dgst[32];
-  u32 out[32];
+  u32  dgst[32];
+  u32  out[32];
 
 } pbkdf2_md5_tmp_t;
 
 typedef struct
 {
-  u32 ipad[5];
-  u32 opad[5];
+  u32  ipad[5];
+  u32  opad[5];
 
-  u32 dgst[32];
-  u32 out[32];
+  u32  dgst[32];
+  u32  out[32];
 
 } pbkdf2_sha1_tmp_t;
 
 typedef struct
 {
-  u32 ipad[8];
-  u32 opad[8];
+  u32  ipad[8];
+  u32  opad[8];
 
-  u32 dgst[32];
-  u32 out[32];
+  u32  dgst[32];
+  u32  out[32];
 
 } pbkdf2_sha256_tmp_t;
 
 typedef struct
 {
-  u64 ipad[8];
-  u64 opad[8];
+  u64  ipad[8];
+  u64  opad[8];
 
-  u64 dgst[16];
-  u64 out[16];
+  u64  dgst[16];
+  u64  out[16];
 
 } pbkdf2_sha512_tmp_t;
 
 typedef struct
 {
-  u64 out[8];
+  u64  out[8];
 
 } ecryptfs_tmp_t;
 
 typedef struct
 {
-  u64 ipad[8];
-  u64 opad[8];
+  u64  ipad[8];
+  u64  opad[8];
 
-  u64 dgst[16];
-  u64 out[16];
+  u64  dgst[16];
+  u64  out[16];
 
 } oraclet_tmp_t;
 
@@ -613,8 +613,8 @@ typedef struct
 
 typedef struct
 {
-  uint     key;
-  u64 val;
+  uint key;
+  u64  val;
 
 } hcstat_table_t;
 
@@ -662,7 +662,7 @@ typedef struct
 
 typedef struct
 {
-  u64 cnt;
+  u64    cnt;
 
   #ifdef _POSIX
   struct stat stat;
@@ -703,7 +703,7 @@ typedef struct
     u8   hc1[1][256];
     u32  hi1[1][ 64];
     u64  hl1[1][ 32];
-  };
+  } h;
 
   uint pw_len;
   uint alignment_placeholder_1;
@@ -742,31 +742,31 @@ typedef struct
 
 typedef struct
 {
-  u32    version_bin;
-  char        cwd[256];
-  u32    pid;
+  u32  version_bin;
+  char cwd[1024];
+  u32  pid;
 
-  u32    dictpos;
-  u32    maskpos;
+  u32  dictpos;
+  u32  maskpos;
 
-  u64    words_cur;
+  u64  words_cur;
 
-  u32    argc;
-  char      **argv;
+  u32  argc;
+  char **argv;
 
 } restore_data_t;
 
 typedef struct
 {
-  char     *file_name;
-  long      seek;
-  time_t    ctime;
+  char   *file_name;
+  long   seek;
+  time_t ctime;
 
 } outfile_data_t;
 
 typedef struct
 {
-  char     *buf;
+  char *buf;
   u32  incr;
   u32  avail;
   u32  cnt;
@@ -824,165 +824,165 @@ typedef struct
 #define PW_MAX1     (PW_MAX + 1)
 #define PW_DICTMAX  31
 #define PW_DICTMAX1 (PW_DICTMAX + 1)
+#define PARAMCNT    32
 
 struct __hc_device_param
 {
   cl_device_id      device;
   cl_device_type    device_type;
 
-  uint              device_id;
-  uint              platform_devices_id;    // for mapping with hms devices
+  uint    device_id;
+  uint    platform_devices_id;   // for mapping with hms devices
+
+  uint    skipped;
 
-  uint              skipped;
+  uint    sm_major;
+  uint    sm_minor;
+  uint    kernel_exec_timeout;
 
-  uint              sm_major;
-  uint              sm_minor;
-  uint              kernel_exec_timeout;
+  uint    device_processors;
+  uint    device_processor_cores;
+  u64     device_maxmem_alloc;
+  u64     device_global_mem;
+  u32     device_maxclock_frequency;
 
-  uint              device_processors;
-  uint              device_processor_cores;
-  u64               device_maxmem_alloc;
-  u64               device_global_mem;
-  u32               device_maxclock_frequency;
+  uint    vector_width;
 
-  uint              vector_width;
+  uint    kernel_threads;
+  uint    kernel_accel;
+  uint    kernel_power;          // these both are based on their _user counterpart
+  uint    kernel_blocks;         // but are modified by autotuner and used inside crack loops
+  uint    kernel_power_user;
+  uint    kernel_blocks_user;
 
-  uint              kernel_threads;
-  uint              kernel_accel;
-  uint              kernel_power;          // these both are based on their _user counterpart
-  uint              kernel_blocks;         // but are modified by autotuner and used inside crack loops
-  uint              kernel_power_user;
-  uint              kernel_blocks_user;
+  uint    size_pws;
+  uint    size_tmps;
+  uint    size_hooks;
+  uint    size_root_css;
+  uint    size_markov_css;
+  uint    size_digests;
+  uint    size_salts;
+  uint    size_shown;
+  uint    size_results;
+  uint    size_plains;
 
-  uint              size_pws;
-  uint              size_tmps;
-  uint              size_hooks;
-  uint              size_root_css;
-  uint              size_markov_css;
-  uint              size_digests;
-  uint              size_salts;
-  uint              size_shown;
-  uint              size_results;
-  uint              size_plains;
+  uint  (*pw_add)       (struct __hc_device_param *, const u8 *, const uint);
 
-  uint (*pw_add)    (struct __hc_device_param *, const u8 *, const uint);
+  void  (*pw_transpose) (const pw_t *, pw_t *);
 
-  void (*pw_transpose) (const pw_t *, pw_t *);
+  FILE   *combs_fp;
+  comb_t *combs_buf;
 
-  FILE             *combs_fp;
-  comb_t           *combs_buf;
+  void   *hooks_buf;
 
-  void             *hooks_buf;
+  pw_cache_t *pw_caches;
 
-  pw_cache_t       *pw_caches;
+  pw_t   *pws_buf;
+  uint    pws_cnt;
+  u64     pw_cnt;
 
-  pw_t             *pws_buf;
-  uint              pws_cnt;
-  u64               pw_cnt;
+  u64     words_off;
+  u64     words_done;
 
-  u64               words_off;
-  u64               words_done;
+  uint   *result;
 
-  uint             *result;
+  uint    outerloop_pos;
+  uint    outerloop_left;
 
-  uint              outerloop_pos;
-  uint              outerloop_left;
+  uint    innerloop_pos;
+  uint    innerloop_left;
 
-  uint              innerloop_pos;
-  uint              innerloop_left;
+  uint    speed_pos;
+  u64     speed_cnt[SPEED_CACHE];
+  float   speed_ms[SPEED_CACHE];
 
-  uint              speed_pos;
-  u64               speed_cnt[SPEED_CACHE];
-  float             speed_ms[SPEED_CACHE];
-  hc_timer_t        speed_rec[SPEED_CACHE];
+  hc_timer_t speed_rec[SPEED_CACHE];
 
-  hc_timer_t        timer_speed;
+  hc_timer_t timer_speed;
 
   // device specific attributes starting
 
-  char             *device_name;
-  char             *device_name_chksum;
-  char             *device_version;
-  char             *driver_version;
-
-  cl_uint           vendor_id;
-
-  cl_kernel         kernel1;
-  cl_kernel         kernel12;
-  cl_kernel         kernel2;
-  cl_kernel         kernel23;
-  cl_kernel         kernel3;
-  cl_kernel         kernel_mp;
-  cl_kernel         kernel_mp_l;
-  cl_kernel         kernel_mp_r;
-  cl_kernel         kernel_amp;
-  cl_kernel         kernel_tb;
-  cl_kernel         kernel_tm;
-  cl_kernel         kernel_weak;
-
-  cl_context        context;
-
-  cl_program        program;
-  cl_program        program_mp;
-  cl_program        program_amp;
-  cl_program        program_weak;
-
-  cl_command_queue  command_queue;
-
-  cl_mem            d_pws_buf;
-  cl_mem            d_pws_amp_buf;
-  cl_mem            d_words_buf_l;
-  cl_mem            d_words_buf_r;
-  cl_mem            d_rules;
-  cl_mem            d_rules_c;
-  cl_mem            d_combs;
-  cl_mem            d_combs_c;
-  cl_mem            d_bfs;
-  cl_mem            d_bfs_c;
-  cl_mem            d_tm_c;
-  cl_mem            d_bitmap_s1_a;
-  cl_mem            d_bitmap_s1_b;
-  cl_mem            d_bitmap_s1_c;
-  cl_mem            d_bitmap_s1_d;
-  cl_mem            d_bitmap_s2_a;
-  cl_mem            d_bitmap_s2_b;
-  cl_mem            d_bitmap_s2_c;
-  cl_mem            d_bitmap_s2_d;
-  cl_mem            d_plain_bufs;
-  cl_mem            d_digests_buf;
-  cl_mem            d_digests_shown;
-  cl_mem            d_salt_bufs;
-  cl_mem            d_esalt_bufs;
-  cl_mem            d_bcrypt_bufs;
-  cl_mem            d_tmps;
-  cl_mem            d_hooks;
-  cl_mem            d_result;
-  cl_mem            d_scryptV_buf;
-  cl_mem            d_root_css_buf;
-  cl_mem            d_markov_css_buf;
-
-  #define PARAMCNT 32
-
-  void             *kernel_params[PARAMCNT];
-  void             *kernel_params_mp[PARAMCNT];
-  void             *kernel_params_mp_r[PARAMCNT];
-  void             *kernel_params_mp_l[PARAMCNT];
-  void             *kernel_params_amp[PARAMCNT];
-  void             *kernel_params_tb[PARAMCNT];
-  void             *kernel_params_tm[PARAMCNT];
-
-  u32          kernel_params_buf32[PARAMCNT];
-
-  u32          kernel_params_mp_buf32[PARAMCNT];
-  u64          kernel_params_mp_buf64[PARAMCNT];
-
-  u32          kernel_params_mp_r_buf32[PARAMCNT];
-  u64          kernel_params_mp_r_buf64[PARAMCNT];
-
-  u32          kernel_params_mp_l_buf32[PARAMCNT];
-  u64          kernel_params_mp_l_buf64[PARAMCNT];
-
-  u32          kernel_params_amp_buf32[PARAMCNT];
+  char   *device_name;
+  char   *device_name_chksum;
+  char   *device_version;
+  char   *driver_version;
+
+  cl_uint vendor_id;
+
+  cl_kernel  kernel1;
+  cl_kernel  kernel12;
+  cl_kernel  kernel2;
+  cl_kernel  kernel23;
+  cl_kernel  kernel3;
+  cl_kernel  kernel_mp;
+  cl_kernel  kernel_mp_l;
+  cl_kernel  kernel_mp_r;
+  cl_kernel  kernel_amp;
+  cl_kernel  kernel_tb;
+  cl_kernel  kernel_tm;
+  cl_kernel  kernel_weak;
+
+  cl_context context;
+
+  cl_program program;
+  cl_program program_mp;
+  cl_program program_amp;
+  cl_program program_weak;
+
+  cl_command_queue command_queue;
+
+  cl_mem  d_pws_buf;
+  cl_mem  d_pws_amp_buf;
+  cl_mem  d_words_buf_l;
+  cl_mem  d_words_buf_r;
+  cl_mem  d_rules;
+  cl_mem  d_rules_c;
+  cl_mem  d_combs;
+  cl_mem  d_combs_c;
+  cl_mem  d_bfs;
+  cl_mem  d_bfs_c;
+  cl_mem  d_tm_c;
+  cl_mem  d_bitmap_s1_a;
+  cl_mem  d_bitmap_s1_b;
+  cl_mem  d_bitmap_s1_c;
+  cl_mem  d_bitmap_s1_d;
+  cl_mem  d_bitmap_s2_a;
+  cl_mem  d_bitmap_s2_b;
+  cl_mem  d_bitmap_s2_c;
+  cl_mem  d_bitmap_s2_d;
+  cl_mem  d_plain_bufs;
+  cl_mem  d_digests_buf;
+  cl_mem  d_digests_shown;
+  cl_mem  d_salt_bufs;
+  cl_mem  d_esalt_bufs;
+  cl_mem  d_bcrypt_bufs;
+  cl_mem  d_tmps;
+  cl_mem  d_hooks;
+  cl_mem  d_result;
+  cl_mem  d_scryptV_buf;
+  cl_mem  d_root_css_buf;
+  cl_mem  d_markov_css_buf;
+
+  void   *kernel_params[PARAMCNT];
+  void   *kernel_params_mp[PARAMCNT];
+  void   *kernel_params_mp_r[PARAMCNT];
+  void   *kernel_params_mp_l[PARAMCNT];
+  void   *kernel_params_amp[PARAMCNT];
+  void   *kernel_params_tb[PARAMCNT];
+  void   *kernel_params_tm[PARAMCNT];
+
+  u32     kernel_params_buf32[PARAMCNT];
+
+  u32     kernel_params_mp_buf32[PARAMCNT];
+  u64     kernel_params_mp_buf64[PARAMCNT];
+
+  u32     kernel_params_mp_r_buf32[PARAMCNT];
+  u64     kernel_params_mp_r_buf64[PARAMCNT];
+
+  u32     kernel_params_mp_l_buf32[PARAMCNT];
+  u64     kernel_params_mp_l_buf64[PARAMCNT];
+
+  u32     kernel_params_amp_buf32[PARAMCNT];
 };
 
 typedef struct __hc_device_param hc_device_param_t;
@@ -1002,12 +1002,11 @@ typedef struct
 
   } adapter_index;
 
-  int od_version;
+  int     od_version;
+  int     fan_supported;
 
-  int fan_supported;
-
-  // int busid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs
-  // int devid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs
+  // int     busid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs
+  // int     devid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs
 
 } hm_attrs_t;
 #endif // HAVE_HWMON
@@ -1018,73 +1017,81 @@ typedef struct
    * threads
    */
 
-  uint                devices_status;
-  uint                devices_cnt;
-  uint                devices_active;
-  hc_device_param_t  *devices_param;
+  uint    devices_status;
+  uint    devices_cnt;
+  uint    devices_active;
+
+  hc_device_param_t *devices_param;
 
-  uint                kernel_blocks_all;
+  uint    kernel_blocks_all;
 
   /**
    * attack specific
    */
 
-  uint                wordlist_mode;
-  uint                hashlist_mode;
-  uint                hashlist_format;
+  uint    wordlist_mode;
+  uint    hashlist_mode;
+  uint    hashlist_format;
 
-  uint                attack_mode;
-  uint                attack_kern;
-  uint                attack_exec;
+  uint    attack_mode;
+  uint    attack_kern;
+  uint    attack_exec;
 
-  uint                kernel_rules_cnt;
-  kernel_rule_t      *kernel_rules_buf;
+  uint    kernel_rules_cnt;
 
-  uint                combs_mode;
-  uint                combs_cnt;
+  kernel_rule_t *kernel_rules_buf;
 
-  uint                bfs_cnt;
+  uint    combs_mode;
+  uint    combs_cnt;
 
-  uint                css_cnt;
-  cs_t               *css_buf;
+  uint    bfs_cnt;
 
-  cs_t               *root_css_buf;
-  cs_t               *markov_css_buf;
+  uint    css_cnt;
+  cs_t   *css_buf;
+
+  cs_t   *root_css_buf;
+  cs_t   *markov_css_buf;
+
+  char   *rule_buf_l;
+  char   *rule_buf_r;
+  int     rule_len_l;
+  int     rule_len_r;
+
+  /**
+   * opencl
+   */
 
-  char               *rule_buf_l;
-  char               *rule_buf_r;
-  int                 rule_len_l;
-  int                 rule_len_r;
+  void               *ocl;
 
   /**
    * hardware watchdog
    */
 
   #ifdef HAVE_HWMON
-  HM_LIB              hm_dll_nv;
-  HM_LIB              hm_dll_amd;
-  hm_attrs_t          hm_device[DEVICES_MAX];
+  HM_LIB  hm_dll_nv;
+  HM_LIB  hm_dll_amd;
+  hm_attrs_t hm_device[DEVICES_MAX];
   #endif
 
   /**
    * hashes
    */
 
-  uint                digests_cnt;
-  uint                digests_done;
-  uint                digests_saved;
+  uint    digests_cnt;
+  uint    digests_done;
+  uint    digests_saved;
 
-  void               *digests_buf;
-  uint               *digests_shown;
-  uint               *digests_shown_tmp;
+  void   *digests_buf;
+  uint   *digests_shown;
+  uint   *digests_shown_tmp;
 
-  uint                salts_cnt;
-  uint                salts_done;
+  uint    salts_cnt;
+  uint    salts_done;
 
-  salt_t             *salts_buf;
-  uint               *salts_shown;
+  salt_t *salts_buf;
+  uint   *salts_shown;
 
-  void               *esalts_buf;
+  void   *esalts_buf;
 
   /**
    * logging
@@ -1099,10 +1106,10 @@ typedef struct
    * crack-per-time
    */
 
-  cpt_t  cpt_buf[CPT_BUF];
-  int    cpt_pos;
-  time_t cpt_start;
-  u64 cpt_total;
+  cpt_t   cpt_buf[CPT_BUF];
+  int     cpt_pos;
+  time_t  cpt_start;
+  u64     cpt_total;
 
   /**
    * user
@@ -1189,42 +1196,42 @@ typedef struct
    * used for restore
    */
 
-  u64 skip;
-  u64 limit;
+  u64     skip;
+  u64     limit;
 
   restore_data_t *rd;
 
-  u64 checkpoint_cur_words;  // used for the "stop at next checkpoint" feature
+  u64     checkpoint_cur_words;     // used for the "stop at next checkpoint" feature
 
   /**
    * status, timer
    */
 
-  time_t     runtime_start;
-  time_t     runtime_stop;
+  time_t  runtime_start;
+  time_t  runtime_stop;
 
-  time_t     proc_start;
-  time_t     proc_stop;
+  time_t  proc_start;
+  time_t  proc_stop;
 
-  u64   words_cnt;
-  u64   words_cur;
-  u64   words_base;
+  u64     words_cnt;
+  u64     words_cur;
+  u64     words_base;
 
-  u64  *words_progress_done;      // progress number of words done     per salt
-  u64  *words_progress_rejected;  // progress number of words rejected per salt
-  u64  *words_progress_restored;  // progress number of words restored per salt
+  u64    *words_progress_done;      // progress number of words done     per salt
+  u64    *words_progress_rejected;  // progress number of words rejected per salt
+  u64    *words_progress_restored;  // progress number of words restored per salt
 
   hc_timer_t timer_running;         // timer on current dict
   hc_timer_t timer_paused;          // timer on current dict
 
-  float      ms_paused;             // timer on current dict
+  float   ms_paused;                // timer on current dict
 
   /**
     * hash_info and username
     */
 
   hashinfo_t **hash_info;
-  uint         username;
+  uint    username;
 
   int (*sort_by_digest) (const void *, const void *);
 
index 9ba0d20..b92dee9 100644 (file)
@@ -125,7 +125,7 @@ VERSION_SUM              := $(shell git describe --tags --dirty=+ | cut -d- -f3)
 CFLAGS                   := -O2 -pipe -W -Wall -std=c99 -Iinclude/
 
 ifeq ($(DEBUG),1)
-CFLAGS                   += -g -ggdb -fsanitize=address -fno-omit-frame-pointer
+CFLAGS                   += -DDEBUG -g -ggdb -fsanitize=address -fno-omit-frame-pointer
 endif
 
 ##
@@ -142,7 +142,7 @@ BINARY_NATIVE            := $(PROG_NAME).app
 CFLAGS_NATIVE            := -D_POSIX -DOSX
 CFLAGS_NATIVE            += $(CFLAGS)
 
-LFLAGS_NATIVE            := -framework OpenCL -lpthread
+LFLAGS_NATIVE            := -lpthread
 
 FOUND_ADL                := 0
 FOUND_NVML               := 0
@@ -152,10 +152,9 @@ ifeq ($(UNAME),Linux)
 CFLAGS_NATIVE            := -D_POSIX -DLINUX
 CFLAGS_NATIVE            += -s $(CFLAGS)
 
-LFLAGS_NATIVE            := -lOpenCL -lpthread
+LFLAGS_NATIVE            := -lpthread -ldl
 
 ifneq (,$(filter 1,$(FOUND_ADL) $(FOUND_NVML)))
-LFLAGS_NATIVE            += -ldl
 CFLAGS_NATIVE            += -DHAVE_HWMON
 ifeq ($(FOUND_ADL),1)
 CFLAGS_NATIVE            += -DHAVE_ADL -I$(ADL)/include/
@@ -206,7 +205,7 @@ endif
 CFLAGS_CROSS_32          := -m32
 CFLAGS_CROSS_64          := -m64
 
-LFLAGS_CROSS_LINUX       := -lpthread -lOpenCL -ldl
+LFLAGS_CROSS_LINUX       := -lpthread -ldl
 LFLAGS_CROSS_WIN         := -lpsapi
 
 ##
@@ -347,8 +346,8 @@ oclHashcat32.bin: src/oclHashcat.c $(LINUX_32_OBJS)
 oclHashcat64.bin: src/oclHashcat.c $(LINUX_64_OBJS)
        $(CC_LINUX_64) $(CFLAGS_CROSS_LINUX) $(CFLAGS_CROSS_64)    -o $@ $^ $(LFLAGS_CROSS_LINUX) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\"
 
-oclHashcat32.exe: src/oclHashcat.c $(WIN_32_OBJS) lib/libOpenCL.a
+oclHashcat32.exe: src/oclHashcat.c $(WIN_32_OBJS)
        $(CC_WIN_32)   $(CFLAGS_CROSS_WIN)   $(CFLAGS_CROSS_32)    -o $@ $^ $(LFLAGS_CROSS_WIN)   -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc
 
-oclHashcat64.exe: src/oclHashcat.c $(WIN_64_OBJS) lib/libOpenCL64.a
+oclHashcat64.exe: src/oclHashcat.c $(WIN_64_OBJS)
        $(CC_WIN_64)   $(CFLAGS_CROSS_WIN)   $(CFLAGS_CROSS_64)    -o $@ $^ $(LFLAGS_CROSS_WIN)   -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc
index c3c4545..8acc474 100644 (file)
@@ -1,5 +1,7 @@
 /**
- * Author......: Jens Steube <jens.steube@gmail.com>
+ * Authors.....: Jens Steube <jens.steube@gmail.com>
+ *               Gabriele Gristina <matrix@hashcat.net>
+ *
  * License.....: MIT
  */
 
@@ -54,9 +56,78 @@ const char *val2cstr_cl (cl_int CL_err)
   return "CL_UNKNOWN_ERROR";
 }
 
-void hc_clEnqueueNDRangeKernel (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+#define LOAD_FUNC(ptr,name,type) \
+    ptr->name = (type) hc_dlsym (ptr->lib, #name); \
+    if (!ptr->name) { \
+      log_error ("ERROR: #name is missing from opencl shared library"); \
+      exit (-1); \
+    }
+
+void ocl_init (OCL_PTR *ocl)
+{
+  memset (ocl, 0, sizeof (hc_opencl_lib_t));
+
+  #ifdef _WIN
+  ocl->lib = hc_dlopen ("OpenCL");
+  #elif OSX
+  ocl->lib = hc_dlopen ("/System/Library/Frameworks/OpenCL.framework/OpenCL", RTLD_NOW);
+  #else
+  ocl->lib = hc_dlopen ("libOpenCL.so", RTLD_NOW);
+  #endif
+
+  if (!ocl->lib)
+  {
+    log_error ("ERROR: cannot load opencl library");
+
+    exit (-1);
+  }
+
+  LOAD_FUNC(ocl, clBuildProgram, OCL_CLBUILDPROGRAM)
+  LOAD_FUNC(ocl, clCreateBuffer, OCL_CLCREATEBUFFER)
+  LOAD_FUNC(ocl, clCreateCommandQueue, OCL_CLCREATECOMMANDQUEUE)
+  LOAD_FUNC(ocl, clCreateContext, OCL_CLCREATECONTEXT)
+  LOAD_FUNC(ocl, clCreateKernel, OCL_CLCREATEKERNEL)
+  LOAD_FUNC(ocl, clCreateProgramWithBinary, OCL_CLCREATEPROGRAMWITHBINARY)
+  LOAD_FUNC(ocl, clCreateProgramWithSource, OCL_CLCREATEPROGRAMWITHSOURCE)
+  LOAD_FUNC(ocl, clEnqueueCopyBuffer, OCL_CLENQUEUECOPYBUFFER)
+  LOAD_FUNC(ocl, clEnqueueFillBuffer, OCL_CLENQUEUEFILLBUFFER)
+  LOAD_FUNC(ocl, clEnqueueMapBuffer, OCL_CLENQUEUEMAPBUFFER)
+  LOAD_FUNC(ocl, clEnqueueNDRangeKernel, OCL_CLENQUEUENDRANGEKERNEL)
+  LOAD_FUNC(ocl, clEnqueueReadBuffer, OCL_CLENQUEUEREADBUFFER)
+  LOAD_FUNC(ocl, clEnqueueUnmapMemObject, OCL_CLENQUEUEUNMAPMEMOBJECT)
+  LOAD_FUNC(ocl, clEnqueueWriteBuffer, OCL_CLENQUEUEWRITEBUFFER)
+  LOAD_FUNC(ocl, clFinish, OCL_CLFINISH)
+  LOAD_FUNC(ocl, clFlush, OCL_CLFLUSH)
+  LOAD_FUNC(ocl, clGetDeviceIDs, OCL_CLGETDEVICEIDS)
+  LOAD_FUNC(ocl, clGetDeviceInfo, OCL_CLGETDEVICEINFO)
+  LOAD_FUNC(ocl, clGetEventInfo, OCL_CLGETEVENTINFO)
+  LOAD_FUNC(ocl, clGetKernelWorkGroupInfo, OCL_CLGETKERNELWORKGROUPINFO)
+  LOAD_FUNC(ocl, clGetPlatformIDs, OCL_CLGETPLATFORMIDS)
+  LOAD_FUNC(ocl, clGetPlatformInfo, OCL_CLGETPLATFORMINFO)
+  LOAD_FUNC(ocl, clGetProgramBuildInfo, OCL_CLGETPROGRAMBUILDINFO)
+  LOAD_FUNC(ocl, clGetProgramInfo, OCL_CLGETPROGRAMINFO)
+  LOAD_FUNC(ocl, clReleaseCommandQueue, OCL_CLRELEASECOMMANDQUEUE)
+  LOAD_FUNC(ocl, clReleaseContext, OCL_CLRELEASECONTEXT)
+  LOAD_FUNC(ocl, clReleaseKernel, OCL_CLRELEASEKERNEL)
+  LOAD_FUNC(ocl, clReleaseMemObject, OCL_CLRELEASEMEMOBJECT)
+  LOAD_FUNC(ocl, clReleaseProgram, OCL_CLRELEASEPROGRAM)
+  LOAD_FUNC(ocl, clSetKernelArg, OCL_CLSETKERNELARG)
+}
+
+void ocl_close (OCL_PTR *ocl)
 {
-  cl_int CL_err = clEnqueueNDRangeKernel (command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event);
+  if (ocl)
+  {
+    if (ocl->lib)
+      hc_dlclose (ocl->lib);
+
+    free (ocl);
+  }
+}
+
+void hc_clEnqueueNDRangeKernel (OCL_PTR *ocl, cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+{
+  cl_int CL_err = ocl->clEnqueueNDRangeKernel (command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -66,9 +137,9 @@ void hc_clEnqueueNDRangeKernel (cl_command_queue command_queue, cl_kernel kernel
   }
 }
 
-void hc_clGetEventInfo (cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
+void hc_clGetEventInfo (OCL_PTR *ocl, cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
 {
-  cl_int CL_err = clGetEventInfo (event, param_name, param_value_size, param_value, param_value_size_ret);
+  cl_int CL_err = ocl->clGetEventInfo (event, param_name, param_value_size, param_value, param_value_size_ret);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -78,9 +149,9 @@ void hc_clGetEventInfo (cl_event event, cl_event_info param_name, size_t param_v
   }
 }
 
-void hc_clFlush (cl_command_queue command_queue)
+void hc_clFlush (OCL_PTR *ocl, cl_command_queue command_queue)
 {
-  cl_int CL_err = clFlush (command_queue);
+  cl_int CL_err = ocl->clFlush (command_queue);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -90,9 +161,9 @@ void hc_clFlush (cl_command_queue command_queue)
   }
 }
 
-void hc_clFinish (cl_command_queue command_queue)
+void hc_clFinish (OCL_PTR *ocl, cl_command_queue command_queue)
 {
-  cl_int CL_err = clFinish (command_queue);
+  cl_int CL_err = ocl->clFinish (command_queue);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -102,9 +173,9 @@ void hc_clFinish (cl_command_queue command_queue)
   }
 }
 
-void hc_clSetKernelArg (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
+void hc_clSetKernelArg (OCL_PTR *ocl, cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)
 {
-  cl_int CL_err = clSetKernelArg (kernel, arg_index, arg_size, arg_value);
+  cl_int CL_err = ocl->clSetKernelArg (kernel, arg_index, arg_size, arg_value);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -114,9 +185,9 @@ void hc_clSetKernelArg (cl_kernel kernel, cl_uint arg_index, size_t arg_size, co
   }
 }
 
-void hc_clEnqueueWriteBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void hc_clEnqueueWriteBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
-  cl_int CL_err = clEnqueueWriteBuffer (command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
+  cl_int CL_err = ocl->clEnqueueWriteBuffer (command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -126,9 +197,9 @@ void hc_clEnqueueWriteBuffer (cl_command_queue command_queue, cl_mem buffer, cl_
   }
 }
 
-void hc_clEnqueueCopyBuffer (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void hc_clEnqueueCopyBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
-  cl_int CL_err = clEnqueueCopyBuffer (command_queue, src_buffer, dst_buffer, src_offset, dst_offset, cb, num_events_in_wait_list, event_wait_list, event);
+  cl_int CL_err = ocl->clEnqueueCopyBuffer (command_queue, src_buffer, dst_buffer, src_offset, dst_offset, cb, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -138,9 +209,9 @@ void hc_clEnqueueCopyBuffer (cl_command_queue command_queue, cl_mem src_buffer,
   }
 }
 
-void hc_clEnqueueReadBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void hc_clEnqueueReadBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
-  cl_int CL_err = clEnqueueReadBuffer (command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
+  cl_int CL_err = ocl->clEnqueueReadBuffer (command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -150,9 +221,9 @@ void hc_clEnqueueReadBuffer (cl_command_queue command_queue, cl_mem buffer, cl_b
   }
 }
 
-void hc_clGetPlatformIDs (cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
+void hc_clGetPlatformIDs (OCL_PTR *ocl, cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms)
 {
-  cl_int CL_err = clGetPlatformIDs (num_entries, platforms, num_platforms);
+  cl_int CL_err = ocl->clGetPlatformIDs (num_entries, platforms, num_platforms);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -162,9 +233,9 @@ void hc_clGetPlatformIDs (cl_uint num_entries, cl_platform_id *platforms, cl_uin
   }
 }
 
-void hc_clGetPlatformInfo (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
+void hc_clGetPlatformInfo (OCL_PTR *ocl, cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
 {
-  cl_int CL_err = clGetPlatformInfo (platform, param_name, param_value_size, param_value, param_value_size_ret);
+  cl_int CL_err = ocl->clGetPlatformInfo (platform, param_name, param_value_size, param_value, param_value_size_ret);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -174,9 +245,9 @@ void hc_clGetPlatformInfo (cl_platform_id platform, cl_platform_info param_name,
   }
 }
 
-void hc_clGetDeviceIDs (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices)
+void hc_clGetDeviceIDs (OCL_PTR *ocl, cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices)
 {
-  cl_int CL_err = clGetDeviceIDs (platform, device_type, num_entries, devices, num_devices);
+  cl_int CL_err = ocl->clGetDeviceIDs (platform, device_type, num_entries, devices, num_devices);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -186,9 +257,9 @@ void hc_clGetDeviceIDs (cl_platform_id platform, cl_device_type device_type, cl_
   }
 }
 
-void hc_clGetDeviceInfo (cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
+void hc_clGetDeviceInfo (OCL_PTR *ocl, cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
 {
-  cl_int CL_err = clGetDeviceInfo (device, param_name, param_value_size, param_value, param_value_size_ret);
+  cl_int CL_err = ocl->clGetDeviceInfo (device, param_name, param_value_size, param_value, param_value_size_ret);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -198,11 +269,11 @@ void hc_clGetDeviceInfo (cl_device_id device, cl_device_info param_name, size_t
   }
 }
 
-cl_context hc_clCreateContext (cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data)
+cl_context hc_clCreateContext (OCL_PTR *ocl, cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data)
 {
   cl_int CL_err;
 
-  cl_context context = clCreateContext (properties, num_devices, devices, pfn_notify, user_data, &CL_err);
+  cl_context context = ocl->clCreateContext (properties, num_devices, devices, pfn_notify, user_data, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -214,12 +285,11 @@ cl_context hc_clCreateContext (cl_context_properties *properties, cl_uint num_de
   return (context);
 }
 
-
-cl_command_queue hc_clCreateCommandQueue (cl_context context, cl_device_id device, cl_command_queue_properties properties)
+cl_command_queue hc_clCreateCommandQueue (OCL_PTR *ocl, cl_context context, cl_device_id device, cl_command_queue_properties properties)
 {
   cl_int CL_err;
 
-  cl_command_queue command_queue = clCreateCommandQueue (context, device, properties, &CL_err);
+  cl_command_queue command_queue = ocl->clCreateCommandQueue (context, device, properties, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -249,11 +319,11 @@ cl_command_queue hc_clCreateCommandQueueWithProperties (cl_context context, cl_d
 }
 */
 
-cl_mem hc_clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr)
+cl_mem hc_clCreateBuffer (OCL_PTR *ocl, cl_context context, cl_mem_flags flags, size_t size, void *host_ptr)
 {
   cl_int CL_err;
 
-  cl_mem mem = clCreateBuffer (context, flags, size, host_ptr, &CL_err);
+  cl_mem mem = ocl->clCreateBuffer (context, flags, size, host_ptr, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -265,11 +335,11 @@ cl_mem hc_clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, v
   return (mem);
 }
 
-cl_program hc_clCreateProgramWithSource (cl_context context, cl_uint count, const char **strings, const size_t *lengths)
+cl_program hc_clCreateProgramWithSource (OCL_PTR *ocl, cl_context context, cl_uint count, const char **strings, const size_t *lengths)
 {
   cl_int CL_err;
 
-  cl_program program = clCreateProgramWithSource (context, count, strings, lengths, &CL_err);
+  cl_program program = ocl->clCreateProgramWithSource (context, count, strings, lengths, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -281,11 +351,11 @@ cl_program hc_clCreateProgramWithSource (cl_context context, cl_uint count, cons
   return (program);
 }
 
-cl_program hc_clCreateProgramWithBinary (cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status)
+cl_program hc_clCreateProgramWithBinary (OCL_PTR *ocl, cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status)
 {
   cl_int CL_err;
 
-  cl_program program = clCreateProgramWithBinary (context, num_devices, device_list, lengths, binaries, binary_status, &CL_err);
+  cl_program program = ocl->clCreateProgramWithBinary (context, num_devices, device_list, lengths, binaries, binary_status, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -297,9 +367,9 @@ cl_program hc_clCreateProgramWithBinary (cl_context context, cl_uint num_devices
   return (program);
 }
 
-void hc_clBuildProgram (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data)
+void hc_clBuildProgram (OCL_PTR *ocl, cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data)
 {
-  cl_int CL_err = clBuildProgram (program, num_devices, device_list, options, pfn_notify, user_data);
+  cl_int CL_err = ocl->clBuildProgram (program, num_devices, device_list, options, pfn_notify, user_data);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -310,11 +380,11 @@ void hc_clBuildProgram (cl_program program, cl_uint num_devices, const cl_device
   }
 }
 
-cl_kernel hc_clCreateKernel (cl_program program, const char *kernel_name)
+cl_kernel hc_clCreateKernel (OCL_PTR *ocl, cl_program program, const char *kernel_name)
 {
   cl_int CL_err;
 
-  cl_kernel kernel = clCreateKernel (program, kernel_name, &CL_err);
+  cl_kernel kernel = ocl->clCreateKernel (program, kernel_name, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -326,9 +396,9 @@ cl_kernel hc_clCreateKernel (cl_program program, const char *kernel_name)
   return (kernel);
 }
 
-void hc_clReleaseMemObject (cl_mem mem)
+void hc_clReleaseMemObject (OCL_PTR *ocl, cl_mem mem)
 {
-  cl_int CL_err = clReleaseMemObject (mem);
+  cl_int CL_err = ocl->clReleaseMemObject (mem);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -338,9 +408,9 @@ void hc_clReleaseMemObject (cl_mem mem)
   }
 }
 
-void hc_clReleaseKernel (cl_kernel kernel)
+void hc_clReleaseKernel (OCL_PTR *ocl, cl_kernel kernel)
 {
-  cl_int CL_err = clReleaseKernel (kernel);
+  cl_int CL_err = ocl->clReleaseKernel (kernel);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -350,9 +420,9 @@ void hc_clReleaseKernel (cl_kernel kernel)
   }
 }
 
-void hc_clReleaseProgram (cl_program program)
+void hc_clReleaseProgram (OCL_PTR *ocl, cl_program program)
 {
-  cl_int CL_err = clReleaseProgram (program);
+  cl_int CL_err = ocl->clReleaseProgram (program);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -362,9 +432,9 @@ void hc_clReleaseProgram (cl_program program)
   }
 }
 
-void hc_clReleaseCommandQueue (cl_command_queue command_queue)
+void hc_clReleaseCommandQueue (OCL_PTR *ocl, cl_command_queue command_queue)
 {
-  cl_int CL_err = clReleaseCommandQueue (command_queue);
+  cl_int CL_err = ocl->clReleaseCommandQueue (command_queue);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -374,9 +444,9 @@ void hc_clReleaseCommandQueue (cl_command_queue command_queue)
   }
 }
 
-void hc_clReleaseContext (cl_context context)
+void hc_clReleaseContext (OCL_PTR *ocl, cl_context context)
 {
-  cl_int CL_err = clReleaseContext (context);
+  cl_int CL_err = ocl->clReleaseContext (context);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -386,11 +456,11 @@ void hc_clReleaseContext (cl_context context)
   }
 }
 
-void *hc_clEnqueueMapBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void *hc_clEnqueueMapBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
   cl_int CL_err;
 
-  void *buf = clEnqueueMapBuffer (command_queue, buffer, blocking_read, map_flags, offset, cb, num_events_in_wait_list, event_wait_list, event, &CL_err);
+  void *buf = ocl->clEnqueueMapBuffer (command_queue, buffer, blocking_read, map_flags, offset, cb, num_events_in_wait_list, event_wait_list, event, &CL_err);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -402,9 +472,9 @@ void *hc_clEnqueueMapBuffer (cl_command_queue command_queue, cl_mem buffer, cl_b
   return buf;
 }
 
-void hc_clEnqueueUnmapMemObject (cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void hc_clEnqueueUnmapMemObject (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
-  cl_int CL_err = clEnqueueUnmapMemObject (command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
+  cl_int CL_err = ocl->clEnqueueUnmapMemObject (command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -414,9 +484,9 @@ void hc_clEnqueueUnmapMemObject (cl_command_queue command_queue, cl_mem memobj,
   }
 }
 
-void hc_clEnqueueFillBuffer (cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
+void hc_clEnqueueFillBuffer (OCL_PTR *ocl, cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
 {
-  cl_int CL_err = clEnqueueFillBuffer (command_queue, buffer, pattern, pattern_size, offset, size, num_events_in_wait_list, event_wait_list, event);
+  cl_int CL_err = ocl->clEnqueueFillBuffer (command_queue, buffer, pattern, pattern_size, offset, size, num_events_in_wait_list, event_wait_list, event);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -426,9 +496,9 @@ void hc_clEnqueueFillBuffer (cl_command_queue command_queue, cl_mem buffer, cons
   }
 }
 
-void hc_clGetKernelWorkGroupInfo (cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
+void hc_clGetKernelWorkGroupInfo (OCL_PTR *ocl, cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
 {
-  cl_int CL_err = clGetKernelWorkGroupInfo (kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
+  cl_int CL_err = ocl->clGetKernelWorkGroupInfo (kernel, device, param_name, param_value_size, param_value, param_value_size_ret);
 
   if (CL_err != CL_SUCCESS)
   {
@@ -437,3 +507,27 @@ void hc_clGetKernelWorkGroupInfo (cl_kernel kernel, cl_device_id device, cl_kern
     exit (-1);
   }
 }
+
+void hc_clGetProgramBuildInfo (OCL_PTR *ocl, cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
+{
+  cl_int CL_err = ocl->clGetProgramBuildInfo (program, device, param_name, param_value_size, param_value, param_value_size_ret);
+
+  if (CL_err != CL_SUCCESS)
+  {
+    log_error ("ERROR: %s : %d : %s\n", "clGetProgramBuildInfo()", CL_err, val2cstr_cl (CL_err));
+
+    exit (-1);
+  }
+}
+
+void hc_clGetProgramInfo (OCL_PTR *ocl, cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t * param_value_size_ret)
+{
+  cl_int CL_err = ocl->clGetProgramInfo (program, param_name, param_value_size, param_value, param_value_size_ret);
+
+  if (CL_err != CL_SUCCESS)
+  {
+    log_error ("ERROR: %s : %d : %s\n", "clGetProgramInfo()", CL_err, val2cstr_cl (CL_err));
+
+    exit (-1);
+  }
+}
index 84e26ee..5056945 100644 (file)
@@ -1,5 +1,7 @@
 /**
- * Author......: Jens Steube <jens.steube@gmail.com>
+ * Authors.....: Jens Steube <jens.steube@gmail.com>
+ *               Gabriele Gristina <matrix@hashcat.net>
+ *
  * License.....: MIT
  */
 
 #include <rp_kernel_on_cpu.h>
 #include <getopt.h>
 
-const char *PROGNAME          = "oclHashcat";
-const uint  VERSION_BIN       = 210;
-const uint  RESTORE_MIN       = 210;
+const char *PROGNAME            = "oclHashcat";
+const uint  VERSION_BIN         = 210;
+const uint  RESTORE_MIN         = 210;
 
-#define INCR_RULES            10000
-#define INCR_SALTS            100000
-#define INCR_MASKS            1000
-#define INCR_POT              1000
+#define INCR_RULES              10000
+#define INCR_SALTS              100000
+#define INCR_MASKS              1000
+#define INCR_POT                1000
 
 #define USAGE                   0
 #define VERSION                 0
@@ -160,10 +162,10 @@ static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] =
   5000,
   10100,
   6000,
-  6100,
-  6900,
-  11700,
-  11800,
+  6100, // broken in osx
+  6900, // broken in osx
+  11700, // broken in osx
+  11800, // broken in osx
   400,
   8900,
   11900,
@@ -172,55 +174,55 @@ static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] =
   12100,
   23,
   2500,
-  5300,
-  5400,
-  5500,
-  5600,
+  5300, // broken in osx
+  5400, // broken in osx
+  5500, // broken in osx
+  5600, // broken in osx
   7300,
-  7500,
+  7500, // broken in osx
   8300,
-  11100,
+  11100, // broken in osx
   11200,
-  11400,
+  11400, // broken in osx
   121,
-  2611,
-  2711,
-  2811,
-  8400,
+  2611, // broken in osx
+  2711, // broken in osx
+  2811, // broken in osx
+  8400, // broken in osx
   11,
-  2612,
+  2612, // broken in osx
   7900,
   21,
   11000,
   124,
   10000,
-  3711,
-  7600,
+  3711, // broken in osx
+  7600, // broken in osx
   12,
   131,
   132,
   1731,
   200,
   300,
-  3100,
+  3100, // broken in osx
   112,
   12300,
-  8000,
+  8000, // broken in osx
   141,
   1441,
   1600,
-  12600,
+  12600, // broken in osx
   1421,
   101,
   111,
   1711,
-  3000,
+  3000, // broken in osx
   1000,
   1100,
   2100,
   12800,
-  1500,
-  12400,
+  1500, // broken in osx
+  12400, // broken in osx
   500,
   3200,
   7400,
@@ -241,45 +243,45 @@ static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] =
   501,
   5800,
   8100,
-  8500,
+  8500, // broken in osx
   7200,
   9900,
   7700,
   7800,
   10300,
-  8600,
-  8700,
-  9100,
+  8600, // broken in osx
+  8700, // broken in osx
+  9100, // broken in osx
   133,
-  11600,
-  12500,
+  11600, // broken in osx
+  12500, // broken in osx
   13000,
   6211,
   6221,
-  6231,
+  6231, // broken in osx
   6241,
-  8800,
+  8800, // broken in osx
   12900,
   12200,
-  9700,
-  9710,
-  9800,
-  9810,
-  9400,
-  9500,
-  9600,
-  10400,
-  10410,
+  9700, // broken in osx
+  9710, // broken in osx
+  9800, // broken in osx
+  9810, // broken in osx
+  9400, // broken in osx
+  9500, // broken in osx
+  9600, // broken in osx
+  10400, // broken in osx
+  10410, // broken in osx
   10500,
   10600,
-  10700,
+  10700, // broken in osx
   9000,
   5200,
-  6800,
-  6600,
+  6800, // broken in osx
+  6600, // broken in osx
   8200,
-  11300,
-  12700
+  11300, // broken in osx
+  12700 // broken in osx
 };
 
 /**
@@ -1828,7 +1830,7 @@ static void clear_prompt ()
 
 static void gidd_to_pw_t (hc_device_param_t *device_param, const u64 gidd, pw_t *pw)
 {
-  hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, gidd * sizeof (pw_t), sizeof (pw_t), pw, 0, NULL, NULL);
+  hc_clEnqueueReadBuffer (data.ocl, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, gidd * sizeof (pw_t), sizeof (pw_t), pw, 0, NULL, NULL);
 }
 
 static void check_hash (hc_device_param_t *device_param, const uint salt_pos, const uint digest_pos)
@@ -1858,7 +1860,7 @@ static void check_hash (hc_device_param_t *device_param, const uint salt_pos, co
 
   plain_t plain;
 
-  hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_plain_bufs, CL_TRUE, idx * sizeof (plain_t), sizeof (plain_t), &plain, 0, NULL, NULL);
+  hc_clEnqueueReadBuffer (data.ocl, device_param->command_queue, device_param->d_plain_bufs, CL_TRUE, idx * sizeof (plain_t), sizeof (plain_t), &plain, 0, NULL, NULL);
 
   uint gidvid = plain.gidvid;
   uint il_pos = plain.il_pos;
@@ -1881,7 +1883,7 @@ static void check_hash (hc_device_param_t *device_param, const uint salt_pos, co
 
     for (int i = 0, j = gidm; i < 16; i++, j++)
     {
-      plain_buf[i] = pw.hi1[0][j];
+      plain_buf[i] = pw.h.hi1[0][j];
     }
 
     plain_len = pw.pw_len;
@@ -1930,7 +1932,7 @@ static void check_hash (hc_device_param_t *device_param, const uint salt_pos, co
 
     for (int i = 0, j = gidm; i < 16; i++, j++)
     {
-      plain_buf[i] = pw.hi1[0][j];
+      plain_buf[i] = pw.h.hi1[0][j];
     }
 
     plain_len = pw.pw_len;
@@ -1991,7 +1993,7 @@ static void check_hash (hc_device_param_t *device_param, const uint salt_pos, co
 
     for (int i = 0, j = gidm; i < 16; i++, j++)
     {
-      plain_buf[i] = pw.hi1[0][j];
+      plain_buf[i] = pw.h.hi1[0][j];
     }
 
     plain_len = pw.pw_len;
@@ -2025,7 +2027,7 @@ static void check_hash (hc_device_param_t *device_param, const uint salt_pos, co
 
     for (int i = 0, j = gidm; i < 16; i++, j++)
     {
-      plain_buf[i] = pw.hi1[0][j];
+      plain_buf[i] = pw.h.hi1[0][j];
     }
 
     plain_len = pw.pw_len;
@@ -2175,7 +2177,7 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos)
 
   int found = 0;
 
-  hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL);
+  hc_clEnqueueReadBuffer (data.ocl, device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL);
 
   for (uint i = 0; i < KERNEL_THREADS; i++) if (device_param->result[i] == 1) found = 1;
 
@@ -2185,7 +2187,7 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos)
 
     log_info_nn ("");
 
-    hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL);
+    hc_clEnqueueReadBuffer (data.ocl, device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL);
 
     uint cpt_cracked = 0;
 
@@ -2240,12 +2242,12 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos)
 
       memset (data.digests_shown_tmp, 0, salt_buf->digests_cnt * sizeof (uint));
 
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL);
     }
 
     memset (device_param->result, 0, device_param->size_results);
 
-    hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL);
+    hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL);
   }
 }
 
@@ -2400,36 +2402,36 @@ static void run_kernel (const uint kern_run, hc_device_param_t *device_param, co
     case KERN_RUN_3:    kernel = device_param->kernel3;     break;
   }
 
-  hc_clSetKernelArg (kernel, 21, sizeof (cl_uint), device_param->kernel_params[21]);
-  hc_clSetKernelArg (kernel, 22, sizeof (cl_uint), device_param->kernel_params[22]);
-  hc_clSetKernelArg (kernel, 23, sizeof (cl_uint), device_param->kernel_params[23]);
-  hc_clSetKernelArg (kernel, 24, sizeof (cl_uint), device_param->kernel_params[24]);
-  hc_clSetKernelArg (kernel, 25, sizeof (cl_uint), device_param->kernel_params[25]);
-  hc_clSetKernelArg (kernel, 26, sizeof (cl_uint), device_param->kernel_params[26]);
-  hc_clSetKernelArg (kernel, 27, sizeof (cl_uint), device_param->kernel_params[27]);
-  hc_clSetKernelArg (kernel, 28, sizeof (cl_uint), device_param->kernel_params[28]);
-  hc_clSetKernelArg (kernel, 29, sizeof (cl_uint), device_param->kernel_params[29]);
-  hc_clSetKernelArg (kernel, 30, sizeof (cl_uint), device_param->kernel_params[30]);
-  hc_clSetKernelArg (kernel, 31, sizeof (cl_uint), device_param->kernel_params[31]);
+  hc_clSetKernelArg (data.ocl, kernel, 21, sizeof (cl_uint), device_param->kernel_params[21]);
+  hc_clSetKernelArg (data.ocl, kernel, 22, sizeof (cl_uint), device_param->kernel_params[22]);
+  hc_clSetKernelArg (data.ocl, kernel, 23, sizeof (cl_uint), device_param->kernel_params[23]);
+  hc_clSetKernelArg (data.ocl, kernel, 24, sizeof (cl_uint), device_param->kernel_params[24]);
+  hc_clSetKernelArg (data.ocl, kernel, 25, sizeof (cl_uint), device_param->kernel_params[25]);
+  hc_clSetKernelArg (data.ocl, kernel, 26, sizeof (cl_uint), device_param->kernel_params[26]);
+  hc_clSetKernelArg (data.ocl, kernel, 27, sizeof (cl_uint), device_param->kernel_params[27]);
+  hc_clSetKernelArg (data.ocl, kernel, 28, sizeof (cl_uint), device_param->kernel_params[28]);
+  hc_clSetKernelArg (data.ocl, kernel, 29, sizeof (cl_uint), device_param->kernel_params[29]);
+  hc_clSetKernelArg (data.ocl, kernel, 30, sizeof (cl_uint), device_param->kernel_params[30]);
+  hc_clSetKernelArg (data.ocl, kernel, 31, sizeof (cl_uint), device_param->kernel_params[31]);
 
   if ((data.opts_type & OPTS_TYPE_PT_BITSLICE) && (data.attack_mode == ATTACK_MODE_BF))
   {
     const size_t global_work_size[3] = { num_elements,        32, 1 };
     const size_t local_work_size[3]  = { kernel_threads / 32, 32, 1 };
 
-    hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+    hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL);
   }
   else
   {
     const size_t global_work_size[3] = { num_elements,   1, 1 };
     const size_t local_work_size[3]  = { kernel_threads, 1, 1 };
 
-    hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+    hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
   }
 
-  hc_clFlush (device_param->command_queue);
+  hc_clFlush (data.ocl, device_param->command_queue);
 
-  hc_clFinish (device_param->command_queue);
+  hc_clFinish (data.ocl, device_param->command_queue);
 }
 
 static void run_kernel_mp (const uint kern_run, hc_device_param_t *device_param, const uint num)
@@ -2461,38 +2463,38 @@ static void run_kernel_mp (const uint kern_run, hc_device_param_t *device_param,
 
   switch (kern_run)
   {
-    case KERN_RUN_MP:   hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp[3]);
-                        hc_clSetKernelArg (kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp[4]);
-                        hc_clSetKernelArg (kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp[5]);
-                        hc_clSetKernelArg (kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp[6]);
-                        hc_clSetKernelArg (kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp[7]);
-                        hc_clSetKernelArg (kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp[8]);
+    case KERN_RUN_MP:   hc_clSetKernelArg (data.ocl, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp[3]);
+                        hc_clSetKernelArg (data.ocl, kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp[4]);
+                        hc_clSetKernelArg (data.ocl, kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp[5]);
+                        hc_clSetKernelArg (data.ocl, kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp[6]);
+                        hc_clSetKernelArg (data.ocl, kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp[7]);
+                        hc_clSetKernelArg (data.ocl, kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp[8]);
                         break;
-    case KERN_RUN_MP_R: hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_r[3]);
-                        hc_clSetKernelArg (kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp_r[4]);
-                        hc_clSetKernelArg (kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp_r[5]);
-                        hc_clSetKernelArg (kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp_r[6]);
-                        hc_clSetKernelArg (kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp_r[7]);
-                        hc_clSetKernelArg (kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp_r[8]);
+    case KERN_RUN_MP_R: hc_clSetKernelArg (data.ocl, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_r[3]);
+                        hc_clSetKernelArg (data.ocl, kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp_r[4]);
+                        hc_clSetKernelArg (data.ocl, kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp_r[5]);
+                        hc_clSetKernelArg (data.ocl, kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp_r[6]);
+                        hc_clSetKernelArg (data.ocl, kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp_r[7]);
+                        hc_clSetKernelArg (data.ocl, kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp_r[8]);
                         break;
-    case KERN_RUN_MP_L: hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_l[3]);
-                        hc_clSetKernelArg (kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp_l[4]);
-                        hc_clSetKernelArg (kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp_l[5]);
-                        hc_clSetKernelArg (kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp_l[6]);
-                        hc_clSetKernelArg (kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp_l[7]);
-                        hc_clSetKernelArg (kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp_l[8]);
-                        hc_clSetKernelArg (kernel, 9, sizeof (cl_uint),  device_param->kernel_params_mp_l[9]);
+    case KERN_RUN_MP_L: hc_clSetKernelArg (data.ocl, kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_l[3]);
+                        hc_clSetKernelArg (data.ocl, kernel, 4, sizeof (cl_uint),  device_param->kernel_params_mp_l[4]);
+                        hc_clSetKernelArg (data.ocl, kernel, 5, sizeof (cl_uint),  device_param->kernel_params_mp_l[5]);
+                        hc_clSetKernelArg (data.ocl, kernel, 6, sizeof (cl_uint),  device_param->kernel_params_mp_l[6]);
+                        hc_clSetKernelArg (data.ocl, kernel, 7, sizeof (cl_uint),  device_param->kernel_params_mp_l[7]);
+                        hc_clSetKernelArg (data.ocl, kernel, 8, sizeof (cl_uint),  device_param->kernel_params_mp_l[8]);
+                        hc_clSetKernelArg (data.ocl, kernel, 9, sizeof (cl_uint),  device_param->kernel_params_mp_l[9]);
                         break;
   }
 
   const size_t global_work_size[3] = { num_elements, 1, 1 };
   const size_t local_work_size[3]  = { kernel_threads,  1, 1 };
 
-  hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+  hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
 
-  hc_clFlush (device_param->command_queue);
+  hc_clFlush (data.ocl, device_param->command_queue);
 
-  hc_clFinish (device_param->command_queue);
+  hc_clFinish (data.ocl, device_param->command_queue);
 }
 
 static void run_kernel_tb (hc_device_param_t *device_param, const uint num)
@@ -2508,11 +2510,11 @@ static void run_kernel_tb (hc_device_param_t *device_param, const uint num)
   const size_t global_work_size[3] = { num_elements, 1, 1 };
   const size_t local_work_size[3]  = { kernel_threads,  1, 1 };
 
-  hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+  hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
 
-  hc_clFlush (device_param->command_queue);
+  hc_clFlush (data.ocl, device_param->command_queue);
 
-  hc_clFinish (device_param->command_queue);
+  hc_clFinish (data.ocl, device_param->command_queue);
 }
 
 static void run_kernel_tm (hc_device_param_t *device_param)
@@ -2526,11 +2528,11 @@ static void run_kernel_tm (hc_device_param_t *device_param)
   const size_t global_work_size[3] = { num_elements, 1, 1 };
   const size_t local_work_size[3]  = { kernel_threads,  1, 1 };
 
-  hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+  hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
 
-  hc_clFlush (device_param->command_queue);
+  hc_clFlush (data.ocl, device_param->command_queue);
 
-  hc_clFinish (device_param->command_queue);
+  hc_clFinish (data.ocl, device_param->command_queue);
 }
 
 static void run_kernel_amp (hc_device_param_t *device_param, const uint num)
@@ -2549,17 +2551,17 @@ static void run_kernel_amp (hc_device_param_t *device_param, const uint num)
 
   cl_kernel kernel = device_param->kernel_amp;
 
-  hc_clSetKernelArg (kernel, 5, sizeof (cl_uint), device_param->kernel_params_amp[5]);
-  hc_clSetKernelArg (kernel, 6, sizeof (cl_uint), device_param->kernel_params_amp[6]);
+  hc_clSetKernelArg (data.ocl, kernel, 5, sizeof (cl_uint), device_param->kernel_params_amp[5]);
+  hc_clSetKernelArg (data.ocl, kernel, 6, sizeof (cl_uint), device_param->kernel_params_amp[6]);
 
   const size_t global_work_size[3] = { num_elements, 1, 1 };
   const size_t local_work_size[3]  = { kernel_threads,  1, 1 };
 
-  hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
+  hc_clEnqueueNDRangeKernel (data.ocl, device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
 
-  hc_clFlush (device_param->command_queue);
+  hc_clFlush (data.ocl, device_param->command_queue);
 
-  hc_clFinish (device_param->command_queue);
+  hc_clFinish (data.ocl, device_param->command_queue);
 }
 
 static void run_kernel_bzero (hc_device_param_t *device_param, cl_mem buf, const uint size)
@@ -2570,7 +2572,7 @@ static void run_kernel_bzero (hc_device_param_t *device_param, cl_mem buf, const
 
     const cl_uchar zero = 0;
 
-    hc_clEnqueueFillBuffer (device_param->command_queue, buf, &zero, sizeof (cl_uchar), 0, size, 0, NULL, NULL);
+    hc_clEnqueueFillBuffer (data.ocl, device_param->command_queue, buf, &zero, sizeof (cl_uchar), 0, size, 0, NULL, NULL);
   }
   else
   {
@@ -2589,7 +2591,7 @@ static void run_kernel_bzero (hc_device_param_t *device_param, cl_mem buf, const
 
       const int fillsz = MIN (FILLSZ, left);
 
-      hc_clEnqueueWriteBuffer (device_param->command_queue, buf, CL_TRUE, i, fillsz, tmp, 0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, buf, CL_TRUE, i, fillsz, tmp, 0, NULL, NULL);
     }
 
     myfree (tmp);
@@ -2614,11 +2616,11 @@ static void run_copy (hc_device_param_t *device_param, const uint pws_cnt)
 {
   if (data.attack_kern == ATTACK_KERN_STRAIGHT)
   {
-    hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL);
+    hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL);
   }
   else if (data.attack_kern == ATTACK_KERN_COMBI)
   {
-    hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL);
+    hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL);
   }
   else if (data.attack_kern == ATTACK_KERN_BF)
   {
@@ -2856,23 +2858,23 @@ static void run_cracker (hc_device_param_t *device_param, const uint pw_cnt, con
 
       if (data.attack_mode == ATTACK_MODE_STRAIGHT)
       {
-        hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_rules, device_param->d_rules_c, innerloop_pos * sizeof (kernel_rule_t), 0, innerloop_left * sizeof (kernel_rule_t), 0, NULL, NULL);
+        hc_clEnqueueCopyBuffer (data.ocl, device_param->command_queue, device_param->d_rules, device_param->d_rules_c, innerloop_pos * sizeof (kernel_rule_t), 0, innerloop_left * sizeof (kernel_rule_t), 0, NULL, NULL);
       }
       else if (data.attack_mode == ATTACK_MODE_COMBI)
       {
-        hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, innerloop_left * sizeof (comb_t), device_param->combs_buf, 0, NULL, NULL);
+        hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, innerloop_left * sizeof (comb_t), device_param->combs_buf, 0, NULL, NULL);
       }
       else if (data.attack_mode == ATTACK_MODE_BF)
       {
-        hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_bfs, device_param->d_bfs_c, 0, 0, innerloop_left * sizeof (bf_t), 0, NULL, NULL);
+        hc_clEnqueueCopyBuffer (data.ocl, device_param->command_queue, device_param->d_bfs, device_param->d_bfs_c, 0, 0, innerloop_left * sizeof (bf_t), 0, NULL, NULL);
       }
       else if (data.attack_mode == ATTACK_MODE_HYBRID1)
       {
-        hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL);
+        hc_clEnqueueCopyBuffer (data.ocl, device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL);
       }
       else if (data.attack_mode == ATTACK_MODE_HYBRID2)
       {
-        hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL);
+        hc_clEnqueueCopyBuffer (data.ocl, device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL);
       }
 
       if (data.attack_exec == ATTACK_EXEC_INSIDE_KERNEL)
@@ -2887,7 +2889,7 @@ static void run_cracker (hc_device_param_t *device_param, const uint pw_cnt, con
 
             run_kernel_tm (device_param);
 
-            hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_tm_c, device_param->d_bfs_c, 0, 0, size_tm, 0, NULL, NULL);
+            hc_clEnqueueCopyBuffer (data.ocl, device_param->command_queue, device_param->d_tm_c, device_param->d_bfs_c, 0, 0, size_tm, 0, NULL, NULL);
           }
         }
 
@@ -2939,11 +2941,11 @@ static void run_cracker (hc_device_param_t *device_param, const uint pw_cnt, con
         {
           run_kernel (KERN_RUN_23, device_param, pws_cnt);
 
-          hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL);
+          hc_clEnqueueReadBuffer (data.ocl, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL);
 
           // do something with data
 
-          hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL);
+          hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL);
         }
 
         run_kernel (KERN_RUN_3, device_param, pws_cnt);
@@ -3339,7 +3341,7 @@ static u64 count_words (wl_data_t *wl_data, FILE *fd, char *dictfile, dictstat_t
 
 static void pw_transpose_to_hi1 (const pw_t *p1, pw_t *p2)
 {
-  memcpy (p2->hi1, p1->hi1, 64 * sizeof (uint));
+  memcpy (p2->h.hi1, p1->h.hi1, 64 * sizeof (uint));
 }
 
 static uint pw_add_to_hc1 (hc_device_param_t *device_param, const u8 *pw_buf, const uint pw_len)
@@ -3350,7 +3352,7 @@ static uint pw_add_to_hc1 (hc_device_param_t *device_param, const u8 *pw_buf, co
 
   uint cache_cnt = pw_cache->cnt;
 
-  u8 *pw_hc1 = pw_cache->pw_buf.hc1[cache_cnt];
+  u8 *pw_hc1 = pw_cache->pw_buf.h.hc1[cache_cnt];
 
   memcpy (pw_hc1, pw_buf, pw_len);
 
@@ -5145,6 +5147,7 @@ int main (int argc, char **argv)
   #ifndef OSX
   char *cpu_affinity      = NULL;
   #endif
+  OCL_PTR *ocl            = NULL;
   char *opencl_devices    = NULL;
   char *opencl_platforms  = NULL;
   char *opencl_device_types = NULL;
@@ -6509,6 +6512,19 @@ int main (int argc, char **argv)
   logfile_top_string (session);
   logfile_top_string (truecrypt_keyfiles);
 
+  /**
+   * Init OpenCL library loader
+   */
+
+  if (keyspace == 0)
+  {
+    ocl = (OCL_PTR *) mymalloc (sizeof (OCL_PTR));
+
+    ocl_init(ocl);
+
+    data.ocl = ocl;
+  }
+
   /**
    * OpenCL platform selection
    */
@@ -11383,7 +11399,9 @@ int main (int argc, char **argv)
                        kernel_accel = 16;
                        break;
           case  6211:  kernel_loops = ROUNDS_TRUECRYPT_2K;
+                       #ifndef OSX
                        kernel_accel = 64;
+                       #endif
                        break;
           case  6212:  kernel_loops = ROUNDS_TRUECRYPT_2K;
                        kernel_accel = 32;
@@ -11410,7 +11428,9 @@ int main (int argc, char **argv)
                        kernel_accel = 8;
                        break;
           case  6241:  kernel_loops = ROUNDS_TRUECRYPT_1K;
+                       #ifndef OSX
                        kernel_accel = 128;
+                       #endif
                        break;
           case  6242:  kernel_loops = ROUNDS_TRUECRYPT_1K;
                        kernel_accel = 64;
@@ -11440,7 +11460,9 @@ int main (int argc, char **argv)
                        kernel_accel = 8;
                        break;
           case  7200:  kernel_loops = ROUNDS_GRUB;
+                       #ifndef OSX
                        kernel_accel = 16;
+                       #endif
                        break;
           case  7400:  kernel_loops = ROUNDS_SHA256CRYPT;
                        kernel_accel = 8;
@@ -12485,13 +12507,16 @@ int main (int argc, char **argv)
 
     cl_uint platform_devices_cnt;
 
-    hc_clGetPlatformIDs (CL_PLATFORMS_MAX, platforms, &platforms_cnt);
-
-    if (platforms_cnt == 0)
+    if (keyspace == 0)
     {
-      log_error ("ERROR: No OpenCL compatible platform found");
+      hc_clGetPlatformIDs (data.ocl, CL_PLATFORMS_MAX, platforms, &platforms_cnt);
 
-      return (-1);
+      if (platforms_cnt == 0)
+      {
+        log_error ("ERROR: No OpenCL compatible platform found");
+
+        return (-1);
+      }
     }
 
     /**
@@ -12504,7 +12529,7 @@ int main (int argc, char **argv)
 
       char platform_vendor[INFOSZ] = { 0 };
 
-      hc_clGetPlatformInfo (platform, CL_PLATFORM_VENDOR, sizeof (platform_vendor), platform_vendor, NULL);
+      hc_clGetPlatformInfo (data.ocl, platform, CL_PLATFORM_VENDOR, sizeof (platform_vendor), platform_vendor, NULL);
 
       #ifdef HAVE_HWMON
       #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
@@ -12538,7 +12563,7 @@ int main (int argc, char **argv)
 
       cl_platform_id platform = platforms[platform_id];
 
-      hc_clGetDeviceIDs (platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt);
+      hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt);
 
       for (uint platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++)
       {
@@ -12556,7 +12581,7 @@ int main (int argc, char **argv)
 
         cl_device_type device_type;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_TYPE, sizeof (device_type), &device_type, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_TYPE, sizeof (device_type), &device_type, NULL);
 
         device_type &= ~CL_DEVICE_TYPE_DEFAULT;
 
@@ -12566,7 +12591,7 @@ int main (int argc, char **argv)
 
         cl_uint vendor_id = 0;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_VENDOR_ID, sizeof (vendor_id), &vendor_id, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_VENDOR_ID, sizeof (vendor_id), &vendor_id, NULL);
 
         device_param->vendor_id = vendor_id;
 
@@ -12574,7 +12599,7 @@ int main (int argc, char **argv)
 
         char *device_name = (char *) mymalloc (INFOSZ);
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_NAME, INFOSZ, device_name, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_NAME, INFOSZ, device_name, NULL);
 
         device_param->device_name = device_name;
 
@@ -12582,7 +12607,7 @@ int main (int argc, char **argv)
 
         char *device_version = (char *) mymalloc (INFOSZ);
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_VERSION, INFOSZ, device_version, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_VERSION, INFOSZ, device_version, NULL);
 
         device_param->device_version = device_version;
 
@@ -12602,7 +12627,7 @@ int main (int argc, char **argv)
 
         if (opencl_vector_width == OPENCL_VECTOR_WIDTH)
         {
-          hc_clGetDeviceInfo (device_param->device, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, sizeof (vector_width), &vector_width, NULL);
+          hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, sizeof (vector_width), &vector_width, NULL);
 
           if ((vendor_id == VENDOR_ID_NV) && (strstr (device_name, " Ti") || strstr (device_name, " TI")))
           {
@@ -12629,7 +12654,7 @@ int main (int argc, char **argv)
 
         cl_uint device_processors;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (device_processors), &device_processors, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (device_processors), &device_processors, NULL);
 
         device_param->device_processors = device_processors;
 
@@ -12637,7 +12662,7 @@ int main (int argc, char **argv)
 
         cl_ulong device_maxmem_alloc;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (device_maxmem_alloc), &device_maxmem_alloc, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (device_maxmem_alloc), &device_maxmem_alloc, NULL);
 
         device_param->device_maxmem_alloc = device_maxmem_alloc;
 
@@ -12645,7 +12670,7 @@ int main (int argc, char **argv)
 
         cl_ulong device_global_mem;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (device_global_mem), &device_global_mem, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (device_global_mem), &device_global_mem, NULL);
 
         device_param->device_global_mem = device_global_mem;
 
@@ -12653,7 +12678,7 @@ int main (int argc, char **argv)
 
         cl_uint device_maxclock_frequency;
 
-        hc_clGetDeviceInfo (device_param->device, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (device_maxclock_frequency), &device_maxclock_frequency, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (device_maxclock_frequency), &device_maxclock_frequency, NULL);
 
         device_param->device_maxclock_frequency = device_maxclock_frequency;
 
@@ -12668,7 +12693,7 @@ int main (int argc, char **argv)
 
         char *driver_version = (char *) mymalloc (INFOSZ);
 
-        hc_clGetDeviceInfo (device_param->device, CL_DRIVER_VERSION, INFOSZ, driver_version, NULL);
+        hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DRIVER_VERSION, INFOSZ, driver_version, NULL);
 
         device_param->driver_version = driver_version;
 
@@ -12707,7 +12732,7 @@ int main (int argc, char **argv)
 
             #define CL_DEVICE_WAVEFRONT_WIDTH_AMD               0x4043
 
-            hc_clGetDeviceInfo (device_param->device, CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof (device_processor_cores), &device_processor_cores, NULL);
+            hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof (device_processor_cores), &device_processor_cores, NULL);
 
             device_param->device_processor_cores = device_processor_cores;
           }
@@ -12717,7 +12742,7 @@ int main (int argc, char **argv)
 
             #define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV            0x4005
 
-            hc_clGetDeviceInfo (device_param->device, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, sizeof (kernel_exec_timeout), &kernel_exec_timeout, NULL);
+            hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, sizeof (kernel_exec_timeout), &kernel_exec_timeout, NULL);
 
             device_param->kernel_exec_timeout = kernel_exec_timeout;
 
@@ -12725,7 +12750,7 @@ int main (int argc, char **argv)
 
             #define CL_DEVICE_WARP_SIZE_NV                      0x4003
 
-            hc_clGetDeviceInfo (device_param->device, CL_DEVICE_WARP_SIZE_NV, sizeof (device_processor_cores), &device_processor_cores, NULL);
+            hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_WARP_SIZE_NV, sizeof (device_processor_cores), &device_processor_cores, NULL);
 
             device_param->device_processor_cores = device_processor_cores;
 
@@ -12735,8 +12760,8 @@ int main (int argc, char **argv)
             #define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV       0x4000
             #define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV       0x4001
 
-            hc_clGetDeviceInfo (device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, sizeof (sm_minor), &sm_minor, NULL);
-            hc_clGetDeviceInfo (device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, sizeof (sm_major), &sm_major, NULL);
+            hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, sizeof (sm_minor), &sm_minor, NULL);
+            hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, sizeof (sm_major), &sm_major, NULL);
 
             device_param->sm_minor = sm_minor;
             device_param->sm_major = sm_major;
@@ -12858,7 +12883,7 @@ int main (int argc, char **argv)
       }
     }
 
-    if (devices_active == 0)
+    if (keyspace == 0 && devices_active == 0)
     {
       log_error ("ERROR: No devices found/left");
 
@@ -13190,6 +13215,37 @@ int main (int argc, char **argv)
     #endif // HAVE_ADK
     #endif // HAVE_HWMON
 
+    #ifdef OSX
+    /*
+     * List of OSX kernel to fix
+     */
+    if ((hash_mode == 6100)  || (hash_mode == 6900)  || (hash_mode == 11700) || (hash_mode == 11800) || (hash_mode == 5300)  || \
+        (hash_mode == 5400)  || (hash_mode == 5500)  || (hash_mode == 5600)  || (hash_mode == 7500)  || (hash_mode == 11100) || \
+        (hash_mode == 11400) || (hash_mode == 2611)  || (hash_mode == 2711)  || (hash_mode == 2811)  || (hash_mode == 8400)  || \
+        (hash_mode == 2612)  || (hash_mode == 3711)  || (hash_mode == 7600)  || (hash_mode == 3100)  || (hash_mode == 8000)  || \
+        (hash_mode == 12600) || (hash_mode == 3000)  || (hash_mode == 1500)  || (hash_mode == 12400) || (hash_mode == 8500)  || \
+        (hash_mode == 8600)  || (hash_mode == 8700)  || (hash_mode == 9100)  || (hash_mode == 11600) || (hash_mode == 12500) || \
+        (hash_mode == 6231)  || (hash_mode == 8800)  || (hash_mode == 9700)  || (hash_mode == 9710)  || (hash_mode == 9800)  || \
+        (hash_mode == 9810)  || (hash_mode == 9400)  || (hash_mode == 9500)  || (hash_mode == 9600)  || (hash_mode == 10400) || \
+        (hash_mode == 10410) || (hash_mode == 10700) || (hash_mode == 6800)  || (hash_mode == 6600)  || (hash_mode == 11300) || \
+        (hash_mode == 12700))
+    {
+      if (force == 0)
+      {
+        log_info ("");
+        log_info ("Warning: Hash mode %d is not stable in OSX.", hash_mode);
+        log_info ("You can use --force to override this but do not post error reports if you do so");
+        log_info ("");
+
+        continue;
+      }
+    }
+    #endif
+
+    #ifdef DEBUG
+    if (benchmark == 1) log_info ("Hashmode: %d", data.hash_mode);
+    #endif
+
     uint kernel_blocks_all = 0;
 
     for (uint device_id = 0; device_id < devices_cnt; device_id++)
@@ -13218,7 +13274,7 @@ int main (int argc, char **argv)
        * create context for each device
        */
 
-      device_param->context = hc_clCreateContext (NULL, 1, &device_param->device, NULL, NULL);
+      device_param->context = hc_clCreateContext (data.ocl, NULL, 1, &device_param->device, NULL, NULL);
 
       /**
        * create command-queue
@@ -13227,7 +13283,7 @@ int main (int argc, char **argv)
       // not supported with NV
       // device_param->command_queue = hc_clCreateCommandQueueWithProperties (device_param->context, device_param->device, NULL);
 
-      device_param->command_queue = hc_clCreateCommandQueue (device_param->context, device_param->device, 0);
+      device_param->command_queue = hc_clCreateCommandQueue (data.ocl, device_param->context, device_param->device, 0);
 
       /**
        * create input buffers on device
@@ -13531,17 +13587,17 @@ int main (int argc, char **argv)
 
             load_kernel (source_file, 1, kernel_lengths, kernel_sources);
 
-            device_param->program = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_sources, NULL);
+            device_param->program = hc_clCreateProgramWithSource (data.ocl, device_param->context, 1, (const char **) kernel_sources, NULL);
 
-            hc_clBuildProgram (device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
+            hc_clBuildProgram (data.ocl, device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
 
             size_t binary_size;
 
-            clGetProgramInfo (device_param->program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
+            hc_clGetProgramInfo (data.ocl, device_param->program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
 
             u8 *binary = (u8 *) mymalloc (binary_size);
 
-            clGetProgramInfo (device_param->program, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
+            hc_clGetProgramInfo (data.ocl, device_param->program, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
 
             writeProgramBin (cached_file, binary, binary_size);
 
@@ -13553,9 +13609,9 @@ int main (int argc, char **argv)
 
             load_kernel (cached_file, 1, kernel_lengths, kernel_sources);
 
-            device_param->program = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
+            device_param->program = hc_clCreateProgramWithBinary (data.ocl, device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
 
-            hc_clBuildProgram (device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
+            hc_clBuildProgram (data.ocl, device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
           }
         }
         else
@@ -13564,7 +13620,7 @@ int main (int argc, char **argv)
 
           load_kernel (source_file, 1, kernel_lengths, kernel_sources);
 
-          device_param->program = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_sources, NULL);
+          device_param->program = hc_clCreateProgramWithSource (data.ocl, device_param->context, 1, (const char **) kernel_sources, NULL);
 
           if (force_jit_compilation == 1500)
           {
@@ -13575,7 +13631,7 @@ int main (int argc, char **argv)
             snprintf (build_opts, sizeof (build_opts) - 1, "%s -DSCRYPT_N=%d -DSCRYPT_R=%d -DSCRYPT_P=%d -DSCRYPT_TMTO=%d", build_opts, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, 1 << data.salts_buf[0].scrypt_tmto);
           }
 
-          hc_clBuildProgram (device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
+          hc_clBuildProgram (data.ocl, device_param->program, 1, &device_param->device, build_opts, NULL, NULL);
         }
 
         local_free (kernel_lengths);
@@ -13586,13 +13642,13 @@ int main (int argc, char **argv)
 
         size_t ret_val_size = 0;
 
-        clGetProgramBuildInfo (device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
+        hc_clGetProgramBuildInfo (data.ocl, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
 
         if (ret_val_size > 2)
         {
           char *build_log = (char *) mymalloc (ret_val_size + 1);
 
-          clGetProgramBuildInfo (device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
+          hc_clGetProgramBuildInfo (data.ocl, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
 
           puts (build_log);
 
@@ -13654,17 +13710,17 @@ int main (int argc, char **argv)
 
           load_kernel (source_file, 1, kernel_lengths, kernel_sources);
 
-          device_param->program_mp = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_sources, NULL);
+          device_param->program_mp = hc_clCreateProgramWithSource (data.ocl, device_param->context, 1, (const char **) kernel_sources, NULL);
 
-          hc_clBuildProgram (device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL);
+          hc_clBuildProgram (data.ocl, device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL);
 
           size_t binary_size;
 
-          clGetProgramInfo (device_param->program_mp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
+          hc_clGetProgramInfo (data.ocl, device_param->program_mp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
 
           u8 *binary = (u8 *) mymalloc (binary_size);
 
-          clGetProgramInfo (device_param->program_mp, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
+          hc_clGetProgramInfo (data.ocl, device_param->program_mp, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
 
           writeProgramBin (cached_file, binary, binary_size);
 
@@ -13676,9 +13732,9 @@ int main (int argc, char **argv)
 
           load_kernel (cached_file, 1, kernel_lengths, kernel_sources);
 
-          device_param->program_mp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
+          device_param->program_mp = hc_clCreateProgramWithBinary (data.ocl, device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
 
-          hc_clBuildProgram (device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL);
+          hc_clBuildProgram (data.ocl, device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL);
         }
 
         local_free (kernel_lengths);
@@ -13689,13 +13745,13 @@ int main (int argc, char **argv)
 
         size_t ret_val_size = 0;
 
-        clGetProgramBuildInfo (device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
+        hc_clGetProgramBuildInfo (data.ocl, device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
 
         if (ret_val_size > 2)
         {
           char *build_log = (char *) mymalloc (ret_val_size + 1);
 
-          clGetProgramBuildInfo (device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
+          hc_clGetProgramBuildInfo (data.ocl, device_param->program_mp, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
 
           puts (build_log);
 
@@ -13761,17 +13817,17 @@ int main (int argc, char **argv)
 
           load_kernel (source_file, 1, kernel_lengths, kernel_sources);
 
-          device_param->program_amp = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_sources, NULL);
+          device_param->program_amp = hc_clCreateProgramWithSource (data.ocl, device_param->context, 1, (const char **) kernel_sources, NULL);
 
-          hc_clBuildProgram (device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL);
+          hc_clBuildProgram (data.ocl, device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL);
 
           size_t binary_size;
 
-          clGetProgramInfo (device_param->program_amp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
+          hc_clGetProgramInfo (data.ocl, device_param->program_amp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
 
           u8 *binary = (u8 *) mymalloc (binary_size);
 
-          clGetProgramInfo (device_param->program_amp, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
+          hc_clGetProgramInfo (data.ocl, device_param->program_amp, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL);
 
           writeProgramBin (cached_file, binary, binary_size);
 
@@ -13783,9 +13839,9 @@ int main (int argc, char **argv)
 
           load_kernel (cached_file, 1, kernel_lengths, kernel_sources);
 
-          device_param->program_amp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
+          device_param->program_amp = hc_clCreateProgramWithBinary (data.ocl, device_param->context, 1, &device_param->device, kernel_lengths, (const u8 **) kernel_sources, NULL);
 
-          hc_clBuildProgram (device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL);
+          hc_clBuildProgram (data.ocl, device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL);
         }
 
         local_free (kernel_lengths);
@@ -13796,13 +13852,13 @@ int main (int argc, char **argv)
 
         size_t ret_val_size = 0;
 
-        clGetProgramBuildInfo (device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
+        hc_clGetProgramBuildInfo (data.ocl, device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
 
         if (ret_val_size > 2)
         {
           char *build_log = (char *) mymalloc (ret_val_size + 1);
 
-          clGetProgramBuildInfo (device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
+          hc_clGetProgramBuildInfo (data.ocl, device_param->program_amp, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
 
           puts (build_log);
 
@@ -13814,36 +13870,36 @@ int main (int argc, char **argv)
        * global buffers
        */
 
-      device_param->d_pws_buf       = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   size_pws,     NULL);
-      device_param->d_pws_amp_buf   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   size_pws,     NULL);
-      device_param->d_tmps          = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_tmps,    NULL);
-      device_param->d_hooks         = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_hooks,   NULL);
-      device_param->d_bitmap_s1_a   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s1_b   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s1_c   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s1_d   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s2_a   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s2_b   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s2_c   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_bitmap_s2_d   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
-      device_param->d_plain_bufs    = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_plains,  NULL);
-      device_param->d_digests_buf   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   size_digests, NULL);
-      device_param->d_digests_shown = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_shown,   NULL);
-      device_param->d_salt_bufs     = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY,   size_salts,   NULL);
-      device_param->d_result        = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_results, NULL);
-      device_param->d_scryptV_buf   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE,  size_scryptV, NULL);
-
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_a,    CL_TRUE, 0, bitmap_size,  bitmap_s1_a,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_b,    CL_TRUE, 0, bitmap_size,  bitmap_s1_b,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_c,    CL_TRUE, 0, bitmap_size,  bitmap_s1_c,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_d,    CL_TRUE, 0, bitmap_size,  bitmap_s1_d,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_a,    CL_TRUE, 0, bitmap_size,  bitmap_s2_a,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_b,    CL_TRUE, 0, bitmap_size,  bitmap_s2_b,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_c,    CL_TRUE, 0, bitmap_size,  bitmap_s2_c,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_d,    CL_TRUE, 0, bitmap_size,  bitmap_s2_d,        0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_buf,    CL_TRUE, 0, size_digests, data.digests_buf,   0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_shown,  CL_TRUE, 0, size_shown,   data.digests_shown, 0, NULL, NULL);
-      hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_salt_bufs,      CL_TRUE, 0, size_salts,   data.salts_buf,     0, NULL, NULL);
+      device_param->d_pws_buf       = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   size_pws,     NULL);
+      device_param->d_pws_amp_buf   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   size_pws,     NULL);
+      device_param->d_tmps          = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_tmps,    NULL);
+      device_param->d_hooks         = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_hooks,   NULL);
+      device_param->d_bitmap_s1_a   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s1_b   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s1_c   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s1_d   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s2_a   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s2_b   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s2_c   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_bitmap_s2_d   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   bitmap_size,  NULL);
+      device_param->d_plain_bufs    = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_plains,  NULL);
+      device_param->d_digests_buf   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   size_digests, NULL);
+      device_param->d_digests_shown = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_shown,   NULL);
+      device_param->d_salt_bufs     = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY,   size_salts,   NULL);
+      device_param->d_result        = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_results, NULL);
+      device_param->d_scryptV_buf   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_WRITE,  size_scryptV, NULL);
+
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s1_a,    CL_TRUE, 0, bitmap_size,  bitmap_s1_a,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s1_b,    CL_TRUE, 0, bitmap_size,  bitmap_s1_b,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s1_c,    CL_TRUE, 0, bitmap_size,  bitmap_s1_c,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s1_d,    CL_TRUE, 0, bitmap_size,  bitmap_s1_d,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s2_a,    CL_TRUE, 0, bitmap_size,  bitmap_s2_a,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s2_b,    CL_TRUE, 0, bitmap_size,  bitmap_s2_b,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s2_c,    CL_TRUE, 0, bitmap_size,  bitmap_s2_c,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_bitmap_s2_d,    CL_TRUE, 0, bitmap_size,  bitmap_s2_d,        0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_digests_buf,    CL_TRUE, 0, size_digests, data.digests_buf,   0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_digests_shown,  CL_TRUE, 0, size_shown,   data.digests_shown, 0, NULL, NULL);
+      hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_salt_bufs,      CL_TRUE, 0, size_salts,   data.salts_buf,     0, NULL, NULL);
 
       run_kernel_bzero (device_param, device_param->d_pws_buf,        size_pws);
       run_kernel_bzero (device_param, device_param->d_pws_amp_buf,    size_pws);
@@ -13858,19 +13914,19 @@ int main (int argc, char **argv)
 
       if (attack_kern == ATTACK_KERN_STRAIGHT)
       {
-        device_param->d_rules   = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_rules,   NULL);
-        device_param->d_rules_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_rules_c, NULL);
+        device_param->d_rules   = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_rules,   NULL);
+        device_param->d_rules_c = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_rules_c, NULL);
 
-        hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_rules, CL_TRUE, 0, size_rules, kernel_rules_buf, 0, NULL, NULL);
+        hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_rules, CL_TRUE, 0, size_rules, kernel_rules_buf, 0, NULL, NULL);
 
         run_kernel_bzero (device_param, device_param->d_rules_c, size_rules_c);
       }
       else if (attack_kern == ATTACK_KERN_COMBI)
       {
-        device_param->d_combs           = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_combs,      NULL);
-        device_param->d_combs_c         = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_combs,      NULL);
-        device_param->d_root_css_buf    = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_root_css,   NULL);
-        device_param->d_markov_css_buf  = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL);
+        device_param->d_combs           = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_combs,      NULL);
+        device_param->d_combs_c         = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_combs,      NULL);
+        device_param->d_root_css_buf    = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_root_css,   NULL);
+        device_param->d_markov_css_buf  = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL);
 
         run_kernel_bzero (device_param, device_param->d_combs,          size_combs);
         run_kernel_bzero (device_param, device_param->d_combs_c,        size_combs);
@@ -13879,11 +13935,11 @@ int main (int argc, char **argv)
       }
       else if (attack_kern == ATTACK_KERN_BF)
       {
-        device_param->d_bfs             = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_bfs,        NULL);
-        device_param->d_bfs_c           = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_bfs,        NULL);
-        device_param->d_tm_c            = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_tm,         NULL);
-        device_param->d_root_css_buf    = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_root_css,   NULL);
-        device_param->d_markov_css_buf  = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL);
+        device_param->d_bfs             = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_bfs,        NULL);
+        device_param->d_bfs_c           = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_bfs,        NULL);
+        device_param->d_tm_c            = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_tm,         NULL);
+        device_param->d_root_css_buf    = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_root_css,   NULL);
+        device_param->d_markov_css_buf  = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL);
 
         run_kernel_bzero (device_param, device_param->d_bfs,            size_bfs);
         run_kernel_bzero (device_param, device_param->d_bfs_c,          size_bfs);
@@ -13894,9 +13950,9 @@ int main (int argc, char **argv)
 
       if (size_esalts)
       {
-        device_param->d_esalt_bufs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_esalts, NULL);
+        device_param->d_esalt_bufs = hc_clCreateBuffer (data.ocl, device_param->context, CL_MEM_READ_ONLY, size_esalts, NULL);
 
-        hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_esalt_bufs, CL_TRUE, 0, size_esalts, data.esalts_buf, 0, NULL, NULL);
+        hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_esalt_bufs, CL_TRUE, 0, size_esalts, data.esalts_buf, 0, NULL, NULL);
       }
 
       /**
@@ -14064,29 +14120,29 @@ int main (int argc, char **argv)
         {
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 4);
 
-          device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel1 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 8);
 
-          device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel2 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 16);
 
-          device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel3 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
         }
         else
         {
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 4);
 
-          device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel1 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 8);
 
-          device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel2 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 16);
 
-          device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel3 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
         }
 
         if (data.attack_mode == ATTACK_MODE_BF)
@@ -14095,11 +14151,11 @@ int main (int argc, char **argv)
           {
             snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_tb", kern_type);
 
-            device_param->kernel_tb = hc_clCreateKernel (device_param->program, kernel_name);
+            device_param->kernel_tb = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
             snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_tm", kern_type);
 
-            device_param->kernel_tm = hc_clCreateKernel (device_param->program, kernel_name);
+            device_param->kernel_tm = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
           }
         }
       }
@@ -14107,71 +14163,71 @@ int main (int argc, char **argv)
       {
         snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_init", kern_type);
 
-        device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name);
+        device_param->kernel1 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
         snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_loop", kern_type);
 
-        device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name);
+        device_param->kernel2 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
         snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_comp", kern_type);
 
-        device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name);
+        device_param->kernel3 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
 
         if (opts_type & OPTS_TYPE_HOOK12)
         {
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_hook12", kern_type);
 
-          device_param->kernel12 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel12 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
         }
 
         if (opts_type & OPTS_TYPE_HOOK23)
         {
           snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_hook23", kern_type);
 
-          device_param->kernel23 = hc_clCreateKernel (device_param->program, kernel_name);
+          device_param->kernel23 = hc_clCreateKernel (data.ocl, device_param->program, kernel_name);
         }
       }
 
       for (uint i = 0; i <= 20; i++)
       {
-        hc_clSetKernelArg (device_param->kernel1, i, sizeof (cl_mem), device_param->kernel_params[i]);
-        hc_clSetKernelArg (device_param->kernel2, i, sizeof (cl_mem), device_param->kernel_params[i]);
-        hc_clSetKernelArg (device_param->kernel3, i, sizeof (cl_mem), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel1, i, sizeof (cl_mem), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel2, i, sizeof (cl_mem), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel3, i, sizeof (cl_mem), device_param->kernel_params[i]);
 
-        if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (device_param->kernel12, i, sizeof (cl_mem), device_param->kernel_params[i]);
-        if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (device_param->kernel23, i, sizeof (cl_mem), device_param->kernel_params[i]);
+        if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (data.ocl, device_param->kernel12, i, sizeof (cl_mem), device_param->kernel_params[i]);
+        if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (data.ocl, device_param->kernel23, i, sizeof (cl_mem), device_param->kernel_params[i]);
       }
 
       for (uint i = 21; i <= 31; i++)
       {
-        hc_clSetKernelArg (device_param->kernel1, i, sizeof (cl_uint), device_param->kernel_params[i]);
-        hc_clSetKernelArg (device_param->kernel2, i, sizeof (cl_uint), device_param->kernel_params[i]);
-        hc_clSetKernelArg (device_param->kernel3, i, sizeof (cl_uint), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel1, i, sizeof (cl_uint), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel2, i, sizeof (cl_uint), device_param->kernel_params[i]);
+        hc_clSetKernelArg (data.ocl, device_param->kernel3, i, sizeof (cl_uint), device_param->kernel_params[i]);
 
-        if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (device_param->kernel12, i, sizeof (cl_uint), device_param->kernel_params[i]);
-        if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (device_param->kernel23, i, sizeof (cl_uint), device_param->kernel_params[i]);
+        if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (data.ocl, device_param->kernel12, i, sizeof (cl_uint), device_param->kernel_params[i]);
+        if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (data.ocl, device_param->kernel23, i, sizeof (cl_uint), device_param->kernel_params[i]);
       }
 
       if (attack_mode == ATTACK_MODE_BF)
       {
-        device_param->kernel_mp_l = hc_clCreateKernel (device_param->program_mp, "l_markov");
-        device_param->kernel_mp_r = hc_clCreateKernel (device_param->program_mp, "r_markov");
+        device_param->kernel_mp_l = hc_clCreateKernel (data.ocl, device_param->program_mp, "l_markov");
+        device_param->kernel_mp_r = hc_clCreateKernel (data.ocl, device_param->program_mp, "r_markov");
 
         if (opts_type & OPTS_TYPE_PT_BITSLICE)
         {
-          hc_clSetKernelArg (device_param->kernel_tb, 0, sizeof (cl_mem), device_param->kernel_params_tb[0]);
+          hc_clSetKernelArg (data.ocl, device_param->kernel_tb, 0, sizeof (cl_mem), device_param->kernel_params_tb[0]);
 
-          hc_clSetKernelArg (device_param->kernel_tm, 0, sizeof (cl_mem), device_param->kernel_params_tm[0]);
-          hc_clSetKernelArg (device_param->kernel_tm, 1, sizeof (cl_mem), device_param->kernel_params_tm[1]);
+          hc_clSetKernelArg (data.ocl, device_param->kernel_tm, 0, sizeof (cl_mem), device_param->kernel_params_tm[0]);
+          hc_clSetKernelArg (data.ocl, device_param->kernel_tm, 1, sizeof (cl_mem), device_param->kernel_params_tm[1]);
         }
       }
       else if (attack_mode == ATTACK_MODE_HYBRID1)
       {
-        device_param->kernel_mp = hc_clCreateKernel (device_param->program_mp, "C_markov");
+        device_param->kernel_mp = hc_clCreateKernel (data.ocl, device_param->program_mp, "C_markov");
       }
       else if (attack_mode == ATTACK_MODE_HYBRID2)
       {
-        device_param->kernel_mp = hc_clCreateKernel (device_param->program_mp, "C_markov");
+        device_param->kernel_mp = hc_clCreateKernel (data.ocl, device_param->program_mp, "C_markov");
       }
 
       if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL)
@@ -14180,7 +14236,7 @@ int main (int argc, char **argv)
       }
       else
       {
-        device_param->kernel_amp = hc_clCreateKernel (device_param->program_amp, "amp");
+        device_param->kernel_amp = hc_clCreateKernel (data.ocl, device_param->program_amp, "amp");
       }
 
       if (attack_exec == ATTACK_EXEC_INSIDE_KERNEL)
@@ -14191,12 +14247,12 @@ int main (int argc, char **argv)
       {
         for (uint i = 0; i < 5; i++)
         {
-          hc_clSetKernelArg (device_param->kernel_amp, i, sizeof (cl_mem), device_param->kernel_params_amp[i]);
+          hc_clSetKernelArg (data.ocl, device_param->kernel_amp, i, sizeof (cl_mem), device_param->kernel_params_amp[i]);
         }
 
         for (uint i = 5; i < 7; i++)
         {
-          hc_clSetKernelArg (device_param->kernel_amp, i, sizeof (cl_uint), device_param->kernel_params_amp[i]);
+          hc_clSetKernelArg (data.ocl, device_param->kernel_amp, i, sizeof (cl_uint), device_param->kernel_params_amp[i]);
         }
       }
 
@@ -15486,12 +15542,12 @@ int main (int argc, char **argv)
               device_param->kernel_params_mp_buf32[7] = 0;
             }
 
-            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp[i]);
-            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp[i]);
-            for (uint i = 4; i < 8; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp[i]);
+            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp[i]);
+            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp[i]);
+            for (uint i = 4; i < 8; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp[i]);
 
-            hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_root_css_buf,   CL_TRUE, 0, device_param->size_root_css,   root_css_buf,   0, NULL, NULL);
-            hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL);
+            hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_root_css_buf,   CL_TRUE, 0, device_param->size_root_css,   root_css_buf,   0, NULL, NULL);
+            hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL);
           }
         }
         else if (attack_mode == ATTACK_MODE_BF)
@@ -15621,9 +15677,9 @@ int main (int argc, char **argv)
 
           // some more resets:
 
-          memset (device_param->pw_caches, 0, 64 * sizeof (pw_cache_t));
+          if (device_param->pw_caches) memset (device_param->pw_caches, 0, 64 * sizeof (pw_cache_t));
 
-          memset (device_param->pws_buf, 0, device_param->size_pws);
+          if (device_param->pws_buf) memset (device_param->pws_buf, 0, device_param->size_pws);
 
           device_param->pw_cnt  = 0;
           device_param->pws_cnt = 0;
@@ -15997,16 +16053,16 @@ int main (int argc, char **argv)
             device_param->kernel_params_mp_r_buf32[6] = 0;
             device_param->kernel_params_mp_r_buf32[7] = 0;
 
-            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp_l[i]);
-            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_l[i]);
-            for (uint i = 4; i < 9; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp_l[i]);
+            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_l, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp_l[i]);
+            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_l, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_l[i]);
+            for (uint i = 4; i < 9; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_l, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp_l[i]);
 
-            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp_r[i]);
-            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_r[i]);
-            for (uint i = 4; i < 8; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp_r[i]);
+            for (uint i = 0; i < 3; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_r, i, sizeof (cl_mem),   (void *) device_param->kernel_params_mp_r[i]);
+            for (uint i = 3; i < 4; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_r, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_r[i]);
+            for (uint i = 4; i < 8; i++) hc_clSetKernelArg (data.ocl, device_param->kernel_mp_r, i, sizeof (cl_uint),  (void *) device_param->kernel_params_mp_r[i]);
 
-            hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_root_css_buf,   CL_TRUE, 0, device_param->size_root_css,   root_css_buf,   0, NULL, NULL);
-            hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL);
+            hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_root_css_buf,   CL_TRUE, 0, device_param->size_root_css,   root_css_buf,   0, NULL, NULL);
+            hc_clEnqueueWriteBuffer (data.ocl, device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL);
           }
         }
 
@@ -16428,53 +16484,53 @@ int main (int argc, char **argv)
       local_free (device_param->driver_version);
 
       if (device_param->pws_buf)            myfree                    (device_param->pws_buf);
-      if (device_param->d_pws_buf)          hc_clReleaseMemObject     (device_param->d_pws_buf);
-      if (device_param->d_pws_amp_buf)      hc_clReleaseMemObject     (device_param->d_pws_amp_buf);
-      if (device_param->d_rules)            hc_clReleaseMemObject     (device_param->d_rules);
-      if (device_param->d_rules_c)          hc_clReleaseMemObject     (device_param->d_rules_c);
-      if (device_param->d_combs)            hc_clReleaseMemObject     (device_param->d_combs);
-      if (device_param->d_combs_c)          hc_clReleaseMemObject     (device_param->d_combs_c);
-      if (device_param->d_bfs)              hc_clReleaseMemObject     (device_param->d_bfs);
-      if (device_param->d_bfs_c)            hc_clReleaseMemObject     (device_param->d_bfs_c);
-      if (device_param->d_bitmap_s1_a)      hc_clReleaseMemObject     (device_param->d_bitmap_s1_a);
-      if (device_param->d_bitmap_s1_b)      hc_clReleaseMemObject     (device_param->d_bitmap_s1_b);
-      if (device_param->d_bitmap_s1_c)      hc_clReleaseMemObject     (device_param->d_bitmap_s1_c);
-      if (device_param->d_bitmap_s1_d)      hc_clReleaseMemObject     (device_param->d_bitmap_s1_d);
-      if (device_param->d_bitmap_s2_a)      hc_clReleaseMemObject     (device_param->d_bitmap_s2_a);
-      if (device_param->d_bitmap_s2_b)      hc_clReleaseMemObject     (device_param->d_bitmap_s2_b);
-      if (device_param->d_bitmap_s2_c)      hc_clReleaseMemObject     (device_param->d_bitmap_s2_c);
-      if (device_param->d_bitmap_s2_d)      hc_clReleaseMemObject     (device_param->d_bitmap_s2_d);
-      if (device_param->d_plain_bufs)       hc_clReleaseMemObject     (device_param->d_plain_bufs);
-      if (device_param->d_digests_buf)      hc_clReleaseMemObject     (device_param->d_digests_buf);
-      if (device_param->d_digests_shown)    hc_clReleaseMemObject     (device_param->d_digests_shown);
-      if (device_param->d_salt_bufs)        hc_clReleaseMemObject     (device_param->d_salt_bufs);
-      if (device_param->d_esalt_bufs)       hc_clReleaseMemObject     (device_param->d_esalt_bufs);
-      if (device_param->d_tmps)             hc_clReleaseMemObject     (device_param->d_tmps);
-      if (device_param->d_hooks)            hc_clReleaseMemObject     (device_param->d_hooks);
-      if (device_param->d_result)           hc_clReleaseMemObject     (device_param->d_result);
-      if (device_param->d_scryptV_buf)      hc_clReleaseMemObject     (device_param->d_scryptV_buf);
-      if (device_param->d_root_css_buf)     hc_clReleaseMemObject     (device_param->d_root_css_buf);
-      if (device_param->d_markov_css_buf)   hc_clReleaseMemObject     (device_param->d_markov_css_buf);
-      if (device_param->d_tm_c)             hc_clReleaseMemObject     (device_param->d_tm_c);
-
-      if (device_param->kernel1)            hc_clReleaseKernel        (device_param->kernel1);
-      if (device_param->kernel12)           hc_clReleaseKernel        (device_param->kernel12);
-      if (device_param->kernel2)            hc_clReleaseKernel        (device_param->kernel2);
-      if (device_param->kernel23)           hc_clReleaseKernel        (device_param->kernel23);
-      if (device_param->kernel3)            hc_clReleaseKernel        (device_param->kernel3);
-      if (device_param->kernel_mp)          hc_clReleaseKernel        (device_param->kernel_mp);
-      if (device_param->kernel_mp_l)        hc_clReleaseKernel        (device_param->kernel_mp_l);
-      if (device_param->kernel_mp_r)        hc_clReleaseKernel        (device_param->kernel_mp_r);
-      if (device_param->kernel_tb)          hc_clReleaseKernel        (device_param->kernel_tb);
-      if (device_param->kernel_tm)          hc_clReleaseKernel        (device_param->kernel_tm);
-      if (device_param->kernel_amp)         hc_clReleaseKernel        (device_param->kernel_amp);
-
-      if (device_param->program)            hc_clReleaseProgram       (device_param->program);
-      if (device_param->program_mp)         hc_clReleaseProgram       (device_param->program_mp);
-      if (device_param->program_amp)        hc_clReleaseProgram       (device_param->program_amp);
-
-      if (device_param->command_queue)      hc_clReleaseCommandQueue  (device_param->command_queue);
-      if (device_param->context)            hc_clReleaseContext       (device_param->context);
+      if (device_param->d_pws_buf)          hc_clReleaseMemObject     (data.ocl, device_param->d_pws_buf);
+      if (device_param->d_pws_amp_buf)      hc_clReleaseMemObject     (data.ocl, device_param->d_pws_amp_buf);
+      if (device_param->d_rules)            hc_clReleaseMemObject     (data.ocl, device_param->d_rules);
+      if (device_param->d_rules_c)          hc_clReleaseMemObject     (data.ocl, device_param->d_rules_c);
+      if (device_param->d_combs)            hc_clReleaseMemObject     (data.ocl, device_param->d_combs);
+      if (device_param->d_combs_c)          hc_clReleaseMemObject     (data.ocl, device_param->d_combs_c);
+      if (device_param->d_bfs)              hc_clReleaseMemObject     (data.ocl, device_param->d_bfs);
+      if (device_param->d_bfs_c)            hc_clReleaseMemObject     (data.ocl, device_param->d_bfs_c);
+      if (device_param->d_bitmap_s1_a)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s1_a);
+      if (device_param->d_bitmap_s1_b)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s1_b);
+      if (device_param->d_bitmap_s1_c)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s1_c);
+      if (device_param->d_bitmap_s1_d)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s1_d);
+      if (device_param->d_bitmap_s2_a)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s2_a);
+      if (device_param->d_bitmap_s2_b)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s2_b);
+      if (device_param->d_bitmap_s2_c)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s2_c);
+      if (device_param->d_bitmap_s2_d)      hc_clReleaseMemObject     (data.ocl, device_param->d_bitmap_s2_d);
+      if (device_param->d_plain_bufs)       hc_clReleaseMemObject     (data.ocl, device_param->d_plain_bufs);
+      if (device_param->d_digests_buf)      hc_clReleaseMemObject     (data.ocl, device_param->d_digests_buf);
+      if (device_param->d_digests_shown)    hc_clReleaseMemObject     (data.ocl, device_param->d_digests_shown);
+      if (device_param->d_salt_bufs)        hc_clReleaseMemObject     (data.ocl, device_param->d_salt_bufs);
+      if (device_param->d_esalt_bufs)       hc_clReleaseMemObject     (data.ocl, device_param->d_esalt_bufs);
+      if (device_param->d_tmps)             hc_clReleaseMemObject     (data.ocl, device_param->d_tmps);
+      if (device_param->d_hooks)            hc_clReleaseMemObject     (data.ocl, device_param->d_hooks);
+      if (device_param->d_result)           hc_clReleaseMemObject     (data.ocl, device_param->d_result);
+      if (device_param->d_scryptV_buf)      hc_clReleaseMemObject     (data.ocl, device_param->d_scryptV_buf);
+      if (device_param->d_root_css_buf)     hc_clReleaseMemObject     (data.ocl, device_param->d_root_css_buf);
+      if (device_param->d_markov_css_buf)   hc_clReleaseMemObject     (data.ocl, device_param->d_markov_css_buf);
+      if (device_param->d_tm_c)             hc_clReleaseMemObject     (data.ocl, device_param->d_tm_c);
+
+      if (device_param->kernel1)            hc_clReleaseKernel        (data.ocl, device_param->kernel1);
+      if (device_param->kernel12)           hc_clReleaseKernel        (data.ocl, device_param->kernel12);
+      if (device_param->kernel2)            hc_clReleaseKernel        (data.ocl, device_param->kernel2);
+      if (device_param->kernel23)           hc_clReleaseKernel        (data.ocl, device_param->kernel23);
+      if (device_param->kernel3)            hc_clReleaseKernel        (data.ocl, device_param->kernel3);
+      if (device_param->kernel_mp)          hc_clReleaseKernel        (data.ocl, device_param->kernel_mp);
+      if (device_param->kernel_mp_l)        hc_clReleaseKernel        (data.ocl, device_param->kernel_mp_l);
+      if (device_param->kernel_mp_r)        hc_clReleaseKernel        (data.ocl, device_param->kernel_mp_r);
+      if (device_param->kernel_tb)          hc_clReleaseKernel        (data.ocl, device_param->kernel_tb);
+      if (device_param->kernel_tm)          hc_clReleaseKernel        (data.ocl, device_param->kernel_tm);
+      if (device_param->kernel_amp)         hc_clReleaseKernel        (data.ocl, device_param->kernel_amp);
+
+      if (device_param->program)            hc_clReleaseProgram       (data.ocl, device_param->program);
+      if (device_param->program_mp)         hc_clReleaseProgram       (data.ocl, device_param->program_mp);
+      if (device_param->program_amp)        hc_clReleaseProgram       (data.ocl, device_param->program_amp);
+
+      if (device_param->command_queue)      hc_clReleaseCommandQueue  (data.ocl, device_param->command_queue);
+      if (device_param->context)            hc_clReleaseContext       (data.ocl, device_param->context);
     }
 
     // reset default fan speed
@@ -16755,6 +16811,8 @@ int main (int argc, char **argv)
   if (quiet == 0) log_info_nn ("Started: %s", ctime (&proc_start));
   if (quiet == 0) log_info_nn ("Stopped: %s", ctime (&proc_stop));
 
+  if (data.ocl) ocl_close (data.ocl);
+
   if (data.devices_status == STATUS_ABORTED)            return 2;
   if (data.devices_status == STATUS_QUIT)               return 2;
   if (data.devices_status == STATUS_STOP_AT_CHECKPOINT) return 2;
index 862cba5..3cc869c 100644 (file)
@@ -1663,6 +1663,7 @@ static u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32 buf0[4], u32
   return in_len;
 }
 
+/*
 static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
 {
   // TODO
@@ -1674,6 +1675,7 @@ static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4
   // TODO
   return in_len;
 }
+*/
 
 static u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
 {
index a259c79..111f547 100644 (file)
@@ -8628,9 +8628,9 @@ void myquit ()
 
 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
 {
-  FILE *fp;
+  FILE *fp = fopen (kernel_file, "rb");
 
-  if ((fp = fopen (kernel_file, "rb")) != NULL)
+  if (fp != NULL)
   {
     struct stat st;