4 _oclHashcat_get_permutations
()
7 oclHashcat_devices_permutation
=""
9 # Formula: Sum (k=1...num_devices) (num_devices! / (k! * (num_devices - k)!))
10 # or ofc (2 ^ num_devices) - 1
11 if [ "${num_devices}" -gt 0 ]; then
13 oclHashcat_devices_permutation
=$
(seq 1 $num_devices)
17 for k
in $
(seq 2 $num_devices); do
19 if [ "${k}" -eq ${num_devices} ];then
21 oclHashcat_devices_permutation
="${oclHashcat_devices_permutation} $(seq 1 $num_devices | tr '\n' ',' | sed 's/, *$//')"
26 local max_pos
=$
((num_devices
- ${k} + 1))
28 for j
in $
(seq 1 ${max_pos}); do
30 local max_value
=$
((j
+ ${k} - 1))
36 for l
in $
(seq ${j} ${max_value}); do
38 if [ ${l} -gt ${j} ]; then
42 out_str
=${out_str}${l}
48 local max_device
=$
((num_devices
+ 1))
51 while [ "${chg_len}" -lt ${last} ]; do
53 local had_pos_changed
=${pos_changed}
54 local old_chg_len
=${chg_len}
56 local idx
=$
(((k
- chg_len
)))
57 local cur_num
=$
(echo ${out_str} | cut
-d, -f ${idx})
58 local next_num
=$
((cur_num
+ 1))
60 if [ "${pos_changed}" -eq 0 ]; then
62 oclHashcat_devices_permutation
="${oclHashcat_devices_permutation} ${out_str}"
70 if [ "${next_num}" -lt ${max_device} -a "${next_num}" -le "${num_devices}" ]; then
72 out_str
=$
(echo ${out_str} | sed "s/,${cur_num},/,${next_num},/;s/,${cur_num}\$/,${next_num}/")
78 chg_len=$((chg_len + 1))
82 if [ "${had_pos_changed}" -eq 1 ];then
87 for m in $(seq 1 ${old_chg_len}); do
89 local reset_idx=$((k - ${old_chg_len} + ${m}))
90 local last_num=$(echo ${out_str} | cut -d, -f ${reset_idx})
91 next_num=$((next_num + 1))
93 if [ "${next_num}" -lt ${max_device} -a "${next_num}" -le "${num_devices}" ]; then
95 out_str=$(echo ${out_str} | sed "s/,${last_num},/,${next_num},/;s/,${last_num}\$/,${next_num}/")
96 max_device
=$
((next_num
+ 2))
97 changed
=$
((changed
+ 1))
105 if [ "${changed}" -gt 0 ]; then
107 max_device
=$
((num_devices
+ 1))
124 _oclHashcat_opencl_devices
()
128 if which clinfo
&> /dev
/null
; then
130 num_devices
=$
(clinfo
2>/dev
/null
2> /dev
/null
)
132 elif which nvidia-smi
&> /dev
/null
; then
134 num_devices
=$
(nvidia-smi
--list-gpus |
wc -l)
138 return ${num_devices}
141 _oclHashcat_cpu_devices
()
145 if [ -f "/proc/cpuinfo" ]; then
147 num_devices
=$
(cat /proc
/cpuinfo |
grep -c processor
2> /dev
/null
)
151 return ${num_devices}
154 _oclHashcat_contains
()
159 if echo "${haystack}" |
grep -q " ${needle} " 2> /dev
/null
; then
161 elif echo "${haystack}" |
grep -q "^${needle} " 2> /dev
/null
; then
163 elif echo "${haystack}" |
grep -q " ${needle}\$" 2> /dev
/null
; then
174 local HASH_MODES
="0 10 11 12 20 21 22 23 30 40 50 60 100 101 110 111 112 120 121 122 124 130 131 132 133 140 141 150 160 190 200 300 400 500 501 900 1000 1100 1400 1410 1420 1421 1430 1440 1441 1450 1460 1500 1600 1700 1710 1711 1720 1722 1730 1731 1740 1750 1760 1800 2100 2400 2410 2500 2600 2611 2612 2711 2811 3000 3100 3200 3710 3711 3800 4300 4400 4500 4700 4800 4900 5000 5100 5200 5300 5400 5500 5600 5700 5800 6000 6100 6211 6212 6213 6221 6222 6223 6231 6232 6233 6241 6242 6243 6300 6400 6500 6600 6700 6800 6900 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 8900 9000 9100 9200 9300 9400 9500 9600 9700 9710 9720 9800 9810 9820 9900 10000 10100 10200 10300 10400 10410 10420 10500 10600 10700 10800 10900 11000 11100 11200 11300 11400 11500 11600 11700 11800 11900 12000 12100 12200 12300 12400 12500 12600 12700 12800"
175 local ATTACK_MODES
="0 1 3 6 7"
176 local OUTFILE_FORMATS
="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"
177 local BENCHMARK_MODE
="0 1"
178 local DEBUG_MODE
="1 2 3 4"
179 local WORKLOAD_PROFILE
="1 2 3"
180 local KERNEL_ACCEL
="1 8 16 24 32 40 48 56 64 62 80 88 96 104 112 120 128 136 144 152 160"
181 local KERNEL_LOOPS
="8 16 32 64 128 256 512 1024"
182 local HIDDEN_FILES
="exe|bin|pot|hcstat|dictstat|accepted|sh|cmd|bat|restore"
183 local HIDDEN_FILES_AGGRESIVE
="exe|bin|pot|hcstat|dictstat|hcmask|hcchr|accepted|sh|cmd|restore"
184 local BUILD_IN_CHARSETS
='?l ?u ?d ?a ?b ?s'
186 local SHORT_OPTS
="-m -a -V -v -h -b -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -i -s -l"
187 local LONG_OPTS
="--hash-type --attack-mode --version --help --eula --quiet --benchmark --benchmark-mode --hex-salt --hex-wordlist --hex-charset --force --status --status-timer --status-automat --loopback --weak-hash-threshold --markov-hcstat --markov-disable --markov-classic --markov-threshold --runtime --session --restore --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --separator --show --left --username --remove --remove-timer --potfile-disable --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-devices --opencl-platform --workload-profile --kernel-accel --kernel-loops --gpu-temp-disable --gpu-temp-abort --gpu-temp-retain --powertune-enable --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --rules-cleanup --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --truecrypt-keyfiles"
188 local OPTIONS
="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --benchmark-mode --status-timer --weak-hash-threshold --markov-hcstat --markov-threshold --runtime --session --timer --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-devices --opencl-platform --workload-profile --kernel-accel --kernel-loops --gpu-temp-abort --gpu-temp-retain -disable --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment-min --increment-max --scrypt-tmto --truecrypt-keyfiles"
191 local cur
="${COMP_WORDS[COMP_CWORD]}"
192 local prev
="${COMP_WORDS[COMP_CWORD-1]}"
194 # if cur is just '=', ignore the '=' and treat it as only the prev was provided
195 if [[ "${cur}" == '=' ]]; then
199 elif [[ "${prev}" == '=' ]]; then
201 if [ "${COMP_CWORD}" -gt 2 ]; then
203 prev
="${COMP_WORDS[COMP_CWORD-2]}"
212 COMPREPLY
=($
(compgen
-W "${HASH_MODES}" -- ${cur}))
217 COMPREPLY
=($
(compgen
-W "${ATTACK_MODES}" -- ${cur}))
222 COMPREPLY
=($
(compgen
-W "${OUTFILE_FORMATS}" -- ${cur}))
227 COMPREPLY
=($
(compgen
-W "${BENCHMARK_MODE}" -- ${cur}))
231 -w|
--workload-profile)
232 COMPREPLY
=($
(compgen
-W "${WORKLOAD_PROFILE}" -- ${cur}))
237 COMPREPLY
=($
(compgen
-W "${KERNEL_ACCEL}" -- ${cur}))
242 COMPREPLY
=($
(compgen
-W "${KERNEL_LOOPS}" -- ${cur}))
246 -o|
--outfile|
-r|
--rules-file|
--debug-file)
247 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
248 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
253 local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null)
254 COMPREPLY=($(compgen -W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
259 _oclHashcat_opencl_devices
260 local num_devices
=${?}
262 _oclHashcat_get_permutations
${num_devices}
264 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
269 local icd_list
=$
(ls -1 /etc
/OpenCL
/vendors
/*.icd
2> /dev
/null
)
271 local architecture
=$
(getconf LONG_BIT
2> /dev
/null
)
273 if [ -z "${architecture}" ]; then
277 # filter the icd_list (do not show 32 bit on 64bit systems and vice versa)
279 if [ "${architecture}" -eq 64 ]; then
281 icd_list
=$
(echo "${icd_list}" |
grep -v "32.icd")
285 icd_list
=$
(echo "${icd_list}" |
grep -v "64.icd")
289 local number_icds
=$
(seq 1 $
(echo "${icd_list}" |
wc -l))
291 COMPREPLY
=($
(compgen
-W "${number_icds}" -- ${cur}))
297 _oclHashcat_cpu_devices
298 local num_devices
=${?}
300 _oclHashcat_get_permutations
${num_devices}
302 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
306 -1|
-2|
-3|
-4|
--custom-charset1|
--custom-charset2|
--custom-charset3|
--custom-charset4)
307 local mask
=${BUILD_IN_CHARSETS}
309 if [ -e "${cur}" ]; then # should be hcchr file (but not enforced)
311 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
316 if [ -n "${cur}" ]; then
318 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
320 mask
="${mask} ${cur_var}"
324 if ! echo ${cur} |
grep -q ${h} 2> /dev
/null
; then
326 if echo ${cur} |
grep -q '?a' 2> /dev
/null
; then
328 if [[ "${h}" == "?l" ]] ; then
330 elif [[ "${h}" == "?u" ]] ; then
332 elif [[ "${h}" == "?d" ]] ; then
334 elif [[ "${h}" == "?s" ]] ; then
336 elif [[ "${h}" == "?b" ]] ; then
342 mask
="${mask} ${cur_var}${h}"
349 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
351 mask
="${mask} ${files}"
353 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
358 --status-timer|
--markov-threshold|
--runtime|
--session|
--separator|
--segment-size|
--rule-left|
--rule-right| \
359 --gpu-temp-abort|
--gpu-temp-retain|
--generate-rules|
--generate-rules-func-min|
--generate-rules-func-max| \
360 --increment-min|
--increment-max|
--remove-timer|
--bitmap-min|
--bitmap-max|
--skip|
--limit|
--generate-rules-seed| \
361 --weak-hash-threshold|
--outfile-check-timer|
--outfile-check-dir|
--induction-dir|
--scrypt-tmto)
366 COMPREPLY
=($
(compgen
-W "${DEBUG_MODE}" -- ${cur}))
370 --truecrypt-keyfiles)
371 # first: remove the quotes such that file matching is possible
373 local cur_part0
=$
(echo "${cur}" |
grep -Eo '^("|'"'"')')
375 local cur_mod
=$
(echo "${cur}" |
sed 's/^["'"'"']//')
376 local cur_part1
=$
(echo "${cur_mod}" |
grep ',' 2> /dev
/null |
sed 's/^\(.*, *\)[^,]*$/\1/')
377 local cur_part2
=$
(echo "${cur_mod}" |
sed 's/^.*, *\([^,]*\)$/\1/')
379 # generate lines with the file name and a duplicate of it with a comma at the end
381 local files
=$
(ls -d ${cur_part2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null | sed 's/^\(.*\)$/\1\n\1,\n/' | sed "s/^/${cur_part0}${cur_part1}/" | sed "s/$/${cur_part0}/")
382 COMPREPLY=($(compgen -W "${files}" -- ${cur}))
387 # allow also the VARIANTS w/o spaces
388 # we could use compgen -P prefix, but for some reason it doesn't seem to work always
393 local hash_modes_var="$
(echo -n "-m ${HASH_MODES}" |
sed 's/ / -m/g')"
394 COMPREPLY=($(compgen -W "${hash_modes_var}" -- ${cur}))
399 local attack_modes_var="$
(echo -n "-a ${ATTACK_MODES}" |
sed 's/ / -a/g')"
400 COMPREPLY=($(compgen -W "${attack_modes_var}" -- ${cur}))
405 local workload_profile_var="$
(echo -n "-w ${WORKLOAD_PROFILE}" |
sed 's/ / -w/g')"
406 COMPREPLY=($(compgen -W "${workload_profile_var}" -- ${cur}))
411 local kernel_accel_var="$
(echo -n "-n ${KERNEL_ACCEL}" |
sed 's/ / -n/g')"
412 COMPREPLY=($(compgen -W "${kernel_accel_var}" -- ${cur}))
417 local kernel_loops_var="$
(echo -n "-u ${KERNEL_LOOPS}" |
sed 's/ / -u/g')"
418 COMPREPLY=($(compgen -W "${kernel_loops_var}" -- ${cur}))
423 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
424 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-o/g')"
425 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
430 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
431 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-r/g')"
432 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
437 _oclHashcat_opencl_devices
438 local num_devices=${?}
440 _oclHashcat_get_permutations ${num_devices}
442 local opencl_devices_var="$
(echo " "${oclHashcat_devices_permutation} |
sed 's/ / -d/g')"
443 COMPREPLY=($(compgen -W "${opencl_devices_var}" -- ${cur}))
448 # Complete options/switches (not the arguments)
450 if [[ "${cur}" == -* ]]; then
452 COMPREPLY=($(compgen -W "${SHORT_OPTS} ${LONG_OPTS}" -- ${cur}))
457 # additional parameter, no switch nor option but maybe hash file, dictionary, mask, directory
459 # check if first option out of (hash.txt and dictionary|mask|directory)
460 # is first option iff: here
461 # is second option iff: COMP_CWORD > 2 and no switch before (-*) if no option afterwards (for mask -a 3, -a 6, -a 7 - but possible for dicts!)
465 local attack_mode
=0 # also default of oclHashcat
466 local has_charset_1
=0
467 local has_charset_2
=0
468 local has_charset_3
=0
469 local has_charset_4
=0
471 while [ ${h} -le ${COMP_CWORD} ]; do
473 if [[ "${COMP_WORDS[h]}" == "-a" ]]; then
475 attack_mode
=${COMP_WORDS[$((h + 1))]}
477 elif [[ "${COMP_WORDS[h]}" == -a* ]]; then
479 attack_mode
=${COMP_WORDS[h]:2}
481 elif [[ "${COMP_WORDS[h]}" == "--attack-mode" ]]; then
483 attack_mode
=${COMP_WORDS[$((h + 1))]}
485 elif [[ "${COMP_WORDS[h]}" == "-1" ]]; then
489 elif [[ "${COMP_WORDS[h]}" == "--custom-charset1" ]]; then
493 elif [[ "${COMP_WORDS[h]}" == "-2" ]]; then
497 elif [[ "${COMP_WORDS[h]}" == "--custom-charset2" ]]; then
501 elif [[ "${COMP_WORDS[h]}" == "-3" ]]; then
505 elif [[ "${COMP_WORDS[h]}" == "--custom-charset3" ]]; then
509 elif [[ "${COMP_WORDS[h]}" == "-4" ]]; then
513 elif [[ "${COMP_WORDS[h]}" == "--custom-charset4" ]]; then
519 if _oclHashcat_contains
"${OPTIONS}" "${COMP_WORDS[h]}"; then
525 if ! _oclHashcat_contains
"${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then
526 local variants
="-m -a -w -n -u -o -r -d"
529 for v
in ${variants}; do
531 if [[ "${COMP_WORDS[h]:0:2}" == "${v}" ]]; then
537 if [ "${skip}" -eq 0 ]; then
539 no_opts
=$
((no_opts
+ 1))
557 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
558 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
563 case "${attack_mode}" in
566 # dict/directory are files here
567 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
568 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
573 if [ "${no_opts}" -gt 4 ]; then
577 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
578 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
583 if [ "${no_opts}" -eq 2 ]; then
584 local mask
=${BUILD_IN_CHARSETS}
586 if [ "${has_charset_1}" -eq 1 ]; then
592 if [ "${has_charset_2}" -eq 1 ]; then
598 if [ "${has_charset_3}" -eq 1 ]; then
604 if [ "${has_charset_4}" -eq 1 ]; then
610 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
612 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
617 if [ -n "${cur}" ]; then
619 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
621 mask
="${mask} ${cur_var}"
626 mask
="${mask} ${cur_var}${h}"
631 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
633 mask
="${mask} ${files}"
635 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
641 if [ "${no_opts}" -eq 2 ]; then
643 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
644 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
646 elif [ "${no_opts}" -eq 3 ]; then
647 local mask
=${BUILD_IN_CHARSETS}
649 if [ "${has_charset_1}" -eq 1 ]; then
655 if [ "${has_charset_2}" -eq 1 ]; then
661 if [ "${has_charset_3}" -eq 1 ]; then
667 if [ "${has_charset_4}" -eq 1 ]; then
673 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
675 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
680 if [ -n "${cur}" ]; then
682 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
684 mask
="${mask} ${cur_var}"
689 mask
="${mask} ${cur_var}${h}"
694 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
696 mask
="${mask} ${files}"
698 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
705 if [ "${no_opts}" -eq 2 ]; then
706 local mask
=${BUILD_IN_CHARSETS}
708 if [ "${has_charset_1}" -eq 1 ]; then
714 if [ "${has_charset_2}" -eq 1 ]; then
720 if [ "${has_charset_3}" -eq 1 ]; then
726 if [ "${has_charset_4}" -eq 1 ]; then
732 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
734 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
739 if [ -n "${cur}" ]; then
741 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
743 mask
="${mask} ${cur_var}"
748 mask
="${mask} ${cur_var}${h}"
753 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
755 mask
="${mask} ${files}"
757 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
760 elif [ "${no_opts}" -eq 3 ]; then
762 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
763 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
774 complete
-F _oclHashcat
-o filenames
"${OCLHASHCAT_ROOT}"/oclHashcat64.bin "${OCLHASHCAT_ROOT}"/oclHashcat32.bin "${OCLHASHCAT_ROOT}"/oclHashcat oclHashcat