2016-06-27 10:13:46 +00:00
/**
2016-09-11 20:20:15 +00:00
* Author . . . . . . : See docs / credits . txt
2015-12-04 14:47:52 +00:00
* License . . . . . : MIT
*/
2016-09-07 20:29:57 +00:00
# if defined (__APPLE__)
2016-09-07 10:34:59 +00:00
# include <stdio.h>
2016-09-13 08:38:59 +00:00
# endif // __APPLE__
2016-09-07 10:34:59 +00:00
2016-09-07 09:16:31 +00:00
# include "common.h"
2016-09-06 20:25:54 +00:00
# include <stdio.h>
# include <string.h>
2016-09-07 09:16:31 +00:00
# include <stdlib.h>
# include <unistd.h>
# include <search.h>
2016-09-07 18:30:14 +00:00
# include <inttypes.h>
2016-09-08 12:11:35 +00:00
# include <signal.h>
2016-09-07 09:16:31 +00:00
2016-09-07 20:29:57 +00:00
# if defined (_POSIX)
2016-09-07 09:16:31 +00:00
# include <pthread.h>
# include <pwd.h>
# endif // _POSIX
2016-09-06 20:25:54 +00:00
2016-09-06 17:44:27 +00:00
# include "types.h"
2016-09-14 14:07:24 +00:00
# include "interface.h"
2016-09-06 17:44:27 +00:00
# include "timer.h"
2016-09-05 12:12:31 +00:00
# include "bitops.h"
2016-09-05 19:47:26 +00:00
# include "memory.h"
2016-09-06 16:23:26 +00:00
# include "folder.h"
2016-09-06 09:49:26 +00:00
# include "convert.h"
2016-09-05 19:47:26 +00:00
# include "logging.h"
2016-09-06 11:05:49 +00:00
# include "logfile.h"
2016-09-05 19:47:26 +00:00
# include "ext_OpenCL.h"
# include "ext_ADL.h"
# include "ext_nvapi.h"
# include "ext_nvml.h"
# include "ext_xnvctrl.h"
# include "cpu_aes.h"
# include "cpu_crc32.h"
# include "cpu_des.h"
# include "cpu_md5.h"
# include "cpu_sha1.h"
# include "cpu_sha256.h"
2016-09-06 17:44:27 +00:00
# include "filehandling.h"
# include "tuningdb.h"
2016-09-20 11:18:47 +00:00
# include "thread.h"
2016-09-15 14:02:52 +00:00
# include "opencl.h"
# include "hwmon.h"
# include "restore.h"
2016-09-16 15:01:18 +00:00
# include "hash_management.h"
2016-09-06 17:08:46 +00:00
# include "locking.h"
2016-09-05 19:47:26 +00:00
# include "rp_cpu.h"
2016-09-05 12:12:31 +00:00
# include "rp_kernel_on_cpu.h"
2016-09-08 07:21:25 +00:00
# include "terminal.h"
2016-09-05 19:47:26 +00:00
# include "inc_hash_constants.h"
# include "shared.h"
2016-09-06 11:52:26 +00:00
# include "mpsp.h"
2016-09-10 15:35:58 +00:00
# include "outfile.h"
2016-09-09 21:17:43 +00:00
# include "potfile.h"
2016-09-13 08:38:59 +00:00
# include "debugfile.h"
2016-09-12 12:58:25 +00:00
# include "loopback.h"
2016-09-06 09:49:26 +00:00
# include "data.h"
2016-09-07 09:16:31 +00:00
# include "affinity.h"
2016-09-07 19:13:53 +00:00
# include "bitmap.h"
2016-09-06 12:11:03 +00:00
# include "usage.h"
2016-09-08 07:21:25 +00:00
# include "status.h"
2016-09-08 12:36:15 +00:00
# include "hlfmt.h"
2016-09-08 12:44:02 +00:00
# include "filenames.h"
2016-09-08 14:01:24 +00:00
# include "stdout.h"
2016-09-08 16:27:53 +00:00
# include "dictstat.h"
2016-09-12 10:59:40 +00:00
# include "wordlist.h"
2016-09-11 09:42:19 +00:00
# include "version.h"
# include "benchmark.h"
# include "outfile_check.h"
# include "weak_hash.h"
# include "remove.h"
# include "debugfile.h"
# include "runtime.h"
# include "attack_mode.h"
# include "powertune.h"
# include "autotune.h"
# include "induct.h"
2016-09-15 02:17:19 +00:00
# include "dispatch.h"
2016-09-15 02:29:22 +00:00
# include "monitor.h"
2016-09-17 15:05:01 +00:00
# include "session.h"
2016-09-20 14:04:22 +00:00
# include "user_options.h"
2016-09-06 09:49:26 +00:00
extern hc_global_data_t data ;
2015-12-04 14:47:52 +00:00
2016-09-06 09:52:02 +00:00
extern int SUPPRESS_OUTPUT ;
2016-09-08 07:21:25 +00:00
extern hc_thread_mutex_t mux_hwmon ;
extern hc_thread_mutex_t mux_display ;
2016-08-31 01:13:41 +00:00
2016-09-11 08:28:59 +00:00
extern const unsigned int full01 ;
extern const unsigned int full80 ;
2016-09-12 08:16:42 +00:00
extern const int DEFAULT_BENCHMARK_ALGORITHMS_BUF [ ] ;
2016-09-09 08:22:21 +00:00
const int comptime = COMPTIME ;
2016-09-22 09:35:08 +00:00
static void setup_environment_variables ( )
2015-12-04 14:47:52 +00:00
{
char * compute = getenv ( " COMPUTE " ) ;
if ( compute )
{
2016-02-04 21:49:34 +00:00
static char display [ 100 ] ;
2015-12-04 14:47:52 +00:00
snprintf ( display , sizeof ( display ) - 1 , " DISPLAY=%s " , compute ) ;
putenv ( display ) ;
}
else
{
if ( getenv ( " DISPLAY " ) = = NULL )
putenv ( ( char * ) " DISPLAY=:0 " ) ;
}
if ( getenv ( " GPU_MAX_ALLOC_PERCENT " ) = = NULL )
putenv ( ( char * ) " GPU_MAX_ALLOC_PERCENT=100 " ) ;
2016-01-19 15:06:03 +00:00
if ( getenv ( " CPU_MAX_ALLOC_PERCENT " ) = = NULL )
putenv ( ( char * ) " CPU_MAX_ALLOC_PERCENT=100 " ) ;
2015-12-04 14:47:52 +00:00
if ( getenv ( " GPU_USE_SYNC_OBJECTS " ) = = NULL )
putenv ( ( char * ) " GPU_USE_SYNC_OBJECTS=1 " ) ;
2016-04-03 15:39:33 +00:00
if ( getenv ( " CUDA_CACHE_DISABLE " ) = = NULL )
putenv ( ( char * ) " CUDA_CACHE_DISABLE=1 " ) ;
2016-05-01 21:15:26 +00:00
if ( getenv ( " POCL_KERNEL_CACHE " ) = = NULL )
putenv ( ( char * ) " POCL_KERNEL_CACHE=0 " ) ;
2016-09-22 09:35:08 +00:00
}
2016-05-01 21:15:26 +00:00
2016-09-22 09:35:08 +00:00
static void setup_umask ( )
{
2016-05-18 07:56:23 +00:00
umask ( 077 ) ;
2016-09-22 09:35:08 +00:00
}
int main ( int argc , char * * argv )
{
# if defined (_WIN)
SetConsoleWindowSize ( 132 ) ;
# endif
/**
* To help users a bit
*/
setup_environment_variables ( ) ;
setup_umask ( ) ;
2016-05-18 07:56:23 +00:00
2015-12-04 14:47:52 +00:00
/**
* Real init
*/
memset ( & data , 0 , sizeof ( hc_global_data_t ) ) ;
time_t proc_start ;
time ( & proc_start ) ;
data . proc_start = proc_start ;
2016-07-24 20:26:40 +00:00
time_t prepare_start ;
time ( & prepare_start ) ;
2015-12-04 14:47:52 +00:00
hc_thread_mutex_init ( mux_display ) ;
2016-09-08 07:21:25 +00:00
hc_thread_mutex_init ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-07-21 08:06:31 +00:00
/**
2016-09-21 21:06:11 +00:00
* folder
2016-07-21 08:06:31 +00:00
*/
2016-09-21 21:06:11 +00:00
folder_config_t * folder_config = ( folder_config_t * ) mymalloc ( sizeof ( folder_config_t ) ) ;
2016-07-21 08:06:31 +00:00
2016-09-21 21:06:11 +00:00
char * install_folder = NULL ;
char * shared_folder = NULL ;
2016-07-21 08:06:31 +00:00
2016-09-21 21:06:11 +00:00
# if defined (INSTALL_FOLDER)
install_folder = INSTALL_FOLDER ;
2016-07-21 08:06:31 +00:00
# endif
2016-09-21 21:06:11 +00:00
# if defined (SHARED_FOLDER)
shared_folder = SHARED_FOLDER ;
2016-07-21 08:06:31 +00:00
# endif
2016-09-21 21:06:11 +00:00
folder_config_init ( folder_config , install_folder , shared_folder ) ;
2016-01-13 16:10:40 +00:00
2016-09-21 21:06:11 +00:00
data . install_dir = folder_config - > install_dir ;
data . profile_dir = folder_config - > profile_dir ;
data . session_dir = folder_config - > session_dir ;
data . shared_dir = folder_config - > shared_dir ;
2016-01-13 16:10:40 +00:00
2016-01-02 23:40:31 +00:00
/**
2016-09-21 18:32:56 +00:00
* commandline parameters
2016-01-02 23:40:31 +00:00
*/
2016-09-21 18:32:56 +00:00
user_options_t * user_options = ( user_options_t * ) mymalloc ( sizeof ( user_options_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-22 09:35:08 +00:00
data . user_options = user_options ;
2016-09-21 18:32:56 +00:00
user_options_init ( user_options , argc , argv ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
const int rc_user_options_parse1 = user_options_parse ( user_options , argc , argv ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
if ( rc_user_options_parse1 = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
/**
* session
*/
data . session = user_options - > session ;
data . restore_disable = user_options - > restore_disable ;
char * eff_restore_file = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
char * new_restore_file = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
snprintf ( eff_restore_file , HCBUFSIZ_TINY - 1 , " %s/%s.restore " , data . session_dir , user_options - > session ) ;
snprintf ( new_restore_file , HCBUFSIZ_TINY - 1 , " %s/%s.restore.new " , data . session_dir , user_options - > session ) ;
data . eff_restore_file = eff_restore_file ;
data . new_restore_file = new_restore_file ;
2015-12-04 14:47:52 +00:00
restore_data_t * rd = init_restore ( argc , argv ) ;
data . rd = rd ;
/**
* restore file
*/
2016-09-21 18:32:56 +00:00
int myargc = argc ;
char * * myargv = argv ;
if ( user_options - > restore = = true )
2015-12-04 14:47:52 +00:00
{
read_restore ( eff_restore_file , rd ) ;
2016-09-07 20:01:34 +00:00
if ( rd - > version < RESTORE_VERSION_MIN )
2015-12-04 14:47:52 +00:00
{
log_error ( " ERROR: Incompatible restore-file version " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
myargc = rd - > argc ;
myargv = rd - > argv ;
2016-09-07 20:29:57 +00:00
# if defined (_POSIX)
2015-12-04 14:47:52 +00:00
rd - > pid = getpid ( ) ;
2016-09-07 20:29:57 +00:00
# elif defined (_WIN)
2015-12-04 14:47:52 +00:00
rd - > pid = GetCurrentProcessId ( ) ;
# endif
}
2016-09-21 18:32:56 +00:00
const int rc_user_options_parse2 = user_options_parse ( user_options , myargc , myargv ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
if ( rc_user_options_parse2 = = - 1 ) return - 1 ;
2016-09-20 15:04:31 +00:00
2016-09-21 09:09:12 +00:00
user_options_extra_t * user_options_extra = ( user_options_extra_t * ) mymalloc ( sizeof ( user_options_extra_t ) ) ;
2016-09-20 15:04:31 +00:00
2016-09-22 09:35:08 +00:00
data . user_options_extra = user_options_extra ;
2016-09-21 09:09:12 +00:00
const int rc_user_options_extra_init = user_options_extra_init ( user_options , myargc , myargv , user_options_extra ) ;
2016-09-20 15:04:31 +00:00
2016-09-21 09:09:12 +00:00
if ( rc_user_options_extra_init = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-21 09:09:12 +00:00
const int rc_user_options_sanity = user_options_sanity ( user_options , myargc , myargv , user_options_extra ) ;
2015-12-04 14:47:52 +00:00
2016-09-20 15:04:31 +00:00
if ( rc_user_options_sanity = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
// temporarily start
if ( 1 )
{
2016-09-21 20:29:56 +00:00
data . attack_mode = user_options - > attack_mode ;
data . benchmark = user_options - > benchmark ;
data . custom_charset_1 = user_options - > custom_charset_1 ;
data . custom_charset_2 = user_options - > custom_charset_2 ;
data . custom_charset_3 = user_options - > custom_charset_3 ;
data . custom_charset_4 = user_options - > custom_charset_4 ;
data . force = user_options - > force ;
data . gpu_temp_abort = user_options - > gpu_temp_abort ;
data . gpu_temp_disable = user_options - > gpu_temp_disable ;
data . gpu_temp_retain = user_options - > gpu_temp_retain ;
data . hex_charset = user_options - > hex_charset ;
data . hex_salt = user_options - > hex_salt ;
data . hex_wordlist = user_options - > hex_wordlist ;
data . limit = user_options - > limit ;
data . logfile_disable = user_options - > logfile_disable ;
data . loopback = user_options - > loopback ;
data . machine_readable = user_options - > machine_readable ;
data . outfile_check_timer = user_options - > outfile_check_timer ;
data . powertune_enable = user_options - > powertune_enable ;
data . quiet = user_options - > quiet ;
data . remove = user_options - > remove ;
data . remove_timer = user_options - > remove_timer ;
data . restore = user_options - > restore ;
data . restore_disable = user_options - > restore_disable ;
data . restore_timer = user_options - > restore_timer ;
data . rp_files = user_options - > rp_files ;
data . rp_files_cnt = user_options - > rp_files_cnt ;
data . rp_gen = user_options - > rp_gen ;
data . rp_gen_seed = user_options - > rp_gen_seed ;
2016-09-21 14:38:55 +00:00
data . rule_buf_l = user_options - > rule_buf_l ;
data . rule_buf_r = user_options - > rule_buf_r ;
2016-09-21 20:29:56 +00:00
data . runtime = user_options - > runtime ;
data . scrypt_tmto = user_options - > scrypt_tmto ;
data . segment_size = user_options - > segment_size ;
data . session = user_options - > session ;
data . skip = user_options - > skip ;
data . status = user_options - > status ;
data . status_timer = user_options - > status_timer ;
data . truecrypt_keyfiles = user_options - > truecrypt_keyfiles ;
data . username = user_options - > username ;
data . veracrypt_keyfiles = user_options - > veracrypt_keyfiles ;
data . veracrypt_pim = user_options - > veracrypt_pim ;
data . rule_len_l = user_options_extra - > rule_len_l ;
data . rule_len_r = user_options_extra - > rule_len_r ;
2016-09-21 14:25:36 +00:00
data . wordlist_mode = user_options_extra - > wordlist_mode ;
2016-09-21 20:29:56 +00:00
data . attack_kern = user_options_extra - > attack_kern ;
2016-09-21 14:07:49 +00:00
}
2016-05-01 18:52:20 +00:00
2016-09-21 18:34:58 +00:00
if ( user_options - > version )
{
log_info ( " %s " , VERSION_TAG ) ;
return 0 ;
}
if ( user_options - > usage )
{
usage_big_print ( PROGNAME ) ;
return 0 ;
}
2016-09-20 15:04:31 +00:00
/**
* Inform user things getting started ,
* - this is giving us a visual header before preparations start , so we do not need to clear them afterwards
* - we do not need to check algorithm_pos
*/
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:34:58 +00:00
if ( user_options - > machine_readable = = false )
2016-09-20 15:04:31 +00:00
{
log_info ( " %s (%s) starting in benchmark-mode... " , PROGNAME , VERSION_TAG ) ;
log_info ( " " ) ;
}
else
{
log_info ( " # %s (%s) %s " , PROGNAME , VERSION_TAG , ctime ( & proc_start ) ) ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-21 18:34:58 +00:00
else if ( user_options - > restore = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-20 15:04:31 +00:00
log_info ( " %s (%s) starting in restore-mode... " , PROGNAME , VERSION_TAG ) ;
log_info ( " " ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 18:34:58 +00:00
else if ( user_options - > stdout_flag = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-20 15:04:31 +00:00
// do nothing
2015-12-04 14:47:52 +00:00
}
2016-09-21 18:34:58 +00:00
else if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-20 15:04:31 +00:00
// do nothing
2015-12-04 14:47:52 +00:00
}
2016-09-20 15:04:31 +00:00
else
2016-01-13 21:22:46 +00:00
{
2016-09-21 18:34:58 +00:00
if ( ( user_options - > show = = true ) | | ( user_options - > left = = true ) )
2016-09-20 15:04:31 +00:00
{
// do nothing
}
else
{
log_info ( " %s (%s) starting... " , PROGNAME , VERSION_TAG ) ;
log_info ( " " ) ;
}
2016-01-13 21:22:46 +00:00
}
}
2015-12-04 14:47:52 +00:00
/**
* induction directory
*/
char * induction_directory = NULL ;
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode ! = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > benchmark = = false ) & & ( user_options - > opencl_info = = false ) )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:52:45 +00:00
if ( user_options - > induction_dir = = NULL )
2016-09-21 14:07:49 +00:00
{
2016-09-21 18:32:56 +00:00
induction_directory = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 21:06:11 +00:00
snprintf ( induction_directory , HCBUFSIZ_TINY - 1 , " %s/%s.%s " , folder_config - > session_dir , user_options - > session , INDUCT_DIR ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
// create induction folder if it does not already exist
2015-12-04 14:47:52 +00:00
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( rmdir ( induction_directory ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( errno = = ENOENT )
{
// good, we can ignore
}
else if ( errno = = ENOTEMPTY )
{
2016-09-21 18:32:56 +00:00
char * induction_directory_mv = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
2016-09-21 14:07:49 +00:00
2016-09-21 21:06:11 +00:00
snprintf ( induction_directory_mv , HCBUFSIZ_TINY - 1 , " %s/%s.induct.%d " , folder_config - > session_dir , user_options - > session , ( int ) proc_start ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
if ( rename ( induction_directory , induction_directory_mv ) ! = 0 )
{
log_error ( " ERROR: Rename directory %s to %s: %s " , induction_directory , induction_directory_mv , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
return - 1 ;
}
}
else
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
log_error ( " ERROR: %s: %s " , induction_directory , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 14:07:49 +00:00
if ( mkdir ( induction_directory , 0700 ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
log_error ( " ERROR: %s: %s " , induction_directory , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-21 14:07:49 +00:00
else
{
2016-09-21 18:52:45 +00:00
induction_directory = user_options - > induction_dir ;
2016-09-21 14:07:49 +00:00
}
2015-12-04 14:47:52 +00:00
}
}
data . induction_directory = induction_directory ;
2016-02-10 19:40:21 +00:00
/**
* tuning db
*/
char tuning_db_file [ 256 ] = { 0 } ;
2016-09-21 21:06:11 +00:00
snprintf ( tuning_db_file , sizeof ( tuning_db_file ) - 1 , " %s/%s " , folder_config - > shared_dir , TUNING_DB_FILE ) ;
2016-02-10 19:40:21 +00:00
tuning_db_t * tuning_db = tuning_db_init ( tuning_db_file ) ;
2015-12-04 14:47:52 +00:00
/**
* outfile - check directory
*/
char * outfile_check_directory = NULL ;
2016-09-21 14:07:49 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > benchmark = = false ) & & ( user_options - > opencl_info = = false ) )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:54:46 +00:00
if ( user_options - > outfile_check_dir = = NULL )
2016-09-21 14:07:49 +00:00
{
2016-09-21 18:32:56 +00:00
outfile_check_directory = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 21:06:11 +00:00
snprintf ( outfile_check_directory , HCBUFSIZ_TINY - 1 , " %s/%s.%s " , folder_config - > session_dir , user_options - > session , OUTFILES_DIR ) ;
2016-09-21 14:07:49 +00:00
}
else
{
2016-09-21 18:54:46 +00:00
outfile_check_directory = user_options - > outfile_check_dir ;
2016-09-21 14:07:49 +00:00
}
2015-12-04 14:47:52 +00:00
struct stat outfile_check_stat ;
if ( stat ( outfile_check_directory , & outfile_check_stat ) = = 0 )
{
uint is_dir = S_ISDIR ( outfile_check_stat . st_mode ) ;
if ( is_dir = = 0 )
{
log_error ( " ERROR: Directory specified in outfile-check '%s' is not a valid directory " , outfile_check_directory ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 18:54:46 +00:00
else if ( user_options - > outfile_check_dir = = NULL )
2015-12-04 14:47:52 +00:00
{
if ( mkdir ( outfile_check_directory , 0700 ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , outfile_check_directory , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-21 14:07:49 +00:00
data . outfile_check_directory = outfile_check_directory ;
2016-09-15 14:02:52 +00:00
2015-12-04 14:47:52 +00:00
/**
* cpu affinity
*/
2016-09-21 14:07:49 +00:00
if ( user_options - > cpu_affinity )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
set_cpu_affinity ( user_options - > cpu_affinity ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:07:49 +00:00
if ( user_options - > rp_gen_seed_chgd = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
srand ( user_options - > rp_gen_seed ) ;
2015-12-04 14:47:52 +00:00
}
else
{
2016-09-21 14:07:49 +00:00
srand ( proc_start ) ;
2015-12-04 14:47:52 +00:00
}
/**
* logfile init
*/
2016-09-21 14:07:49 +00:00
if ( user_options - > logfile_disable = = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-21 20:12:48 +00:00
char * logfile = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 21:06:11 +00:00
snprintf ( logfile , HCBUFSIZ_TINY - 1 , " %s/%s.log " , folder_config - > session_dir , user_options - > session ) ;
2015-12-04 14:47:52 +00:00
data . logfile = logfile ;
char * topid = logfile_generate_topid ( ) ;
data . topid = topid ;
}
logfile_top_msg ( " START " ) ;
2016-09-21 09:09:12 +00:00
logfile_top_uint ( user_options - > attack_mode ) ;
logfile_top_uint ( user_options - > benchmark ) ;
logfile_top_uint ( user_options - > stdout_flag ) ;
logfile_top_uint ( user_options - > bitmap_min ) ;
logfile_top_uint ( user_options - > bitmap_max ) ;
logfile_top_uint ( user_options - > debug_mode ) ;
logfile_top_uint ( user_options - > force ) ;
logfile_top_uint ( user_options - > kernel_accel ) ;
logfile_top_uint ( user_options - > kernel_loops ) ;
logfile_top_uint ( user_options - > nvidia_spin_damp ) ;
logfile_top_uint ( user_options - > hash_mode ) ;
logfile_top_uint ( user_options - > hex_charset ) ;
logfile_top_uint ( user_options - > hex_salt ) ;
logfile_top_uint ( user_options - > hex_wordlist ) ;
logfile_top_uint ( user_options - > increment ) ;
logfile_top_uint ( user_options - > increment_max ) ;
logfile_top_uint ( user_options - > increment_min ) ;
logfile_top_uint ( user_options - > keyspace ) ;
logfile_top_uint ( user_options - > left ) ;
logfile_top_uint ( user_options - > logfile_disable ) ;
logfile_top_uint ( user_options - > loopback ) ;
logfile_top_uint ( user_options - > markov_classic ) ;
logfile_top_uint ( user_options - > markov_disable ) ;
logfile_top_uint ( user_options - > markov_threshold ) ;
logfile_top_uint ( user_options - > outfile_autohex ) ;
logfile_top_uint ( user_options - > outfile_check_timer ) ;
logfile_top_uint ( user_options - > outfile_format ) ;
logfile_top_uint ( user_options - > potfile_disable ) ;
logfile_top_string ( user_options - > potfile_path ) ;
logfile_top_uint ( user_options - > powertune_enable ) ;
logfile_top_uint ( user_options - > scrypt_tmto ) ;
logfile_top_uint ( user_options - > quiet ) ;
logfile_top_uint ( user_options - > remove ) ;
logfile_top_uint ( user_options - > remove_timer ) ;
logfile_top_uint ( user_options - > restore ) ;
logfile_top_uint ( user_options - > restore_disable ) ;
logfile_top_uint ( user_options - > restore_timer ) ;
logfile_top_uint ( user_options - > rp_gen ) ;
logfile_top_uint ( user_options - > rp_gen_func_max ) ;
logfile_top_uint ( user_options - > rp_gen_func_min ) ;
logfile_top_uint ( user_options - > rp_gen_seed ) ;
logfile_top_uint ( user_options - > runtime ) ;
logfile_top_uint ( user_options - > segment_size ) ;
logfile_top_uint ( user_options - > show ) ;
logfile_top_uint ( user_options - > status ) ;
logfile_top_uint ( user_options - > machine_readable ) ;
logfile_top_uint ( user_options - > status_timer ) ;
logfile_top_uint ( user_options - > usage ) ;
logfile_top_uint ( user_options - > username ) ;
logfile_top_uint ( user_options - > version ) ;
logfile_top_uint ( user_options - > weak_hash_threshold ) ;
logfile_top_uint ( user_options - > workload_profile ) ;
logfile_top_uint64 ( user_options - > limit ) ;
logfile_top_uint64 ( user_options - > skip ) ;
logfile_top_char ( user_options - > separator ) ;
logfile_top_string ( user_options - > cpu_affinity ) ;
logfile_top_string ( user_options - > custom_charset_1 ) ;
logfile_top_string ( user_options - > custom_charset_2 ) ;
logfile_top_string ( user_options - > custom_charset_3 ) ;
logfile_top_string ( user_options - > custom_charset_4 ) ;
logfile_top_string ( user_options - > debug_file ) ;
logfile_top_string ( user_options - > opencl_devices ) ;
logfile_top_string ( user_options - > opencl_platforms ) ;
logfile_top_string ( user_options - > opencl_device_types ) ;
logfile_top_uint ( user_options - > opencl_vector_width ) ;
logfile_top_string ( user_options - > induction_dir ) ;
logfile_top_string ( user_options - > markov_hcstat ) ;
logfile_top_string ( user_options - > outfile ) ;
logfile_top_string ( user_options - > outfile_check_dir ) ;
logfile_top_string ( user_options - > rule_buf_l ) ;
logfile_top_string ( user_options - > rule_buf_r ) ;
logfile_top_string ( user_options - > session ) ;
logfile_top_string ( user_options - > truecrypt_keyfiles ) ;
logfile_top_string ( user_options - > veracrypt_keyfiles ) ;
logfile_top_uint ( user_options - > veracrypt_pim ) ;
2015-12-04 14:47:52 +00:00
2016-01-26 20:40:49 +00:00
/**
* Init OpenCL library loader
*/
2016-09-15 14:02:52 +00:00
opencl_ctx_t * opencl_ctx = ( opencl_ctx_t * ) mymalloc ( sizeof ( opencl_ctx_t ) ) ;
2016-01-11 23:44:28 +00:00
2016-09-15 14:02:52 +00:00
data . opencl_ctx = opencl_ctx ;
2016-01-13 16:10:40 +00:00
2016-09-21 14:07:49 +00:00
const int rc_opencl_init = opencl_ctx_init ( opencl_ctx , user_options ) ;
2016-09-18 13:51:47 +00:00
2016-09-19 13:52:01 +00:00
if ( rc_opencl_init = = - 1 )
2016-09-18 16:30:32 +00:00
{
2016-09-19 13:52:01 +00:00
log_error ( " ERROR: opencl_ctx_init() failed " ) ;
2016-09-18 16:30:32 +00:00
return - 1 ;
}
2016-01-13 16:10:40 +00:00
2016-06-25 10:05:16 +00:00
/**
* status , monitor and outfile remove threads
*/
2016-06-26 14:09:05 +00:00
uint outer_threads_cnt = 0 ;
2016-06-25 10:05:16 +00:00
2016-06-26 14:09:05 +00:00
hc_thread_t * outer_threads = ( hc_thread_t * ) mycalloc ( 10 , sizeof ( hc_thread_t ) ) ;
2016-06-25 10:05:16 +00:00
2016-06-27 10:13:46 +00:00
data . shutdown_outer = 0 ;
2016-09-21 14:32:38 +00:00
if ( user_options - > keyspace = = false & & user_options - > benchmark = = false & & user_options - > stdout_flag = = false )
2016-06-25 10:05:16 +00:00
{
2016-09-21 14:25:36 +00:00
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
2016-06-25 10:05:16 +00:00
{
2016-06-26 14:09:05 +00:00
hc_thread_create ( outer_threads [ outer_threads_cnt ] , thread_keypress , NULL ) ;
2016-06-25 10:05:16 +00:00
2016-06-26 14:09:05 +00:00
outer_threads_cnt + + ;
2016-06-25 10:05:16 +00:00
}
}
2015-12-04 14:47:52 +00:00
/**
* config
*/
2016-09-09 14:54:48 +00:00
hashconfig_t * hashconfig = ( hashconfig_t * ) mymalloc ( sizeof ( hashconfig_t ) ) ;
data . hashconfig = hashconfig ;
2015-12-04 14:47:52 +00:00
uint algorithm_pos = 0 ;
uint algorithm_max = 1 ;
2016-09-12 08:16:42 +00:00
const int * algorithms = DEFAULT_BENCHMARK_ALGORITHMS_BUF ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true & & user_options - > hash_mode_chgd = = false ) algorithm_max = DEFAULT_BENCHMARK_ALGORITHMS_CNT ;
2015-12-04 14:47:52 +00:00
for ( algorithm_pos = 0 ; algorithm_pos < algorithm_max ; algorithm_pos + + )
{
2016-09-19 13:52:01 +00:00
opencl_ctx - > devices_status = STATUS_INIT ;
//opencl_ctx->run_main_level1 = true;
opencl_ctx - > run_main_level2 = true ;
opencl_ctx - > run_main_level3 = true ;
opencl_ctx - > run_thread_level1 = true ;
opencl_ctx - > run_thread_level2 = true ;
2015-12-04 14:47:52 +00:00
/*
* We need to reset ' rd ' in benchmark mode otherwise when the user hits ' bypass '
* the following algos are skipped entirely
*/
if ( algorithm_pos > 0 )
{
local_free ( rd ) ;
rd = init_restore ( argc , argv ) ;
data . rd = rd ;
}
/**
* update hash_mode in case of multihash benchmark
*/
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:32:38 +00:00
if ( user_options - > hash_mode_chgd = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 19:02:49 +00:00
user_options - > hash_mode = algorithms [ algorithm_pos ] ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:07:49 +00:00
user_options - > quiet = true ;
2015-12-04 14:47:52 +00:00
}
2016-09-16 15:01:18 +00:00
/**
* setup variables and buffers depending on hash_mode
*/
2015-12-04 14:47:52 +00:00
2016-09-21 19:02:49 +00:00
const int rc_hashconfig = hashconfig_init ( hashconfig , user_options ) ;
2016-09-16 15:01:18 +00:00
if ( rc_hashconfig = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
/**
2016-09-09 21:17:43 +00:00
* outfile
2015-12-04 14:47:52 +00:00
*/
2016-09-10 15:35:58 +00:00
outfile_ctx_t * outfile_ctx = mymalloc ( sizeof ( outfile_ctx_t ) ) ;
data . outfile_ctx = outfile_ctx ;
2016-09-21 19:14:06 +00:00
outfile_init ( outfile_ctx , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:31:31 +00:00
/**
* Sanity check for hashfile vs outfile ( should not point to the same physical file )
*/
2016-09-21 09:09:12 +00:00
const int rc_outfile_and_hashfile = outfile_and_hashfile ( outfile_ctx , myargv [ user_options_extra - > optind ] ) ;
2016-09-16 15:31:31 +00:00
if ( rc_outfile_and_hashfile = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
/**
* potfile
*/
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
potfile_ctx_t * potfile_ctx = mymalloc ( sizeof ( potfile_ctx_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
data . potfile_ctx = potfile_ctx ;
2016-09-21 21:06:11 +00:00
potfile_init ( potfile_ctx , folder_config - > profile_dir , user_options - > potfile_path , user_options - > potfile_disable ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:36:10 +00:00
if ( user_options - > show = = true | | user_options - > left = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:31:31 +00:00
outfile_write_open ( outfile_ctx ) ;
2015-12-04 14:47:52 +00:00
SUPPRESS_OUTPUT = 1 ;
2016-09-16 15:01:18 +00:00
potfile_read_open ( potfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-10 09:32:26 +00:00
potfile_read_parse ( potfile_ctx , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
potfile_read_close ( potfile_ctx ) ;
2016-03-26 09:37:59 +00:00
2015-12-04 14:47:52 +00:00
SUPPRESS_OUTPUT = 0 ;
}
/**
2016-09-16 15:01:18 +00:00
* load hashes , stage 1
2015-12-04 14:47:52 +00:00
*/
2016-09-16 15:01:18 +00:00
hashes_t * hashes = ( hashes_t * ) mymalloc ( sizeof ( hashes_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
data . hashes = hashes ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
const int rc_hashes_init_stage1 = hashes_init_stage1 ( hashes , hashconfig , potfile_ctx , outfile_ctx , user_options , myargv [ user_options_extra - > optind ] ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
if ( rc_hashes_init_stage1 = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
logfile_top_var_string ( " hashfile " , hashes - > hashfile ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
logfile_top_uint ( hashes - > hashlist_mode ) ;
logfile_top_uint ( hashes - > hashlist_format ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > stdout_flag = = false ) & & ( user_options - > opencl_info = = false ) )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
if ( hashes - > hashes_cnt = = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
log_error ( " ERROR: No hashes loaded " ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 18:36:10 +00:00
if ( user_options - > show = = true | | user_options - > left = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-10 15:35:58 +00:00
outfile_write_close ( outfile_ctx ) ;
2016-09-10 09:32:26 +00:00
potfile_hash_free ( potfile_ctx , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return 0 ;
2015-12-04 14:47:52 +00:00
}
/**
* Potfile removes
*/
2016-09-10 10:16:16 +00:00
int potfile_remove_cracks = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:43:54 +00:00
if ( user_options - > potfile_disable = = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Comparing hashes with potfile entries... " ) ;
2016-03-26 09:37:59 +00:00
2016-09-16 15:01:18 +00:00
potfile_remove_cracks = potfile_remove_parse ( potfile_ctx , hashconfig , hashes ) ;
2015-12-04 14:47:52 +00:00
}
/**
2016-09-16 15:01:18 +00:00
* load hashes , stage 2
2015-12-04 14:47:52 +00:00
*/
2016-09-16 15:01:18 +00:00
uint hashes_cnt_orig = hashes - > hashes_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
const int rc_hashes_init_stage2 = hashes_init_stage2 ( hashes , hashconfig , opencl_ctx , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
if ( rc_hashes_init_stage2 = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
/**
* Automatic Optimizers
*/
2015-12-04 14:47:52 +00:00
2016-09-21 20:21:35 +00:00
hashconfig_general_defaults ( hashconfig , hashes , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
if ( hashes - > salts_cnt = = 1 )
2016-09-09 14:54:48 +00:00
hashconfig - > opti_type | = OPTI_TYPE_SINGLE_SALT ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
if ( hashes - > digests_cnt = = 1 )
2016-09-09 14:54:48 +00:00
hashconfig - > opti_type | = OPTI_TYPE_SINGLE_HASH ;
2015-12-04 14:47:52 +00:00
2016-09-09 14:54:48 +00:00
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
hashconfig - > opti_type | = OPTI_TYPE_NOT_ITERATED ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_BF )
2016-09-09 14:54:48 +00:00
hashconfig - > opti_type | = OPTI_TYPE_BRUTE_FORCE ;
2015-12-04 14:47:52 +00:00
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_BRUTE_FORCE )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_SINGLE_HASH )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_APPENDED_SALT )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_ST_ADD80 )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
hashconfig - > opts_type & = ~ OPTS_TYPE_ST_ADD80 ;
hashconfig - > opts_type | = OPTS_TYPE_PT_ADD80 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_ST_ADDBITS14 )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
hashconfig - > opts_type & = ~ OPTS_TYPE_ST_ADDBITS14 ;
hashconfig - > opts_type | = OPTS_TYPE_PT_ADDBITS14 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_ST_ADDBITS15 )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
hashconfig - > opts_type & = ~ OPTS_TYPE_ST_ADDBITS15 ;
hashconfig - > opts_type | = OPTS_TYPE_PT_ADDBITS15 ;
2015-12-04 14:47:52 +00:00
}
}
}
}
2016-09-16 15:31:31 +00:00
/**
* dictstat
*/
dictstat_ctx_t * dictstat_ctx = mymalloc ( sizeof ( dictstat_ctx_t ) ) ;
2016-09-21 21:06:11 +00:00
dictstat_init ( dictstat_ctx , folder_config - > profile_dir ) ;
2016-09-16 15:31:31 +00:00
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = false )
2016-09-16 15:31:31 +00:00
{
dictstat_read ( dictstat_ctx ) ;
}
/**
* loopback
*/
loopback_ctx_t * loopback_ctx = mymalloc ( sizeof ( loopback_ctx_t ) ) ;
data . loopback_ctx = loopback_ctx ;
loopback_init ( loopback_ctx ) ;
/**
* debugfile
*/
debugfile_ctx_t * debugfile_ctx = mymalloc ( sizeof ( debugfile_ctx_t ) ) ;
data . debugfile_ctx = debugfile_ctx ;
2016-09-21 18:45:01 +00:00
debugfile_init ( debugfile_ctx , user_options - > debug_mode , user_options - > debug_file ) ;
2016-09-16 15:31:31 +00:00
/**
* word len
*/
uint pw_min = hashconfig_general_pw_min ( hashconfig ) ;
uint pw_max = hashconfig_general_pw_max ( hashconfig ) ;
/**
* charsets : keep them together for more easy maintainnce
*/
cs_t mp_sys [ 6 ] = { { { 0 } , 0 } } ;
cs_t mp_usr [ 4 ] = { { { 0 } , 0 } } ;
mp_setup_sys ( mp_sys ) ;
2016-09-21 14:42:49 +00:00
if ( user_options - > custom_charset_1 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig ) ;
if ( user_options - > custom_charset_2 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig ) ;
if ( user_options - > custom_charset_3 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig ) ;
if ( user_options - > custom_charset_4 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_4 , 3 , hashconfig ) ;
2016-09-16 15:31:31 +00:00
2015-12-07 20:37:12 +00:00
/**
* Some algorithm , like descrypt , can benefit from JIT compilation
*/
2016-09-17 15:05:01 +00:00
opencl_ctx - > force_jit_compilation = - 1 ;
2015-12-07 20:37:12 +00:00
2016-09-09 14:54:48 +00:00
if ( hashconfig - > hash_mode = = 8900 )
2015-12-07 20:37:12 +00:00
{
2016-09-17 15:05:01 +00:00
opencl_ctx - > force_jit_compilation = 8900 ;
2015-12-07 20:37:12 +00:00
}
2016-09-09 14:54:48 +00:00
else if ( hashconfig - > hash_mode = = 9300 )
2015-12-07 20:37:12 +00:00
{
2016-09-17 15:05:01 +00:00
opencl_ctx - > force_jit_compilation = 8900 ;
2015-12-07 20:37:12 +00:00
}
2016-09-21 14:30:23 +00:00
else if ( hashconfig - > hash_mode = = 1500 & & user_options - > attack_mode = = ATTACK_MODE_BF & & hashes - > salts_cnt = = 1 )
2015-12-07 20:37:12 +00:00
{
2016-09-17 15:05:01 +00:00
opencl_ctx - > force_jit_compilation = 1500 ;
2015-12-07 20:37:12 +00:00
}
2015-12-04 14:47:52 +00:00
/**
* generate bitmap tables
*/
const uint bitmap_shift1 = 5 ;
const uint bitmap_shift2 = 13 ;
2016-09-21 14:38:55 +00:00
if ( user_options - > bitmap_max < user_options - > bitmap_min ) user_options - > bitmap_max = user_options - > bitmap_min ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:38:55 +00:00
uint * bitmap_s1_a = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s1_b = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s1_c = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s1_d = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s2_a = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s2_b = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s2_c = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
uint * bitmap_s2_d = ( uint * ) mymalloc ( ( 1u < < user_options - > bitmap_max ) * sizeof ( uint ) ) ;
2015-12-04 14:47:52 +00:00
uint bitmap_bits ;
uint bitmap_nums ;
uint bitmap_mask ;
uint bitmap_size ;
2016-09-21 14:38:55 +00:00
for ( bitmap_bits = user_options - > bitmap_min ; bitmap_bits < user_options - > bitmap_max ; bitmap_bits + + )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Generating bitmap tables with %u bits... " , bitmap_bits ) ;
2015-12-04 14:47:52 +00:00
2016-07-26 05:31:50 +00:00
bitmap_nums = 1u < < bitmap_bits ;
2015-12-04 14:47:52 +00:00
bitmap_mask = bitmap_nums - 1 ;
bitmap_size = bitmap_nums * sizeof ( uint ) ;
2016-09-16 15:01:18 +00:00
if ( ( hashes - > digests_cnt & bitmap_mask ) = = hashes - > digests_cnt ) break ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
if ( generate_bitmaps ( hashes - > digests_cnt , hashconfig - > dgst_size , bitmap_shift1 , ( char * ) hashes - > digests_buf , hashconfig - > dgst_pos0 , hashconfig - > dgst_pos1 , hashconfig - > dgst_pos2 , hashconfig - > dgst_pos3 , bitmap_mask , bitmap_size , bitmap_s1_a , bitmap_s1_b , bitmap_s1_c , bitmap_s1_d , hashes - > digests_cnt / 2 ) = = 0x7fffffff ) continue ;
if ( generate_bitmaps ( hashes - > digests_cnt , hashconfig - > dgst_size , bitmap_shift2 , ( char * ) hashes - > digests_buf , hashconfig - > dgst_pos0 , hashconfig - > dgst_pos1 , hashconfig - > dgst_pos2 , hashconfig - > dgst_pos3 , bitmap_mask , bitmap_size , bitmap_s1_a , bitmap_s1_b , bitmap_s1_c , bitmap_s1_d , hashes - > digests_cnt / 2 ) = = 0x7fffffff ) continue ;
2015-12-04 14:47:52 +00:00
break ;
}
2016-07-26 05:31:50 +00:00
bitmap_nums = 1u < < bitmap_bits ;
2015-12-04 14:47:52 +00:00
bitmap_mask = bitmap_nums - 1 ;
bitmap_size = bitmap_nums * sizeof ( uint ) ;
2016-09-16 15:01:18 +00:00
generate_bitmaps ( hashes - > digests_cnt , hashconfig - > dgst_size , bitmap_shift1 , ( char * ) hashes - > digests_buf , hashconfig - > dgst_pos0 , hashconfig - > dgst_pos1 , hashconfig - > dgst_pos2 , hashconfig - > dgst_pos3 , bitmap_mask , bitmap_size , bitmap_s1_a , bitmap_s1_b , bitmap_s1_c , bitmap_s1_d , - 1ul ) ;
generate_bitmaps ( hashes - > digests_cnt , hashconfig - > dgst_size , bitmap_shift2 , ( char * ) hashes - > digests_buf , hashconfig - > dgst_pos0 , hashconfig - > dgst_pos1 , hashconfig - > dgst_pos2 , hashconfig - > dgst_pos3 , bitmap_mask , bitmap_size , bitmap_s2_a , bitmap_s2_b , bitmap_s2_c , bitmap_s2_d , - 1ul ) ;
2015-12-04 14:47:52 +00:00
/**
* load rules
*/
2016-01-05 07:26:44 +00:00
uint * all_kernel_rules_cnt = NULL ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rule_t * * all_kernel_rules_buf = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
if ( user_options - > rp_files_cnt )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:32:56 +00:00
all_kernel_rules_cnt = ( uint * ) mycalloc ( user_options - > rp_files_cnt , sizeof ( uint ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
all_kernel_rules_buf = ( kernel_rule_t * * ) mycalloc ( user_options - > rp_files_cnt , sizeof ( kernel_rule_t * ) ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-08 10:17:56 +00:00
char * rule_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
int rule_len = 0 ;
2016-09-21 18:32:56 +00:00
for ( uint i = 0 ; i < user_options - > rp_files_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
uint kernel_rules_avail = 0 ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
uint kernel_rules_cnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rule_t * kernel_rules_buf = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
char * rp_file = user_options - > rp_files [ i ] ;
2015-12-04 14:47:52 +00:00
2016-01-24 12:25:47 +00:00
char in [ BLOCK_SIZE ] = { 0 } ;
char out [ BLOCK_SIZE ] = { 0 } ;
2015-12-04 14:47:52 +00:00
FILE * fp = NULL ;
uint rule_line = 0 ;
if ( ( fp = fopen ( rp_file , " rb " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , rp_file , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
while ( ! feof ( fp ) )
{
2016-09-08 10:17:56 +00:00
memset ( rule_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
rule_len = fgetl ( fp , rule_buf ) ;
rule_line + + ;
if ( rule_len = = 0 ) continue ;
if ( rule_buf [ 0 ] = = ' # ' ) continue ;
2016-01-05 07:26:44 +00:00
if ( kernel_rules_avail = = kernel_rules_cnt )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
kernel_rules_buf = ( kernel_rule_t * ) myrealloc ( kernel_rules_buf , kernel_rules_avail * sizeof ( kernel_rule_t ) , INCR_RULES * sizeof ( kernel_rule_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rules_avail + = INCR_RULES ;
2015-12-04 14:47:52 +00:00
}
memset ( in , 0 , BLOCK_SIZE ) ;
memset ( out , 0 , BLOCK_SIZE ) ;
int result = _old_apply_rule ( rule_buf , rule_len , in , 1 , out ) ;
if ( result = = - 1 )
{
2016-06-19 18:42:22 +00:00
log_info ( " WARNING: Skipping invalid or unsupported rule in file %s on line %u: %s " , rp_file , rule_line , rule_buf ) ;
2015-12-04 14:47:52 +00:00
continue ;
}
2016-01-05 07:26:44 +00:00
if ( cpu_rule_to_kernel_rule ( rule_buf , rule_len , & kernel_rules_buf [ kernel_rules_cnt ] ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
2016-06-26 14:59:56 +00:00
log_info ( " WARNING: Cannot convert rule for use on OpenCL device in file %s on line %u: %s " , rp_file , rule_line , rule_buf ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
memset ( & kernel_rules_buf [ kernel_rules_cnt ] , 0 , sizeof ( kernel_rule_t ) ) ; // needs to be cleared otherwise we could have some remaining data
2015-12-04 14:47:52 +00:00
continue ;
}
2016-01-05 07:26:44 +00:00
kernel_rules_cnt + + ;
2015-12-04 14:47:52 +00:00
}
fclose ( fp ) ;
2016-01-05 07:26:44 +00:00
all_kernel_rules_cnt [ i ] = kernel_rules_cnt ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
all_kernel_rules_buf [ i ] = kernel_rules_buf ;
2015-12-04 14:47:52 +00:00
}
/**
* merge rules or automatic rule generator
*/
2016-01-05 07:26:44 +00:00
uint kernel_rules_cnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rule_t * kernel_rules_buf = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:32:56 +00:00
if ( user_options - > rp_files_cnt )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
kernel_rules_cnt = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
uint * repeats = ( uint * ) mycalloc ( user_options - > rp_files_cnt + 1 , sizeof ( uint ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
repeats [ 0 ] = kernel_rules_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
for ( uint i = 0 ; i < user_options - > rp_files_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
kernel_rules_cnt * = all_kernel_rules_cnt [ i ] ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
repeats [ i + 1 ] = kernel_rules_cnt ;
2015-12-04 14:47:52 +00:00
}
2016-01-05 07:26:44 +00:00
kernel_rules_buf = ( kernel_rule_t * ) mycalloc ( kernel_rules_cnt , sizeof ( kernel_rule_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
memset ( kernel_rules_buf , 0 , kernel_rules_cnt * sizeof ( kernel_rule_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
for ( uint i = 0 ; i < kernel_rules_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
uint out_pos = 0 ;
2016-01-05 07:26:44 +00:00
kernel_rule_t * out = & kernel_rules_buf [ i ] ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:32:56 +00:00
for ( uint j = 0 ; j < user_options - > rp_files_cnt ; j + + )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
uint in_off = ( i / repeats [ j ] ) % all_kernel_rules_cnt [ j ] ;
2015-12-04 14:47:52 +00:00
uint in_pos ;
2016-01-05 07:26:44 +00:00
kernel_rule_t * in = & all_kernel_rules_buf [ j ] [ in_off ] ;
2015-12-04 14:47:52 +00:00
for ( in_pos = 0 ; in - > cmds [ in_pos ] ; in_pos + + , out_pos + + )
{
if ( out_pos = = RULES_MAX - 1 )
{
// log_info ("WARNING: Truncating chaining of rule %d and rule %d as maximum number of function calls per rule exceeded", i, in_off);
break ;
}
out - > cmds [ out_pos ] = in - > cmds [ in_pos ] ;
}
}
}
local_free ( repeats ) ;
}
2016-09-21 19:22:02 +00:00
else if ( user_options - > rp_gen )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
uint kernel_rules_avail = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-21 19:22:02 +00:00
while ( kernel_rules_cnt < user_options - > rp_gen )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
if ( kernel_rules_avail = = kernel_rules_cnt )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
kernel_rules_buf = ( kernel_rule_t * ) myrealloc ( kernel_rules_buf , kernel_rules_avail * sizeof ( kernel_rule_t ) , INCR_RULES * sizeof ( kernel_rule_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rules_avail + = INCR_RULES ;
2015-12-04 14:47:52 +00:00
}
2016-09-08 10:17:56 +00:00
memset ( rule_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 19:22:02 +00:00
rule_len = ( int ) generate_random_rule ( rule_buf , user_options - > rp_gen_func_min , user_options - > rp_gen_func_max ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
if ( cpu_rule_to_kernel_rule ( rule_buf , rule_len , & kernel_rules_buf [ kernel_rules_cnt ] ) = = - 1 ) continue ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rules_cnt + + ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-03-26 09:37:59 +00:00
myfree ( rule_buf ) ;
2015-12-04 14:47:52 +00:00
/**
* generate NOP rules
*/
2016-09-21 18:32:56 +00:00
if ( ( user_options - > rp_files_cnt = = 0 ) & & ( user_options - > rp_gen = = 0 ) )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
kernel_rules_buf = ( kernel_rule_t * ) mymalloc ( sizeof ( kernel_rule_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rules_buf [ kernel_rules_cnt ] . cmds [ 0 ] = RULE_OP_MANGLE_NOOP ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
kernel_rules_cnt + + ;
2015-12-04 14:47:52 +00:00
}
2016-01-05 07:26:44 +00:00
data . kernel_rules_cnt = kernel_rules_cnt ;
data . kernel_rules_buf = kernel_rules_buf ;
2015-12-04 14:47:52 +00:00
2016-06-26 14:59:56 +00:00
if ( kernel_rules_cnt = = 0 )
{
log_error ( " ERROR: No valid rules left " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-26 14:59:56 +00:00
}
2016-09-14 15:40:39 +00:00
/**
* If we have a NOOP rule then we can process words from wordlists > length 32 for slow hashes
*/
int has_noop = 0 ;
for ( uint kernel_rules_pos = 0 ; kernel_rules_pos < kernel_rules_cnt ; kernel_rules_pos + + )
{
if ( kernel_rules_buf [ kernel_rules_pos ] . cmds [ 0 ] ! = RULE_OP_MANGLE_NOOP ) continue ;
if ( kernel_rules_buf [ kernel_rules_pos ] . cmds [ 1 ] ! = 0 ) continue ;
has_noop = 1 ;
}
if ( has_noop = = 0 )
{
2016-09-21 09:09:12 +00:00
switch ( user_options_extra - > attack_kern )
2016-09-14 15:40:39 +00:00
{
case ATTACK_KERN_STRAIGHT : if ( pw_max > PW_DICTMAX ) pw_max = PW_DICTMAX1 ;
break ;
case ATTACK_KERN_COMBI : if ( pw_max > PW_DICTMAX ) pw_max = PW_DICTMAX1 ;
break ;
}
}
else
{
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
{
2016-09-21 09:09:12 +00:00
switch ( user_options_extra - > attack_kern )
2016-09-14 15:40:39 +00:00
{
case ATTACK_KERN_STRAIGHT : if ( pw_max > PW_DICTMAX ) pw_max = PW_DICTMAX1 ;
break ;
case ATTACK_KERN_COMBI : if ( pw_max > PW_DICTMAX ) pw_max = PW_DICTMAX1 ;
break ;
}
}
else
{
// in this case we can process > 32
}
}
2016-09-21 14:07:49 +00:00
const int rc_devices_init = opencl_ctx_devices_init ( opencl_ctx , hashconfig , tuning_db , user_options , algorithm_pos ) ;
2016-09-21 09:09:12 +00:00
if ( rc_devices_init = = - 1 )
2016-09-18 16:30:32 +00:00
{
2016-09-21 09:09:12 +00:00
log_error ( " ERROR: opencl_ctx_devices_init() failed " ) ;
2016-09-18 16:30:32 +00:00
return - 1 ;
}
2015-12-23 14:51:55 +00:00
2016-01-13 16:10:40 +00:00
/**
* HM devices : init
*/
2016-07-08 20:57:27 +00:00
hm_attrs_t hm_adapters_adl [ DEVICES_MAX ] ;
hm_attrs_t hm_adapters_nvapi [ DEVICES_MAX ] ;
hm_attrs_t hm_adapters_nvml [ DEVICES_MAX ] ;
hm_attrs_t hm_adapters_xnvctrl [ DEVICES_MAX ] ;
memset ( hm_adapters_adl , 0 , sizeof ( hm_adapters_adl ) ) ;
memset ( hm_adapters_nvapi , 0 , sizeof ( hm_adapters_nvapi ) ) ;
memset ( hm_adapters_nvml , 0 , sizeof ( hm_adapters_nvml ) ) ;
memset ( hm_adapters_xnvctrl , 0 , sizeof ( hm_adapters_xnvctrl ) ) ;
2016-01-13 16:10:40 +00:00
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = false )
2016-01-13 16:10:40 +00:00
{
2016-06-18 08:59:58 +00:00
ADL_PTR * adl = ( ADL_PTR * ) mymalloc ( sizeof ( ADL_PTR ) ) ;
NVAPI_PTR * nvapi = ( NVAPI_PTR * ) mymalloc ( sizeof ( NVAPI_PTR ) ) ;
NVML_PTR * nvml = ( NVML_PTR * ) mymalloc ( sizeof ( NVML_PTR ) ) ;
XNVCTRL_PTR * xnvctrl = ( XNVCTRL_PTR * ) mymalloc ( sizeof ( XNVCTRL_PTR ) ) ;
2016-06-02 09:10:36 +00:00
2016-06-18 08:59:58 +00:00
data . hm_adl = NULL ;
data . hm_nvapi = NULL ;
data . hm_nvml = NULL ;
data . hm_xnvctrl = NULL ;
2016-01-13 16:10:40 +00:00
2016-09-15 14:02:52 +00:00
if ( ( opencl_ctx - > need_nvml = = 1 ) & & ( nvml_init ( nvml ) = = 0 ) )
2016-06-02 09:10:36 +00:00
{
2016-06-02 12:20:15 +00:00
data . hm_nvml = nvml ;
2016-06-02 09:10:36 +00:00
}
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
if ( data . hm_nvml )
2016-01-13 16:10:40 +00:00
{
2016-06-02 12:20:15 +00:00
if ( hm_NVML_nvmlInit ( data . hm_nvml ) = = NVML_SUCCESS )
2016-01-13 16:10:40 +00:00
{
2016-06-02 12:20:15 +00:00
HM_ADAPTER_NVML nvmlGPUHandle [ DEVICES_MAX ] = { 0 } ;
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
int tmp_in = hm_get_adapter_index_nvml ( nvmlGPUHandle ) ;
2016-01-13 16:10:40 +00:00
int tmp_out = 0 ;
for ( int i = 0 ; i < tmp_in ; i + + )
{
2016-06-03 13:37:53 +00:00
hm_adapters_nvml [ tmp_out + + ] . nvml = nvmlGPUHandle [ i ] ;
2016-01-13 16:10:40 +00:00
}
for ( int i = 0 ; i < tmp_out ; i + + )
{
unsigned int speed ;
2016-06-03 13:37:53 +00:00
if ( hm_NVML_nvmlDeviceGetFanSpeed ( data . hm_nvml , 0 , hm_adapters_nvml [ i ] . nvml , & speed ) = = NVML_SUCCESS ) hm_adapters_nvml [ i ] . fan_get_supported = 1 ;
2016-05-31 22:57:57 +00:00
2016-06-26 14:59:56 +00:00
// doesn't seem to create any advantages
//hm_NVML_nvmlDeviceSetComputeMode (data.hm_nvml, 1, hm_adapters_nvml[i].nvml, NVML_COMPUTEMODE_EXCLUSIVE_PROCESS);
//hm_NVML_nvmlDeviceSetGpuOperationMode (data.hm_nvml, 1, hm_adapters_nvml[i].nvml, NVML_GOM_ALL_ON);
2016-01-13 16:10:40 +00:00
}
}
}
2016-09-15 14:02:52 +00:00
if ( ( opencl_ctx - > need_nvapi = = 1 ) & & ( nvapi_init ( nvapi ) = = 0 ) )
2016-06-03 09:33:59 +00:00
{
data . hm_nvapi = nvapi ;
}
if ( data . hm_nvapi )
{
if ( hm_NvAPI_Initialize ( data . hm_nvapi ) = = NVAPI_OK )
{
HM_ADAPTER_NVAPI nvGPUHandle [ DEVICES_MAX ] = { 0 } ;
int tmp_in = hm_get_adapter_index_nvapi ( nvGPUHandle ) ;
int tmp_out = 0 ;
for ( int i = 0 ; i < tmp_in ; i + + )
{
2016-06-03 13:37:53 +00:00
hm_adapters_nvapi [ tmp_out + + ] . nvapi = nvGPUHandle [ i ] ;
2016-06-03 09:33:59 +00:00
}
}
}
2016-09-15 14:02:52 +00:00
if ( ( opencl_ctx - > need_xnvctrl = = 1 ) & & ( xnvctrl_init ( xnvctrl ) = = 0 ) )
2016-06-18 08:59:58 +00:00
{
data . hm_xnvctrl = xnvctrl ;
}
if ( data . hm_xnvctrl )
{
if ( hm_XNVCTRL_XOpenDisplay ( data . hm_xnvctrl ) = = 0 )
{
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-06-18 08:59:58 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-06-18 08:59:58 +00:00
if ( ( device_param - > device_type & CL_DEVICE_TYPE_GPU ) = = 0 ) continue ;
hm_adapters_xnvctrl [ device_id ] . xnvctrl = device_id ;
int speed = 0 ;
if ( get_fan_speed_current ( data . hm_xnvctrl , device_id , & speed ) = = 0 ) hm_adapters_xnvctrl [ device_id ] . fan_get_supported = 1 ;
}
}
}
2016-09-15 14:02:52 +00:00
if ( ( opencl_ctx - > need_adl = = 1 ) & & ( adl_init ( adl ) = = 0 ) )
2016-06-02 09:10:36 +00:00
{
2016-06-02 12:20:15 +00:00
data . hm_adl = adl ;
2016-06-02 09:10:36 +00:00
}
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
if ( data . hm_adl )
2016-01-13 16:10:40 +00:00
{
2016-06-02 12:20:15 +00:00
if ( hm_ADL_Main_Control_Create ( data . hm_adl , ADL_Main_Memory_Alloc , 0 ) = = ADL_OK )
2016-01-13 16:10:40 +00:00
{
// total number of adapters
int hm_adapters_num ;
2016-07-10 11:23:06 +00:00
if ( get_adapters_num_adl ( data . hm_adl , & hm_adapters_num ) ! = 0 ) return - 1 ;
2016-01-13 16:10:40 +00:00
// adapter info
2016-06-02 12:20:15 +00:00
LPAdapterInfo lpAdapterInfo = hm_get_adapter_info_adl ( data . hm_adl , hm_adapters_num ) ;
2016-01-13 16:10:40 +00:00
2016-07-10 11:23:06 +00:00
if ( lpAdapterInfo = = NULL ) return - 1 ;
2016-01-13 16:10:40 +00:00
// get a list (of ids of) valid/usable adapters
int num_adl_adapters = 0 ;
2016-01-15 16:16:43 +00:00
u32 * valid_adl_device_list = hm_get_list_valid_adl_adapters ( hm_adapters_num , & num_adl_adapters , lpAdapterInfo ) ;
2016-01-13 16:10:40 +00:00
if ( num_adl_adapters > 0 )
{
2016-09-08 07:21:25 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
// hm_get_opencl_busid_devid (hm_adapters_adl, devices_all_cnt, devices_all);
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
hm_get_adapter_index_adl ( hm_adapters_adl , valid_adl_device_list , num_adl_adapters , lpAdapterInfo ) ;
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
hm_get_overdrive_version ( data . hm_adl , hm_adapters_adl , valid_adl_device_list , num_adl_adapters , lpAdapterInfo ) ;
hm_check_fanspeed_control ( data . hm_adl , hm_adapters_adl , valid_adl_device_list , num_adl_adapters , lpAdapterInfo ) ;
2016-01-13 16:10:40 +00:00
2016-09-08 07:21:25 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
2016-01-13 16:10:40 +00:00
}
myfree ( valid_adl_device_list ) ;
myfree ( lpAdapterInfo ) ;
}
}
2016-02-04 14:07:38 +00:00
2016-06-18 09:26:51 +00:00
if ( data . hm_adl = = NULL & & data . hm_nvml = = NULL & & data . hm_xnvctrl = = NULL )
2016-02-04 14:07:38 +00:00
{
2016-09-21 18:50:14 +00:00
user_options - > gpu_temp_disable = true ;
2016-02-04 14:07:38 +00:00
}
2016-01-13 16:10:40 +00:00
}
2016-02-04 14:07:38 +00:00
/**
* OpenCL devices : allocate buffer for device specific information
*/
2016-09-15 14:02:52 +00:00
ADLOD6MemClockState * od_clock_mem_status = ( ADLOD6MemClockState * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( ADLOD6MemClockState ) ) ;
2016-02-04 14:07:38 +00:00
2016-09-15 14:02:52 +00:00
int * od_power_control_status = ( int * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( int ) ) ;
2016-02-04 14:07:38 +00:00
2016-09-15 14:02:52 +00:00
unsigned int * nvml_power_limit = ( unsigned int * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( unsigned int ) ) ;
2016-06-01 17:01:44 +00:00
2016-02-04 14:07:38 +00:00
/**
* User - defined GPU temp handling
*/
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = true )
2016-02-04 14:07:38 +00:00
{
2016-09-21 18:50:14 +00:00
user_options - > gpu_temp_abort = 0 ;
user_options - > gpu_temp_retain = 0 ;
2016-02-04 14:07:38 +00:00
}
2016-09-21 18:50:14 +00:00
data . gpu_temp_disable = user_options - > gpu_temp_disable ;
data . gpu_temp_abort = user_options - > gpu_temp_abort ;
data . gpu_temp_retain = user_options - > gpu_temp_retain ;
2016-02-04 14:07:38 +00:00
2016-05-30 08:29:18 +00:00
/**
* enable custom signal handler ( s )
*/
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = false )
2016-05-30 08:29:18 +00:00
{
hc_signal ( sigHandler_default ) ;
}
else
{
hc_signal ( sigHandler_benchmark ) ;
}
2016-02-04 14:07:38 +00:00
/**
* inform the user
*/
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false )
2016-02-04 14:07:38 +00:00
{
2016-09-16 15:01:18 +00:00
log_info ( " Hashes: %u digests; %u unique digests, %u unique salts " , hashes_cnt_orig , hashes - > digests_cnt , hashes - > salts_cnt ) ;
2016-02-04 14:07:38 +00:00
log_info ( " Bitmaps: %u bits, %u entries, 0x%08x mask, %u bytes, %u/%u rotates " , bitmap_bits , bitmap_nums , bitmap_mask , bitmap_size , bitmap_shift1 , bitmap_shift2 ) ;
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2016-02-04 14:07:38 +00:00
{
log_info ( " Rules: %u " , kernel_rules_cnt ) ;
}
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type )
2016-02-04 14:07:38 +00:00
{
log_info ( " Applicable Optimizers: " ) ;
for ( uint i = 0 ; i < 32 ; i + + )
{
const uint opti_bit = 1u < < i ;
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & opti_bit ) log_info ( " * %s " , stroptitype ( opti_bit ) ) ;
2016-02-04 14:07:38 +00:00
}
}
/**
* Watchdog and Temperature balance
*/
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = false & & data . hm_adl = = NULL & & data . hm_nvml = = NULL & & data . hm_xnvctrl = = NULL )
2016-02-04 14:07:38 +00:00
{
log_info ( " Watchdog: Hardware Monitoring Interface not found on your system " ) ;
}
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_abort = = 0 )
2016-02-04 14:07:38 +00:00
{
log_info ( " Watchdog: Temperature abort trigger disabled " ) ;
}
else
{
2016-09-21 18:50:14 +00:00
log_info ( " Watchdog: Temperature abort trigger set to %uc " , user_options - > gpu_temp_abort ) ;
2016-02-04 14:07:38 +00:00
}
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_retain = = 0 )
2016-02-04 14:07:38 +00:00
{
log_info ( " Watchdog: Temperature retain trigger disabled " ) ;
}
else
{
2016-09-21 18:50:14 +00:00
log_info ( " Watchdog: Temperature retain trigger set to %uc " , user_options - > gpu_temp_retain ) ;
2016-02-04 14:07:38 +00:00
}
2016-05-12 10:44:15 +00:00
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info ( " " ) ;
2016-02-04 14:07:38 +00:00
}
2016-01-13 16:10:40 +00:00
/**
* HM devices : copy
*/
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = false )
2016-01-13 16:10:40 +00:00
{
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-01-13 16:10:40 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-01-13 16:10:40 +00:00
if ( ( device_param - > device_type & CL_DEVICE_TYPE_GPU ) = = 0 ) continue ;
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
const uint platform_devices_id = device_param - > platform_devices_id ;
2016-01-13 16:10:40 +00:00
2016-06-03 21:10:43 +00:00
if ( device_param - > device_vendor_id = = VENDOR_ID_AMD )
2016-01-13 16:10:40 +00:00
{
2016-06-03 21:10:43 +00:00
data . hm_device [ device_id ] . adl = hm_adapters_adl [ platform_devices_id ] . adl ;
data . hm_device [ device_id ] . nvapi = 0 ;
data . hm_device [ device_id ] . nvml = 0 ;
2016-06-18 08:59:58 +00:00
data . hm_device [ device_id ] . xnvctrl = 0 ;
2016-06-03 21:10:43 +00:00
data . hm_device [ device_id ] . od_version = hm_adapters_adl [ platform_devices_id ] . od_version ;
data . hm_device [ device_id ] . fan_get_supported = hm_adapters_adl [ platform_devices_id ] . fan_get_supported ;
2016-06-18 09:26:51 +00:00
data . hm_device [ device_id ] . fan_set_supported = 0 ;
2016-01-13 16:10:40 +00:00
}
2016-06-03 21:10:43 +00:00
if ( device_param - > device_vendor_id = = VENDOR_ID_NV )
2016-01-13 16:10:40 +00:00
{
2016-06-03 21:10:43 +00:00
data . hm_device [ device_id ] . adl = 0 ;
data . hm_device [ device_id ] . nvapi = hm_adapters_nvapi [ platform_devices_id ] . nvapi ;
data . hm_device [ device_id ] . nvml = hm_adapters_nvml [ platform_devices_id ] . nvml ;
2016-06-18 08:59:58 +00:00
data . hm_device [ device_id ] . xnvctrl = hm_adapters_xnvctrl [ platform_devices_id ] . xnvctrl ;
2016-06-03 21:10:43 +00:00
data . hm_device [ device_id ] . od_version = 0 ;
data . hm_device [ device_id ] . fan_get_supported = hm_adapters_nvml [ platform_devices_id ] . fan_get_supported ;
data . hm_device [ device_id ] . fan_set_supported = 0 ;
2016-01-13 16:10:40 +00:00
}
}
}
2016-05-28 22:59:24 +00:00
/**
2016-06-01 17:01:44 +00:00
* powertune on user request
2016-05-28 22:59:24 +00:00
*/
2015-12-04 14:47:52 +00:00
2016-09-21 19:18:43 +00:00
if ( user_options - > powertune_enable = = true )
2015-12-15 11:04:22 +00:00
{
2016-09-08 07:21:25 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-01-13 16:10:40 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2016-09-15 14:02:52 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_AMD )
2015-12-15 11:04:22 +00:00
{
2016-06-01 17:01:44 +00:00
/**
* Temporary fix :
* with AMD r9 295 x cards it seems that we need to set the powertune value just AFTER the ocl init stuff
* otherwise after hc_clCreateContext ( ) etc , powertune value was set back to " normal " and cards unfortunately
* were not working @ full speed ( setting hm_ADL_Overdrive_PowerControl_Set ( ) here seems to fix the problem )
* Driver / ADL bug ?
*/
2016-01-13 16:10:40 +00:00
2016-06-01 17:01:44 +00:00
if ( data . hm_device [ device_id ] . od_version = = 6 )
2015-12-15 11:04:22 +00:00
{
2016-06-01 17:01:44 +00:00
int ADL_rc ;
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
// check powertune capabilities first, if not available then skip device
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
int powertune_supported = 0 ;
2015-12-04 14:47:52 +00:00
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive6_PowerControl_Caps ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune_supported ) ) ! = ADL_OK )
2015-12-15 11:04:22 +00:00
{
2016-06-01 17:01:44 +00:00
log_error ( " ERROR: Failed to get ADL PowerControl Capabilities " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-15 11:04:22 +00:00
}
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
// first backup current value, we will restore it later
if ( powertune_supported ! = 0 )
2015-12-15 11:04:22 +00:00
{
2016-06-01 17:01:44 +00:00
// powercontrol settings
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
ADLOD6PowerControlInfo powertune = { 0 , 0 , 0 , 0 , 0 } ;
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune ) ) = = ADL_OK )
2016-06-01 17:01:44 +00:00
{
2016-06-03 13:37:53 +00:00
ADL_rc = hm_ADL_Overdrive_PowerControl_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & od_power_control_status [ device_id ] ) ;
2016-06-01 17:01:44 +00:00
}
if ( ADL_rc ! = ADL_OK )
{
log_error ( " ERROR: Failed to get current ADL PowerControl settings " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , powertune . iMaxValue ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_error ( " ERROR: Failed to set new ADL PowerControl values " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
// clocks
memset ( & od_clock_mem_status [ device_id ] , 0 , sizeof ( ADLOD6MemClockState ) ) ;
od_clock_mem_status [ device_id ] . state . iNumberOfPerformanceLevels = 2 ;
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_StateInfo_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE , & od_clock_mem_status [ device_id ] ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_error ( " ERROR: Failed to get ADL memory and engine clock frequency " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
// Query capabilities only to see if profiles were not "damaged", if so output a warning but do accept the users profile settings
ADLOD6Capabilities caps = { 0 , 0 , 0 , { 0 , 0 , 0 } , { 0 , 0 , 0 } , 0 , 0 } ;
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_Capabilities_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & caps ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_error ( " ERROR: Failed to get ADL device capabilities " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2016-08-28 19:44:19 +00:00
int engine_clock_max = ( int ) ( 0.6666 * caps . sEngineClockRange . iMax ) ;
int memory_clock_max = ( int ) ( 0.6250 * caps . sMemoryClockRange . iMax ) ;
2016-06-01 17:01:44 +00:00
2016-08-28 19:44:19 +00:00
int warning_trigger_engine = ( int ) ( 0.25 * engine_clock_max ) ;
int warning_trigger_memory = ( int ) ( 0.25 * memory_clock_max ) ;
2016-06-01 17:01:44 +00:00
int engine_clock_profile_max = od_clock_mem_status [ device_id ] . state . aLevels [ 1 ] . iEngineClock ;
int memory_clock_profile_max = od_clock_mem_status [ device_id ] . state . aLevels [ 1 ] . iMemoryClock ;
// warning if profile has too low max values
if ( ( engine_clock_max - engine_clock_profile_max ) > warning_trigger_engine )
{
2016-06-19 14:36:41 +00:00
log_info ( " WARN: The custom profile seems to have too low maximum engine clock values. You therefore may not reach full performance " ) ;
2016-06-01 17:01:44 +00:00
}
if ( ( memory_clock_max - memory_clock_profile_max ) > warning_trigger_memory )
{
2016-06-19 14:36:41 +00:00
log_info ( " WARN: The custom profile seems to have too low maximum memory clock values. You therefore may not reach full performance " ) ;
2016-06-01 17:01:44 +00:00
}
ADLOD6StateInfo * performance_state = ( ADLOD6StateInfo * ) mycalloc ( 1 , sizeof ( ADLOD6StateInfo ) + sizeof ( ADLOD6PerformanceLevel ) ) ;
performance_state - > iNumberOfPerformanceLevels = 2 ;
performance_state - > aLevels [ 0 ] . iEngineClock = engine_clock_profile_max ;
performance_state - > aLevels [ 1 ] . iEngineClock = engine_clock_profile_max ;
performance_state - > aLevels [ 0 ] . iMemoryClock = memory_clock_profile_max ;
performance_state - > aLevels [ 1 ] . iMemoryClock = memory_clock_profile_max ;
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_State_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , ADL_OD6_SETSTATE_PERFORMANCE , performance_state ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_info ( " ERROR: Failed to set ADL performance state " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
local_free ( performance_state ) ;
}
// set powertune value only
if ( powertune_supported ! = 0 )
{
// powertune set
ADLOD6PowerControlInfo powertune = { 0 , 0 , 0 , 0 , 0 } ;
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_error ( " ERROR: Failed to get current ADL PowerControl settings " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2016-06-03 13:37:53 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , powertune . iMaxValue ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_error ( " ERROR: Failed to set new ADL PowerControl values " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
}
}
}
2016-09-15 14:02:52 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_NV )
2016-06-01 17:01:44 +00:00
{
// first backup current value, we will restore it later
unsigned int limit ;
int powertune_supported = 0 ;
2016-06-03 13:37:53 +00:00
if ( hm_NVML_nvmlDeviceGetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , & limit ) = = NVML_SUCCESS )
2016-06-01 17:01:44 +00:00
{
powertune_supported = 1 ;
}
// if backup worked, activate the maximum allowed
if ( powertune_supported ! = 0 )
{
unsigned int minLimit ;
unsigned int maxLimit ;
2016-06-03 13:37:53 +00:00
if ( hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , & minLimit , & maxLimit ) = = NVML_SUCCESS )
2016-06-01 17:01:44 +00:00
{
if ( maxLimit > 0 )
{
2016-06-03 13:37:53 +00:00
if ( hm_NVML_nvmlDeviceSetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , maxLimit ) = = NVML_SUCCESS )
2016-06-01 17:01:44 +00:00
{
// now we can be sure we need to reset later
nvml_power_limit [ device_id ] = limit ;
}
}
2015-12-15 11:04:22 +00:00
}
}
2015-12-04 14:47:52 +00:00
}
2015-12-15 11:04:22 +00:00
}
2016-01-13 16:10:40 +00:00
2016-09-08 07:21:25 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
}
2016-05-29 22:05:46 +00:00
2016-09-07 20:29:57 +00:00
# if defined (DEBUG)
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true ) log_info ( " Hashmode: %d " , hashconfig - > hash_mode ) ;
2016-01-24 21:48:01 +00:00
# endif
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Initializing device kernels and memory... " ) ;
2016-05-12 10:44:15 +00:00
2016-09-17 15:05:01 +00:00
session_ctx_t * session_ctx = ( session_ctx_t * ) mymalloc ( sizeof ( session_ctx_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-17 15:05:01 +00:00
data . session_ctx = session_ctx ;
2016-05-15 11:22:31 +00:00
2016-09-21 21:06:11 +00:00
session_ctx_init ( session_ctx , kernel_rules_cnt , kernel_rules_buf , bitmap_size , bitmap_mask , bitmap_shift1 , bitmap_shift2 , bitmap_s1_a , bitmap_s1_b , bitmap_s1_c , bitmap_s1_d , bitmap_s2_a , bitmap_s2_b , bitmap_s2_c , bitmap_s2_d ) ;
2016-05-26 14:45:52 +00:00
2016-09-21 21:06:11 +00:00
opencl_session_begin ( opencl_ctx , hashconfig , hashes , session_ctx , user_options , user_options_extra , folder_config ) ;
2016-07-10 11:23:06 +00:00
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " " ) ;
2016-05-26 14:45:52 +00:00
2016-09-17 15:05:01 +00:00
/**
* Store initial fanspeed if gpu_temp_retain is enabled
*/
2016-05-26 14:45:52 +00:00
2016-09-22 08:55:33 +00:00
if ( user_options - > gpu_temp_disable = = false )
2016-09-17 15:05:01 +00:00
{
2016-09-22 08:55:33 +00:00
if ( user_options - > gpu_temp_retain )
{
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
{
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
if ( device_param - > skipped ) continue ;
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
2016-05-26 14:45:52 +00:00
2016-09-22 08:55:33 +00:00
if ( data . hm_device [ device_id ] . fan_get_supported = = 1 )
{
const int fanspeed = hm_get_fanspeed_with_device_id ( opencl_ctx , device_id ) ;
const int fanpolicy = hm_get_fanpolicy_with_device_id ( opencl_ctx , device_id ) ;
2016-05-26 14:45:52 +00:00
2016-09-22 08:55:33 +00:00
// we also set it to tell the OS we take control over the fan and it's automatic controller
// if it was set to automatic. we do not control user-defined fanspeeds.
2015-12-04 14:47:52 +00:00
2016-09-22 08:55:33 +00:00
if ( fanpolicy = = 1 )
{
data . hm_device [ device_id ] . fan_set_supported = 1 ;
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
int rc = - 1 ;
2016-05-15 11:22:31 +00:00
2016-09-22 08:55:33 +00:00
if ( device_param - > device_vendor_id = = VENDOR_ID_AMD )
{
rc = hm_set_fanspeed_with_device_id_adl ( device_id , fanspeed , 1 ) ;
}
else if ( device_param - > device_vendor_id = = VENDOR_ID_NV )
{
# if defined (__linux__)
rc = set_fan_control ( data . hm_xnvctrl , data . hm_device [ device_id ] . xnvctrl , NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE ) ;
# endif
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
# if defined (_WIN)
rc = hm_set_fanspeed_with_device_id_nvapi ( device_id , fanspeed , 1 ) ;
# endif
}
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
if ( rc = = 0 )
{
data . hm_device [ device_id ] . fan_set_supported = 1 ;
}
else
{
log_info ( " WARNING: Failed to set initial fan speed for device #%u " , device_id + 1 ) ;
2016-07-10 11:23:06 +00:00
2016-09-22 08:55:33 +00:00
data . hm_device [ device_id ] . fan_set_supported = 0 ;
}
}
else
{
data . hm_device [ device_id ] . fan_set_supported = 0 ;
}
2016-07-10 11:23:06 +00:00
}
2016-06-18 16:21:40 +00:00
2016-09-22 08:55:33 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
}
}
}
/**
2016-04-24 10:24:21 +00:00
* In benchmark - mode , inform user which algorithm is checked
2015-12-04 14:47:52 +00:00
*/
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:32:38 +00:00
if ( user_options - > machine_readable = = false )
2016-05-17 09:29:38 +00:00
{
2016-09-21 14:07:49 +00:00
//quiet = 0;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
//user_options->quiet = quiet;
2015-12-04 14:47:52 +00:00
2016-09-09 14:54:48 +00:00
char * hash_type = strhashtype ( hashconfig - > hash_mode ) ; // not a bug
2015-12-04 14:47:52 +00:00
2016-05-17 09:29:38 +00:00
log_info ( " Hashtype: %s " , hash_type ) ;
log_info ( " " ) ;
}
2015-12-04 14:47:52 +00:00
}
/**
* keep track of the progress
*/
2016-09-16 15:01:18 +00:00
data . words_progress_done = ( u64 * ) mycalloc ( hashes - > salts_cnt , sizeof ( u64 ) ) ;
data . words_progress_rejected = ( u64 * ) mycalloc ( hashes - > salts_cnt , sizeof ( u64 ) ) ;
data . words_progress_restored = ( u64 * ) mycalloc ( hashes - > salts_cnt , sizeof ( u64 ) ) ;
2015-12-04 14:47:52 +00:00
/**
* open filehandles
*/
2016-09-07 20:29:57 +00:00
# if defined (_WIN)
2015-12-04 14:47:52 +00:00
if ( _setmode ( _fileno ( stdin ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stdin " , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( _setmode ( _fileno ( stdout ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stdout " , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( _setmode ( _fileno ( stderr ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stderr " , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
# endif
/**
* dictionary pad
*/
wl_data_t * wl_data = ( wl_data_t * ) mymalloc ( sizeof ( wl_data_t ) ) ;
2016-09-22 09:35:08 +00:00
wl_data_init ( wl_data , user_options , hashconfig ) ;
2015-12-04 14:47:52 +00:00
cs_t * css_buf = NULL ;
uint css_cnt = 0 ;
uint dictcnt = 0 ;
uint maskcnt = 1 ;
char * * masks = NULL ;
char * * dictfiles = NULL ;
uint mask_from_file = 0 ;
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:25:36 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
2015-12-04 14:47:52 +00:00
{
2016-09-21 09:09:12 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 1 ) ;
2015-12-04 14:47:52 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
{
2016-09-21 09:09:12 +00:00
char * l0_filename = myargv [ user_options_extra - > optind + 1 + i ] ;
2015-12-04 14:47:52 +00:00
struct stat l0_stat ;
if ( stat ( l0_filename , & l0_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l0_filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
uint is_dir = S_ISDIR ( l0_stat . st_mode ) ;
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = l0_filename ;
}
else
{
// do not allow --keyspace w/ a directory
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-06-19 14:36:41 +00:00
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
char * * dictionary_files = NULL ;
dictionary_files = scan_directory ( l0_filename ) ;
if ( dictionary_files ! = NULL )
{
qsort ( dictionary_files , count_dictionaries ( dictionary_files ) , sizeof ( char * ) , sort_by_stringptr ) ;
for ( int d = 0 ; dictionary_files [ d ] ! = NULL ; d + + )
{
char * l1_filename = dictionary_files [ d ] ;
struct stat l1_stat ;
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l1_filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( S_ISREG ( l1_stat . st_mode ) )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
2016-09-07 09:16:31 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
2015-12-04 14:47:52 +00:00
}
}
}
local_free ( dictionary_files ) ;
}
}
if ( dictcnt < 1 )
{
log_error ( " ERROR: No usable dictionary file found. " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
2015-12-04 14:47:52 +00:00
{
dictcnt = 1 ;
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_COMBI )
2015-12-04 14:47:52 +00:00
{
// display
2016-09-21 09:09:12 +00:00
char * dictfile1 = myargv [ user_options_extra - > optind + 1 + 0 ] ;
char * dictfile2 = myargv [ user_options_extra - > optind + 1 + 1 ] ;
2015-12-04 14:47:52 +00:00
// find the bigger dictionary and use as base
2016-01-24 12:25:47 +00:00
FILE * fp1 = NULL ;
FILE * fp2 = NULL ;
2015-12-04 14:47:52 +00:00
struct stat tmp_stat ;
if ( ( fp1 = fopen ( dictfile1 , " rb " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile1 , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( stat ( dictfile1 , & tmp_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , dictfile1 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( S_ISDIR ( tmp_stat . st_mode ) )
{
log_error ( " ERROR: %s must be a regular file " , dictfile1 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( ( fp2 = fopen ( dictfile2 , " rb " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( stat ( dictfile2 , & tmp_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( S_ISDIR ( tmp_stat . st_mode ) )
{
log_error ( " ERROR: %s must be a regular file " , dictfile2 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
data . combs_cnt = 1 ;
2016-09-21 14:07:49 +00:00
//user_options->quiet = 1;
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
const u64 words1_cnt = count_words ( wl_data , fp1 , dictfile1 , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
//user_options->quiet = quiet;
2015-12-04 14:47:52 +00:00
if ( words1_cnt = = 0 )
{
log_error ( " ERROR: %s: empty file " , dictfile1 ) ;
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
data . combs_cnt = 1 ;
2016-09-21 14:07:49 +00:00
//user_options->quiet = 1;
2015-12-04 14:47:52 +00:00
2016-09-09 21:17:43 +00:00
const u64 words2_cnt = count_words ( wl_data , fp2 , dictfile2 , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
//user_options->quiet = quiet;
2015-12-04 14:47:52 +00:00
if ( words2_cnt = = 0 )
{
log_error ( " ERROR: %s: empty file " , dictfile2 ) ;
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
fclose ( fp1 ) ;
fclose ( fp2 ) ;
data . dictfile = dictfile1 ;
data . dictfile2 = dictfile2 ;
if ( words1_cnt > = words2_cnt )
{
data . combs_cnt = words2_cnt ;
data . combs_mode = COMBINATOR_MODE_BASE_LEFT ;
dictfiles = & data . dictfile ;
dictcnt = 1 ;
}
else
{
data . combs_cnt = words1_cnt ;
data . combs_mode = COMBINATOR_MODE_BASE_RIGHT ;
dictfiles = & data . dictfile2 ;
dictcnt = 1 ;
// we also have to switch wordlist related rules!
char * tmpc = data . rule_buf_l ;
data . rule_buf_l = data . rule_buf_r ;
data . rule_buf_r = tmpc ;
int tmpi = data . rule_len_l ;
data . rule_len_l = data . rule_len_r ;
data . rule_len_r = tmpi ;
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
char * mask = NULL ;
maskcnt = 0 ;
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 09:09:12 +00:00
mask = myargv [ user_options_extra - > optind + 1 ] ;
2015-12-04 14:47:52 +00:00
masks = ( char * * ) mymalloc ( INCR_MASKS * sizeof ( char * ) ) ;
2016-09-21 09:09:12 +00:00
if ( ( user_options_extra - > optind + 2 ) < = myargc )
2015-12-04 14:47:52 +00:00
{
struct stat file_stat ;
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
{
2016-09-21 09:09:12 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 1 ) ;
2015-12-04 14:47:52 +00:00
uint masks_avail = INCR_MASKS ;
for ( int i = 0 ; i < wls_left ; i + + )
{
if ( i ! = 0 )
{
2016-09-21 09:09:12 +00:00
mask = myargv [ user_options_extra - > optind + 1 + i ] ;
2015-12-04 14:47:52 +00:00
if ( stat ( mask , & file_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
uint is_file = S_ISREG ( file_stat . st_mode ) ;
if ( is_file = = 1 )
{
FILE * mask_fp ;
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-08 10:17:56 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
while ( ! feof ( mask_fp ) )
{
2016-09-08 10:17:56 +00:00
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
if ( line_len = = 0 ) continue ;
if ( line_buf [ 0 ] = = ' # ' ) continue ;
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
masks_avail + = INCR_MASKS ;
}
masks [ maskcnt ] = mystrdup ( line_buf ) ;
maskcnt + + ;
}
2016-03-26 09:37:59 +00:00
myfree ( line_buf ) ;
2015-12-04 14:47:52 +00:00
fclose ( mask_fp ) ;
}
else
{
log_error ( " ERROR: %s: unsupported file-type " , mask ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
mask_from_file = 1 ;
}
}
else
{
2016-09-21 14:42:49 +00:00
user_options - > custom_charset_1 = ( char * ) " ?l?d?u " ;
user_options - > custom_charset_2 = ( char * ) " ?l?d " ;
user_options - > custom_charset_3 = ( char * ) " ?l?d*!$@_ " ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:42:49 +00:00
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig ) ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig ) ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-19 14:09:28 +00:00
maskcnt = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-19 14:09:28 +00:00
masks [ maskcnt - 1 ] = mystrdup ( " ?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d " ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 19:02:49 +00:00
user_options - > increment = true ;
2015-12-04 14:47:52 +00:00
}
}
else
{
/**
* generate full masks and charsets
*/
2016-09-12 08:16:42 +00:00
mask = hashconfig_benchmark_mask ( hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-12 08:16:42 +00:00
pw_min = mp_get_length ( mask ) ;
pw_max = pw_min ;
masks = ( char * * ) mymalloc ( sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
2016-09-21 19:02:49 +00:00
user_options - > increment = true ;
2015-12-04 14:47:52 +00:00
}
dictfiles = ( char * * ) mycalloc ( pw_max , sizeof ( char * ) ) ;
2016-09-21 19:02:49 +00:00
if ( user_options - > increment = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-21 19:02:49 +00:00
if ( user_options - > increment_min > pw_min ) pw_min = user_options - > increment_min ;
if ( user_options - > increment_max < pw_max ) pw_max = user_options - > increment_max ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 )
2015-12-04 14:47:52 +00:00
{
data . combs_mode = COMBINATOR_MODE_BASE_LEFT ;
// display
char * mask = myargv [ myargc - 1 ] ;
maskcnt = 0 ;
masks = ( char * * ) mymalloc ( 1 * sizeof ( char * ) ) ;
// mod
struct stat file_stat ;
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
{
uint is_file = S_ISREG ( file_stat . st_mode ) ;
if ( is_file = = 1 )
{
FILE * mask_fp ;
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-08 10:17:56 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
uint masks_avail = 1 ;
while ( ! feof ( mask_fp ) )
{
2016-09-08 10:17:56 +00:00
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
if ( line_len = = 0 ) continue ;
if ( line_buf [ 0 ] = = ' # ' ) continue ;
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
masks_avail + = INCR_MASKS ;
}
masks [ maskcnt ] = mystrdup ( line_buf ) ;
maskcnt + + ;
}
2016-03-26 09:37:59 +00:00
myfree ( line_buf ) ;
2015-12-04 14:47:52 +00:00
fclose ( mask_fp ) ;
mask_from_file = 1 ;
}
else
{
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
}
// base
2016-09-21 09:09:12 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 2 ) ;
2015-12-04 14:47:52 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
{
2016-09-21 09:09:12 +00:00
char * filename = myargv [ user_options_extra - > optind + 1 + i ] ;
2015-12-04 14:47:52 +00:00
struct stat file_stat ;
if ( stat ( filename , & file_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
uint is_dir = S_ISDIR ( file_stat . st_mode ) ;
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = filename ;
}
else
{
// do not allow --keyspace w/ a directory
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-06-19 14:36:41 +00:00
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
char * * dictionary_files = NULL ;
dictionary_files = scan_directory ( filename ) ;
if ( dictionary_files ! = NULL )
{
qsort ( dictionary_files , count_dictionaries ( dictionary_files ) , sizeof ( char * ) , sort_by_stringptr ) ;
for ( int d = 0 ; dictionary_files [ d ] ! = NULL ; d + + )
{
char * l1_filename = dictionary_files [ d ] ;
struct stat l1_stat ;
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l1_filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( S_ISREG ( l1_stat . st_mode ) )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
2016-09-07 09:16:31 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
2015-12-04 14:47:52 +00:00
}
}
}
local_free ( dictionary_files ) ;
}
}
if ( dictcnt < 1 )
{
log_error ( " ERROR: No usable dictionary file found. " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 19:02:49 +00:00
if ( user_options - > increment = = true )
2015-12-04 14:47:52 +00:00
{
maskcnt = 0 ;
2016-09-21 19:02:49 +00:00
uint mask_min = user_options - > increment_min ; // we can't reject smaller masks here
uint mask_max = ( user_options - > increment_max < pw_max ) ? user_options - > increment_max : pw_max ;
2015-12-04 14:47:52 +00:00
for ( uint mask_cur = mask_min ; mask_cur < = mask_max ; mask_cur + + )
{
char * cur_mask = mp_get_truncated_mask ( mask , strlen ( mask ) , mask_cur ) ;
if ( cur_mask = = NULL ) break ;
masks [ maskcnt ] = cur_mask ;
maskcnt + + ;
masks = ( char * * ) myrealloc ( masks , maskcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
}
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
2015-12-04 14:47:52 +00:00
{
data . combs_mode = COMBINATOR_MODE_BASE_RIGHT ;
// display
2016-09-21 09:09:12 +00:00
char * mask = myargv [ user_options_extra - > optind + 1 + 0 ] ;
2015-12-04 14:47:52 +00:00
maskcnt = 0 ;
masks = ( char * * ) mymalloc ( 1 * sizeof ( char * ) ) ;
// mod
struct stat file_stat ;
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
{
uint is_file = S_ISREG ( file_stat . st_mode ) ;
if ( is_file = = 1 )
{
FILE * mask_fp ;
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-08 10:17:56 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
uint masks_avail = 1 ;
while ( ! feof ( mask_fp ) )
{
2016-09-08 10:17:56 +00:00
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
if ( line_len = = 0 ) continue ;
if ( line_buf [ 0 ] = = ' # ' ) continue ;
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
masks_avail + = INCR_MASKS ;
}
masks [ maskcnt ] = mystrdup ( line_buf ) ;
maskcnt + + ;
}
2016-03-26 09:37:59 +00:00
myfree ( line_buf ) ;
2015-12-04 14:47:52 +00:00
fclose ( mask_fp ) ;
mask_from_file = 1 ;
}
else
{
maskcnt = 1 ;
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
}
// base
2016-09-21 09:09:12 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 2 ) ;
2015-12-04 14:47:52 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
{
2016-09-21 09:09:12 +00:00
char * filename = myargv [ user_options_extra - > optind + 2 + i ] ;
2015-12-04 14:47:52 +00:00
struct stat file_stat ;
if ( stat ( filename , & file_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
uint is_dir = S_ISDIR ( file_stat . st_mode ) ;
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = filename ;
}
else
{
// do not allow --keyspace w/ a directory
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-06-19 14:36:41 +00:00
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
char * * dictionary_files = NULL ;
dictionary_files = scan_directory ( filename ) ;
if ( dictionary_files ! = NULL )
{
qsort ( dictionary_files , count_dictionaries ( dictionary_files ) , sizeof ( char * ) , sort_by_stringptr ) ;
for ( int d = 0 ; dictionary_files [ d ] ! = NULL ; d + + )
{
char * l1_filename = dictionary_files [ d ] ;
struct stat l1_stat ;
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l1_filename , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( S_ISREG ( l1_stat . st_mode ) )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
dictcnt + + ;
2016-09-07 09:16:31 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
2015-12-04 14:47:52 +00:00
}
}
}
local_free ( dictionary_files ) ;
}
}
if ( dictcnt < 1 )
{
log_error ( " ERROR: No usable dictionary file found. " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 19:02:49 +00:00
if ( user_options - > increment = = true )
2015-12-04 14:47:52 +00:00
{
maskcnt = 0 ;
2016-09-21 19:02:49 +00:00
uint mask_min = user_options - > increment_min ; // we can't reject smaller masks here
uint mask_max = ( user_options - > increment_max < pw_max ) ? user_options - > increment_max : pw_max ;
2015-12-04 14:47:52 +00:00
for ( uint mask_cur = mask_min ; mask_cur < = mask_max ; mask_cur + + )
{
char * cur_mask = mp_get_truncated_mask ( mask , strlen ( mask ) , mask_cur ) ;
if ( cur_mask = = NULL ) break ;
masks [ maskcnt ] = cur_mask ;
maskcnt + + ;
masks = ( char * * ) myrealloc ( masks , maskcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
}
}
}
data . pw_min = pw_min ;
data . pw_max = pw_max ;
2016-09-13 11:06:55 +00:00
/**
* weak hash check
*/
potfile_write_open ( potfile_ctx ) ;
2015-12-04 14:47:52 +00:00
/**
* weak hash check
*/
2016-09-21 19:19:53 +00:00
if ( user_options - > weak_hash_threshold > = hashes - > salts_cnt )
2015-12-04 14:47:52 +00:00
{
2016-02-05 14:27:09 +00:00
hc_device_param_t * device_param = NULL ;
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-01-16 11:24:08 +00:00
{
2016-09-15 14:02:52 +00:00
device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-01-16 11:24:08 +00:00
if ( device_param - > skipped ) continue ;
break ;
}
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Checking for weak hashes... " ) ;
2015-12-04 14:47:52 +00:00
2016-09-16 15:01:18 +00:00
for ( uint salt_pos = 0 ; salt_pos < hashes - > salts_cnt ; salt_pos + + )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
weak_hash_check ( opencl_ctx , device_param , hashconfig , hashes , salt_pos ) ;
2015-12-04 14:47:52 +00:00
}
2016-05-12 10:44:15 +00:00
// Display hack, guarantee that there is at least one \r before real start
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
//if (user_options->quiet == false) log_info ("");
2016-05-12 10:44:15 +00:00
}
2015-12-04 14:47:52 +00:00
/**
* status and monitor threads
*/
2016-06-26 14:09:05 +00:00
uint inner_threads_cnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-06-26 14:09:05 +00:00
hc_thread_t * inner_threads = ( hc_thread_t * ) mycalloc ( 10 , sizeof ( hc_thread_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-06-27 10:13:46 +00:00
data . shutdown_inner = 0 ;
2015-12-04 14:47:52 +00:00
/**
* Outfile remove
*/
2016-09-21 14:32:38 +00:00
if ( user_options - > keyspace = = false & & user_options - > benchmark = = false & & user_options - > stdout_flag = = false )
2015-12-04 14:47:52 +00:00
{
2016-06-27 10:13:46 +00:00
hc_thread_create ( inner_threads [ inner_threads_cnt ] , thread_monitor , NULL ) ;
inner_threads_cnt + + ;
2016-09-21 19:14:06 +00:00
if ( user_options - > outfile_check_timer ! = 0 )
2015-12-04 14:47:52 +00:00
{
if ( data . outfile_check_directory ! = NULL )
{
2016-09-19 13:52:01 +00:00
if ( ( hashconfig - > hash_mode ! = 5200 ) & &
! ( ( hashconfig - > hash_mode > = 6200 ) & & ( hashconfig - > hash_mode < = 6299 ) ) & &
! ( ( hashconfig - > hash_mode > = 13700 ) & & ( hashconfig - > hash_mode < = 13799 ) ) & &
2016-09-09 14:54:48 +00:00
( hashconfig - > hash_mode ! = 9000 ) )
2015-12-04 14:47:52 +00:00
{
2016-06-26 14:09:05 +00:00
hc_thread_create ( inner_threads [ inner_threads_cnt ] , thread_outfile_remove , NULL ) ;
2015-12-04 14:47:52 +00:00
2016-06-26 14:09:05 +00:00
inner_threads_cnt + + ;
2015-12-04 14:47:52 +00:00
}
else
{
2016-09-21 19:14:06 +00:00
user_options - > outfile_check_timer = 0 ;
2015-12-04 14:47:52 +00:00
}
}
else
{
2016-09-21 19:14:06 +00:00
user_options - > outfile_check_timer = 0 ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-21 19:14:06 +00:00
data . outfile_check_timer = user_options - > outfile_check_timer ;
2016-09-10 10:16:16 +00:00
2015-12-04 14:47:52 +00:00
/**
2016-09-10 10:16:16 +00:00
* main loop
2015-12-04 14:47:52 +00:00
*/
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false )
2015-12-04 14:47:52 +00:00
{
if ( potfile_remove_cracks > 0 )
{
2016-09-10 10:16:16 +00:00
if ( potfile_remove_cracks = = 1 ) log_info ( " INFO: Removed 1 hash found in potfile \n " ) ;
else log_info ( " INFO: Removed %d hashes found in potfile \n " , potfile_remove_cracks ) ;
2015-12-04 14:47:52 +00:00
}
}
char * * induction_dictionaries = NULL ;
int induction_dictionaries_cnt = 0 ;
hcstat_table_t * root_table_buf = NULL ;
hcstat_table_t * markov_table_buf = NULL ;
uint initial_restore_done = 0 ;
data . maskcnt = maskcnt ;
for ( uint maskpos = rd - > maskpos ; maskpos < maskcnt ; maskpos + + )
{
2016-09-19 13:52:01 +00:00
//opencl_ctx->run_main_level1 = true;
//opencl_ctx->run_main_level2 = true;
opencl_ctx - > run_main_level3 = true ;
opencl_ctx - > run_thread_level1 = true ;
opencl_ctx - > run_thread_level2 = true ;
2016-06-26 07:47:02 +00:00
2015-12-04 14:47:52 +00:00
if ( maskpos > rd - > maskpos )
{
rd - > dictpos = 0 ;
}
rd - > maskpos = maskpos ;
data . maskpos = maskpos ;
2016-09-21 14:30:23 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 | | user_options - > attack_mode = = ATTACK_MODE_HYBRID2 | | user_options - > attack_mode = = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
char * mask = masks [ maskpos ] ;
if ( mask_from_file = = 1 )
{
if ( mask [ 0 ] = = ' \\ ' & & mask [ 1 ] = = ' # ' ) mask + + ; // escaped comment sign (sharp) "\#"
char * str_ptr ;
uint str_pos ;
uint mask_offset = 0 ;
uint separator_cnt ;
for ( separator_cnt = 0 ; separator_cnt < 4 ; separator_cnt + + )
{
str_ptr = strstr ( mask + mask_offset , " , " ) ;
if ( str_ptr = = NULL ) break ;
str_pos = str_ptr - mask ;
// escaped separator, i.e. "\,"
if ( str_pos > 0 )
{
if ( mask [ str_pos - 1 ] = = ' \\ ' )
{
separator_cnt - - ;
mask_offset = str_pos + 1 ;
continue ;
}
}
// reset the offset
mask_offset = 0 ;
mask [ str_pos ] = ' \0 ' ;
switch ( separator_cnt )
{
case 0 :
mp_reset_usr ( mp_usr , 0 ) ;
2016-09-21 14:42:49 +00:00
user_options - > custom_charset_1 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig ) ;
2015-12-04 14:47:52 +00:00
break ;
case 1 :
mp_reset_usr ( mp_usr , 1 ) ;
2016-09-21 14:42:49 +00:00
user_options - > custom_charset_2 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig ) ;
2015-12-04 14:47:52 +00:00
break ;
case 2 :
mp_reset_usr ( mp_usr , 2 ) ;
2016-09-21 14:42:49 +00:00
user_options - > custom_charset_3 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig ) ;
2015-12-04 14:47:52 +00:00
break ;
case 3 :
mp_reset_usr ( mp_usr , 3 ) ;
2016-09-21 14:42:49 +00:00
user_options - > custom_charset_4 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_4 , 3 , hashconfig ) ;
2015-12-04 14:47:52 +00:00
break ;
}
mask = mask + str_pos + 1 ;
}
2016-07-04 10:47:16 +00:00
/**
* What follows is a very special case where " \ , " is within the mask field of a line in a . hcmask file only because otherwise ( without the " \" )
* it would be interpreted as a custom charset definition .
*
* We need to replace all " \ , " with just " , " within the mask ( but allow the special case " \\ , " which means " \" followed by " , " )
* Note : " \\ " is not needed to replace all " \" within the mask! The meaning of " \ \ " within a line containing the string " \ \ , " is just to allow " \ " followed by " , "
*/
uint mask_len_cur = strlen ( mask ) ;
uint mask_out_pos = 0 ;
char mask_prev = 0 ;
for ( uint mask_iter = 0 ; mask_iter < mask_len_cur ; mask_iter + + , mask_out_pos + + )
{
if ( mask [ mask_iter ] = = ' , ' )
{
if ( mask_prev = = ' \\ ' )
{
mask_out_pos - = 1 ; // this means: skip the previous "\"
}
}
mask_prev = mask [ mask_iter ] ;
mask [ mask_out_pos ] = mask [ mask_iter ] ;
}
mask [ mask_out_pos ] = ' \0 ' ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:25:36 +00:00
if ( ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 ) | | ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 ) )
2015-12-04 14:47:52 +00:00
{
if ( maskpos > 0 )
{
local_free ( css_buf ) ;
local_free ( data . root_css_buf ) ;
local_free ( data . markov_css_buf ) ;
local_free ( masks [ maskpos - 1 ] ) ;
}
2016-09-09 14:54:48 +00:00
css_buf = mp_gen_css ( mask , strlen ( mask ) , mp_sys , mp_usr , & css_cnt , hashconfig ) ;
2015-12-04 14:47:52 +00:00
data . mask = mask ;
data . css_cnt = css_cnt ;
data . css_buf = css_buf ;
2016-01-15 18:51:47 +00:00
uint uniq_tbls [ SP_PW_MAX ] [ CHARSIZ ] = { { 0 } } ;
2015-12-04 14:47:52 +00:00
mp_css_to_uniq_tbl ( css_cnt , css_buf , uniq_tbls ) ;
if ( root_table_buf = = NULL ) root_table_buf = ( hcstat_table_t * ) mycalloc ( SP_ROOT_CNT , sizeof ( hcstat_table_t ) ) ;
if ( markov_table_buf = = NULL ) markov_table_buf = ( hcstat_table_t * ) mycalloc ( SP_MARKOV_CNT , sizeof ( hcstat_table_t ) ) ;
2016-09-21 21:06:11 +00:00
sp_setup_tbl ( folder_config - > shared_dir , user_options - > markov_hcstat , user_options - > markov_disable , user_options - > markov_classic , root_table_buf , markov_table_buf ) ;
2015-12-04 14:47:52 +00:00
cs_t * root_css_buf = ( cs_t * ) mycalloc ( SP_PW_MAX , sizeof ( cs_t ) ) ;
cs_t * markov_css_buf = ( cs_t * ) mycalloc ( SP_PW_MAX * CHARSIZ , sizeof ( cs_t ) ) ;
data . root_css_buf = root_css_buf ;
data . markov_css_buf = markov_css_buf ;
2016-09-21 19:07:57 +00:00
sp_tbl_to_css ( root_table_buf , markov_table_buf , root_css_buf , markov_css_buf , user_options - > markov_threshold , uniq_tbls ) ;
2015-12-04 14:47:52 +00:00
data . combs_cnt = sp_get_sum ( 0 , css_cnt , root_css_buf ) ;
local_free ( root_table_buf ) ;
local_free ( markov_table_buf ) ;
// args
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2015-12-04 14:47:52 +00:00
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
device_param - > kernel_params_mp [ 0 ] = & device_param - > d_combs ;
device_param - > kernel_params_mp [ 1 ] = & device_param - > d_root_css_buf ;
device_param - > kernel_params_mp [ 2 ] = & device_param - > d_markov_css_buf ;
device_param - > kernel_params_mp_buf64 [ 3 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 4 ] = css_cnt ;
device_param - > kernel_params_mp_buf32 [ 5 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 6 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 7 ] = 0 ;
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADD01 ) device_param - > kernel_params_mp_buf32 [ 5 ] = full01 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADD80 ) device_param - > kernel_params_mp_buf32 [ 5 ] = full80 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADDBITS14 ) device_param - > kernel_params_mp_buf32 [ 6 ] = 1 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADDBITS15 ) device_param - > kernel_params_mp_buf32 [ 7 ] = 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
2015-12-04 14:47:52 +00:00
{
device_param - > kernel_params_mp_buf32 [ 5 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 6 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 7 ] = 0 ;
}
2016-07-10 11:23:06 +00:00
cl_int CL_err = CL_SUCCESS ;
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
for ( uint i = 0 ; i < 3 ; i + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > ocl , device_param - > kernel_mp , i , sizeof ( cl_mem ) , ( void * ) device_param - > kernel_params_mp [ i ] ) ;
for ( uint i = 3 ; i < 4 ; i + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > ocl , device_param - > kernel_mp , i , sizeof ( cl_ulong ) , ( void * ) device_param - > kernel_params_mp [ i ] ) ;
for ( uint i = 4 ; i < 8 ; i + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > ocl , device_param - > kernel_mp , i , sizeof ( cl_uint ) , ( void * ) device_param - > kernel_params_mp [ i ] ) ;
2016-07-10 11:23:06 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clSetKernelArg(): %s \n " , val2cstr_cl ( CL_err ) ) ;
return - 1 ;
}
2016-09-15 14:02:52 +00:00
CL_err | = hc_clEnqueueWriteBuffer ( opencl_ctx - > 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 ) ;
CL_err | = hc_clEnqueueWriteBuffer ( opencl_ctx - > 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 ) ;
2016-07-10 11:23:06 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clEnqueueWriteBuffer(): %s \n " , val2cstr_cl ( CL_err ) ) ;
return - 1 ;
}
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
dictcnt = 0 ; // number of "sub-masks", i.e. when using incremental mode
2016-09-21 19:02:49 +00:00
if ( user_options - > increment = = true )
2015-12-04 14:47:52 +00:00
{
for ( uint i = 0 ; i < dictcnt ; i + + )
{
local_free ( dictfiles [ i ] ) ;
}
for ( uint pw_len = MAX ( 1 , pw_min ) ; pw_len < = pw_max ; pw_len + + )
{
char * l1_filename = mp_get_truncated_mask ( mask , strlen ( mask ) , pw_len ) ;
if ( l1_filename = = NULL ) break ;
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = l1_filename ;
}
}
else
{
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = mask ;
}
if ( dictcnt = = 0 )
{
log_error ( " ERROR: Mask is too small " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
}
free ( induction_dictionaries ) ;
// induction_dictionaries_cnt = 0; // implied
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode ! = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > benchmark = = false ) & & ( user_options - > opencl_info = = false ) )
2015-12-04 14:47:52 +00:00
{
induction_dictionaries = scan_directory ( induction_directory ) ;
induction_dictionaries_cnt = count_dictionaries ( induction_dictionaries ) ;
}
}
if ( induction_dictionaries_cnt )
{
qsort ( induction_dictionaries , induction_dictionaries_cnt , sizeof ( char * ) , sort_by_mtime ) ;
}
2016-08-18 12:39:07 +00:00
/**
* prevent the user from using - - skip / - - limit together w / maskfile and or dictfile
*/
2016-09-21 18:40:07 +00:00
if ( user_options - > skip ! = 0 | | user_options - > limit ! = 0 )
2016-08-18 12:39:07 +00:00
{
if ( ( maskcnt > 1 ) | | ( dictcnt > 1 ) )
{
log_error ( " ERROR: --skip/--limit are not supported with --increment or mask files " ) ;
return - 1 ;
}
}
2015-12-04 14:47:52 +00:00
/**
* prevent the user from using - - keyspace together w / maskfile and or dictfile
*/
2016-08-18 12:39:07 +00:00
2016-09-21 18:40:07 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
if ( ( maskcnt > 1 ) | | ( dictcnt > 1 ) )
{
log_error ( " ERROR: --keyspace is not supported with --increment or mask files " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
2016-06-26 07:47:02 +00:00
for ( uint dictpos = rd - > dictpos ; dictpos < dictcnt ; dictpos + + )
2015-12-04 14:47:52 +00:00
{
2016-09-19 13:52:01 +00:00
if ( opencl_ctx - > run_main_level3 = = false ) break ;
//opencl_ctx->run_main_level1 = true;
//opencl_ctx->run_main_level2 = true;
//opencl_ctx->run_main_level3 = true;
opencl_ctx - > run_thread_level1 = true ;
opencl_ctx - > run_thread_level2 = true ;
2016-06-26 07:47:02 +00:00
rd - > dictpos = dictpos ;
2015-12-04 14:47:52 +00:00
char * subid = logfile_generate_subid ( ) ;
data . subid = subid ;
logfile_sub_msg ( " START " ) ;
2016-09-16 15:01:18 +00:00
memset ( data . words_progress_done , 0 , hashes - > salts_cnt * sizeof ( u64 ) ) ;
memset ( data . words_progress_rejected , 0 , hashes - > salts_cnt * sizeof ( u64 ) ) ;
memset ( data . words_progress_restored , 0 , hashes - > salts_cnt * sizeof ( u64 ) ) ;
2015-12-04 14:47:52 +00:00
memset ( data . cpt_buf , 0 , CPT_BUF * sizeof ( cpt_t ) ) ;
data . cpt_pos = 0 ;
data . cpt_start = time ( NULL ) ;
data . cpt_total = 0 ;
2016-09-21 14:07:49 +00:00
if ( data . restore = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:40:07 +00:00
rd - > words_cur = user_options - > skip ;
2015-12-04 14:47:52 +00:00
2016-09-21 18:40:07 +00:00
user_options - > skip = 0 ;
2015-12-04 14:47:52 +00:00
data . skip = 0 ;
}
data . ms_paused = 0 ;
2016-06-06 19:39:11 +00:00
data . kernel_power_final = 0 ;
2016-06-02 10:32:24 +00:00
2015-12-04 14:47:52 +00:00
data . words_cur = rd - > words_cur ;
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2015-12-04 14:47:52 +00:00
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
device_param - > speed_pos = 0 ;
2016-01-15 16:16:43 +00:00
memset ( device_param - > speed_cnt , 0 , SPEED_CACHE * sizeof ( u64 ) ) ;
2016-04-24 10:24:21 +00:00
memset ( device_param - > speed_ms , 0 , SPEED_CACHE * sizeof ( double ) ) ;
2016-02-11 08:54:50 +00:00
device_param - > exec_pos = 0 ;
memset ( device_param - > exec_ms , 0 , EXEC_CACHE * sizeof ( double ) ) ;
2015-12-04 14:47:52 +00:00
device_param - > outerloop_pos = 0 ;
device_param - > outerloop_left = 0 ;
device_param - > innerloop_pos = 0 ;
device_param - > innerloop_left = 0 ;
// some more resets:
2016-01-24 21:48:01 +00:00
if ( device_param - > pws_buf ) memset ( device_param - > pws_buf , 0 , device_param - > size_pws ) ;
2015-12-04 14:47:52 +00:00
device_param - > pws_cnt = 0 ;
device_param - > words_off = 0 ;
device_param - > words_done = 0 ;
}
// figure out some workload
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:25:36 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
2015-12-04 14:47:52 +00:00
{
char * dictfile = NULL ;
if ( induction_dictionaries_cnt )
{
dictfile = induction_dictionaries [ 0 ] ;
}
else
{
dictfile = dictfiles [ dictpos ] ;
}
data . dictfile = dictfile ;
logfile_sub_string ( dictfile ) ;
2016-09-21 18:32:56 +00:00
for ( uint i = 0 ; i < user_options - > rp_files_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-09-21 18:32:56 +00:00
logfile_sub_var_string ( " rulefile " , user_options - > rp_files [ i ] ) ;
2015-12-04 14:47:52 +00:00
}
FILE * fd2 = fopen ( dictfile , " rb " ) ;
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 21:17:43 +00:00
data . words_cnt = count_words ( wl_data , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
fclose ( fd2 ) ;
if ( data . words_cnt = = 0 )
{
2016-06-26 07:47:02 +00:00
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
continue ;
}
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_COMBI )
2015-12-04 14:47:52 +00:00
{
char * dictfile = data . dictfile ;
char * dictfile2 = data . dictfile2 ;
logfile_sub_string ( dictfile ) ;
logfile_sub_string ( dictfile2 ) ;
if ( data . combs_mode = = COMBINATOR_MODE_BASE_LEFT )
{
FILE * fd2 = fopen ( dictfile , " rb " ) ;
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 21:17:43 +00:00
data . words_cnt = count_words ( wl_data , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
fclose ( fd2 ) ;
}
else if ( data . combs_mode = = COMBINATOR_MODE_BASE_RIGHT )
{
FILE * fd2 = fopen ( dictfile2 , " rb " ) ;
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 21:17:43 +00:00
data . words_cnt = count_words ( wl_data , fd2 , dictfile2 , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
fclose ( fd2 ) ;
}
if ( data . words_cnt = = 0 )
{
2016-06-26 07:47:02 +00:00
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
continue ;
}
}
2016-09-21 14:25:36 +00:00
else if ( ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 ) | | ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 ) )
2015-12-04 14:47:52 +00:00
{
char * dictfile = NULL ;
if ( induction_dictionaries_cnt )
{
dictfile = induction_dictionaries [ 0 ] ;
}
else
{
dictfile = dictfiles [ dictpos ] ;
}
data . dictfile = dictfile ;
char * mask = data . mask ;
logfile_sub_string ( dictfile ) ;
logfile_sub_string ( mask ) ;
FILE * fd2 = fopen ( dictfile , " rb " ) ;
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-09 21:17:43 +00:00
data . words_cnt = count_words ( wl_data , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
fclose ( fd2 ) ;
if ( data . words_cnt = = 0 )
{
2016-06-26 07:47:02 +00:00
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
continue ;
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
local_free ( css_buf ) ;
local_free ( data . root_css_buf ) ;
local_free ( data . markov_css_buf ) ;
char * mask = dictfiles [ dictpos ] ;
logfile_sub_string ( mask ) ;
// base
2016-09-09 14:54:48 +00:00
css_buf = mp_gen_css ( mask , strlen ( mask ) , mp_sys , mp_usr , & css_cnt , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
2015-12-04 14:47:52 +00:00
{
uint css_cnt_unicode = css_cnt * 2 ;
cs_t * css_buf_unicode = ( cs_t * ) mycalloc ( css_cnt_unicode , sizeof ( cs_t ) ) ;
for ( uint i = 0 , j = 0 ; i < css_cnt ; i + = 1 , j + = 2 )
{
memcpy ( & css_buf_unicode [ j + 0 ] , & css_buf [ i ] , sizeof ( cs_t ) ) ;
css_buf_unicode [ j + 1 ] . cs_buf [ 0 ] = 0 ;
css_buf_unicode [ j + 1 ] . cs_len = 1 ;
}
free ( css_buf ) ;
css_buf = css_buf_unicode ;
css_cnt = css_cnt_unicode ;
}
// check if mask is not too large or too small for pw_min/pw_max (*2 if unicode)
uint mask_min = pw_min ;
uint mask_max = pw_max ;
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
2015-12-04 14:47:52 +00:00
{
mask_min * = 2 ;
mask_max * = 2 ;
}
if ( ( css_cnt < mask_min ) | | ( css_cnt > mask_max ) )
{
if ( css_cnt < mask_min )
{
2016-06-19 14:36:41 +00:00
log_info ( " WARNING: Skipping mask '%s' because it is smaller than the minimum password length " , mask ) ;
2015-12-04 14:47:52 +00:00
}
if ( css_cnt > mask_max )
{
2016-06-19 14:36:41 +00:00
log_info ( " WARNING: Skipping mask '%s' because it is larger than the maximum password length " , mask ) ;
2015-12-04 14:47:52 +00:00
}
// skip to next mask
logfile_sub_msg ( " STOP " ) ;
continue ;
}
uint save_css_cnt = css_cnt ;
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_SINGLE_HASH )
2015-12-04 14:47:52 +00:00
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_APPENDED_SALT )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
uint salt_len = ( uint ) hashes - > salts_buf [ 0 ] . salt_len ;
char * salt_buf = ( char * ) hashes - > salts_buf [ 0 ] . salt_buf ;
2015-12-04 14:47:52 +00:00
uint css_cnt_salt = css_cnt + salt_len ;
cs_t * css_buf_salt = ( cs_t * ) mycalloc ( css_cnt_salt , sizeof ( cs_t ) ) ;
memcpy ( css_buf_salt , css_buf , css_cnt * sizeof ( cs_t ) ) ;
for ( uint i = 0 , j = css_cnt ; i < salt_len ; i + + , j + + )
{
css_buf_salt [ j ] . cs_buf [ 0 ] = salt_buf [ i ] ;
css_buf_salt [ j ] . cs_len = 1 ;
}
free ( css_buf ) ;
css_buf = css_buf_salt ;
css_cnt = css_cnt_salt ;
}
}
data . mask = mask ;
data . css_cnt = css_cnt ;
data . css_buf = css_buf ;
if ( maskpos > 0 & & dictpos = = 0 ) free ( masks [ maskpos - 1 ] ) ;
2016-01-15 18:51:47 +00:00
uint uniq_tbls [ SP_PW_MAX ] [ CHARSIZ ] = { { 0 } } ;
2015-12-04 14:47:52 +00:00
mp_css_to_uniq_tbl ( css_cnt , css_buf , uniq_tbls ) ;
if ( root_table_buf = = NULL ) root_table_buf = ( hcstat_table_t * ) mycalloc ( SP_ROOT_CNT , sizeof ( hcstat_table_t ) ) ;
if ( markov_table_buf = = NULL ) markov_table_buf = ( hcstat_table_t * ) mycalloc ( SP_MARKOV_CNT , sizeof ( hcstat_table_t ) ) ;
2016-09-21 21:06:11 +00:00
sp_setup_tbl ( folder_config - > shared_dir , user_options - > markov_hcstat , user_options - > markov_disable , user_options - > markov_classic , root_table_buf , markov_table_buf ) ;
2015-12-04 14:47:52 +00:00
cs_t * root_css_buf = ( cs_t * ) mycalloc ( SP_PW_MAX , sizeof ( cs_t ) ) ;
cs_t * markov_css_buf = ( cs_t * ) mycalloc ( SP_PW_MAX * CHARSIZ , sizeof ( cs_t ) ) ;
data . root_css_buf = root_css_buf ;
data . markov_css_buf = markov_css_buf ;
2016-09-21 19:07:57 +00:00
sp_tbl_to_css ( root_table_buf , markov_table_buf , root_css_buf , markov_css_buf , user_options - > markov_threshold , uniq_tbls ) ;
2015-12-04 14:47:52 +00:00
data . words_cnt = sp_get_sum ( 0 , css_cnt , root_css_buf ) ;
local_free ( root_table_buf ) ;
local_free ( markov_table_buf ) ;
// copy + args
uint css_cnt_l = css_cnt ;
uint css_cnt_r ;
2016-09-09 14:54:48 +00:00
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
2015-12-04 14:47:52 +00:00
{
if ( save_css_cnt < 6 )
{
css_cnt_r = 1 ;
}
else if ( save_css_cnt = = 6 )
{
css_cnt_r = 2 ;
}
else
{
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
2015-12-04 14:47:52 +00:00
{
if ( save_css_cnt = = 8 | | save_css_cnt = = 10 )
{
css_cnt_r = 2 ;
}
else
{
css_cnt_r = 4 ;
}
}
else
{
if ( ( css_buf [ 0 ] . cs_len * css_buf [ 1 ] . cs_len * css_buf [ 2 ] . cs_len ) > 256 )
{
css_cnt_r = 3 ;
}
else
{
css_cnt_r = 4 ;
}
}
}
}
else
{
css_cnt_r = 1 ;
/* unfinished code?
int sum = css_buf [ css_cnt_r - 1 ] . cs_len ;
for ( uint i = 1 ; i < 4 & & i < css_cnt ; i + + )
{
if ( sum > 1 ) break ; // we really don't need alot of amplifier them for slow hashes
css_cnt_r + + ;
sum * = css_buf [ css_cnt_r - 1 ] . cs_len ;
}
*/
}
css_cnt_l - = css_cnt_r ;
data . bfs_cnt = sp_get_sum ( 0 , css_cnt_r , root_css_buf ) ;
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2015-12-04 14:47:52 +00:00
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
device_param - > kernel_params_mp_l [ 0 ] = & device_param - > d_pws_buf ;
device_param - > kernel_params_mp_l [ 1 ] = & device_param - > d_root_css_buf ;
device_param - > kernel_params_mp_l [ 2 ] = & device_param - > d_markov_css_buf ;
device_param - > kernel_params_mp_l_buf64 [ 3 ] = 0 ;
device_param - > kernel_params_mp_l_buf32 [ 4 ] = css_cnt_l ;
device_param - > kernel_params_mp_l_buf32 [ 5 ] = css_cnt_r ;
device_param - > kernel_params_mp_l_buf32 [ 6 ] = 0 ;
device_param - > kernel_params_mp_l_buf32 [ 7 ] = 0 ;
device_param - > kernel_params_mp_l_buf32 [ 8 ] = 0 ;
2016-09-09 14:54:48 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADD01 ) device_param - > kernel_params_mp_l_buf32 [ 6 ] = full01 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADD80 ) device_param - > kernel_params_mp_l_buf32 [ 6 ] = full80 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADDBITS14 ) device_param - > kernel_params_mp_l_buf32 [ 7 ] = 1 ;
if ( hashconfig - > opts_type & OPTS_TYPE_PT_ADDBITS15 ) device_param - > kernel_params_mp_l_buf32 [ 8 ] = 1 ;
2015-12-04 14:47:52 +00:00
device_param - > kernel_params_mp_r [ 0 ] = & device_param - > d_bfs ;
device_param - > kernel_params_mp_r [ 1 ] = & device_param - > d_root_css_buf ;
device_param - > kernel_params_mp_r [ 2 ] = & device_param - > d_markov_css_buf ;
device_param - > kernel_params_mp_r_buf64 [ 3 ] = 0 ;
device_param - > kernel_params_mp_r_buf32 [ 4 ] = css_cnt_r ;
device_param - > kernel_params_mp_r_buf32 [ 5 ] = 0 ;
device_param - > kernel_params_mp_r_buf32 [ 6 ] = 0 ;
device_param - > kernel_params_mp_r_buf32 [ 7 ] = 0 ;
2016-07-10 11:23:06 +00:00
cl_int CL_err = CL_SUCCESS ;
2016-09-15 14:02:52 +00:00
for ( uint i = 0 ; i < 3 ; i + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > 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 + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > 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 + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > ocl , device_param - > kernel_mp_l , i , sizeof ( cl_uint ) , ( void * ) device_param - > kernel_params_mp_l [ i ] ) ;
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
for ( uint i = 0 ; i < 3 ; i + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > 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 + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > 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 + + ) CL_err | = hc_clSetKernelArg ( opencl_ctx - > ocl , device_param - > kernel_mp_r , i , sizeof ( cl_uint ) , ( void * ) device_param - > kernel_params_mp_r [ i ] ) ;
2016-07-10 11:23:06 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clSetKernelArg(): %s \n " , val2cstr_cl ( CL_err ) ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
}
2016-09-15 14:02:52 +00:00
CL_err | = hc_clEnqueueWriteBuffer ( opencl_ctx - > 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 ) ;
CL_err | = hc_clEnqueueWriteBuffer ( opencl_ctx - > 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 ) ;
2016-07-10 11:23:06 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clEnqueueWriteBuffer(): %s \n " , val2cstr_cl ( CL_err ) ) ;
return - 1 ;
}
2015-12-04 14:47:52 +00:00
}
}
2016-01-15 16:16:43 +00:00
u64 words_base = data . words_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-21 09:09:12 +00:00
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
if ( data . kernel_rules_cnt )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
words_base / = data . kernel_rules_cnt ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 09:09:12 +00:00
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_COMBI )
2015-12-04 14:47:52 +00:00
{
if ( data . combs_cnt )
{
words_base / = data . combs_cnt ;
}
}
2016-09-21 09:09:12 +00:00
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_BF )
2015-12-04 14:47:52 +00:00
{
if ( data . bfs_cnt )
{
words_base / = data . bfs_cnt ;
}
}
data . words_base = words_base ;
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-07 18:30:14 +00:00
log_info ( " % " PRIu64 " " , words_base ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return 0 ;
2015-12-04 14:47:52 +00:00
}
if ( data . words_cur > data . words_base )
{
2016-06-19 14:36:41 +00:00
log_error ( " ERROR: Restore value greater keyspace " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
if ( data . words_cur )
{
2016-09-21 09:09:12 +00:00
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-01-05 07:26:44 +00:00
data . words_progress_restored [ i ] = data . words_cur * data . kernel_rules_cnt ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-21 09:09:12 +00:00
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_COMBI )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
data . words_progress_restored [ i ] = data . words_cur * data . combs_cnt ;
}
}
2016-09-21 09:09:12 +00:00
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_BF )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
data . words_progress_restored [ i ] = data . words_cur * data . bfs_cnt ;
}
}
}
/*
2016-09-12 12:58:25 +00:00
* Update dictionary statistic
2015-12-04 14:47:52 +00:00
*/
2016-09-21 18:41:30 +00:00
if ( user_options - > keyspace = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-12 12:58:25 +00:00
dictstat_write ( dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-12 12:58:25 +00:00
/**
* Update loopback file
2015-12-04 14:47:52 +00:00
*/
2016-09-21 19:16:45 +00:00
if ( user_options - > loopback = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-12 12:58:25 +00:00
loopback_write_open ( loopback_ctx , induction_directory ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-17 15:05:01 +00:00
/**
* some algorithms have a maximum kernel - loops count
*/
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
{
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
if ( device_param - > skipped ) continue ;
if ( device_param - > kernel_loops_min < device_param - > kernel_loops_max )
{
u32 innerloop_cnt = 0 ;
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
{
2016-09-21 09:09:12 +00:00
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT ) innerloop_cnt = data . kernel_rules_cnt ;
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_COMBI ) innerloop_cnt = data . combs_cnt ;
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_BF ) innerloop_cnt = data . bfs_cnt ;
2016-09-17 15:05:01 +00:00
}
else
{
innerloop_cnt = hashes - > salts_buf [ 0 ] . salt_iter ;
}
if ( ( innerloop_cnt > = device_param - > kernel_loops_min ) & &
( innerloop_cnt < = device_param - > kernel_loops_max ) )
{
device_param - > kernel_loops_max = innerloop_cnt ;
}
}
}
2016-06-02 10:32:24 +00:00
/**
* create autotune threads
*/
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
hc_thread_t * c_threads = ( hc_thread_t * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( hc_thread_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-19 13:52:01 +00:00
opencl_ctx - > devices_status = STATUS_AUTOTUNE ;
2016-06-25 19:56:18 +00:00
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-06-26 07:47:02 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-06-02 10:32:24 +00:00
2016-06-26 07:47:02 +00:00
hc_thread_create ( c_threads [ device_id ] , thread_autotune , device_param ) ;
2016-06-02 10:32:24 +00:00
}
2016-09-15 14:02:52 +00:00
hc_thread_wait ( opencl_ctx - > devices_cnt , c_threads ) ;
2016-06-02 10:32:24 +00:00
/*
* Inform user about possible slow speeds
*/
2016-06-06 19:39:11 +00:00
uint hardware_power_all = 0 ;
2016-06-02 10:32:24 +00:00
uint kernel_power_all = 0 ;
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-06-02 10:32:24 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-06-02 10:32:24 +00:00
2016-06-06 19:39:11 +00:00
hardware_power_all + = device_param - > hardware_power ;
2016-06-02 10:32:24 +00:00
kernel_power_all + = device_param - > kernel_power ;
}
2016-06-06 19:39:11 +00:00
data . hardware_power_all = hardware_power_all ; // hardware_power_all is the same as kernel_power_all but without the influence of kernel_accel on the devices
2016-06-02 10:32:24 +00:00
data . kernel_power_all = kernel_power_all ;
2016-09-21 14:25:36 +00:00
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
2016-06-02 10:32:24 +00:00
{
if ( data . words_base < kernel_power_all )
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false )
2016-06-02 10:32:24 +00:00
{
2016-06-24 10:55:54 +00:00
clear_prompt ( ) ;
2016-06-02 10:32:24 +00:00
log_info ( " ATTENTION! " ) ;
log_info ( " The wordlist or mask you are using is too small. " ) ;
log_info ( " Therefore, hashcat is unable to utilize the full parallelization power of your device(s). " ) ;
log_info ( " The cracking speed will drop. " ) ;
log_info ( " Workaround: https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#how_to_create_more_work_for_full_speed " ) ;
log_info ( " " ) ;
}
}
}
2015-12-04 14:47:52 +00:00
/**
* create cracker threads
*/
2016-09-19 13:52:01 +00:00
opencl_ctx - > devices_status = STATUS_RUNNING ;
2016-06-03 22:54:28 +00:00
if ( initial_restore_done = = 0 )
{
2016-09-15 14:02:52 +00:00
if ( data . restore_disable = = 0 ) cycle_restore ( opencl_ctx ) ;
2016-06-03 22:54:28 +00:00
initial_restore_done = 1 ;
}
hc_timer_set ( & data . timer_running ) ;
2016-09-21 14:25:36 +00:00
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
2016-06-03 22:54:28 +00:00
{
2016-09-21 14:32:38 +00:00
if ( ( user_options - > quiet = = false ) & & ( user_options - > status = = false ) & & ( user_options - > benchmark = = false ) )
2016-06-03 22:54:28 +00:00
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) send_prompt ( ) ;
2016-06-03 22:54:28 +00:00
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
2016-06-03 22:54:28 +00:00
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info ( " Starting attack in stdin mode... " ) ;
if ( user_options - > quiet = = false ) log_info ( " " ) ;
2016-06-03 22:54:28 +00:00
}
2016-06-02 10:32:24 +00:00
time_t runtime_start ;
time ( & runtime_start ) ;
data . runtime_start = runtime_start ;
2015-12-04 14:47:52 +00:00
2016-07-24 20:26:40 +00:00
data . prepare_time + = runtime_start - prepare_start ;
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-06-25 19:56:18 +00:00
2016-09-21 14:25:36 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
2016-06-26 07:47:02 +00:00
{
hc_thread_create ( c_threads [ device_id ] , thread_calc_stdin , device_param ) ;
}
else
{
hc_thread_create ( c_threads [ device_id ] , thread_calc , device_param ) ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-15 14:02:52 +00:00
hc_thread_wait ( opencl_ctx - > devices_cnt , c_threads ) ;
2015-12-04 14:47:52 +00:00
local_free ( c_threads ) ;
2016-09-19 13:52:01 +00:00
if ( ( opencl_ctx - > devices_status ! = STATUS_CRACKED )
& & ( opencl_ctx - > devices_status ! = STATUS_ABORTED )
& & ( opencl_ctx - > devices_status ! = STATUS_QUIT )
& & ( opencl_ctx - > devices_status ! = STATUS_BYPASS ) )
2016-06-27 07:25:34 +00:00
{
2016-09-15 14:02:52 +00:00
opencl_ctx - > devices_status = STATUS_EXHAUSTED ;
2016-06-27 07:25:34 +00:00
}
2016-09-15 14:02:52 +00:00
logfile_sub_var_uint ( " status-after-work " , opencl_ctx - > devices_status ) ;
2015-12-04 14:47:52 +00:00
2016-06-25 19:56:18 +00:00
data . restore = 0 ;
2015-12-04 14:47:52 +00:00
if ( induction_dictionaries_cnt )
{
unlink ( induction_dictionaries [ 0 ] ) ;
}
free ( induction_dictionaries ) ;
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode ! = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > benchmark = = false ) & & ( user_options - > opencl_info = = false ) )
{
induction_dictionaries = scan_directory ( induction_directory ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
induction_dictionaries_cnt = count_dictionaries ( induction_dictionaries ) ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:32:38 +00:00
if ( user_options - > benchmark = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-16 15:01:18 +00:00
status_benchmark ( opencl_ctx , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:32:38 +00:00
if ( user_options - > machine_readable = = false )
2016-06-26 07:47:02 +00:00
{
log_info ( " " ) ;
2015-12-04 14:47:52 +00:00
}
}
else
{
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false )
2015-12-04 14:47:52 +00:00
{
2016-06-26 07:47:02 +00:00
clear_prompt ( ) ;
2015-12-04 14:47:52 +00:00
2016-06-26 07:47:02 +00:00
log_info ( " " ) ;
2016-09-16 15:01:18 +00:00
status_display ( opencl_ctx , hashconfig , hashes ) ;
2016-06-26 07:47:02 +00:00
log_info ( " " ) ;
2015-12-04 14:47:52 +00:00
}
2016-06-30 06:43:10 +00:00
else
{
2016-09-21 19:15:36 +00:00
if ( user_options - > status = = true )
2016-06-30 06:43:10 +00:00
{
2016-09-16 15:01:18 +00:00
status_display ( opencl_ctx , hashconfig , hashes ) ;
2016-06-30 06:43:10 +00:00
}
}
2015-12-04 14:47:52 +00:00
}
2016-06-26 07:47:02 +00:00
if ( induction_dictionaries_cnt )
{
qsort ( induction_dictionaries , induction_dictionaries_cnt , sizeof ( char * ) , sort_by_mtime ) ;
2016-07-05 13:00:26 +00:00
// yeah, this next statement is a little hack to make sure that --loopback runs correctly (because with it we guarantee that the loop iterates one more time)
dictpos - - ;
2016-06-26 07:47:02 +00:00
}
2016-09-12 12:58:25 +00:00
/**
* Update loopback file
*/
2016-09-21 19:15:36 +00:00
if ( user_options - > loopback = = true )
2016-09-12 12:58:25 +00:00
{
loopback_write_close ( loopback_ctx ) ;
}
2015-12-04 14:47:52 +00:00
time_t runtime_stop ;
time ( & runtime_stop ) ;
data . runtime_stop = runtime_stop ;
logfile_sub_uint ( runtime_start ) ;
logfile_sub_uint ( runtime_stop ) ;
2016-07-24 20:26:40 +00:00
time ( & prepare_start ) ;
2015-12-04 14:47:52 +00:00
logfile_sub_msg ( " STOP " ) ;
global_free ( subid ) ;
2016-06-25 19:56:18 +00:00
2016-06-26 07:47:02 +00:00
// finalize task
2016-06-25 19:56:18 +00:00
2016-09-19 13:52:01 +00:00
if ( opencl_ctx - > run_main_level3 = = false ) break ;
2015-12-04 14:47:52 +00:00
}
2016-09-19 13:52:01 +00:00
if ( opencl_ctx - > run_main_level2 = = false ) break ;
2015-12-04 14:47:52 +00:00
}
// problems could occur if already at startup everything was cracked (because of .pot file reading etc), we must set some variables here to avoid NULL pointers
2016-09-21 14:25:36 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:25:36 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
2015-12-04 14:47:52 +00:00
{
if ( data . dictfile = = NULL )
{
if ( dictfiles ! = NULL )
{
data . dictfile = dictfiles [ 0 ] ;
hc_timer_set ( & data . timer_running ) ;
}
}
}
}
// NOTE: combi is okay because it is already set beforehand
2016-09-21 14:30:23 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 | | user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
2015-12-04 14:47:52 +00:00
{
if ( data . dictfile = = NULL )
{
if ( dictfiles ! = NULL )
{
hc_timer_set ( & data . timer_running ) ;
data . dictfile = dictfiles [ 0 ] ;
}
}
}
2016-09-21 14:25:36 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
2015-12-04 14:47:52 +00:00
{
if ( data . mask = = NULL )
{
hc_timer_set ( & data . timer_running ) ;
data . mask = masks [ 0 ] ;
}
}
// if cracked / aborted remove last induction dictionary
for ( int file_pos = 0 ; file_pos < induction_dictionaries_cnt ; file_pos + + )
{
struct stat induct_stat ;
if ( stat ( induction_dictionaries [ file_pos ] , & induct_stat ) = = 0 )
{
unlink ( induction_dictionaries [ file_pos ] ) ;
}
}
2016-06-27 10:13:46 +00:00
// wait for inner threads
data . shutdown_inner = 1 ;
2015-12-04 14:47:52 +00:00
2016-06-26 14:09:05 +00:00
for ( uint thread_idx = 0 ; thread_idx < inner_threads_cnt ; thread_idx + + )
2015-12-04 14:47:52 +00:00
{
2016-06-26 14:09:05 +00:00
hc_thread_wait ( 1 , & inner_threads [ thread_idx ] ) ;
2015-12-04 14:47:52 +00:00
}
2016-06-26 14:09:05 +00:00
local_free ( inner_threads ) ;
2015-12-04 14:47:52 +00:00
// we dont need restore file anymore
if ( data . restore_disable = = 0 )
{
2016-09-15 14:02:52 +00:00
if ( ( opencl_ctx - > devices_status = = STATUS_EXHAUSTED ) | | ( opencl_ctx - > devices_status = = STATUS_CRACKED ) )
2015-12-04 14:47:52 +00:00
{
unlink ( eff_restore_file ) ;
unlink ( new_restore_file ) ;
}
else
{
2016-09-15 14:02:52 +00:00
cycle_restore ( opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
}
}
// finally save left hashes
2016-09-21 18:37:05 +00:00
if ( ( hashes - > hashlist_mode = = HL_MODE_FILE ) & & ( user_options - > remove = = 1 ) & & ( hashes - > digests_saved ! = hashes - > digests_done ) )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
save_hash ( opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
}
/**
* Clean up
*/
// reset default fan speed
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-22 08:55:33 +00:00
if ( user_options - > gpu_temp_retain )
2015-12-04 14:47:52 +00:00
{
2016-09-08 07:21:25 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2016-05-29 22:05:46 +00:00
if ( data . hm_device [ device_id ] . fan_set_supported = = 1 )
2015-12-04 14:47:52 +00:00
{
2016-06-26 18:18:46 +00:00
int rc = - 1 ;
2015-12-04 14:47:52 +00:00
2016-06-26 18:18:46 +00:00
if ( device_param - > device_vendor_id = = VENDOR_ID_AMD )
2016-05-29 22:05:46 +00:00
{
2016-06-26 18:18:46 +00:00
rc = hm_set_fanspeed_with_device_id_adl ( device_id , 100 , 0 ) ;
}
else if ( device_param - > device_vendor_id = = VENDOR_ID_NV )
{
2016-09-07 20:29:57 +00:00
# if defined (__linux__)
2016-06-26 18:18:46 +00:00
rc = set_fan_control ( data . hm_xnvctrl , data . hm_device [ device_id ] . xnvctrl , NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE ) ;
# endif
2015-12-04 14:47:52 +00:00
2016-09-07 20:29:57 +00:00
# if defined (_WIN)
2016-06-26 18:41:11 +00:00
rc = hm_set_fanspeed_with_device_id_nvapi ( device_id , 100 , 0 ) ;
2016-06-26 18:18:46 +00:00
# endif
2016-05-29 22:05:46 +00:00
}
2016-06-26 18:18:46 +00:00
if ( rc = = - 1 ) log_info ( " WARNING: Failed to restore default fan speed and policy for device #% " , device_id + 1 ) ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-08 07:21:25 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
}
}
// reset power tuning
2016-09-21 19:18:43 +00:00
if ( user_options - > powertune_enable = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-08 07:21:25 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-15 14:02:52 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-01-15 16:23:07 +00:00
if ( device_param - > skipped ) continue ;
2016-09-15 14:02:52 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_AMD )
2015-12-04 14:47:52 +00:00
{
2016-06-01 17:01:44 +00:00
if ( data . hm_device [ device_id ] . od_version = = 6 )
2015-12-04 14:47:52 +00:00
{
2016-06-01 17:01:44 +00:00
// check powertune capabilities first, if not available then skip device
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
int powertune_supported = 0 ;
2015-12-04 14:47:52 +00:00
2016-06-03 13:37:53 +00:00
if ( ( hm_ADL_Overdrive6_PowerControl_Caps ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune_supported ) ) ! = ADL_OK )
2015-12-04 14:47:52 +00:00
{
2016-06-01 17:01:44 +00:00
log_error ( " ERROR: Failed to get ADL PowerControl Capabilities " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-06-01 17:01:44 +00:00
if ( powertune_supported ! = 0 )
{
// powercontrol settings
2015-12-04 14:47:52 +00:00
2016-06-03 13:37:53 +00:00
if ( ( hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , od_power_control_status [ device_id ] ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_info ( " ERROR: Failed to restore the ADL PowerControl values " ) ;
2015-12-04 14:47:52 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
// clocks
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
ADLOD6StateInfo * performance_state = ( ADLOD6StateInfo * ) mycalloc ( 1 , sizeof ( ADLOD6StateInfo ) + sizeof ( ADLOD6PerformanceLevel ) ) ;
2015-12-04 14:47:52 +00:00
2016-06-01 17:01:44 +00:00
performance_state - > iNumberOfPerformanceLevels = 2 ;
performance_state - > aLevels [ 0 ] . iEngineClock = od_clock_mem_status [ device_id ] . state . aLevels [ 0 ] . iEngineClock ;
performance_state - > aLevels [ 1 ] . iEngineClock = od_clock_mem_status [ device_id ] . state . aLevels [ 1 ] . iEngineClock ;
performance_state - > aLevels [ 0 ] . iMemoryClock = od_clock_mem_status [ device_id ] . state . aLevels [ 0 ] . iMemoryClock ;
performance_state - > aLevels [ 1 ] . iMemoryClock = od_clock_mem_status [ device_id ] . state . aLevels [ 1 ] . iMemoryClock ;
2016-06-03 13:37:53 +00:00
if ( ( hm_ADL_Overdrive_State_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , ADL_OD6_SETSTATE_PERFORMANCE , performance_state ) ) ! = ADL_OK )
2016-06-01 17:01:44 +00:00
{
log_info ( " ERROR: Failed to restore ADL performance state " ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
local_free ( performance_state ) ;
2015-12-04 14:47:52 +00:00
}
2016-06-01 17:01:44 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-15 14:02:52 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_NV )
2016-06-01 17:01:44 +00:00
{
2016-09-21 18:40:07 +00:00
unsigned int power_limit = nvml_power_limit [ device_id ] ;
2016-06-01 17:01:44 +00:00
2016-09-21 18:40:07 +00:00
if ( power_limit > 0 )
2016-06-01 17:01:44 +00:00
{
2016-09-21 18:40:07 +00:00
hm_NVML_nvmlDeviceSetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , power_limit ) ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-08 07:21:25 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-21 18:50:14 +00:00
if ( user_options - > gpu_temp_disable = = false )
2015-12-04 14:47:52 +00:00
{
2016-06-02 12:20:15 +00:00
if ( data . hm_nvml )
2015-12-15 11:04:22 +00:00
{
2016-06-02 12:20:15 +00:00
hm_NVML_nvmlShutdown ( data . hm_nvml ) ;
2015-12-04 14:47:52 +00:00
2016-06-02 12:20:15 +00:00
nvml_close ( data . hm_nvml ) ;
2016-02-02 00:14:33 +00:00
2016-06-02 12:20:15 +00:00
data . hm_nvml = NULL ;
2016-02-02 00:14:33 +00:00
}
2015-12-15 19:34:07 +00:00
2016-06-18 08:59:58 +00:00
if ( data . hm_nvapi )
{
hm_NvAPI_Unload ( data . hm_nvapi ) ;
nvapi_close ( data . hm_nvapi ) ;
data . hm_nvapi = NULL ;
}
if ( data . hm_xnvctrl )
{
hm_XNVCTRL_XCloseDisplay ( data . hm_xnvctrl ) ;
xnvctrl_close ( data . hm_xnvctrl ) ;
data . hm_xnvctrl = NULL ;
}
2016-06-02 12:20:15 +00:00
if ( data . hm_adl )
2015-12-15 19:34:07 +00:00
{
2016-06-02 12:20:15 +00:00
hm_ADL_Main_Control_Destroy ( data . hm_adl ) ;
2016-01-13 16:10:40 +00:00
2016-06-02 12:20:15 +00:00
adl_close ( data . hm_adl ) ;
2016-05-29 22:05:46 +00:00
2016-06-02 12:20:15 +00:00
data . hm_adl = NULL ;
2015-12-15 11:04:22 +00:00
}
2015-12-04 14:47:52 +00:00
}
2016-09-19 13:52:01 +00:00
if ( opencl_ctx - > run_main_level1 = = false ) break ;
2015-12-04 14:47:52 +00:00
// free memory
2016-09-17 15:05:01 +00:00
opencl_session_destroy ( opencl_ctx ) ;
opencl_ctx_devices_destroy ( opencl_ctx ) ;
2016-09-09 08:22:21 +00:00
local_free ( masks ) ;
2015-12-04 14:47:52 +00:00
2016-09-13 08:38:59 +00:00
debugfile_destroy ( debugfile_ctx ) ;
2016-09-10 15:35:58 +00:00
outfile_destroy ( outfile_ctx ) ;
2016-09-09 21:17:43 +00:00
potfile_write_close ( potfile_ctx ) ;
potfile_destroy ( potfile_ctx ) ;
dictstat_destroy ( dictstat_ctx ) ;
2016-09-12 12:58:25 +00:00
loopback_destroy ( loopback_ctx ) ;
2016-09-22 09:35:08 +00:00
wl_data_destroy ( wl_data ) ;
2016-01-05 07:26:44 +00:00
local_free ( all_kernel_rules_cnt ) ;
local_free ( all_kernel_rules_buf ) ;
2015-12-04 14:47:52 +00:00
local_free ( bitmap_s1_a ) ;
local_free ( bitmap_s1_b ) ;
local_free ( bitmap_s1_c ) ;
local_free ( bitmap_s1_d ) ;
local_free ( bitmap_s2_a ) ;
local_free ( bitmap_s2_b ) ;
local_free ( bitmap_s2_c ) ;
local_free ( bitmap_s2_d ) ;
local_free ( od_clock_mem_status ) ;
local_free ( od_power_control_status ) ;
2016-06-01 17:01:44 +00:00
local_free ( nvml_power_limit ) ;
2015-12-04 14:47:52 +00:00
2016-01-05 07:26:44 +00:00
global_free ( kernel_rules_buf ) ;
2015-12-04 14:47:52 +00:00
global_free ( root_css_buf ) ;
global_free ( markov_css_buf ) ;
2016-09-16 15:01:18 +00:00
hashes_destroy ( hashes ) ;
2015-12-04 14:47:52 +00:00
global_free ( words_progress_done ) ;
global_free ( words_progress_rejected ) ;
global_free ( words_progress_restored ) ;
}
2016-06-27 10:13:46 +00:00
// wait for outer threads
data . shutdown_outer = 1 ;
2016-06-25 10:05:16 +00:00
2016-06-26 14:09:05 +00:00
for ( uint thread_idx = 0 ; thread_idx < outer_threads_cnt ; thread_idx + + )
2016-06-25 10:05:16 +00:00
{
2016-06-26 14:09:05 +00:00
hc_thread_wait ( 1 , & outer_threads [ thread_idx ] ) ;
2016-06-25 10:05:16 +00:00
}
2016-06-26 14:09:05 +00:00
local_free ( outer_threads ) ;
2016-06-25 10:05:16 +00:00
2015-12-04 14:47:52 +00:00
// destroy others mutex
hc_thread_mutex_delete ( mux_display ) ;
2016-09-08 07:21:25 +00:00
hc_thread_mutex_delete ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
// free memory
2016-09-09 14:54:48 +00:00
local_free ( hashconfig ) ;
2015-12-04 14:47:52 +00:00
local_free ( eff_restore_file ) ;
local_free ( new_restore_file ) ;
local_free ( rd ) ;
2016-02-10 19:40:21 +00:00
// tuning db
tuning_db_destroy ( tuning_db ) ;
2015-12-04 14:47:52 +00:00
// induction directory
2016-09-21 18:52:45 +00:00
if ( induction_directory ! = NULL )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( rmdir ( induction_directory ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
if ( errno = = ENOENT )
2015-12-04 14:47:52 +00:00
{
2016-09-21 14:07:49 +00:00
// good, we can ignore
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:07:49 +00:00
else if ( errno = = ENOTEMPTY )
{
// good, we can ignore
}
else
{
log_error ( " ERROR: %s: %s " , induction_directory , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 14:07:49 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-21 14:07:49 +00:00
local_free ( induction_directory ) ;
2015-12-04 14:47:52 +00:00
}
// outfile-check directory
2016-09-21 18:52:45 +00:00
if ( outfile_check_directory ! = NULL )
2015-12-04 14:47:52 +00:00
{
if ( rmdir ( outfile_check_directory ) = = - 1 )
{
if ( errno = = ENOENT )
{
// good, we can ignore
}
else if ( errno = = ENOTEMPTY )
{
// good, we can ignore
}
else
{
log_error ( " ERROR: %s: %s " , outfile_check_directory , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
local_free ( outfile_check_directory ) ;
}
time_t proc_stop ;
time ( & proc_stop ) ;
logfile_top_uint ( proc_start ) ;
logfile_top_uint ( proc_stop ) ;
logfile_top_msg ( " STOP " ) ;
2016-09-21 14:07:49 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Started: %s " , ctime ( & proc_start ) ) ;
if ( user_options - > quiet = = false ) log_info_nn ( " Stopped: %s " , ctime ( & proc_stop ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-17 18:18:38 +00:00
u32 rc_final = - 1 ;
2016-09-19 13:52:01 +00:00
if ( opencl_ctx - > devices_status = = STATUS_ABORTED ) rc_final = 2 ;
if ( opencl_ctx - > devices_status = = STATUS_QUIT ) rc_final = 2 ;
if ( opencl_ctx - > devices_status = = STATUS_EXHAUSTED ) rc_final = 1 ;
if ( opencl_ctx - > devices_status = = STATUS_CRACKED ) rc_final = 0 ;
2016-01-26 20:40:49 +00:00
2016-09-17 18:18:38 +00:00
opencl_ctx_destroy ( opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-21 21:06:11 +00:00
folder_config_destroy ( folder_config ) ;
2016-09-17 18:18:38 +00:00
return rc_final ;
2015-12-04 14:47:52 +00:00
}