Improve Lotus Notes/Domino 6 performance
[hashcat.git] / OpenCL / m08600_a3.cl
index bd30653..6864349 100644 (file)
 
 #define NEW_SIMD_CODE
 
-#include "include/constants.h"
-#include "include/kernel_vendor.h"
+#include "inc_hash_constants.h"
+#include "inc_vendor.cl"
 
 #define DGST_R0 0
 #define DGST_R1 1
 #define DGST_R2 2
 #define DGST_R3 3
 
-#include "include/kernel_functions.c"
-#include "OpenCL/types_ocl.c"
-#include "OpenCL/common.c"
-#include "OpenCL/simd.c"
+#include "inc_hash_functions.cl"
+#include "inc_types.cl"
+#include "inc_common.cl"
+#include "inc_simd.cl"
 
 __constant u32 lotus_magic_table[256] =
 {
@@ -79,7 +79,6 @@ void lotus_mix (u32x *in, __local u32 *s_lotus_magic_table)
   {
     u32 s = 48;
 
-    #pragma unroll 12
     for (int j = 0; j < 12; j++)
     {
       u32x tmp_in = in[j];
@@ -101,7 +100,9 @@ void lotus_transform_password (u32x in[4], u32x out[4], __local u32 *s_lotus_mag
 
   u32x c;
 
-  #pragma unroll 4
+  #ifdef _unroll
+  #pragma unroll
+  #endif
   for (int i = 0; i < 4; i++)
   {
     t ^= (in[i] >>  0) & 0xff; c = BOX1 (s_lotus_magic_table, t); out[i] ^= c <<  0; t = ((out[i] >>  0) & 0xff);
@@ -222,7 +223,7 @@ void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 *s
   lotus_transform_password (block, checksum, s_lotus_magic_table);
 }
 
-void domino_big_md (const u32x saved_key[16], const u32x size, u32x state[4], __local u32 *s_lotus_magic_table)
+void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 *s_lotus_magic_table)
 {
   u32x checksum[4];
 
@@ -233,10 +234,28 @@ void domino_big_md (const u32x saved_key[16], const u32x size, u32x state[4], __
 
   u32x block[4];
 
-  block[0] = saved_key[0];
-  block[1] = saved_key[1];
-  block[2] = saved_key[2];
-  block[3] = saved_key[3];
+  block[0] = 0;
+  block[1] = 0;
+  block[2] = 0;
+  block[3] = 0;
+
+  u32 curpos;
+  u32 idx;
+
+  for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4)
+  {
+    block[0] = saved_key[idx + 0];
+    block[1] = saved_key[idx + 1];
+    block[2] = saved_key[idx + 2];
+    block[3] = saved_key[idx + 3];
+
+    mdtransform (state, checksum, block, s_lotus_magic_table);
+  }
+
+  block[0] = saved_key[idx + 0];
+  block[1] = saved_key[idx + 1];
+  block[2] = saved_key[idx + 2];
+  block[3] = saved_key[idx + 3];
 
   mdtransform (state, checksum, block, s_lotus_magic_table);