Merge remote-tracking branch 'upstream/master'
[hashcat.git] / OpenCL / m11800_a0.cl
index 13f52c6..f282c3e 100644 (file)
@@ -6,9 +6,10 @@
  * License.....: MIT
  */
 
-#define _GOST2012_512_
+#define _GOST2012_256_
 
-#define NEW_SIMD_CODE
+//too much register pressure
+//#define NEW_SIMD_CODE
 
 #include "include/constants.h"
 #include "include/kernel_vendor.h"
@@ -2243,13 +2244,15 @@ __constant u64 sbob_rc64[12][8] =
   },
 };
 
-static void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256])
+void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[256])
 {
   u64x k[8];
   u64x s[8];
   u64x t[8];
 
+  #ifdef _unroll
   #pragma unroll
+  #endif
   for (int i = 0; i < 8; i++)
   {
     t[i] = h[i];
@@ -2260,7 +2263,9 @@ static void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[2
     k[i] = SBOG_LPSti64;
   }
 
+  #ifdef _unroll
   #pragma unroll
+  #endif
   for (int i = 0; i < 8; i++)
   {
     s[i] = m[i];
@@ -2268,13 +2273,17 @@ static void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[2
 
   for (int r = 0; r < 12; r++)
   {
+    #ifdef _unroll
     #pragma unroll
+    #endif
     for (int i = 0; i < 8; i++)
     {
       t[i] = s[i] ^ k[i];
     }
 
+    #ifdef _unroll
     #pragma unroll
+    #endif
     for (int i = 0; i < 8; i++)
     {
       s[i] = SBOG_LPSti64;
@@ -2285,14 +2294,18 @@ static void streebog_g (u64x h[8], const u64x m[8], __local u64 (*s_sbob_sl64)[2
       t[i] = k[i] ^ sbob_rc64[r][i];
     }
 
+    #ifdef _unroll
     #pragma unroll
+    #endif
     for (int i = 0; i < 8; i++)
     {
       k[i] = SBOG_LPSti64;
     }
   }
 
+  #ifdef _unroll
   #pragma unroll
+  #endif
   for (int i = 0; i < 8; i++)
   {
     h[i] ^= s[i] ^ k[i] ^ m[i];
@@ -2336,14 +2349,12 @@ __kernel void m11800_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    */
 
   u32 pw_buf0[4];
+  u32 pw_buf1[4];
 
   pw_buf0[0] = pws[gid].i[ 0];
   pw_buf0[1] = pws[gid].i[ 1];
   pw_buf0[2] = pws[gid].i[ 2];
   pw_buf0[3] = pws[gid].i[ 3];
-
-  u32 pw_buf1[4];
-
   pw_buf1[0] = pws[gid].i[ 4];
   pw_buf1[1] = pws[gid].i[ 5];
   pw_buf1[2] = pws[gid].i[ 6];
@@ -2366,6 +2377,10 @@ __kernel void m11800_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
 
     append_0x01_2x4_VV (w0, w1, out_len);
 
+    /**
+     * GOST
+     */
+
     u32x w[16];
 
     w[ 0] = w0[0];
@@ -2433,7 +2448,7 @@ __kernel void m11800_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
     z[4] = 0;
     z[5] = 0;
     z[6] = 0;
-    z[7] = swap64 ((u64x) (out_len * 8)); // maybe a bug
+    z[7] = swap64 ((u64) (pw_len * 8));
 
     streebog_g (h, z, s_sbob_sl64);
     streebog_g (h, m, s_sbob_sl64);
@@ -2492,14 +2507,12 @@ __kernel void m11800_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
    */
 
   u32 pw_buf0[4];
+  u32 pw_buf1[4];
 
   pw_buf0[0] = pws[gid].i[ 0];
   pw_buf0[1] = pws[gid].i[ 1];
   pw_buf0[2] = pws[gid].i[ 2];
   pw_buf0[3] = pws[gid].i[ 3];
-
-  u32 pw_buf1[4];
-
   pw_buf1[0] = pws[gid].i[ 4];
   pw_buf1[1] = pws[gid].i[ 5];
   pw_buf1[2] = pws[gid].i[ 6];
@@ -2534,6 +2547,10 @@ __kernel void m11800_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
 
     append_0x01_2x4_VV (w0, w1, out_len);
 
+    /**
+     * GOST
+     */
+
     u32x w[16];
 
     w[ 0] = w0[0];
@@ -2601,7 +2618,7 @@ __kernel void m11800_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf,
     z[4] = 0;
     z[5] = 0;
     z[6] = 0;
-    z[7] = swap64 ((u64) (out_len * 8)); // maybe a bug
+    z[7] = swap64 ((u64) (pw_len * 8));
 
     streebog_g (h, z, s_sbob_sl64);
     streebog_g (h, m, s_sbob_sl64);