From 10a7c5df3d1e01d16bbe3a58d69e80eb5fb50922 Mon Sep 17 00:00:00 2001
From: jsteube <jens.steube@gmail.com>
Date: Thu, 27 Dec 2018 19:54:12 +0100
Subject: [PATCH] Improve test.pl functionality a bit

---
 tools/test.pl | 57 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 42 insertions(+), 15 deletions(-)

diff --git a/tools/test.pl b/tools/test.pl
index a878b9af2..58fcac3d7 100755
--- a/tools/test.pl
+++ b/tools/test.pl
@@ -64,23 +64,29 @@ sub single
 
   my $format = "echo -n %-31s | ./hashcat \${OPTS} -a 0 -m %d '%s'\n";
 
+  my $db;
+
+  my $giveup = 0;
+
   my $idx = 0;
 
   while ($idx < 8)
   {
+    last if ($giveup++ == 1000);
+
     my $word_len = 0;
 
     if (defined $len)
     {
       if ($IS_OPTIMIZED == 1)
       {
-        last if $len < $constraints->[2]->[0];
-        last if $len > $constraints->[2]->[1];
+        next if $len < $constraints->[2]->[0];
+        next if $len > $constraints->[2]->[1];
       }
       else
       {
-        last if $len < $constraints->[0]->[0];
-        last if $len > $constraints->[0]->[1];
+        next if $len < $constraints->[0]->[0];
+        next if $len > $constraints->[0]->[1];
       }
 
       $word_len = $len;
@@ -91,14 +97,23 @@ sub single
                                  ($IS_OPTIMIZED == 1) ? $constraints->[2]->[1] : $constraints->[0]->[1]);
     }
 
-    my $salt_len = random_number (($IS_OPTIMIZED == 1) ? $constraints->[3]->[0] : $constraints->[1]->[0],
-                                  ($IS_OPTIMIZED == 1) ? $constraints->[3]->[1] : $constraints->[1]->[1]);
-
     if ($IS_OPTIMIZED == 1)
     {
       next if ($word_len > 31);
     }
 
+    my $salt_len = 0;
+
+    if ($constraints->[3]->[0] == $constraints->[3]->[1])
+    {
+      $salt_len = $constraints->[3]->[0];
+    }
+    else
+    {
+      $salt_len = random_number (($IS_OPTIMIZED == 1) ? $constraints->[3]->[0] : $constraints->[1]->[0],
+                                 ($IS_OPTIMIZED == 1) ? $constraints->[3]->[1] : $constraints->[1]->[1]);
+    }
+
     my $comb_len = $word_len + $salt_len;
 
     if ($IS_OPTIMIZED == 1)
@@ -118,6 +133,11 @@ sub single
     my $word = random_numeric_string ($word_len) // "";
     my $salt = random_numeric_string ($salt_len) // "";
 
+    # check if this combination out of word and salt was previously checked
+    next if exists $db->{$word}->{$salt};
+
+    $db->{$word}->{$salt} = undef;
+
     my $hash = module_generate_hash ($word, $salt);
 
     # possible if the requested length is not supported by algorithm
@@ -142,12 +162,25 @@ sub passthrough
       next if ($word_len > 31);
     }
 
+    my $giveup = 0;
+
     my $idx = 0;
 
     while ($idx < 1)
     {
-      my $salt_len = random_number (($IS_OPTIMIZED == 1) ? $constraints->[3]->[0] : $constraints->[1]->[0],
-                                    ($IS_OPTIMIZED == 1) ? $constraints->[3]->[1] : $constraints->[1]->[1]);
+      last if ($giveup++ == 1000);
+
+      my $salt_len = 0;
+
+      if ($constraints->[3]->[0] == $constraints->[3]->[1])
+      {
+        $salt_len = $constraints->[3]->[0];
+      }
+      else
+      {
+        $salt_len = random_number (($IS_OPTIMIZED == 1) ? $constraints->[3]->[0] : $constraints->[1]->[0],
+                                   ($IS_OPTIMIZED == 1) ? $constraints->[3]->[1] : $constraints->[1]->[1]);
+      }
 
       my $comb_len = $word_len + $salt_len;
 
@@ -196,12 +229,6 @@ sub verify
 
   close (IN);
 
-  # resolve hash ambiguity if necessary
-  if (exists &{module_preprocess_hashlist})
-  {
-    module_preprocess_hashlist (\@hashlist);
-  }
-
   open (IN,  '<', $cracks_file) or die "$cracks_file: $!\n";
   open (OUT, '>', $out_file)    or die "$out_file: $!\n";