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-24 19:44:43 +00:00
# include "affinity.h"
# include "attack_mode.h"
# include "autotune.h"
# include "benchmark.h"
# include "bitmap.h"
2016-09-05 12:12:31 +00:00
# include "bitops.h"
2016-09-06 09:49:26 +00:00
# include "convert.h"
2016-09-05 19:47:26 +00:00
# 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-24 19:44:43 +00:00
# include "data.h"
# include "debugfile.h"
# include "dictstat.h"
# include "dispatch.h"
# include "ext_ADL.h"
# include "ext_nvapi.h"
# include "ext_nvml.h"
# include "ext_OpenCL.h"
# include "ext_xnvctrl.h"
2016-09-06 17:44:27 +00:00
# include "filehandling.h"
2016-09-24 19:44:43 +00:00
# include "folder.h"
2016-09-16 15:01:18 +00:00
# include "hash_management.h"
2016-09-24 19:44:43 +00:00
# include "hlfmt.h"
# include "hwmon.h"
2016-09-05 19:47:26 +00:00
# include "inc_hash_constants.h"
2016-09-24 19:44:43 +00:00
# include "induct.h"
# include "interface.h"
# include "locking.h"
# include "logfile.h"
# include "logging.h"
# include "loopback.h"
# include "memory.h"
# include "monitor.h"
2016-09-06 11:52:26 +00:00
# include "mpsp.h"
2016-09-24 19:44:43 +00:00
# include "opencl.h"
# include "outfile_check.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-24 19:44:43 +00:00
# include "powertune.h"
2016-09-11 09:42:19 +00:00
# include "remove.h"
2016-09-24 19:44:43 +00:00
# include "restore.h"
# include "rp_cpu.h"
# include "rp.h"
# include "rp_kernel_on_cpu.h"
2016-09-11 09:42:19 +00:00
# include "runtime.h"
2016-09-17 15:05:01 +00:00
# include "session.h"
2016-09-24 19:44:43 +00:00
# include "shared.h"
# include "status.h"
# include "stdout.h"
# include "terminal.h"
# include "thread.h"
# include "timer.h"
# include "tuningdb.h"
# include "usage.h"
2016-09-20 14:04:22 +00:00
# include "user_options.h"
2016-09-24 19:44:43 +00:00
# include "version.h"
# include "weak_hash.h"
# include "wordlist.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
}
2016-09-24 11:14:50 +00:00
static int setup_console ( )
2016-09-22 09:35:08 +00:00
{
# if defined (_WIN)
SetConsoleWindowSize ( 132 ) ;
2016-09-24 11:14:50 +00:00
if ( _setmode ( _fileno ( stdin ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stdin " , strerror ( errno ) ) ;
return - 1 ;
}
if ( _setmode ( _fileno ( stdout ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stdout " , strerror ( errno ) ) ;
return - 1 ;
}
if ( _setmode ( _fileno ( stderr ) , _O_BINARY ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , " stderr " , strerror ( errno ) ) ;
return - 1 ;
}
2016-09-22 09:35:08 +00:00
# endif
2016-09-24 11:14:50 +00:00
return 0 ;
}
static void setup_seeding ( const user_options_t * user_options , const time_t * proc_start )
{
if ( user_options - > rp_gen_seed_chgd = = true )
{
srand ( user_options - > rp_gen_seed ) ;
}
else
{
srand ( * proc_start ) ;
}
2016-09-23 17:50:59 +00:00
}
2016-09-22 09:35:08 +00:00
2016-09-24 10:29:07 +00:00
static void welcome_screen ( const user_options_t * user_options , const time_t * proc_start )
2016-09-23 18:06:29 +00:00
{
if ( user_options - > quiet = = true ) return ;
if ( user_options - > keyspace = = true ) return ;
if ( user_options - > stdout_flag = = true ) return ;
if ( user_options - > show = = true ) return ;
if ( user_options - > left = = true ) return ;
if ( user_options - > benchmark = = true )
{
if ( user_options - > machine_readable = = false )
{
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 ) ) ;
}
}
else if ( user_options - > restore = = true )
{
log_info ( " %s (%s) starting in restore-mode... " , PROGNAME , VERSION_TAG ) ;
log_info ( " " ) ;
}
else
{
log_info ( " %s (%s) starting... " , PROGNAME , VERSION_TAG ) ;
log_info ( " " ) ;
}
}
2016-09-24 10:29:07 +00:00
static void goodbye_screen ( const user_options_t * user_options , const time_t * proc_start , const time_t * proc_stop )
{
if ( user_options - > quiet = = true ) return ;
if ( user_options - > keyspace = = true ) return ;
if ( user_options - > stdout_flag = = true ) return ;
if ( user_options - > show = = true ) return ;
if ( user_options - > left = = true ) return ;
2016-09-24 12:00:59 +00:00
log_info_nn ( " Started: %s " , ctime ( proc_start ) ) ;
log_info_nn ( " Stopped: %s " , ctime ( proc_stop ) ) ;
2016-09-24 10:29:07 +00:00
}
2016-09-24 11:05:09 +00:00
static int outer_loop ( user_options_t * user_options , user_options_extra_t * user_options_extra , int myargc , char * * myargv , folder_config_t * folder_config , logfile_ctx_t * logfile_ctx , tuning_db_t * tuning_db , induct_ctx_t * induct_ctx , outcheck_ctx_t * outcheck_ctx , outfile_ctx_t * outfile_ctx , potfile_ctx_t * potfile_ctx , rules_ctx_t * rules_ctx , dictstat_ctx_t * dictstat_ctx , loopback_ctx_t * loopback_ctx , opencl_ctx_t * opencl_ctx )
2016-09-23 20:51:42 +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 ;
/*
* We need to reset ' rd ' in benchmark mode otherwise when the user hits ' bypass '
* the following algos are skipped entirely
* still needed ? there ' s no more bypass in benchmark mode
* also there ' s no signs of special benchmark handling in the branch
2016-09-22 09:35:08 +00:00
*/
2016-09-23 20:51:42 +00:00
/*
if ( algorithm_pos > 0 )
{
local_free ( rd ) ;
2016-09-23 17:50:59 +00:00
2016-09-23 20:51:42 +00:00
rd = init_restore ( argc , argv , user_options ) ;
2016-09-22 09:35:08 +00:00
2016-09-23 20:51:42 +00:00
data . rd = rd ;
}
*/
2016-05-18 07:56:23 +00:00
2015-12-04 14:47:52 +00:00
/**
2016-09-23 20:51:42 +00:00
* setup prepare timer
2015-12-04 14:47:52 +00:00
*/
2016-07-24 20:26:40 +00:00
time_t prepare_start ;
time ( & prepare_start ) ;
2016-07-21 08:06:31 +00:00
/**
2016-09-23 20:51:42 +00:00
* setup variables and buffers depending on hash_mode
2016-07-21 08:06:31 +00:00
*/
2016-09-23 20:51:42 +00:00
hashconfig_t * hashconfig = ( hashconfig_t * ) mymalloc ( sizeof ( hashconfig_t ) ) ;
2016-07-21 08:06:31 +00:00
2016-09-23 20:51:42 +00:00
data . hashconfig = hashconfig ;
2016-07-21 08:06:31 +00:00
2016-09-23 20:51:42 +00:00
const int rc_hashconfig = hashconfig_init ( hashconfig , user_options ) ;
2016-09-22 20:40:47 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_hashconfig = = - 1 ) return - 1 ;
2016-01-13 16:10:40 +00:00
2016-09-21 18:32:56 +00:00
/**
2016-09-24 10:41:56 +00:00
* potfile show / left depends on hash_mode , so it ' s called here first time
2016-09-21 18:32:56 +00:00
*/
2016-09-23 20:51:42 +00:00
if ( user_options - > show = = true | | user_options - > left = = true )
{
outfile_write_open ( outfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
SUPPRESS_OUTPUT = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
potfile_read_open ( potfile_ctx ) ;
2016-09-21 18:32:56 +00:00
2016-09-23 20:51:42 +00:00
potfile_read_parse ( potfile_ctx , hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
potfile_read_close ( potfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
SUPPRESS_OUTPUT = 0 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* load hashes , stage 1
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hashes_t * hashes = ( hashes_t * ) mymalloc ( sizeof ( hashes_t ) ) ;
2016-09-23 18:06:29 +00:00
2016-09-23 20:51:42 +00:00
data . hashes = hashes ;
2016-09-23 18:06:29 +00:00
2016-09-23 20:51:42 +00:00
const int rc_hashes_init_stage1 = hashes_init_stage1 ( hashes , hashconfig , potfile_ctx , outfile_ctx , user_options , myargv [ user_options_extra - > optind ] ) ;
2016-09-23 18:06:29 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_hashes_init_stage1 = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( user_options - > keyspace = = false ) & & ( user_options - > stdout_flag = = false ) & & ( user_options - > opencl_info = = false ) )
2016-09-23 18:06:29 +00:00
{
2016-09-23 20:51:42 +00:00
if ( hashes - > hashes_cnt = = 0 )
{
log_error ( " ERROR: No hashes loaded " ) ;
2016-09-22 21:03:47 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-09-23 18:06:29 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-24 10:41:56 +00:00
/**
* potfile show / left final
*/
2016-09-23 20:51:42 +00:00
if ( user_options - > show = = true | | user_options - > left = = true )
2016-09-23 18:06:29 +00:00
{
2016-09-23 20:51:42 +00:00
outfile_write_close ( outfile_ctx ) ;
potfile_hash_free ( potfile_ctx , hashconfig ) ;
2016-09-24 12:00:59 +00:00
//if (user_options->quiet == false) log_info_nn ("");
2016-09-23 18:06:29 +00:00
return 0 ;
}
2016-09-20 15:04:31 +00:00
2016-09-23 19:41:05 +00:00
/**
2016-09-23 20:51:42 +00:00
* Potfile removes
2016-09-23 19:41:05 +00:00
*/
2016-09-23 20:51:42 +00:00
int potfile_remove_cracks = 0 ;
2016-09-20 15:04:31 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > potfile_disable = = 0 )
{
if ( user_options - > quiet = = false ) log_info_nn ( " Comparing hashes with potfile entries... " ) ;
2016-09-22 09:35:08 +00:00
2016-09-23 20:51:42 +00:00
potfile_remove_cracks = potfile_remove_parse ( potfile_ctx , hashconfig , hashes ) ;
}
2016-09-20 15:04:31 +00:00
2016-09-23 20:51:42 +00:00
/**
* load hashes , stage 2 , remove duplicates , build base structure
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
const u32 hashes_cnt_orig = hashes - > hashes_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
const int rc_hashes_init_stage2 = hashes_init_stage2 ( hashes , hashconfig , opencl_ctx , user_options ) ;
if ( rc_hashes_init_stage2 = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 19:50:35 +00:00
/**
2016-09-23 20:51:42 +00:00
* load hashes , stage 3 , automatic Optimizers
2016-09-23 19:50:35 +00:00
*/
2016-09-23 20:51:42 +00:00
const int rc_hashes_init_stage3 = hashes_init_stage3 ( hashes , hashconfig , user_options ) ;
2016-09-23 19:50:35 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_hashes_init_stage3 = = - 1 ) return - 1 ;
2016-09-23 19:50:35 +00:00
2016-09-23 20:51:42 +00:00
hashes_logger ( hashes , logfile_ctx ) ;
2016-09-23 19:50:35 +00:00
2016-09-23 20:51:42 +00:00
/**
* bitmaps
*/
2016-09-23 19:50:35 +00:00
2016-09-23 20:51:42 +00:00
bitmap_ctx_t * bitmap_ctx = ( bitmap_ctx_t * ) mymalloc ( sizeof ( bitmap_ctx_t ) ) ;
2016-09-23 19:50:35 +00:00
2016-09-23 20:51:42 +00:00
data . bitmap_ctx = bitmap_ctx ;
bitmap_ctx_init ( bitmap_ctx , user_options , hashconfig , hashes ) ;
2016-09-23 19:41:05 +00:00
2016-09-22 20:40:47 +00:00
/**
2016-09-23 20:51:42 +00:00
* word len
2016-09-22 20:40:47 +00:00
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint pw_min = hashconfig_general_pw_min ( hashconfig ) ;
uint pw_max = hashconfig_general_pw_max ( hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* If we have a NOOP rule then we can process words from wordlists > length 32 for slow hashes
*/
int has_noop = 0 ;
2016-09-24 10:05:56 +00:00
for ( uint kernel_rules_pos = 0 ; kernel_rules_pos < rules_ctx - > kernel_rules_cnt ; kernel_rules_pos + + )
2016-09-23 20:51:42 +00:00
{
2016-09-24 10:05:56 +00:00
if ( rules_ctx - > kernel_rules_buf [ kernel_rules_pos ] . cmds [ 0 ] ! = RULE_OP_MANGLE_NOOP ) continue ;
if ( rules_ctx - > kernel_rules_buf [ kernel_rules_pos ] . cmds [ 1 ] ! = 0 ) continue ;
2016-09-23 20:51:42 +00:00
has_noop = 1 ;
}
2016-03-26 09:37:59 +00:00
2016-09-23 20:51:42 +00:00
if ( has_noop = = 0 )
{
switch ( user_options_extra - > attack_kern )
{
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 )
{
switch ( user_options_extra - > attack_kern )
{
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
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
/**
* 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 ) ;
if ( user_options - > custom_charset_1 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig , user_options ) ;
if ( user_options - > custom_charset_2 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig , user_options ) ;
if ( user_options - > custom_charset_3 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig , user_options ) ;
if ( user_options - > custom_charset_4 ) mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_4 , 3 , hashconfig , user_options ) ;
2016-09-23 20:51:42 +00:00
/**
* HM devices : init
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false )
{
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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . hm_adl = NULL ;
data . hm_nvapi = NULL ;
data . hm_nvml = NULL ;
data . hm_xnvctrl = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( opencl_ctx - > need_nvml = = true ) & & ( nvml_init ( nvml ) = = 0 ) )
{
data . hm_nvml = nvml ;
}
if ( data . hm_nvml )
{
if ( hm_NVML_nvmlInit ( data . hm_nvml ) = = NVML_SUCCESS )
{
HM_ADAPTER_NVML nvmlGPUHandle [ DEVICES_MAX ] = { 0 } ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int tmp_in = hm_get_adapter_index_nvml ( nvmlGPUHandle ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int tmp_out = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( int i = 0 ; i < tmp_in ; i + + )
{
hm_adapters_nvml [ tmp_out + + ] . nvml = nvmlGPUHandle [ i ] ;
}
2016-09-22 14:23:36 +00:00
2016-09-23 20:51:42 +00:00
for ( int i = 0 ; i < tmp_out ; i + + )
{
unsigned int speed ;
2016-09-22 14:23:36 +00:00
2016-09-23 20:51:42 +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-09-22 14:23:36 +00:00
2016-09-23 20:51:42 +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-09-22 14:23:36 +00:00
2016-09-23 20:51:42 +00:00
if ( ( opencl_ctx - > need_nvapi = = true ) & & ( nvapi_init ( nvapi ) = = 0 ) )
{
data . hm_nvapi = nvapi ;
}
if ( data . hm_nvapi )
{
if ( hm_NvAPI_Initialize ( data . hm_nvapi ) = = NVAPI_OK )
{
HM_ADAPTER_NVAPI nvGPUHandle [ DEVICES_MAX ] = { 0 } ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
int tmp_in = hm_get_adapter_index_nvapi ( nvGPUHandle ) ;
int tmp_out = 0 ;
for ( int i = 0 ; i < tmp_in ; i + + )
{
hm_adapters_nvapi [ tmp_out + + ] . nvapi = nvGPUHandle [ i ] ;
}
}
}
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( ( opencl_ctx - > need_xnvctrl = = true ) & & ( xnvctrl_init ( xnvctrl ) = = 0 ) )
{
data . hm_xnvctrl = xnvctrl ;
}
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_xnvctrl )
2016-09-16 15:31:31 +00:00
{
2016-09-23 20:51:42 +00:00
if ( hm_XNVCTRL_XOpenDisplay ( data . hm_xnvctrl ) = = 0 )
{
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 - > 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-16 15:31:31 +00:00
}
2016-09-23 20:51:42 +00:00
if ( ( opencl_ctx - > need_adl = = true ) & & ( adl_init ( adl ) = = 0 ) )
{
data . hm_adl = adl ;
}
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_adl )
{
if ( hm_ADL_Main_Control_Create ( data . hm_adl , ADL_Main_Memory_Alloc , 0 ) = = ADL_OK )
{
// total number of adapters
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
int hm_adapters_num ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( get_adapters_num_adl ( data . hm_adl , & hm_adapters_num ) ! = 0 ) return - 1 ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
// adapter info
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
LPAdapterInfo lpAdapterInfo = hm_get_adapter_info_adl ( data . hm_adl , hm_adapters_num ) ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( lpAdapterInfo = = NULL ) return - 1 ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
// get a list (of ids of) valid/usable adapters
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
int num_adl_adapters = 0 ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
u32 * valid_adl_device_list = hm_get_list_valid_adl_adapters ( hm_adapters_num , & num_adl_adapters , lpAdapterInfo ) ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
if ( num_adl_adapters > 0 )
{
hc_thread_mutex_lock ( mux_hwmon ) ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
// hm_get_opencl_busid_devid (hm_adapters_adl, devices_all_cnt, devices_all);
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
hm_get_adapter_index_adl ( hm_adapters_adl , valid_adl_device_list , num_adl_adapters , lpAdapterInfo ) ;
2016-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +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-09-16 15:31:31 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
}
2015-12-07 20:37:12 +00:00
2016-09-23 20:51:42 +00:00
myfree ( valid_adl_device_list ) ;
myfree ( lpAdapterInfo ) ;
}
}
2015-12-07 20:37:12 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_adl = = NULL & & data . hm_nvml = = NULL & & data . hm_xnvctrl = = NULL )
2015-12-07 20:37:12 +00:00
{
2016-09-23 20:51:42 +00:00
user_options - > gpu_temp_disable = true ;
2015-12-07 20:37:12 +00:00
}
2016-09-23 20:51:42 +00:00
}
/**
* OpenCL devices : allocate buffer for device specific information
*/
ADLOD6MemClockState * od_clock_mem_status = ( ADLOD6MemClockState * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( ADLOD6MemClockState ) ) ;
int * od_power_control_status = ( int * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( int ) ) ;
unsigned int * nvml_power_limit = ( unsigned int * ) mycalloc ( opencl_ctx - > devices_cnt , sizeof ( unsigned int ) ) ;
/**
* User - defined GPU temp handling
*/
if ( user_options - > gpu_temp_disable = = true )
{
user_options - > gpu_temp_abort = 0 ;
user_options - > gpu_temp_retain = 0 ;
}
/**
* enable custom signal handler ( s )
*/
if ( user_options - > benchmark = = false )
{
hc_signal ( sigHandler_default ) ;
}
else
{
hc_signal ( sigHandler_benchmark ) ;
}
/**
* inform the user
*/
if ( user_options - > quiet = = false )
{
log_info ( " Hashes: %u digests; %u unique digests, %u unique salts " , hashes_cnt_orig , hashes - > digests_cnt , hashes - > salts_cnt ) ;
log_info ( " Bitmaps: %u bits, %u entries, 0x%08x mask, %u bytes, %u/%u rotates " , bitmap_ctx - > bitmap_bits , bitmap_ctx - > bitmap_nums , bitmap_ctx - > bitmap_mask , bitmap_ctx - > bitmap_size , bitmap_ctx - > bitmap_shift1 , bitmap_ctx - > bitmap_shift2 ) ;
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-07 20:37:12 +00:00
{
2016-09-24 10:05:56 +00:00
log_info ( " Rules: %u " , rules_ctx - > kernel_rules_cnt ) ;
2015-12-07 20:37:12 +00:00
}
2016-09-23 20:51:42 +00:00
2016-09-24 12:00:59 +00:00
if ( user_options - > quiet = = false ) log_info ( " " ) ;
2016-09-23 20:51:42 +00:00
if ( hashconfig - > opti_type )
2015-12-07 20:37:12 +00:00
{
2016-09-23 20:51:42 +00:00
log_info ( " Applicable Optimizers: " ) ;
for ( uint i = 0 ; i < 32 ; i + + )
{
const uint opti_bit = 1u < < i ;
if ( hashconfig - > opti_type & opti_bit ) log_info ( " * %s " , stroptitype ( opti_bit ) ) ;
}
2015-12-07 20:37:12 +00:00
}
2016-09-24 12:00:59 +00:00
if ( user_options - > quiet = = false ) log_info ( " " ) ;
2016-09-23 18:08:47 +00:00
/**
2016-09-23 20:51:42 +00:00
* Watchdog and Temperature balance
2016-09-23 18:08:47 +00:00
*/
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false & & data . hm_adl = = NULL & & data . hm_nvml = = NULL & & data . hm_xnvctrl = = NULL )
{
log_info ( " Watchdog: Hardware Monitoring Interface not found on your system " ) ;
}
if ( user_options - > gpu_temp_abort = = 0 )
2016-09-23 18:08:47 +00:00
{
2016-09-23 20:51:42 +00:00
log_info ( " Watchdog: Temperature abort trigger disabled " ) ;
2016-09-23 18:08:47 +00:00
}
else
{
2016-09-23 20:51:42 +00:00
log_info ( " Watchdog: Temperature abort trigger set to %uc " , user_options - > gpu_temp_abort ) ;
2016-09-23 18:08:47 +00:00
}
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_retain = = 0 )
{
log_info ( " Watchdog: Temperature retain trigger disabled " ) ;
}
else
{
log_info ( " Watchdog: Temperature retain trigger set to %uc " , user_options - > gpu_temp_retain ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > quiet = = false ) log_info ( " " ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* HM devices : copy
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false )
{
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
if ( ( device_param - > device_type & CL_DEVICE_TYPE_GPU ) = = 0 ) continue ;
if ( device_param - > skipped ) continue ;
const uint platform_devices_id = device_param - > platform_devices_id ;
if ( device_param - > device_vendor_id = = VENDOR_ID_AMD )
{
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 ;
data . hm_device [ device_id ] . xnvctrl = 0 ;
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 ;
data . hm_device [ device_id ] . fan_set_supported = 0 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > device_vendor_id = = VENDOR_ID_NV )
{
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 ;
data . hm_device [ device_id ] . xnvctrl = hm_adapters_xnvctrl [ platform_devices_id ] . xnvctrl ;
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 ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* powertune on user request
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > powertune_enable = = true )
{
hc_thread_mutex_lock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_AMD )
{
/**
* 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 ?
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_device [ device_id ] . od_version = = 6 )
{
int ADL_rc ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// check powertune capabilities first, if not available then skip device
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int powertune_supported = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive6_PowerControl_Caps ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune_supported ) ) ! = ADL_OK )
{
log_error ( " ERROR: Failed to get ADL PowerControl Capabilities " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// first backup current value, we will restore it later
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( powertune_supported ! = 0 )
{
// powercontrol settings
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
ADLOD6PowerControlInfo powertune = { 0 , 0 , 0 , 0 , 0 } ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune ) ) = = ADL_OK )
{
ADL_rc = hm_ADL_Overdrive_PowerControl_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & od_power_control_status [ device_id ] ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ADL_rc ! = ADL_OK )
{
log_error ( " ERROR: Failed to get current ADL PowerControl settings " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , powertune . iMaxValue ) ) ! = ADL_OK )
{
log_error ( " ERROR: Failed to set new ADL PowerControl values " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// clocks
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
memset ( & od_clock_mem_status [ device_id ] , 0 , sizeof ( ADLOD6MemClockState ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
od_clock_mem_status [ device_id ] . state . iNumberOfPerformanceLevels = 2 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 )
{
log_error ( " ERROR: Failed to get ADL memory and engine clock frequency " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// Query capabilities only to see if profiles were not "damaged", if so output a warning but do accept the users profile settings
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
ADLOD6Capabilities caps = { 0 , 0 , 0 , { 0 , 0 , 0 } , { 0 , 0 , 0 } , 0 , 0 } ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_Capabilities_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & caps ) ) ! = ADL_OK )
{
log_error ( " ERROR: Failed to get ADL device capabilities " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int engine_clock_max = ( int ) ( 0.6666 * caps . sEngineClockRange . iMax ) ;
int memory_clock_max = ( int ) ( 0.6250 * caps . sMemoryClockRange . iMax ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int warning_trigger_engine = ( int ) ( 0.25 * engine_clock_max ) ;
int warning_trigger_memory = ( int ) ( 0.25 * memory_clock_max ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// warning if profile has too low max values
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( engine_clock_max - engine_clock_profile_max ) > warning_trigger_engine )
{
log_info ( " WARN: The custom profile seems to have too low maximum engine clock values. You therefore may not reach full performance " ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( memory_clock_max - memory_clock_profile_max ) > warning_trigger_memory )
{
log_info ( " WARN: The custom profile seems to have too low maximum memory clock values. You therefore may not reach full performance " ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
ADLOD6StateInfo * performance_state = ( ADLOD6StateInfo * ) mycalloc ( 1 , sizeof ( ADLOD6StateInfo ) + sizeof ( ADLOD6PerformanceLevel ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
performance_state - > iNumberOfPerformanceLevels = 2 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 )
{
log_info ( " ERROR: Failed to set ADL performance state " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
local_free ( performance_state ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// set powertune value only
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( powertune_supported ! = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
// powertune set
ADLOD6PowerControlInfo powertune = { 0 , 0 , 0 , 0 , 0 } ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControlInfo_Get ( data . hm_adl , data . hm_device [ device_id ] . adl , & powertune ) ) ! = ADL_OK )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: Failed to get current ADL PowerControl settings " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
if ( ( ADL_rc = hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , powertune . iMaxValue ) ) ! = ADL_OK )
{
log_error ( " ERROR: Failed to set new ADL PowerControl values " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
2015-12-04 14:47:52 +00:00
}
}
}
}
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_NV )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
// first backup current value, we will restore it later
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
unsigned int limit ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
bool powertune_supported = false ;
if ( hm_NVML_nvmlDeviceGetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , & limit ) = = NVML_SUCCESS )
{
powertune_supported = true ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// if backup worked, activate the maximum allowed
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( powertune_supported = = true )
{
unsigned int minLimit ;
unsigned int maxLimit ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( hm_NVML_nvmlDeviceGetPowerManagementLimitConstraints ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , & minLimit , & maxLimit ) = = NVML_SUCCESS )
{
if ( maxLimit > 0 )
{
if ( hm_NVML_nvmlDeviceSetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , maxLimit ) = = NVML_SUCCESS )
{
// now we can be sure we need to reset later
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
nvml_power_limit [ device_id ] = limit ;
}
}
}
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-23 20:51:42 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
}
2016-03-26 09:37:59 +00:00
2016-09-23 20:51:42 +00:00
# if defined (DEBUG)
if ( user_options - > benchmark = = true ) log_info ( " Hashmode: %d " , hashconfig - > hash_mode ) ;
# endif
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Initializing device kernels and memory... " ) ;
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
/*
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
data . session_ctx = session_ctx ;
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
session_ctx_init ( session_ctx ) ;
*/
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
opencl_session_begin ( opencl_ctx , hashconfig , hashes , rules_ctx , user_options , user_options_extra , folder_config , bitmap_ctx , tuning_db ) ;
2016-06-26 14:59:56 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " " ) ;
2016-06-26 14:59:56 +00:00
2016-09-23 20:51:42 +00:00
/**
* Store initial fanspeed if gpu_temp_retain is enabled
*/
2016-09-14 15:40:39 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false )
{
if ( user_options - > gpu_temp_retain )
2016-09-14 15:40:39 +00:00
{
2016-09-23 20:51:42 +00:00
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-09-14 15:40:39 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2016-09-14 15:40:39 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_mutex_lock ( mux_hwmon ) ;
if ( data . hm_device [ device_id ] . fan_get_supported = = true )
2016-09-14 15:40:39 +00:00
{
2016-09-23 20:51:42 +00:00
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-09-14 15:40:39 +00:00
2016-09-23 20:51:42 +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.
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( fanpolicy = = 1 )
{
data . hm_device [ device_id ] . fan_set_supported = true ;
2016-07-08 20:57:27 +00:00
2016-09-23 20:51:42 +00:00
int rc = - 1 ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +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-06-02 09:10:36 +00:00
2016-09-23 20:51:42 +00:00
# if defined (_WIN)
rc = hm_set_fanspeed_with_device_id_nvapi ( device_id , fanspeed , 1 ) ;
# endif
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +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 ) ;
data . hm_device [ device_id ] . fan_set_supported = 0 ;
}
}
else
{
data . hm_device [ device_id ] . fan_set_supported = 0 ;
}
}
hc_thread_mutex_unlock ( mux_hwmon ) ;
2016-06-02 09:10:36 +00:00
}
2016-09-23 20:51:42 +00:00
}
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
/**
* In benchmark - mode , inform user which algorithm is checked
*/
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > benchmark = = true )
{
if ( user_options - > machine_readable = = false )
{
char * hash_type = strhashtype ( hashconfig - > hash_mode ) ; // not a bug
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
log_info ( " Hashtype: %s " , hash_type ) ;
log_info ( " " ) ;
}
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
/**
* keep track of the progress
*/
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +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 ) ) ;
2016-01-13 16:10:40 +00:00
2016-09-24 11:01:17 +00:00
/**
* dictstat
*/
dictstat_read ( dictstat_ctx ) ;
2016-09-23 20:51:42 +00:00
/**
* dictionary pad
*/
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
wl_data_t * wl_data = ( wl_data_t * ) mymalloc ( sizeof ( wl_data_t ) ) ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
wl_data_init ( wl_data , user_options , hashconfig ) ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
cs_t * css_buf = NULL ;
uint css_cnt = 0 ;
uint dictcnt = 0 ;
uint maskcnt = 1 ;
char * * masks = NULL ;
char * * dictfiles = NULL ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
uint mask_from_file = 0 ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
{
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
{
int wls_left = myargc - ( user_options_extra - > optind + 1 ) ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
2016-06-02 09:10:36 +00:00
{
2016-09-23 20:51:42 +00:00
char * l0_filename = myargv [ user_options_extra - > optind + 1 + i ] ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
struct stat l0_stat ;
if ( stat ( l0_filename , & l0_stat ) = = - 1 )
2016-01-13 16:10:40 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , l0_filename , strerror ( errno ) ) ;
return - 1 ;
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
uint is_dir = S_ISDIR ( l0_stat . st_mode ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = l0_filename ;
}
else
{
// do not allow --keyspace w/ a directory
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = true )
{
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
char * * dictionary_files = NULL ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictionary_files = scan_directory ( l0_filename ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( dictionary_files ! = NULL )
2016-01-13 16:10:40 +00:00
{
2016-09-23 20:51:42 +00:00
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 ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l1_filename , strerror ( errno ) ) ;
return - 1 ;
}
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( S_ISREG ( l1_stat . st_mode ) )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
}
}
2016-01-13 16:10:40 +00:00
}
2016-09-23 20:51:42 +00:00
local_free ( dictionary_files ) ;
2016-01-13 16:10:40 +00:00
}
}
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
if ( dictcnt < 1 )
2016-02-04 14:07:38 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: No usable dictionary file found. " ) ;
return - 1 ;
2016-02-04 14:07:38 +00:00
}
2016-01-13 16:10:40 +00:00
}
2016-09-23 20:51:42 +00:00
else if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
{
dictcnt = 1 ;
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_COMBI )
{
// display
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
char * dictfile1 = myargv [ user_options_extra - > optind + 1 + 0 ] ;
char * dictfile2 = myargv [ user_options_extra - > optind + 1 + 1 ] ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
// find the bigger dictionary and use as base
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
FILE * fp1 = NULL ;
FILE * fp2 = NULL ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
struct stat tmp_stat ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
if ( ( fp1 = fopen ( dictfile1 , " rb " ) ) = = NULL )
2016-02-04 14:07:38 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , dictfile1 , strerror ( errno ) ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-05-30 08:29:18 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( dictfile1 , & tmp_stat ) = = - 1 )
2016-05-30 08:29:18 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , dictfile1 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
return - 1 ;
2016-05-30 08:29:18 +00:00
}
2016-09-23 20:51:42 +00:00
if ( S_ISDIR ( tmp_stat . st_mode ) )
2016-05-30 08:29:18 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s must be a regular file " , dictfile1 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
return - 1 ;
2016-05-30 08:29:18 +00:00
}
2016-09-23 20:51:42 +00:00
if ( ( fp2 = fopen ( dictfile2 , " rb " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
fclose ( fp1 ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
if ( stat ( dictfile2 , & tmp_stat ) = = - 1 )
2016-02-04 14:07:38 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
if ( S_ISDIR ( tmp_stat . st_mode ) )
{
log_error ( " ERROR: %s must be a regular file " , dictfile2 , strerror ( errno ) ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
data . combs_cnt = 1 ;
2016-02-04 14:07:38 +00:00
2016-09-24 10:05:56 +00:00
const u64 words1_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fp1 , dictfile1 , dictstat_ctx ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
if ( words1_cnt = = 0 )
{
log_error ( " ERROR: %s: empty file " , dictfile1 ) ;
2016-02-04 14:07:38 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-05-12 10:44:15 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
2016-02-04 14:07:38 +00:00
}
2016-09-23 20:51:42 +00:00
data . combs_cnt = 1 ;
2016-09-24 10:05:56 +00:00
const u64 words2_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fp2 , dictfile2 , dictstat_ctx ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( words2_cnt = = 0 )
2016-01-13 16:10:40 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: empty file " , dictfile2 ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fp1 ) ;
fclose ( fp2 ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
data . dictfile = dictfile1 ;
data . dictfile2 = dictfile2 ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
if ( words1_cnt > = words2_cnt )
{
data . combs_cnt = words2_cnt ;
data . combs_mode = COMBINATOR_MODE_BASE_LEFT ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
dictfiles = & data . dictfile ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt = 1 ;
}
else
2015-12-15 11:04:22 +00:00
{
2016-09-23 20:51:42 +00:00
data . combs_cnt = words1_cnt ;
data . combs_mode = COMBINATOR_MODE_BASE_RIGHT ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles = & data . dictfile2 ;
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
dictcnt = 1 ;
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
// we also have to switch wordlist related rules!
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
char * tmpc = user_options - > rule_buf_l ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > rule_buf_l = user_options - > rule_buf_r ;
user_options - > rule_buf_r = tmpc ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int tmpi = user_options_extra - > rule_len_l ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options_extra - > rule_len_l = user_options_extra - > rule_len_r ;
user_options_extra - > rule_len_r = tmpi ;
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
{
char * mask = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
maskcnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > benchmark = = false )
{
mask = myargv [ user_options_extra - > optind + 1 ] ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) mymalloc ( INCR_MASKS * sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( user_options_extra - > optind + 2 ) < = myargc )
{
struct stat file_stat ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
{
int wls_left = myargc - ( user_options_extra - > optind + 1 ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
uint masks_avail = INCR_MASKS ;
for ( int i = 0 ; i < wls_left ; i + + )
{
if ( i ! = 0 )
{
mask = myargv [ user_options_extra - > optind + 1 + i ] ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( mask , & file_stat ) = = - 1 )
2016-06-01 17:01:44 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-06-01 17:01:44 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2016-09-23 20:51:42 +00:00
}
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
uint is_file = S_ISREG ( file_stat . st_mode ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( is_file = = 1 )
{
FILE * mask_fp ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
2016-06-01 17:01:44 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-06-01 17:01:44 +00:00
2016-07-10 11:23:06 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
2016-09-23 20:51:42 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
while ( ! feof ( mask_fp ) )
2016-06-01 17:01:44 +00:00
{
2016-09-23 20:51:42 +00:00
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( line_len = = 0 ) continue ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( line_buf [ 0 ] = = ' # ' ) continue ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks_avail + = INCR_MASKS ;
}
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt ] = mystrdup ( line_buf ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
maskcnt + + ;
2016-06-01 17:01:44 +00:00
}
2016-09-23 20:51:42 +00:00
myfree ( line_buf ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
fclose ( mask_fp ) ;
2016-06-01 17:01:44 +00:00
}
2016-09-23 20:51:42 +00:00
else
2016-06-01 17:01:44 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: unsupported file-type " , mask ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
2016-06-01 17:01:44 +00:00
}
}
2016-09-23 20:51:42 +00:00
mask_from_file = 1 ;
2016-06-01 17:01:44 +00:00
}
2016-09-23 20:51:42 +00:00
}
else
{
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*!$@_ " ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig , user_options ) ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig , user_options ) ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig , user_options ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
maskcnt = 1 ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( " ?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d " ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
user_options - > increment = true ;
}
}
else
{
/**
* generate full masks and charsets
*/
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
mask = hashconfig_benchmark_mask ( hashconfig ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
pw_min = mp_get_length ( mask ) ;
pw_max = pw_min ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) mymalloc ( sizeof ( char * ) ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
maskcnt = 1 ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
user_options - > increment = true ;
2015-12-04 14:47:52 +00:00
}
2016-05-29 22:05:46 +00:00
2016-09-23 20:51:42 +00:00
dictfiles = ( char * * ) mycalloc ( pw_max , sizeof ( char * ) ) ;
2016-01-24 21:48:01 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > increment = = true )
{
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 ;
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 )
{
data . combs_mode = COMBINATOR_MODE_BASE_LEFT ;
2016-05-12 10:44:15 +00:00
2016-09-23 20:51:42 +00:00
// display
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * mask = myargv [ myargc - 1 ] ;
2016-05-15 11:22:31 +00:00
2016-09-23 20:51:42 +00:00
maskcnt = 0 ;
2016-05-26 14:45:52 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) mymalloc ( 1 * sizeof ( char * ) ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
// mod
2016-05-26 14:45:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat file_stat ;
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
2016-05-26 14:45:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
2016-09-17 15:05:01 +00:00
{
2016-09-23 20:51:42 +00:00
uint is_file = S_ISREG ( file_stat . st_mode ) ;
if ( is_file = = 1 )
2016-09-22 08:55:33 +00:00
{
2016-09-23 20:51:42 +00:00
FILE * mask_fp ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-05-26 14:45:52 +00:00
2016-09-23 20:51:42 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2016-05-26 14:45:52 +00:00
2016-09-23 20:51:42 +00:00
uint masks_avail = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
while ( ! feof ( mask_fp ) )
{
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
2016-05-15 11:22:31 +00:00
2016-09-23 20:51:42 +00:00
if ( line_len = = 0 ) continue ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
if ( line_buf [ 0 ] = = ' # ' ) continue ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
masks_avail + = INCR_MASKS ;
2016-07-10 11:23:06 +00:00
}
2016-06-18 16:21:40 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt ] = mystrdup ( line_buf ) ;
maskcnt + + ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
myfree ( line_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( mask_fp ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask_from_file = 1 ;
2016-05-17 09:29:38 +00:00
}
2016-09-23 20:51:42 +00:00
else
{
maskcnt = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
// base
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
char * filename = myargv [ user_options_extra - > optind + 1 + i ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat file_stat ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( filename , & file_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , filename , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint is_dir = S_ISDIR ( file_stat . st_mode ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = filename ;
}
else
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
// do not allow --keyspace w/ a directory
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * * dictionary_files = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictionary_files = scan_directory ( filename ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( dictionary_files ! = NULL )
{
qsort ( dictionary_files , count_dictionaries ( dictionary_files ) , sizeof ( char * ) , sort_by_stringptr ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( int d = 0 ; dictionary_files [ d ] ! = NULL ; d + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
char * l1_filename = dictionary_files [ d ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat l1_stat ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , l1_filename , 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-23 20:51:42 +00:00
if ( S_ISREG ( l1_stat . st_mode ) )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
2015-12-04 14:47:52 +00:00
}
}
}
2016-09-23 20:51:42 +00:00
local_free ( dictionary_files ) ;
2015-12-04 14:47:52 +00:00
}
}
2016-09-23 20:51:42 +00:00
if ( dictcnt < 1 )
{
log_error ( " ERROR: No usable dictionary file found. " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > increment = = true )
{
maskcnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +00:00
for ( uint mask_cur = mask_min ; mask_cur < = mask_max ; mask_cur + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
char * cur_mask = mp_get_truncated_mask ( mask , strlen ( mask ) , mask_cur , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( cur_mask = = NULL ) break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt ] = cur_mask ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
maskcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) myrealloc ( masks , maskcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
{
data . combs_mode = COMBINATOR_MODE_BASE_RIGHT ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// display
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * mask = myargv [ user_options_extra - > optind + 1 + 0 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
maskcnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) mymalloc ( 1 * sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// mod
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat file_stat ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( mask , & file_stat ) = = - 1 )
{
maskcnt = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
else
{
uint is_file = S_ISREG ( file_stat . st_mode ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( is_file = = 1 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
FILE * mask_fp ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( mask_fp = fopen ( mask , " r " ) ) = = NULL )
{
log_error ( " ERROR: %s: %s " , mask , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * line_buf = ( char * ) mymalloc ( HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint masks_avail = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
while ( ! feof ( mask_fp ) )
{
memset ( line_buf , 0 , HCBUFSIZ_LARGE ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int line_len = fgetl ( mask_fp , line_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( line_len = = 0 ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( line_buf [ 0 ] = = ' # ' ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( masks_avail = = maskcnt )
{
masks = ( char * * ) myrealloc ( masks , masks_avail * sizeof ( char * ) , INCR_MASKS * sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks_avail + = INCR_MASKS ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt ] = mystrdup ( line_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
maskcnt + + ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
myfree ( line_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( mask_fp ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask_from_file = 1 ;
2015-12-04 14:47:52 +00:00
}
else
{
2016-09-23 20:51:42 +00:00
maskcnt = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt - 1 ] = mystrdup ( mask ) ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// base
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int wls_left = myargc - ( user_options_extra - > optind + 2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( int i = 0 ; i < wls_left ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
char * filename = myargv [ user_options_extra - > optind + 2 + i ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat file_stat ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( filename , & file_stat ) = = - 1 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: %s: %s " , filename , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint is_dir = S_ISDIR ( file_stat . st_mode ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( is_dir = = 0 )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = filename ;
}
else
{
// do not allow --keyspace w/ a directory
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = true )
{
log_error ( " ERROR: Keyspace parameter is not allowed together with a directory " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * * dictionary_files = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictionary_files = scan_directory ( filename ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( dictionary_files ! = NULL )
{
qsort ( dictionary_files , count_dictionaries ( dictionary_files ) , sizeof ( char * ) , sort_by_stringptr ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( int d = 0 ; dictionary_files [ d ] ! = NULL ; d + + )
{
char * l1_filename = dictionary_files [ d ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
struct stat l1_stat ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( stat ( l1_filename , & l1_stat ) = = - 1 )
{
log_error ( " ERROR: %s: %s " , l1_filename , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( S_ISREG ( l1_stat . st_mode ) )
{
dictfiles = ( char * * ) myrealloc ( dictfiles , dictcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = mystrdup ( l1_filename ) ;
}
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
local_free ( dictionary_files ) ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( dictcnt < 1 )
{
log_error ( " ERROR: No usable dictionary file found. " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-03-26 09:37:59 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > increment = = true )
{
maskcnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +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 , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( cur_mask = = NULL ) break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks [ maskcnt ] = cur_mask ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
maskcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
masks = ( char * * ) myrealloc ( masks , maskcnt * sizeof ( char * ) , sizeof ( char * ) ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . pw_min = pw_min ;
data . pw_max = pw_max ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
2016-09-24 10:41:56 +00:00
* weak hash check is the first to write to potfile , so open it for writing from here
2016-09-23 20:51:42 +00:00
*/
2016-09-12 08:16:42 +00:00
2016-09-23 20:51:42 +00:00
potfile_write_open ( potfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* weak hash check
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > weak_hash_threshold > = hashes - > salts_cnt )
{
hc_device_param_t * device_param = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
{
device_param = & opencl_ctx - > devices_param [ device_id ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
break ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
if ( user_options - > quiet = = false ) log_info_nn ( " Checking for weak hashes... " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint salt_pos = 0 ; salt_pos < hashes - > salts_cnt ; salt_pos + + )
{
2016-09-24 10:05:56 +00:00
weak_hash_check ( opencl_ctx , device_param , user_options , user_options_extra , rules_ctx , hashconfig , hashes , salt_pos ) ;
2016-09-23 20:51:42 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* status and monitor threads
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint inner_threads_cnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-09-23 20:51:42 +00:00
data . shutdown_inner = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Outfile remove
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = false & & user_options - > benchmark = = false & & user_options - > stdout_flag = = false )
{
hc_thread_create ( inner_threads [ inner_threads_cnt ] , thread_monitor , NULL ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
inner_threads_cnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( outcheck_ctx - > enabled = = true )
{
hc_thread_create ( inner_threads [ inner_threads_cnt ] , thread_outfile_remove , NULL ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
inner_threads_cnt + + ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* main loop
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > quiet = = false )
{
if ( potfile_remove_cracks > 0 )
{
2016-09-24 12:00:59 +00:00
if ( potfile_remove_cracks = = 1 )
{
log_info ( " INFO: Removed 1 hash found in potfile " ) ;
log_info ( " " ) ;
}
else
{
log_info ( " INFO: Removed %d hashes found in potfile " , potfile_remove_cracks ) ;
log_info ( " " ) ;
}
2016-09-23 20:51:42 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hcstat_table_t * root_table_buf = NULL ;
hcstat_table_t * markov_table_buf = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint initial_restore_done = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . maskcnt = maskcnt ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
restore_data_t * rd = data . rd ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint maskpos = rd - > maskpos ; maskpos < maskcnt ; maskpos + + )
{
//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
2016-09-23 20:51:42 +00:00
if ( maskpos > rd - > maskpos )
{
rd - > dictpos = 0 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
rd - > maskpos = maskpos ;
data . maskpos = maskpos ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 | | user_options - > attack_mode = = ATTACK_MODE_HYBRID2 | | user_options - > attack_mode = = ATTACK_MODE_BF )
{
char * mask = masks [ maskpos ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( mask_from_file = = true )
{
if ( mask [ 0 ] = = ' \\ ' & & mask [ 1 ] = = ' # ' ) mask + + ; // escaped comment sign (sharp) "\#"
2016-03-26 09:37:59 +00:00
2016-09-23 20:51:42 +00:00
char * str_ptr ;
uint str_pos ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint mask_offset = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint separator_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( separator_cnt = 0 ; separator_cnt < 4 ; separator_cnt + + )
{
str_ptr = strstr ( mask + mask_offset , " , " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( str_ptr = = NULL ) break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
str_pos = str_ptr - mask ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// escaped separator, i.e. "\,"
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( str_pos > 0 )
{
if ( mask [ str_pos - 1 ] = = ' \\ ' )
{
separator_cnt - - ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask_offset = str_pos + 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
continue ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// reset the offset
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask_offset = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask [ str_pos ] = ' \0 ' ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
switch ( separator_cnt )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
case 0 :
mp_reset_usr ( mp_usr , 0 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > custom_charset_1 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_1 , 0 , hashconfig , user_options ) ;
break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
case 1 :
mp_reset_usr ( mp_usr , 1 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > custom_charset_2 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_2 , 1 , hashconfig , user_options ) ;
break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
case 2 :
mp_reset_usr ( mp_usr , 2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > custom_charset_3 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_3 , 2 , hashconfig , user_options ) ;
break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
case 3 :
mp_reset_usr ( mp_usr , 3 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > custom_charset_4 = mask ;
mp_setup_usr ( mp_sys , mp_usr , user_options - > custom_charset_4 , 3 , hashconfig , user_options ) ;
break ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mask = mask + str_pos + 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 " , "
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint mask_len_cur = strlen ( mask ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 "\"
2015-12-04 14:47:52 +00:00
}
}
2016-09-23 20:51:42 +00:00
mask_prev = mask [ mask_iter ] ;
mask [ mask_out_pos ] = mask [ mask_iter ] ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
mask [ mask_out_pos ] = ' \0 ' ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +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
{
2016-09-23 20:51:42 +00:00
if ( maskpos > 0 )
{
local_free ( css_buf ) ;
local_free ( data . root_css_buf ) ;
local_free ( data . markov_css_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
local_free ( masks [ maskpos - 1 ] ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
css_buf = mp_gen_css ( mask , strlen ( mask ) , mp_sys , mp_usr , & css_cnt , hashconfig , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . mask = mask ;
data . css_cnt = css_cnt ;
data . css_buf = css_buf ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint uniq_tbls [ SP_PW_MAX ] [ CHARSIZ ] = { { 0 } } ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
mp_css_to_uniq_tbl ( css_cnt , css_buf , uniq_tbls ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . root_css_buf = root_css_buf ;
data . markov_css_buf = markov_css_buf ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +00:00
data . combs_cnt = sp_get_sum ( 0 , css_cnt , root_css_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
local_free ( root_table_buf ) ;
local_free ( markov_table_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// args
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +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 ;
}
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
{
device_param - > kernel_params_mp_buf32 [ 5 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 6 ] = 0 ;
device_param - > kernel_params_mp_buf32 [ 7 ] = 0 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
cl_int CL_err = CL_SUCCESS ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ] ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( CL_err ! = CL_SUCCESS )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: clSetKernelArg(): %s \n " , val2cstr_cl ( CL_err ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clEnqueueWriteBuffer(): %s \n " , val2cstr_cl ( CL_err ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
{
dictcnt = 0 ; // number of "sub-masks", i.e. when using incremental mode
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > increment = = true )
{
for ( uint i = 0 ; i < dictcnt ; i + + )
{
local_free ( dictfiles [ i ] ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
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 , user_options ) ;
2016-03-26 09:37:59 +00:00
2016-09-23 20:51:42 +00:00
if ( l1_filename = = NULL ) break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictcnt + + ;
dictfiles [ dictcnt - 1 ] = l1_filename ;
}
2015-12-04 14:47:52 +00:00
}
else
{
2016-09-23 20:51:42 +00:00
dictcnt + + ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictfiles [ dictcnt - 1 ] = mask ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
if ( dictcnt = = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: Mask is too small " ) ;
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-23 20:51:42 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* update induction directory scan
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
induct_ctx_scan ( induct_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* prevent the user from using - - skip / - - limit together w / maskfile and or dictfile
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > skip ! = 0 | | user_options - > limit ! = 0 )
{
if ( ( maskcnt > 1 ) | | ( dictcnt > 1 ) )
{
log_error ( " ERROR: --skip/--limit are not supported with --increment or mask files " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* prevent the user from using - - keyspace together w / maskfile and or dictfile
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = true )
{
if ( ( maskcnt > 1 ) | | ( dictcnt > 1 ) )
{
log_error ( " ERROR: --keyspace is not supported with --increment or mask files " ) ;
return - 1 ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint dictpos = rd - > dictpos ; dictpos < dictcnt ; dictpos + + )
{
if ( opencl_ctx - > run_main_level3 = = false ) break ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
rd - > dictpos = dictpos ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_generate_subid ( logfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_msg ( " START " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +00:00
memset ( data . cpt_buf , 0 , CPT_BUF * sizeof ( cpt_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . cpt_pos = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . cpt_start = time ( NULL ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . cpt_total = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > restore = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
rd - > words_cur = user_options - > skip ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > skip = 0 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
data . ms_paused = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . kernel_power_final = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . words_cur = rd - > words_cur ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
device_param - > speed_pos = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
memset ( device_param - > speed_cnt , 0 , SPEED_CACHE * sizeof ( u64 ) ) ;
memset ( device_param - > speed_ms , 0 , SPEED_CACHE * sizeof ( double ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
device_param - > exec_pos = 0 ;
2016-09-13 11:06:55 +00:00
2016-09-23 20:51:42 +00:00
memset ( device_param - > exec_ms , 0 , EXEC_CACHE * sizeof ( double ) ) ;
2016-09-13 11:06:55 +00:00
2016-09-23 20:51:42 +00:00
device_param - > outerloop_pos = 0 ;
device_param - > outerloop_left = 0 ;
device_param - > innerloop_pos = 0 ;
device_param - > innerloop_left = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// some more resets:
2016-02-05 14:27:09 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > pws_buf ) memset ( device_param - > pws_buf , 0 , device_param - > size_pws ) ;
2016-01-16 11:24:08 +00:00
2016-09-23 20:51:42 +00:00
device_param - > pws_cnt = 0 ;
2016-01-16 11:24:08 +00:00
2016-09-23 20:51:42 +00:00
device_param - > words_off = 0 ;
device_param - > words_done = 0 ;
2016-01-16 11:24:08 +00:00
}
2016-09-23 20:51:42 +00:00
// figure out some workload
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
{
char * dictfile = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( induct_ctx - > induction_dictionaries_cnt )
{
dictfile = induct_ctx - > induction_dictionaries [ 0 ] ;
}
else
{
dictfile = dictfiles [ dictpos ] ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . dictfile = dictfile ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_string ( dictfile ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint i = 0 ; i < user_options - > rp_files_cnt ; i + + )
{
logfile_sub_var_string ( " rulefile " , user_options - > rp_files [ i ] ) ;
}
2016-06-27 10:13:46 +00:00
2016-09-23 20:51:42 +00:00
FILE * fd2 = fopen ( dictfile , " rb " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2016-06-27 10:13:46 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-06-27 10:13:46 +00:00
2016-09-24 10:05:56 +00:00
data . words_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fd2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . words_cnt = = 0 )
{
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
continue ;
}
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
else if ( user_options - > attack_mode = = ATTACK_MODE_COMBI )
{
char * dictfile = data . dictfile ;
char * dictfile2 = data . dictfile2 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_string ( dictfile ) ;
logfile_sub_string ( dictfile2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . combs_mode = = COMBINATOR_MODE_BASE_LEFT )
{
FILE * fd2 = fopen ( dictfile , " rb " ) ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +00:00
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
data . words_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fd2 ) ;
}
else if ( data . combs_mode = = COMBINATOR_MODE_BASE_RIGHT )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
FILE * fd2 = fopen ( dictfile2 , " rb " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile2 , strerror ( errno ) ) ;
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
data . words_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fd2 , dictfile2 , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fd2 ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . words_cnt = = 0 )
{
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
continue ;
}
}
else if ( ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 ) | | ( user_options - > attack_mode = = ATTACK_MODE_HYBRID2 ) )
{
char * dictfile = NULL ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( induct_ctx - > induction_dictionaries_cnt )
{
dictfile = induct_ctx - > induction_dictionaries [ 0 ] ;
}
else
{
dictfile = dictfiles [ dictpos ] ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . dictfile = dictfile ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * mask = data . mask ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_string ( dictfile ) ;
logfile_sub_string ( mask ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
FILE * fd2 = fopen ( dictfile , " rb " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( fd2 = = NULL )
{
log_error ( " ERROR: %s: %s " , dictfile , strerror ( errno ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
data . words_cnt = count_words ( wl_data , user_options , user_options_extra , rules_ctx , fd2 , dictfile , dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
fclose ( fd2 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . words_cnt = = 0 )
{
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
continue ;
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
{
local_free ( css_buf ) ;
local_free ( data . root_css_buf ) ;
local_free ( data . markov_css_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * mask = dictfiles [ dictpos ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_string ( mask ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// base
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
css_buf = mp_gen_css ( mask , strlen ( mask ) , mp_sys , mp_usr , & css_cnt , hashconfig , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
{
uint css_cnt_unicode = css_cnt * 2 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
cs_t * css_buf_unicode = ( cs_t * ) mycalloc ( css_cnt_unicode , sizeof ( cs_t ) ) ;
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
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 ) ) ;
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
css_buf_unicode [ j + 1 ] . cs_buf [ 0 ] = 0 ;
css_buf_unicode [ j + 1 ] . cs_len = 1 ;
}
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
free ( css_buf ) ;
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
css_buf = css_buf_unicode ;
css_cnt = css_cnt_unicode ;
}
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
// check if mask is not too large or too small for pw_min/pw_max (*2 if unicode)
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
uint mask_min = pw_min ;
uint mask_max = pw_max ;
2016-07-04 10:47:16 +00:00
2016-09-23 20:51:42 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
{
mask_min * = 2 ;
mask_max * = 2 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
if ( ( css_cnt < mask_min ) | | ( css_cnt > mask_max ) )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
if ( css_cnt < mask_min )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +00:00
if ( css_cnt > mask_max )
{
log_info ( " WARNING: Skipping mask '%s' because it is larger than the maximum password length " , mask ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
// skip to next mask
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
continue ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint save_css_cnt = css_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( hashconfig - > opti_type & OPTI_TYPE_SINGLE_HASH )
{
if ( hashconfig - > opti_type & OPTI_TYPE_APPENDED_SALT )
{
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
2016-09-23 20:51:42 +00:00
uint css_cnt_salt = css_cnt + salt_len ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
cs_t * css_buf_salt = ( cs_t * ) mycalloc ( css_cnt_salt , sizeof ( cs_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
memcpy ( css_buf_salt , css_buf , css_cnt * sizeof ( cs_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
free ( css_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
css_buf = css_buf_salt ;
css_cnt = css_cnt_salt ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . mask = mask ;
data . css_cnt = css_cnt ;
data . css_buf = css_buf ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( maskpos > 0 & & dictpos = = 0 ) free ( masks [ maskpos - 1 ] ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint uniq_tbls [ SP_PW_MAX ] [ CHARSIZ ] = { { 0 } } ;
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
mp_css_to_uniq_tbl ( css_cnt , css_buf , uniq_tbls ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2016-09-23 20:51:42 +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 ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . root_css_buf = root_css_buf ;
data . markov_css_buf = markov_css_buf ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
sp_tbl_to_css ( root_table_buf , markov_table_buf , root_css_buf , markov_css_buf , user_options - > markov_threshold , uniq_tbls ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
data . words_cnt = sp_get_sum ( 0 , css_cnt , root_css_buf ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
local_free ( root_table_buf ) ;
local_free ( markov_table_buf ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
// copy + args
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
uint css_cnt_l = css_cnt ;
uint css_cnt_r ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
{
if ( save_css_cnt < 6 )
{
css_cnt_r = 1 ;
}
else if ( save_css_cnt = = 6 )
{
css_cnt_r = 2 ;
}
else
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
if ( hashconfig - > opts_type & OPTS_TYPE_PT_UNICODE )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
if ( save_css_cnt = = 8 | | save_css_cnt = = 10 )
{
css_cnt_r = 2 ;
}
else
{
css_cnt_r = 4 ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
else
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
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 ;
}
2015-12-04 14:47:52 +00:00
}
}
2016-09-23 20:51:42 +00:00
}
else
{
css_cnt_r = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/* unfinished code?
int sum = css_buf [ css_cnt_r - 1 ] . cs_len ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint i = 1 ; i < 4 & & i < css_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
if ( sum > 1 ) break ; // we really don't need alot of amplifier them for slow hashes
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
css_cnt_r + + ;
sum * = css_buf [ css_cnt_r - 1 ] . cs_len ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
*/
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
css_cnt_l - = css_cnt_r ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . bfs_cnt = sp_get_sum ( 0 , css_cnt_r , root_css_buf ) ;
2016-08-18 12:39:07 +00:00
2016-09-23 20:51:42 +00:00
for ( uint device_id = 0 ; device_id < opencl_ctx - > devices_cnt ; device_id + + )
2016-08-18 12:39:07 +00:00
{
2016-09-23 20:51:42 +00:00
hc_device_param_t * device_param = & opencl_ctx - > devices_param [ device_id ] ;
2016-08-18 12:39:07 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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-19 13:52:01 +00:00
2016-09-23 20:51:42 +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 ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +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 ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +00:00
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 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
cl_int CL_err = CL_SUCCESS ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-23 20:51:42 +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 ] ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( CL_err ! = CL_SUCCESS )
{
log_error ( " ERROR: clEnqueueWriteBuffer(): %s \n " , val2cstr_cl ( CL_err ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
u64 words_base = data . words_cnt ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT )
{
2016-09-24 10:05:56 +00:00
if ( rules_ctx - > kernel_rules_cnt )
2015-12-04 14:47:52 +00:00
{
2016-09-24 10:05:56 +00:00
words_base / = rules_ctx - > kernel_rules_cnt ;
2016-09-23 20:51:42 +00:00
}
}
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_COMBI )
{
if ( data . combs_cnt )
{
words_base / = data . combs_cnt ;
}
}
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_BF )
{
if ( data . bfs_cnt )
{
words_base / = data . bfs_cnt ;
}
}
2016-02-11 08:54:50 +00:00
2016-09-23 20:51:42 +00:00
data . words_base = words_base ;
2016-02-11 08:54:50 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = true )
{
log_info ( " % " PRIu64 " " , words_base ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return 0 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . words_cur > data . words_base )
{
log_error ( " ERROR: Restore value greater keyspace " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . words_cur )
{
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT )
{
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
{
2016-09-24 10:05:56 +00:00
data . words_progress_restored [ i ] = data . words_cur * rules_ctx - > kernel_rules_cnt ;
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_COMBI )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
data . words_progress_restored [ i ] = data . words_cur * data . combs_cnt ;
}
}
else if ( user_options_extra - > attack_kern = = ATTACK_KERN_BF )
{
for ( uint i = 0 ; i < hashes - > salts_cnt ; i + + )
{
data . words_progress_restored [ i ] = data . words_cur * data . bfs_cnt ;
}
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/*
* Update dictionary statistic
*/
2015-12-04 14:47:52 +00:00
2016-09-24 11:01:17 +00:00
dictstat_write ( dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Update loopback file
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > loopback = = true )
{
loopback_write_open ( loopback_ctx , induct_ctx - > root_directory ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* some algorithms have a maximum kernel - loops count
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > kernel_loops_min < device_param - > kernel_loops_max )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
u32 innerloop_cnt = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( hashconfig - > attack_exec = = ATTACK_EXEC_INSIDE_KERNEL )
2015-12-04 14:47:52 +00:00
{
2016-09-24 10:05:56 +00:00
if ( user_options_extra - > attack_kern = = ATTACK_KERN_STRAIGHT ) innerloop_cnt = rules_ctx - > kernel_rules_cnt ;
2016-09-23 20:51:42 +00:00
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 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
else
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
innerloop_cnt = hashes - > salts_buf [ 0 ] . salt_iter ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( innerloop_cnt > = device_param - > kernel_loops_min ) & &
( innerloop_cnt < = device_param - > kernel_loops_max ) )
{
device_param - > kernel_loops_max = innerloop_cnt ;
}
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* create autotune threads
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
opencl_ctx - > devices_status = STATUS_AUTOTUNE ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_create ( c_threads [ device_id ] , thread_autotune , device_param ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_wait ( opencl_ctx - > devices_cnt , c_threads ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/*
* Inform user about possible slow speeds
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint hardware_power_all = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
uint kernel_power_all = 0 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hardware_power_all + = device_param - > hardware_power ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
kernel_power_all + = device_param - > kernel_power ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . kernel_power_all = kernel_power_all ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
{
if ( data . words_base < kernel_power_all )
{
if ( user_options - > quiet = = false )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
clear_prompt ( ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
}
}
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* create cracker threads
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
opencl_ctx - > devices_status = STATUS_RUNNING ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( initial_restore_done = = 0 )
{
if ( user_options - > restore_disable = = false ) cycle_restore ( opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
initial_restore_done = 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hc_timer_set ( & data . timer_running ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
{
if ( ( user_options - > quiet = = false ) & & ( user_options - > status = = false ) & & ( user_options - > benchmark = = false ) )
{
if ( user_options - > quiet = = false ) send_prompt ( ) ;
}
}
else if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
{
if ( user_options - > quiet = = false ) log_info ( " Starting attack in stdin mode... " ) ;
if ( user_options - > quiet = = false ) log_info ( " " ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time_t runtime_start ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time ( & runtime_start ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . runtime_start = runtime_start ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . prepare_time = runtime_start - prepare_start ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options_extra - > wordlist_mode = = WL_MODE_STDIN )
{
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-23 20:51:42 +00:00
hc_thread_wait ( opencl_ctx - > devices_cnt , c_threads ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
local_free ( c_threads ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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 ) )
{
opencl_ctx - > devices_status = STATUS_EXHAUSTED ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_var_uint ( " status-after-work " , opencl_ctx - > devices_status ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options - > restore = false ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( induct_ctx - > induction_dictionaries_cnt )
{
unlink ( induct_ctx - > induction_dictionaries [ 0 ] ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
myfree ( induct_ctx - > induction_dictionaries ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
induct_ctx_scan ( induct_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > benchmark = = true )
{
status_benchmark ( opencl_ctx , hashconfig , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-24 12:00:59 +00:00
log_info ( " " ) ;
2016-09-23 20:51:42 +00:00
}
else
{
if ( user_options - > quiet = = false )
{
clear_prompt ( ) ;
2015-12-04 14:47:52 +00:00
2016-09-24 10:05:56 +00:00
status_display ( opencl_ctx , hashconfig , hashes , user_options , user_options_extra , rules_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
log_info ( " " ) ;
}
else
{
if ( user_options - > status = = true )
{
2016-09-24 10:05:56 +00:00
status_display ( opencl_ctx , hashconfig , hashes , user_options , user_options_extra , rules_ctx ) ;
2016-09-24 12:00:59 +00:00
log_info ( " " ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( induct_ctx - > induction_dictionaries_cnt )
{
// 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)
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
dictpos - - ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Update loopback file
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > loopback = = true )
{
loopback_write_close ( loopback_ctx ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time_t runtime_stop ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time ( & runtime_stop ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . runtime_stop = runtime_stop ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_uint ( runtime_start ) ;
logfile_sub_uint ( runtime_stop ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time ( & prepare_start ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_sub_msg ( " STOP " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// finalize task
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > run_main_level3 = = false ) break ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > run_main_level2 = = false ) break ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
if ( user_options - > attack_mode = = ATTACK_MODE_STRAIGHT )
{
if ( user_options_extra - > wordlist_mode = = WL_MODE_FILE )
{
if ( data . dictfile = = NULL )
{
if ( dictfiles ! = NULL )
{
data . dictfile = dictfiles [ 0 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hc_timer_set ( & data . timer_running ) ;
}
}
}
}
// NOTE: combi is okay because it is already set beforehand
else if ( user_options - > attack_mode = = ATTACK_MODE_HYBRID1 | | user_options - > attack_mode = = ATTACK_MODE_HYBRID2 )
{
if ( data . dictfile = = NULL )
{
if ( dictfiles ! = NULL )
{
hc_timer_set ( & data . timer_running ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . dictfile = dictfiles [ 0 ] ;
}
}
}
else if ( user_options - > attack_mode = = ATTACK_MODE_BF )
{
if ( data . mask = = NULL )
{
hc_timer_set ( & data . timer_running ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . mask = masks [ 0 ] ;
}
}
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
// if cracked / aborted remove last induction dictionary
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
induct_ctx_cleanup ( induct_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// wait for inner threads
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . shutdown_inner = 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
for ( uint thread_idx = 0 ; thread_idx < inner_threads_cnt ; thread_idx + + )
{
hc_thread_wait ( 1 , & inner_threads [ thread_idx ] ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-24 11:23:18 +00:00
myfree ( inner_threads ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
// we dont need restore file anymore
if ( user_options - > restore_disable = = false )
{
if ( ( opencl_ctx - > devices_status = = STATUS_EXHAUSTED ) | | ( opencl_ctx - > devices_status = = STATUS_CRACKED ) )
{
unlink ( data . eff_restore_file ) ;
unlink ( data . new_restore_file ) ;
}
else
{
cycle_restore ( opencl_ctx ) ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// finally save left hashes
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
if ( ( hashes - > hashlist_mode = = HL_MODE_FILE ) & & ( user_options - > remove = = true ) & & ( hashes - > digests_saved ! = hashes - > digests_done ) )
{
save_hash ( user_options , hashconfig , hashes ) ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Clean up
*/
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
// reset default fan speed
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false )
{
if ( user_options - > gpu_temp_retain )
{
hc_thread_mutex_lock ( mux_hwmon ) ;
2016-07-10 11:23:06 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_device [ device_id ] . fan_set_supported = = true )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
int rc = - 1 ;
if ( device_param - > device_vendor_id = = VENDOR_ID_AMD )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
rc = hm_set_fanspeed_with_device_id_adl ( device_id , 100 , 0 ) ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
else if ( device_param - > device_vendor_id = = VENDOR_ID_NV )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
# if defined (__linux__)
rc = set_fan_control ( data . hm_xnvctrl , data . hm_device [ device_id ] . xnvctrl , NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE ) ;
# endif
# if defined (_WIN)
rc = hm_set_fanspeed_with_device_id_nvapi ( device_id , 100 , 0 ) ;
# endif
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
}
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
// reset power tuning
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > powertune_enable = = true )
{
hc_thread_mutex_lock ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ] ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( device_param - > skipped ) continue ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_AMD )
{
if ( data . hm_device [ device_id ] . od_version = = 6 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
// check powertune capabilities first, if not available then skip device
int powertune_supported = 0 ;
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-09-23 20:51:42 +00:00
log_error ( " ERROR: Failed to get ADL PowerControl Capabilities " ) ;
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
if ( powertune_supported ! = 0 )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
// powercontrol settings
if ( ( hm_ADL_Overdrive_PowerControl_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , od_power_control_status [ device_id ] ) ) ! = ADL_OK )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_info ( " ERROR: Failed to restore the ADL PowerControl values " ) ;
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
// clocks
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
ADLOD6StateInfo * performance_state = ( ADLOD6StateInfo * ) mycalloc ( 1 , sizeof ( ADLOD6StateInfo ) + sizeof ( ADLOD6PerformanceLevel ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
performance_state - > iNumberOfPerformanceLevels = 2 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
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 ;
if ( ( hm_ADL_Overdrive_State_Set ( data . hm_adl , data . hm_device [ device_id ] . adl , ADL_OD6_SETSTATE_PERFORMANCE , performance_state ) ) ! = ADL_OK )
{
log_info ( " ERROR: Failed to restore ADL performance state " ) ;
return - 1 ;
}
local_free ( performance_state ) ;
}
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( opencl_ctx - > devices_param [ device_id ] . device_vendor_id = = VENDOR_ID_NV )
{
unsigned int power_limit = nvml_power_limit [ device_id ] ;
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
if ( power_limit > 0 )
2016-09-17 15:05:01 +00:00
{
2016-09-23 20:51:42 +00:00
hm_NVML_nvmlDeviceSetPowerManagementLimit ( data . hm_nvml , 0 , data . hm_device [ device_id ] . nvml , power_limit ) ;
}
}
}
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_mutex_unlock ( mux_hwmon ) ;
}
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > gpu_temp_disable = = false )
{
if ( data . hm_nvml )
{
hm_NVML_nvmlShutdown ( data . hm_nvml ) ;
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
nvml_close ( data . hm_nvml ) ;
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
data . hm_nvml = NULL ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_nvapi )
{
hm_NvAPI_Unload ( data . hm_nvapi ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
nvapi_close ( data . hm_nvapi ) ;
2016-06-25 19:56:18 +00:00
2016-09-23 20:51:42 +00:00
data . hm_nvapi = NULL ;
}
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_xnvctrl )
{
hm_XNVCTRL_XCloseDisplay ( data . hm_xnvctrl ) ;
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
xnvctrl_close ( data . hm_xnvctrl ) ;
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
data . hm_xnvctrl = NULL ;
}
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
if ( data . hm_adl )
{
hm_ADL_Main_Control_Destroy ( data . hm_adl ) ;
2016-06-06 19:39:11 +00:00
2016-09-23 20:51:42 +00:00
adl_close ( data . hm_adl ) ;
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
data . hm_adl = NULL ;
}
}
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
// free memory
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
opencl_session_destroy ( opencl_ctx ) ;
2016-06-06 19:39:11 +00:00
2016-09-23 20:51:42 +00:00
potfile_write_close ( potfile_ctx ) ;
2016-06-03 22:54:28 +00:00
2016-09-23 20:51:42 +00:00
wl_data_destroy ( wl_data ) ;
2016-06-03 22:54:28 +00:00
2016-09-23 20:51:42 +00:00
bitmap_ctx_destroy ( bitmap_ctx ) ;
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
hashes_destroy ( hashes ) ;
2016-06-02 10:32:24 +00:00
2016-09-23 20:51:42 +00:00
hashconfig_destroy ( hashconfig ) ;
2015-12-04 14:47:52 +00:00
2016-09-24 11:23:18 +00:00
local_free ( masks ) ;
2016-09-23 20:51:42 +00:00
local_free ( od_clock_mem_status ) ;
local_free ( od_power_control_status ) ;
local_free ( nvml_power_limit ) ;
2016-06-25 19:56:18 +00:00
2016-09-23 20:51:42 +00:00
global_free ( root_css_buf ) ;
global_free ( markov_css_buf ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
global_free ( words_progress_done ) ;
global_free ( words_progress_rejected ) ;
global_free ( words_progress_restored ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return 0 ;
}
2016-06-27 07:25:34 +00:00
2016-09-23 20:51:42 +00:00
int main ( int argc , char * * argv )
{
/**
* To help users a bit
*/
2015-12-04 14:47:52 +00:00
2016-09-24 11:14:50 +00:00
const int rc_console = setup_console ( ) ;
if ( rc_console = = - 1 ) return - 1 ;
2016-09-22 10:15:13 +00:00
2016-09-23 20:51:42 +00:00
setup_environment_variables ( ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
setup_umask ( ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Real init
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
memset ( & data , 0 , sizeof ( hc_global_data_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time_t proc_start ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
time ( & proc_start ) ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +00:00
data . proc_start = proc_start ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_mutex_init ( mux_display ) ;
hc_thread_mutex_init ( mux_hwmon ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* folder
*/
2016-07-05 13:00:26 +00:00
2016-09-23 20:51:42 +00:00
char * install_folder = NULL ;
char * shared_folder = NULL ;
2016-06-26 07:47:02 +00:00
2016-09-23 20:51:42 +00:00
# if defined (INSTALL_FOLDER)
install_folder = INSTALL_FOLDER ;
# endif
2016-09-12 12:58:25 +00:00
2016-09-23 20:51:42 +00:00
# if defined (SHARED_FOLDER)
shared_folder = SHARED_FOLDER ;
# endif
2016-09-12 12:58:25 +00:00
2016-09-23 20:51:42 +00:00
folder_config_t * folder_config = ( folder_config_t * ) mymalloc ( sizeof ( folder_config_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
folder_config_init ( folder_config , install_folder , shared_folder ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* commandline parameters
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
data . user_options = user_options ;
2016-07-24 20:26:40 +00:00
2016-09-23 20:51:42 +00:00
user_options_init ( user_options , argc , argv ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
const int rc_user_options_parse = user_options_parse ( user_options , argc , argv ) ;
2016-06-25 19:56:18 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_user_options_parse = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* session
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
char * eff_restore_file = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
char * new_restore_file = ( char * ) mymalloc ( HCBUFSIZ_TINY ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
snprintf ( eff_restore_file , HCBUFSIZ_TINY - 1 , " %s/%s.restore " , folder_config - > session_dir , user_options - > session ) ;
snprintf ( new_restore_file , HCBUFSIZ_TINY - 1 , " %s/%s.restore.new " , folder_config - > session_dir , user_options - > session ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . eff_restore_file = eff_restore_file ;
data . new_restore_file = new_restore_file ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
restore_data_t * rd = init_restore ( argc , argv , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . rd = rd ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* restore file
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
int myargc = argc ;
char * * myargv = argv ;
2016-06-27 10:13:46 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > restore = = true )
{
read_restore ( eff_restore_file , rd ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rd - > version < RESTORE_VERSION_MIN )
2015-12-04 14:47:52 +00:00
{
2016-09-23 20:51:42 +00:00
log_error ( " ERROR: Incompatible restore-file version " ) ;
return - 1 ;
2015-12-04 14:47:52 +00:00
}
2016-09-23 20:51:42 +00:00
myargc = rd - > argc ;
myargv = rd - > argv ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
# if defined (_POSIX)
rd - > pid = getpid ( ) ;
# elif defined (_WIN)
rd - > pid = GetCurrentProcessId ( ) ;
# endif
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options_init ( user_options , myargc , myargv ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
const int rc_user_options_parse = user_options_parse ( user_options , myargc , myargv ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_user_options_parse = = - 1 ) return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > version = = true )
{
log_info ( " %s " , VERSION_TAG ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
return 0 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > usage = = true )
{
usage_big_print ( PROGNAME ) ;
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
return 0 ;
}
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
/**
* process user input
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options_extra_t * user_options_extra = ( user_options_extra_t * ) mymalloc ( sizeof ( user_options_extra_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . user_options_extra = user_options_extra ;
2016-06-26 18:18:46 +00:00
2016-09-23 20:51:42 +00:00
const int rc_user_options_extra_init = user_options_extra_init ( user_options , myargc , myargv , user_options_extra ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_user_options_extra_init = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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-23 20:51:42 +00:00
if ( rc_user_options_sanity = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* prepare seeding for random number generator , required by logfile and rules generator
*/
2016-01-15 16:23:07 +00:00
2016-09-24 11:14:50 +00:00
setup_seeding ( user_options , & proc_start ) ;
2016-01-15 16:23:07 +00:00
2016-09-23 20:51:42 +00:00
/**
* logfile init
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_ctx_t * logfile_ctx = ( logfile_ctx_t * ) mymalloc ( sizeof ( logfile_ctx_t ) ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
data . logfile_ctx = logfile_ctx ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_init ( logfile_ctx , user_options , folder_config ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_generate_topid ( logfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
logfile_top_msg ( " START " ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
user_options_logger ( user_options , logfile_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +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
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
welcome_screen ( user_options , & proc_start ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* tuning db
*/
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
char tuning_db_file [ 256 ] = { 0 } ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
snprintf ( tuning_db_file , sizeof ( tuning_db_file ) - 1 , " %s/%s " , folder_config - > shared_dir , TUNING_DB_FILE ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
tuning_db_t * tuning_db = tuning_db_init ( tuning_db_file ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
/**
* induction directory
*/
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
induct_ctx_t * induct_ctx = ( induct_ctx_t * ) mymalloc ( sizeof ( induct_ctx_t ) ) ;
2016-06-01 17:01:44 +00:00
2016-09-23 20:51:42 +00:00
data . induct_ctx = induct_ctx ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
const int rc_induct_ctx_init = induct_ctx_init ( induct_ctx , user_options , folder_config , proc_start ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_induct_ctx_init = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* outfile - check directory
*/
2016-02-02 00:14:33 +00:00
2016-09-23 20:51:42 +00:00
outcheck_ctx_t * outcheck_ctx = ( outcheck_ctx_t * ) mymalloc ( sizeof ( outcheck_ctx_t ) ) ;
2015-12-15 19:34:07 +00:00
2016-09-23 20:51:42 +00:00
data . outcheck_ctx = outcheck_ctx ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
const int rc_outcheck_ctx_init = outcheck_ctx_init ( outcheck_ctx , user_options , folder_config ) ;
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_outcheck_ctx_init = = - 1 ) return - 1 ;
2016-06-18 08:59:58 +00:00
2016-09-24 10:19:56 +00:00
/**
* outfile itself
*/
outfile_ctx_t * outfile_ctx = mymalloc ( sizeof ( outfile_ctx_t ) ) ;
data . outfile_ctx = outfile_ctx ;
outfile_init ( outfile_ctx , user_options ) ;
/**
* Sanity check for hashfile vs outfile ( should not point to the same physical file )
*/
const int rc_outfile_and_hashfile = outfile_and_hashfile ( outfile_ctx , myargv [ user_options_extra - > optind ] ) ;
if ( rc_outfile_and_hashfile = = - 1 ) return - 1 ;
2016-09-24 10:41:56 +00:00
/**
* potfile init
* this is only setting path because potfile can be used in read and write mode depending on user options
* plus it depends on hash_mode , so we continue using it in outer_loop
*/
potfile_ctx_t * potfile_ctx = mymalloc ( sizeof ( potfile_ctx_t ) ) ;
data . potfile_ctx = potfile_ctx ;
potfile_init ( potfile_ctx , folder_config - > profile_dir , user_options - > potfile_path , user_options - > potfile_disable ) ;
2016-09-24 11:01:17 +00:00
/**
* dictstat init
*/
dictstat_ctx_t * dictstat_ctx = mymalloc ( sizeof ( dictstat_ctx_t ) ) ;
dictstat_init ( dictstat_ctx , user_options , folder_config ) ;
2016-09-24 11:05:09 +00:00
/**
* loopback init
*/
loopback_ctx_t * loopback_ctx = mymalloc ( sizeof ( loopback_ctx_t ) ) ;
data . loopback_ctx = loopback_ctx ;
loopback_init ( loopback_ctx ) ;
2016-09-24 11:10:19 +00:00
/**
* debugfile init
*/
debugfile_ctx_t * debugfile_ctx = mymalloc ( sizeof ( debugfile_ctx_t ) ) ;
data . debugfile_ctx = debugfile_ctx ;
debugfile_init ( debugfile_ctx , user_options - > debug_mode , user_options - > debug_file ) ;
2016-09-23 20:51:42 +00:00
/**
* cpu affinity
*/
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > cpu_affinity )
{
set_cpu_affinity ( user_options - > cpu_affinity ) ;
}
2016-06-18 08:59:58 +00:00
2016-09-24 10:05:56 +00:00
/**
* rules
*/
rules_ctx_t * rules_ctx = ( rules_ctx_t * ) mymalloc ( sizeof ( rules_ctx_t ) ) ;
data . rules_ctx = rules_ctx ;
const int rc_rules_init = rules_ctx_init ( rules_ctx , user_options ) ;
if ( rc_rules_init = = - 1 ) return - 1 ;
2016-09-23 20:51:42 +00:00
/**
* Init OpenCL library loader
*/
2016-06-18 08:59:58 +00:00
2016-09-23 20:51:42 +00:00
opencl_ctx_t * opencl_ctx = ( opencl_ctx_t * ) mymalloc ( sizeof ( opencl_ctx_t ) ) ;
2016-01-13 16:10:40 +00:00
2016-09-23 20:51:42 +00:00
data . opencl_ctx = opencl_ctx ;
2016-05-29 22:05:46 +00:00
2016-09-23 20:51:42 +00:00
const int rc_opencl_init = opencl_ctx_init ( opencl_ctx , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_opencl_init = = - 1 )
{
log_error ( " ERROR: opencl_ctx_init() failed " ) ;
2016-09-19 13:52:01 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
/**
* Init OpenCL devices
*/
2016-09-17 15:05:01 +00:00
2016-09-23 20:51:42 +00:00
const int rc_devices_init = opencl_ctx_devices_init ( opencl_ctx , user_options ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc_devices_init = = - 1 )
{
log_error ( " ERROR: opencl_ctx_devices_init() failed " ) ;
2016-09-13 08:38:59 +00:00
2016-09-23 20:51:42 +00:00
return - 1 ;
}
2016-09-10 15:35:58 +00:00
2016-09-23 20:51:42 +00:00
/**
2016-09-24 10:19:56 +00:00
* keypress thread
2016-09-23 20:51:42 +00:00
*/
2016-09-09 21:17:43 +00:00
2016-09-23 20:51:42 +00:00
uint outer_threads_cnt = 0 ;
2016-09-09 21:17:43 +00:00
2016-09-23 20:51:42 +00:00
hc_thread_t * outer_threads = ( hc_thread_t * ) mycalloc ( 10 , sizeof ( hc_thread_t ) ) ;
2016-09-09 21:17:43 +00:00
2016-09-23 20:51:42 +00:00
data . shutdown_outer = 0 ;
2016-09-12 12:58:25 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > keyspace = = false & & user_options - > benchmark = = false & & user_options - > stdout_flag = = false )
{
if ( ( user_options_extra - > wordlist_mode = = WL_MODE_FILE ) | | ( user_options_extra - > wordlist_mode = = WL_MODE_MASK ) )
{
hc_thread_create ( outer_threads [ outer_threads_cnt ] , thread_keypress , NULL ) ;
2016-09-22 09:35:08 +00:00
2016-09-23 20:51:42 +00:00
outer_threads_cnt + + ;
}
}
2016-09-22 14:23:36 +00:00
2016-09-23 20:51:42 +00:00
/**
* outer loop
*/
2016-09-22 15:11:17 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > benchmark = = true )
{
user_options - > quiet = true ;
2016-09-23 20:01:43 +00:00
2016-09-23 20:51:42 +00:00
if ( user_options - > hash_mode_chgd = = true )
{
2016-09-24 11:05:09 +00:00
const int rc = outer_loop ( user_options , user_options_extra , myargc , myargv , folder_config , logfile_ctx , tuning_db , induct_ctx , outcheck_ctx , outfile_ctx , potfile_ctx , rules_ctx , dictstat_ctx , loopback_ctx , opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc = = - 1 ) return - 1 ;
}
else
{
for ( int algorithm_pos = 0 ; algorithm_pos < DEFAULT_BENCHMARK_ALGORITHMS_CNT ; algorithm_pos + + )
{
user_options - > hash_mode = DEFAULT_BENCHMARK_ALGORITHMS_BUF [ algorithm_pos ] ;
2015-12-04 14:47:52 +00:00
2016-09-24 11:05:09 +00:00
const int rc = outer_loop ( user_options , user_options_extra , myargc , myargv , folder_config , logfile_ctx , tuning_db , induct_ctx , outcheck_ctx , outfile_ctx , potfile_ctx , rules_ctx , dictstat_ctx , loopback_ctx , opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc = = - 1 ) return - 1 ;
2016-09-24 11:23:18 +00:00
if ( opencl_ctx - > run_main_level1 = = false ) break ;
2016-09-23 20:51:42 +00:00
}
}
}
else
{
2016-09-24 11:05:09 +00:00
const int rc = outer_loop ( user_options , user_options_extra , myargc , myargv , folder_config , logfile_ctx , tuning_db , induct_ctx , outcheck_ctx , outfile_ctx , potfile_ctx , rules_ctx , dictstat_ctx , loopback_ctx , opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:51:42 +00:00
if ( rc = = - 1 ) return - 1 ;
2015-12-04 14:47:52 +00:00
}
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
2016-09-24 12:00:59 +00:00
if ( user_options - > benchmark = = true )
{
user_options - > quiet = false ;
}
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
local_free ( eff_restore_file ) ;
local_free ( new_restore_file ) ;
local_free ( rd ) ;
2016-09-24 11:10:19 +00:00
debugfile_destroy ( debugfile_ctx ) ;
2016-09-24 10:05:56 +00:00
rules_ctx_destroy ( rules_ctx ) ;
2016-02-10 19:40:21 +00:00
tuning_db_destroy ( tuning_db ) ;
2016-09-24 11:05:09 +00:00
loopback_destroy ( loopback_ctx ) ;
2016-09-24 11:01:17 +00:00
dictstat_destroy ( dictstat_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-24 10:41:56 +00:00
potfile_destroy ( potfile_ctx ) ;
2016-09-24 11:01:17 +00:00
induct_ctx_destroy ( induct_ctx ) ;
2016-09-24 10:19:56 +00:00
outfile_destroy ( outfile_ctx ) ;
2016-09-22 20:40:47 +00:00
outcheck_ctx_destroy ( outcheck_ctx ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:01:43 +00:00
folder_config_destroy ( folder_config ) ;
user_options_extra_destroy ( user_options_extra ) ;
2016-09-23 20:23:13 +00:00
opencl_ctx_devices_destroy ( opencl_ctx ) ;
2015-12-04 14:47:52 +00:00
time_t proc_stop ;
time ( & proc_stop ) ;
logfile_top_uint ( proc_start ) ;
logfile_top_uint ( proc_stop ) ;
logfile_top_msg ( " STOP " ) ;
2016-09-23 19:41:05 +00:00
logfile_destroy ( logfile_ctx ) ;
2016-09-24 10:29:07 +00:00
goodbye_screen ( user_options , & proc_start , & proc_stop ) ;
2015-12-04 14:47:52 +00:00
2016-09-23 20:01:43 +00:00
user_options_destroy ( user_options ) ;
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-17 18:18:38 +00:00
return rc_final ;
2015-12-04 14:47:52 +00:00
}