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 12900 13000"
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 OPENCL_DEVICE_TYPES
="1 2 3"
178 local BENCHMARK_MODE
="0 1"
179 local DEBUG_MODE
="1 2 3 4"
180 local WORKLOAD_PROFILE
="1 2 3"
181 local KERNEL_ACCEL
="1 8 16 24 32 40 48 56 64 62 80 88 96 104 112 120 128 136 144 152 160"
182 local KERNEL_LOOPS
="8 16 32 64 128 256 512 1024"
183 local HIDDEN_FILES
="exe|bin|pot|hcstat|dictstat|accepted|sh|cmd|bat|restore"
184 local HIDDEN_FILES_AGGRESIVE
="exe|bin|pot|hcstat|dictstat|hcmask|hcchr|accepted|sh|cmd|restore"
185 local BUILD_IN_CHARSETS
='?l ?u ?d ?a ?b ?s'
187 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"
188 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 --opencl-device-types --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"
189 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 --opencl-device-types --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"
192 local cur
="${COMP_WORDS[COMP_CWORD]}"
193 local prev
="${COMP_WORDS[COMP_CWORD-1]}"
195 # if cur is just '=', ignore the '=' and treat it as only the prev was provided
196 if [[ "${cur}" == '=' ]]; then
200 elif [[ "${prev}" == '=' ]]; then
202 if [ "${COMP_CWORD}" -gt 2 ]; then
204 prev
="${COMP_WORDS[COMP_CWORD-2]}"
213 COMPREPLY
=($
(compgen
-W "${HASH_MODES}" -- ${cur}))
218 COMPREPLY
=($
(compgen
-W "${ATTACK_MODES}" -- ${cur}))
223 COMPREPLY
=($
(compgen
-W "${OUTFILE_FORMATS}" -- ${cur}))
228 COMPREPLY
=($
(compgen
-W "${BENCHMARK_MODE}" -- ${cur}))
232 -w|
--workload-profile)
233 COMPREPLY
=($
(compgen
-W "${WORKLOAD_PROFILE}" -- ${cur}))
238 COMPREPLY
=($
(compgen
-W "${KERNEL_ACCEL}" -- ${cur}))
243 COMPREPLY
=($
(compgen
-W "${KERNEL_LOOPS}" -- ${cur}))
247 -o|
--outfile|
-r|
--rules-file|
--debug-file)
248 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
249 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
254 local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null)
255 COMPREPLY=($(compgen -W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
260 _oclHashcat_opencl_devices
261 local num_devices
=${?}
263 _oclHashcat_get_permutations
${num_devices}
265 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
269 --opencl-device-types)
270 COMPREPLY
=($
(compgen
-W "${OPENCL_DEVICE_TYPES}" -- ${cur}))
275 local icd_list
=$
(ls -1 /etc
/OpenCL
/vendors
/*.icd
2> /dev
/null
)
277 local architecture
=$
(getconf LONG_BIT
2> /dev
/null
)
279 if [ -z "${architecture}" ]; then
283 # filter the icd_list (do not show 32 bit on 64bit systems and vice versa)
285 if [ "${architecture}" -eq 64 ]; then
287 icd_list
=$
(echo "${icd_list}" |
grep -v "32.icd")
291 icd_list
=$
(echo "${icd_list}" |
grep -v "64.icd")
295 local number_icds
=$
(seq 1 $
(echo "${icd_list}" |
wc -l))
297 COMPREPLY
=($
(compgen
-W "${number_icds}" -- ${cur}))
303 _oclHashcat_cpu_devices
304 local num_devices
=${?}
306 _oclHashcat_get_permutations
${num_devices}
308 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
312 -1|
-2|
-3|
-4|
--custom-charset1|
--custom-charset2|
--custom-charset3|
--custom-charset4)
313 local mask
=${BUILD_IN_CHARSETS}
315 if [ -e "${cur}" ]; then # should be hcchr file (but not enforced)
317 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
322 if [ -n "${cur}" ]; then
324 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
326 mask
="${mask} ${cur_var}"
330 if ! echo ${cur} |
grep -q ${h} 2> /dev
/null
; then
332 if echo ${cur} |
grep -q '?a' 2> /dev
/null
; then
334 if [[ "${h}" == "?l" ]] ; then
336 elif [[ "${h}" == "?u" ]] ; then
338 elif [[ "${h}" == "?d" ]] ; then
340 elif [[ "${h}" == "?s" ]] ; then
342 elif [[ "${h}" == "?b" ]] ; then
348 mask
="${mask} ${cur_var}${h}"
355 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
357 mask
="${mask} ${files}"
359 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
364 --status-timer|
--markov-threshold|
--runtime|
--session|
--separator|
--segment-size|
--rule-left|
--rule-right| \
365 --gpu-temp-abort|
--gpu-temp-retain|
--generate-rules|
--generate-rules-func-min|
--generate-rules-func-max| \
366 --increment-min|
--increment-max|
--remove-timer|
--bitmap-min|
--bitmap-max|
--skip|
--limit|
--generate-rules-seed| \
367 --weak-hash-threshold|
--outfile-check-timer|
--outfile-check-dir|
--induction-dir|
--scrypt-tmto)
372 COMPREPLY
=($
(compgen
-W "${DEBUG_MODE}" -- ${cur}))
376 --truecrypt-keyfiles)
377 # first: remove the quotes such that file matching is possible
379 local cur_part0
=$
(echo "${cur}" |
grep -Eo '^("|'"'"')')
381 local cur_mod
=$
(echo "${cur}" |
sed 's/^["'"'"']//')
382 local cur_part1
=$
(echo "${cur_mod}" |
grep ',' 2> /dev
/null |
sed 's/^\(.*, *\)[^,]*$/\1/')
383 local cur_part2
=$
(echo "${cur_mod}" |
sed 's/^.*, *\([^,]*\)$/\1/')
385 # generate lines with the file name and a duplicate of it with a comma at the end
387 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}/")
388 COMPREPLY=($(compgen -W "${files}" -- ${cur}))
393 # allow also the VARIANTS w/o spaces
394 # we could use compgen -P prefix, but for some reason it doesn't seem to work always
399 local hash_modes_var="$
(echo -n "-m ${HASH_MODES}" |
sed 's/ / -m/g')"
400 COMPREPLY=($(compgen -W "${hash_modes_var}" -- ${cur}))
405 local attack_modes_var="$
(echo -n "-a ${ATTACK_MODES}" |
sed 's/ / -a/g')"
406 COMPREPLY=($(compgen -W "${attack_modes_var}" -- ${cur}))
411 local workload_profile_var="$
(echo -n "-w ${WORKLOAD_PROFILE}" |
sed 's/ / -w/g')"
412 COMPREPLY=($(compgen -W "${workload_profile_var}" -- ${cur}))
417 local kernel_accel_var="$
(echo -n "-n ${KERNEL_ACCEL}" |
sed 's/ / -n/g')"
418 COMPREPLY=($(compgen -W "${kernel_accel_var}" -- ${cur}))
423 local kernel_loops_var="$
(echo -n "-u ${KERNEL_LOOPS}" |
sed 's/ / -u/g')"
424 COMPREPLY=($(compgen -W "${kernel_loops_var}" -- ${cur}))
429 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
430 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-o/g')"
431 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
436 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
437 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-r/g')"
438 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
443 _oclHashcat_opencl_devices
444 local num_devices=${?}
446 _oclHashcat_get_permutations ${num_devices}
448 local opencl_devices_var="$
(echo " "${oclHashcat_devices_permutation} |
sed 's/ / -d/g')"
449 COMPREPLY=($(compgen -W "${opencl_devices_var}" -- ${cur}))
454 # Complete options/switches (not the arguments)
456 if [[ "${cur}" == -* ]]; then
458 COMPREPLY=($(compgen -W "${SHORT_OPTS} ${LONG_OPTS}" -- ${cur}))
463 # additional parameter, no switch nor option but maybe hash file, dictionary, mask, directory
465 # check if first option out of (hash.txt and dictionary|mask|directory)
466 # is first option iff: here
467 # 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!)
471 local attack_mode
=0 # also default of oclHashcat
472 local has_charset_1
=0
473 local has_charset_2
=0
474 local has_charset_3
=0
475 local has_charset_4
=0
477 while [ ${h} -le ${COMP_CWORD} ]; do
479 if [[ "${COMP_WORDS[h]}" == "-a" ]]; then
481 attack_mode
=${COMP_WORDS[$((h + 1))]}
483 elif [[ "${COMP_WORDS[h]}" == -a* ]]; then
485 attack_mode
=${COMP_WORDS[h]:2}
487 elif [[ "${COMP_WORDS[h]}" == "--attack-mode" ]]; then
489 attack_mode
=${COMP_WORDS[$((h + 1))]}
491 elif [[ "${COMP_WORDS[h]}" == "-1" ]]; then
495 elif [[ "${COMP_WORDS[h]}" == "--custom-charset1" ]]; then
499 elif [[ "${COMP_WORDS[h]}" == "-2" ]]; then
503 elif [[ "${COMP_WORDS[h]}" == "--custom-charset2" ]]; then
507 elif [[ "${COMP_WORDS[h]}" == "-3" ]]; then
511 elif [[ "${COMP_WORDS[h]}" == "--custom-charset3" ]]; then
515 elif [[ "${COMP_WORDS[h]}" == "-4" ]]; then
519 elif [[ "${COMP_WORDS[h]}" == "--custom-charset4" ]]; then
525 if _oclHashcat_contains
"${OPTIONS}" "${COMP_WORDS[h]}"; then
531 if ! _oclHashcat_contains
"${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then
532 local variants
="-m -a -w -n -u -o -r -d"
535 for v
in ${variants}; do
537 if [[ "${COMP_WORDS[h]:0:2}" == "${v}" ]]; then
543 if [ "${skip}" -eq 0 ]; then
545 no_opts
=$
((no_opts
+ 1))
563 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
564 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
569 case "${attack_mode}" in
572 # dict/directory are files here
573 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
574 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
579 if [ "${no_opts}" -gt 4 ]; then
583 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
584 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
589 if [ "${no_opts}" -eq 2 ]; then
590 local mask
=${BUILD_IN_CHARSETS}
592 if [ "${has_charset_1}" -eq 1 ]; then
598 if [ "${has_charset_2}" -eq 1 ]; then
604 if [ "${has_charset_3}" -eq 1 ]; then
610 if [ "${has_charset_4}" -eq 1 ]; then
616 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
618 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
623 if [ -n "${cur}" ]; then
625 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
627 mask
="${mask} ${cur_var}"
632 mask
="${mask} ${cur_var}${h}"
637 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
639 mask
="${mask} ${files}"
641 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
647 if [ "${no_opts}" -eq 2 ]; then
649 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
650 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
652 elif [ "${no_opts}" -eq 3 ]; then
653 local mask
=${BUILD_IN_CHARSETS}
655 if [ "${has_charset_1}" -eq 1 ]; then
661 if [ "${has_charset_2}" -eq 1 ]; then
667 if [ "${has_charset_3}" -eq 1 ]; then
673 if [ "${has_charset_4}" -eq 1 ]; then
679 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
681 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
686 if [ -n "${cur}" ]; then
688 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
690 mask
="${mask} ${cur_var}"
695 mask
="${mask} ${cur_var}${h}"
700 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
702 mask
="${mask} ${files}"
704 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
711 if [ "${no_opts}" -eq 2 ]; then
712 local mask
=${BUILD_IN_CHARSETS}
714 if [ "${has_charset_1}" -eq 1 ]; then
720 if [ "${has_charset_2}" -eq 1 ]; then
726 if [ "${has_charset_3}" -eq 1 ]; then
732 if [ "${has_charset_4}" -eq 1 ]; then
738 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
740 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
745 if [ -n "${cur}" ]; then
747 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
749 mask
="${mask} ${cur_var}"
754 mask
="${mask} ${cur_var}${h}"
759 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
761 mask
="${mask} ${files}"
763 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
766 elif [ "${no_opts}" -eq 3 ]; then
768 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
769 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
780 complete
-F _oclHashcat
-o filenames
"${OCLHASHCAT_ROOT}"/oclHashcat64.bin "${OCLHASHCAT_ROOT}"/oclHashcat32.bin "${OCLHASHCAT_ROOT}"/oclHashcat oclHashcat