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 OPENCL_VECTOR_WIDTH
="1 2 4 8"
179 local BENCHMARK_MODE
="0 1"
180 local DEBUG_MODE
="1 2 3 4"
181 local WORKLOAD_PROFILE
="1 2 3"
182 local KERNEL_ACCEL
="1 8 16 24 32 40 48 56 64 62 80 88 96 104 112 120 128 136 144 152 160"
183 local KERNEL_LOOPS
="8 16 32 64 128 256 512 1024"
184 local HIDDEN_FILES
="exe|bin|pot|hcstat|dictstat|accepted|sh|cmd|bat|restore"
185 local HIDDEN_FILES_AGGRESIVE
="exe|bin|pot|hcstat|dictstat|hcmask|hcchr|accepted|sh|cmd|restore"
186 local BUILD_IN_CHARSETS
='?l ?u ?d ?a ?b ?s'
188 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"
189 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-platforms --opencl-device-types --opencl-vector-width --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"
190 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-platforms --opencl-device-types --opencl-vector-width --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"
193 local cur
="${COMP_WORDS[COMP_CWORD]}"
194 local prev
="${COMP_WORDS[COMP_CWORD-1]}"
196 # if cur is just '=', ignore the '=' and treat it as only the prev was provided
197 if [[ "${cur}" == '=' ]]; then
201 elif [[ "${prev}" == '=' ]]; then
203 if [ "${COMP_CWORD}" -gt 2 ]; then
205 prev
="${COMP_WORDS[COMP_CWORD-2]}"
214 COMPREPLY
=($
(compgen
-W "${HASH_MODES}" -- ${cur}))
219 COMPREPLY
=($
(compgen
-W "${ATTACK_MODES}" -- ${cur}))
224 COMPREPLY
=($
(compgen
-W "${OUTFILE_FORMATS}" -- ${cur}))
229 COMPREPLY
=($
(compgen
-W "${BENCHMARK_MODE}" -- ${cur}))
233 -w|
--workload-profile)
234 COMPREPLY
=($
(compgen
-W "${WORKLOAD_PROFILE}" -- ${cur}))
239 COMPREPLY
=($
(compgen
-W "${KERNEL_ACCEL}" -- ${cur}))
244 COMPREPLY
=($
(compgen
-W "${KERNEL_LOOPS}" -- ${cur}))
248 -o|
--outfile|
-r|
--rules-file|
--debug-file)
249 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
250 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
255 local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null)
256 COMPREPLY=($(compgen -W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur})
261 _oclHashcat_opencl_devices
262 local num_devices
=${?}
264 _oclHashcat_get_permutations
${num_devices}
266 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
270 --opencl-device-types)
271 COMPREPLY
=($
(compgen
-W "${OPENCL_DEVICE_TYPES}" -- ${cur}))
275 --opencl-vector-width)
276 COMPREPLY
=($
(compgen
-W "${OPENCL_VECTOR_WIDTH}" -- ${cur}))
281 local icd_list
=$
(ls -1 /etc
/OpenCL
/vendors
/*.icd
2> /dev
/null
)
283 local architecture
=$
(getconf LONG_BIT
2> /dev
/null
)
285 if [ -z "${architecture}" ]; then
289 # filter the icd_list (do not show 32 bit on 64bit systems and vice versa)
291 if [ "${architecture}" -eq 64 ]; then
293 icd_list
=$
(echo "${icd_list}" |
grep -v "32.icd")
297 icd_list
=$
(echo "${icd_list}" |
grep -v "64.icd")
301 local number_icds
=$
(seq 1 $
(echo "${icd_list}" |
wc -l))
303 COMPREPLY
=($
(compgen
-W "${number_icds}" -- ${cur}))
309 _oclHashcat_cpu_devices
310 local num_devices
=${?}
312 _oclHashcat_get_permutations
${num_devices}
314 COMPREPLY
=($
(compgen
-W "${oclHashcat_devices_permutation}" -- ${cur}))
318 -1|
-2|
-3|
-4|
--custom-charset1|
--custom-charset2|
--custom-charset3|
--custom-charset4)
319 local mask
=${BUILD_IN_CHARSETS}
321 if [ -e "${cur}" ]; then # should be hcchr file (but not enforced)
323 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
328 if [ -n "${cur}" ]; then
330 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
332 mask
="${mask} ${cur_var}"
336 if ! echo ${cur} |
grep -q ${h} 2> /dev
/null
; then
338 if echo ${cur} |
grep -q '?a' 2> /dev
/null
; then
340 if [[ "${h}" == "?l" ]] ; then
342 elif [[ "${h}" == "?u" ]] ; then
344 elif [[ "${h}" == "?d" ]] ; then
346 elif [[ "${h}" == "?s" ]] ; then
348 elif [[ "${h}" == "?b" ]] ; then
354 mask
="${mask} ${cur_var}${h}"
361 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
363 mask
="${mask} ${files}"
365 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
370 --status-timer|
--markov-threshold|
--runtime|
--session|
--separator|
--segment-size|
--rule-left|
--rule-right| \
371 --gpu-temp-abort|
--gpu-temp-retain|
--generate-rules|
--generate-rules-func-min|
--generate-rules-func-max| \
372 --increment-min|
--increment-max|
--remove-timer|
--bitmap-min|
--bitmap-max|
--skip|
--limit|
--generate-rules-seed| \
373 --weak-hash-threshold|
--outfile-check-timer|
--outfile-check-dir|
--induction-dir|
--scrypt-tmto)
378 COMPREPLY
=($
(compgen
-W "${DEBUG_MODE}" -- ${cur}))
382 --truecrypt-keyfiles)
383 # first: remove the quotes such that file matching is possible
385 local cur_part0
=$
(echo "${cur}" |
grep -Eo '^("|'"'"')')
387 local cur_mod
=$
(echo "${cur}" |
sed 's/^["'"'"']//')
388 local cur_part1
=$
(echo "${cur_mod}" |
grep ',' 2> /dev
/null |
sed 's/^\(.*, *\)[^,]*$/\1/')
389 local cur_part2
=$
(echo "${cur_mod}" |
sed 's/^.*, *\([^,]*\)$/\1/')
391 # generate lines with the file name and a duplicate of it with a comma at the end
393 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}/")
394 COMPREPLY=($(compgen -W "${files}" -- ${cur}))
399 # allow also the VARIANTS w/o spaces
400 # we could use compgen -P prefix, but for some reason it doesn't seem to work always
405 local hash_modes_var="$
(echo -n "-m ${HASH_MODES}" |
sed 's/ / -m/g')"
406 COMPREPLY=($(compgen -W "${hash_modes_var}" -- ${cur}))
411 local attack_modes_var="$
(echo -n "-a ${ATTACK_MODES}" |
sed 's/ / -a/g')"
412 COMPREPLY=($(compgen -W "${attack_modes_var}" -- ${cur}))
417 local workload_profile_var="$
(echo -n "-w ${WORKLOAD_PROFILE}" |
sed 's/ / -w/g')"
418 COMPREPLY=($(compgen -W "${workload_profile_var}" -- ${cur}))
423 local kernel_accel_var="$
(echo -n "-n ${KERNEL_ACCEL}" |
sed 's/ / -n/g')"
424 COMPREPLY=($(compgen -W "${kernel_accel_var}" -- ${cur}))
429 local kernel_loops_var="$
(echo -n "-u ${KERNEL_LOOPS}" |
sed 's/ / -u/g')"
430 COMPREPLY=($(compgen -W "${kernel_loops_var}" -- ${cur}))
435 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
436 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-o/g')"
437 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
442 local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null)
443 outfile_var="$
(echo -e "\n${outfile_var}" |
sed 's/^/-r/g')"
444 COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur}))
449 _oclHashcat_opencl_devices
450 local num_devices=${?}
452 _oclHashcat_get_permutations ${num_devices}
454 local opencl_devices_var="$
(echo " "${oclHashcat_devices_permutation} |
sed 's/ / -d/g')"
455 COMPREPLY=($(compgen -W "${opencl_devices_var}" -- ${cur}))
460 # Complete options/switches (not the arguments)
462 if [[ "${cur}" == -* ]]; then
464 COMPREPLY=($(compgen -W "${SHORT_OPTS} ${LONG_OPTS}" -- ${cur}))
469 # additional parameter, no switch nor option but maybe hash file, dictionary, mask, directory
471 # check if first option out of (hash.txt and dictionary|mask|directory)
472 # is first option iff: here
473 # 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!)
477 local attack_mode
=0 # also default of oclHashcat
478 local has_charset_1
=0
479 local has_charset_2
=0
480 local has_charset_3
=0
481 local has_charset_4
=0
483 while [ ${h} -le ${COMP_CWORD} ]; do
485 if [[ "${COMP_WORDS[h]}" == "-a" ]]; then
487 attack_mode
=${COMP_WORDS[$((h + 1))]}
489 elif [[ "${COMP_WORDS[h]}" == -a* ]]; then
491 attack_mode
=${COMP_WORDS[h]:2}
493 elif [[ "${COMP_WORDS[h]}" == "--attack-mode" ]]; then
495 attack_mode
=${COMP_WORDS[$((h + 1))]}
497 elif [[ "${COMP_WORDS[h]}" == "-1" ]]; then
501 elif [[ "${COMP_WORDS[h]}" == "--custom-charset1" ]]; then
505 elif [[ "${COMP_WORDS[h]}" == "-2" ]]; then
509 elif [[ "${COMP_WORDS[h]}" == "--custom-charset2" ]]; then
513 elif [[ "${COMP_WORDS[h]}" == "-3" ]]; then
517 elif [[ "${COMP_WORDS[h]}" == "--custom-charset3" ]]; then
521 elif [[ "${COMP_WORDS[h]}" == "-4" ]]; then
525 elif [[ "${COMP_WORDS[h]}" == "--custom-charset4" ]]; then
531 if _oclHashcat_contains
"${OPTIONS}" "${COMP_WORDS[h]}"; then
537 if ! _oclHashcat_contains
"${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then
538 local variants
="-m -a -w -n -u -o -r -d"
541 for v
in ${variants}; do
543 if [[ "${COMP_WORDS[h]:0:2}" == "${v}" ]]; then
549 if [ "${skip}" -eq 0 ]; then
551 no_opts
=$
((no_opts
+ 1))
569 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
570 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
575 case "${attack_mode}" in
578 # dict/directory are files here
579 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
580 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
585 if [ "${no_opts}" -gt 4 ]; then
589 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
590 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
595 if [ "${no_opts}" -eq 2 ]; then
596 local mask
=${BUILD_IN_CHARSETS}
598 if [ "${has_charset_1}" -eq 1 ]; then
604 if [ "${has_charset_2}" -eq 1 ]; then
610 if [ "${has_charset_3}" -eq 1 ]; then
616 if [ "${has_charset_4}" -eq 1 ]; then
622 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
624 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
629 if [ -n "${cur}" ]; then
631 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
633 mask
="${mask} ${cur_var}"
638 mask
="${mask} ${cur_var}${h}"
643 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
645 mask
="${mask} ${files}"
647 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
653 if [ "${no_opts}" -eq 2 ]; then
655 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
656 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
658 elif [ "${no_opts}" -eq 3 ]; then
659 local mask
=${BUILD_IN_CHARSETS}
661 if [ "${has_charset_1}" -eq 1 ]; then
667 if [ "${has_charset_2}" -eq 1 ]; then
673 if [ "${has_charset_3}" -eq 1 ]; then
679 if [ "${has_charset_4}" -eq 1 ]; then
685 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
687 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
692 if [ -n "${cur}" ]; then
694 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
696 mask
="${mask} ${cur_var}"
701 mask
="${mask} ${cur_var}${h}"
706 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
708 mask
="${mask} ${files}"
710 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
717 if [ "${no_opts}" -eq 2 ]; then
718 local mask
=${BUILD_IN_CHARSETS}
720 if [ "${has_charset_1}" -eq 1 ]; then
726 if [ "${has_charset_2}" -eq 1 ]; then
732 if [ "${has_charset_3}" -eq 1 ]; then
738 if [ "${has_charset_4}" -eq 1 ]; then
744 if [ -e "${cur}" ]; then # should be hcmask file (but not enforced)
746 COMPREPLY
=($
(compgen
-W "${cur}" -- ${cur}))
751 if [ -n "${cur}" ]; then
753 local cur_var
=$
(echo "${cur}" |
sed 's/\?$//')
755 mask
="${mask} ${cur_var}"
760 mask
="${mask} ${cur_var}${h}"
765 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev
/null
)
767 mask
="${mask} ${files}"
769 COMPREPLY
=($
(compgen
-W "${mask}" -- ${cur}))
772 elif [ "${no_opts}" -eq 3 ]; then
774 local files
=$
(ls -d ${cur}* 2> /dev
/null |
grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev
/null
)
775 COMPREPLY
=($
(compgen
-W "${files}" -- ${cur}))
786 complete
-F _oclHashcat
-o filenames
"${OCLHASHCAT_ROOT}"/oclHashcat64.bin "${OCLHASHCAT_ROOT}"/oclHashcat32.bin "${OCLHASHCAT_ROOT}"/oclHashcat oclHashcat