4 ## Authors.....: Gabriele Gristina <matrix@hashcat.net>
5 ## Jens Steube <jens.steube@gmail.com>
10 # missing hash types: 5200,6211,6221,6231,6241,6251,6261,6271,6281
12 HASH_TYPES
="0 10 11 12 20 21 22 23 30 40 50 60 100 101 110 111 112 120 121 122 130 131 132 140 141 150 160 190 200 300 400 500 900 1000 1100 1400 1410 1420 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 5300 5400 5500 5600 5700 5800 6000 6100 6300 6400 6500 6600 6700 6800 6900 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8900 9100 9200 9300 9400 9500 9600 9700 9800 9900 10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000 11100 11200 11300 11400 11500 11600 11900 12000 12100 12200 12300 12400 12600 12800 12900 13000"
14 ATTACK_MODES
="0 1 3 6 7"
16 VECTOR_WIDTHS
="1 2 4 8"
18 MATCH_PASS_ONLY
="2500 5300 5400 6600 6800 8200"
24 SLOW_ALGOS
="400 500 501 1600 1800 2100 2500 3200 5200 5800 6211 6221 6231 6241 6251 6261 6271 6281 6300 6400 6500 6600 6700 6800 7100 7200 7400 7900 8200 8800 8900 9000 9100 9200 9300 9400 9500 9600 10000 10300 10500 10700 10900 11300 11600 11900 12000 12100 12200 12300 12400 12500 12800 12900 13000"
26 OPTS
="--quiet --force --potfile-disable --runtime 200 --gpu-temp-disable --weak-hash-threshold=0"
28 OUTD
="test_$(date +%s)"
38 mask_3
[5]="?d?d?d?d?d"
39 mask_3
[6]="?d?d?d?d?d?d"
40 mask_3
[7]="?d?d?d?d?d?d?d"
41 mask_3
[8]="?d?d?d?d?d?d?d?d"
42 mask_3
[9]="?d?d?d?d?d?d?d?d?d"
43 mask_3
[10]="?d?d?d?d?d?d?d?d?d?d"
44 mask_3
[11]="?d?d?d?d?d?d?d?d?d?d?d"
45 mask_3
[12]="?d?d?d?d?d?d?d?d?d?d?d?d"
46 mask_3
[13]="?d?d?d?d?d?d?d?d?d?d?d?d?d"
47 mask_3
[14]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d"
48 mask_3
[15]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d"
49 mask_3
[16]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0"
50 mask_3
[17]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00"
51 mask_3
[18]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000"
52 mask_3
[19]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000"
53 mask_3
[20]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000"
54 mask_3
[21]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000"
55 mask_3
[22]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000"
56 mask_3
[23]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000"
57 mask_3
[24]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000"
58 mask_3
[25]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000"
59 mask_3
[26]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000000"
60 mask_3
[27]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000000"
61 mask_3
[28]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000000"
62 mask_3
[29]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000000000"
63 mask_3
[30]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000000000"
64 mask_3
[31]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000000000"
75 mask_6
[9]="?d?d?d?d?d"
76 mask_6
[10]="?d?d?d?d?d"
77 mask_6
[11]="?d?d?d?d?d?d"
78 mask_6
[12]="?d?d?d?d?d?d"
79 mask_6
[13]="?d?d?d?d?d?d?d"
80 mask_6
[14]="?d?d?d?d?d?d?d"
81 mask_6
[15]="?d?d?d?d?d?d?d?d"
82 mask_6
[16]="?d?d?d?d?d?d?d?d"
83 mask_6
[17]="?d?d?d?d?d?d?d?d0"
84 mask_6
[18]="?d?d?d?d?d?d?d?d0"
85 mask_6
[19]="?d?d?d?d?d?d?d?d00"
86 mask_6
[20]="?d?d?d?d?d?d?d?d00"
87 mask_6
[21]="?d?d?d?d?d?d?d?d000"
88 mask_6
[22]="?d?d?d?d?d?d?d?d000"
89 mask_6
[23]="?d?d?d?d?d?d?d?d0000"
90 mask_6
[24]="?d?d?d?d?d?d?d?d0000"
91 mask_6
[25]="?d?d?d?d?d?d?d?d00000"
92 mask_6
[26]="?d?d?d?d?d?d?d?d00000"
93 mask_6
[27]="?d?d?d?d?d?d?d?d000000"
94 mask_6
[28]="?d?d?d?d?d?d?d?d000000"
95 mask_6
[29]="?d?d?d?d?d?d?d?d0000000"
96 mask_6
[30]="?d?d?d?d?d?d?d?d0000000"
97 mask_6
[31]="?d?d?d?d?d?d?d?d00000000"
109 mask_7
[10]="?d?d?d?d?d"
110 mask_7
[11]="?d?d?d?d?d"
111 mask_7
[12]="?d?d?d?d?d?d"
112 mask_7
[13]="?d?d?d?d?d?d"
113 mask_7
[14]="?d?d?d?d?d?d?d"
114 mask_7
[15]="?d?d?d?d?d?d?d"
115 mask_7
[16]="?d?d?d?d?d?d?d?d"
116 mask_7
[17]="?d?d?d?d?d?d?d?d"
117 mask_7
[18]="?d?d?d?d?d?d?d?d0"
118 mask_7
[19]="?d?d?d?d?d?d?d?d0"
119 mask_7
[20]="?d?d?d?d?d?d?d?d00"
120 mask_7
[21]="?d?d?d?d?d?d?d?d00"
121 mask_7
[22]="?d?d?d?d?d?d?d?d000"
122 mask_7
[23]="?d?d?d?d?d?d?d?d000"
123 mask_7
[24]="?d?d?d?d?d?d?d?d0000"
124 mask_7
[25]="?d?d?d?d?d?d?d?d0000"
125 mask_7
[26]="?d?d?d?d?d?d?d?d00000"
126 mask_7
[27]="?d?d?d?d?d?d?d?d00000"
127 mask_7
[28]="?d?d?d?d?d?d?d?d000000"
128 mask_7
[29]="?d?d?d?d?d?d?d?d000000"
129 mask_7
[30]="?d?d?d?d?d?d?d?d0000000"
130 mask_7
[31]="?d?d?d?d?d?d?d?d0000000"
134 for element
in "${@:2}"; do
136 if [ "${element}" == "${1}" ]; then
147 if [ "${PACKAGE}" -eq 1 ]; then
149 echo "[ ${OUTD} ] > Generate tests for hash type $hash_type."
153 echo "[ ${OUTD} ] > Init test for hash type $hash_type."
157 rm -rf ${OUTD}/${hash_type}.sh ${OUTD}/${hash_type}_passwords.txt ${OUTD}/${hash_type}_hashes.txt
159 # create list of password and hashes of same type
160 grep " ${hash_type} '" ${OUTD}/all.sh > ${OUTD}/${hash_type}.sh
162 # create separate list of password and hashes
163 cat ${OUTD}/${hash_type}.sh | awk '{print $3}' > ${OUTD}/${hash_type}_passwords.txt
164 cat ${OUTD}/${hash_type}.sh | awk '{print $11}' | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes.txt
166 if [ "${hash_type}" -eq 10300 ]; then
167 cat ${OUTD}/${hash_type}.sh | cut -d' ' -f11- | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes.txt
171 rm -rf ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2
172 touch ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2
174 # foreach password entry split password in 2 (skip first entry, is len 1)
177 # minimum password length
181 if [ "${hash_type}" -eq 2500 ]; then
183 min_len=7 # means length 8, since we start with 0
187 while read -u 9 pass; do
189 if [ ${i} -gt 1 ]; then
191 # split password, 'i' is the len
195 # special case (passwords longer than expected)
198 if [ "${pass_len}" -gt 1 ]
201 p1=$((p1 + ${min_len}))
202 p0=$((p0 + ${min_len}))
204 if [ "${p1}" -gt ${pass_len} ]; then
211 # add splitted password to dicts
213 echo ${pass} | cut -c -${p0} >> ${OUTD}/${hash_type}_dict1
214 echo ${pass} | cut -c ${p1}- >> ${OUTD}/${hash_type}_dict2
221 done 9< ${OUTD}/${hash_type}_passwords.txt
225 if [ "${hash_type}" -eq 2500 ]; then
227 min_len=7 # means length 8, since we start with 0
231 # generate multiple pass/hash foreach len (2 to 8)
232 if [ ${MODE} -ge 1 ]; then
234 for ((i = 2; i < 9; i++)); do
236 rm -rf ${OUTD}/${hash_type}_multi_${i}.txt ${OUTD}/${hash_type}_passwords_multi_${i}.txt ${OUTD}/${hash_type}_hashes_multi_${i}.txt
237 rm -rf ${OUTD}/${hash_type}_dict1_multi_${i} ${OUTD}/${hash_type}_dict2_multi_${i}
238 touch ${OUTD}/${hash_type}_dict1_multi_${i} ${OUTD}/${hash_type}_dict2_multi_${i}
240 perl tools/test.pl single ${hash_type} ${i} > ${OUTD}/${hash_type}_multi_${i}.txt
242 cat ${OUTD}/${hash_type}_multi_${i}.txt | awk '{print $3}' > ${OUTD}/${hash_type}_passwords_multi_${i}.txt
243 cat ${OUTD}/${hash_type}_multi_${i}.txt | awk '{print $11}' | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes_multi_${i}.txt
245 if [ "${hash_type}" -eq 10300 ]; then
246 cat ${OUTD}/${hash_type}_multi_${i}.txt | cut -d' ' -f11- | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes_multi_${i}.txt
249 # split password, 'i' is the len
253 p0=$((p0 + ${min_len}))
254 p1=$((p1 + ${min_len}))
256 while read -u 9 pass; do
258 # add splitted password to dicts
259 echo ${pass} | cut -c -${p0} >> ${OUTD}/${hash_type}_dict1_multi_${i}
260 echo ${pass} | cut -c ${p1}- >> ${OUTD}/${hash_type}_dict2_multi_${i}
262 done 9< ${OUTD}/${hash_type}_passwords_multi_${i}.txt
275 if [ ${RET} -ne 0 ]; then
278 if contains ${hash_type} ${NEVER_CRACK_ALGOS}; then
280 echo "password not found
, cmdline
: ${CMD}" &>> ${OUTD}/logfull.txt
287 echo "timeout reached
, cmdline
: ${CMD}" &>> ${OUTD}/logfull.txt
292 if [ "${pass_only}" -eq 1 ]; then
293 echo "plains not found
in output
, cmdline
: ${CMD}" &>> ${OUTD}/logfull.txt
295 echo "hash:plains not matched
in output
, cmdline
: ${CMD}" &>> ${OUTD}/logfull.txt
301 echo "! unhandled
return code
${RET}, cmdline : ${CMD}" &>> ${OUTD}/logfull.txt
302 echo "! unhandled return code, see ${OUTD}/logfull.txt for details."
313 if ! contains
${hash_type} ${FILE_BASED_ALGOS}; then
320 if [ ${MODE} -ne 1 ]; then
327 echo "> Testing hash type $hash_type with attack mode 0, markov ${MARKOV}, single hash, device-type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
331 if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then
339 while read -u 9 line; do
341 if [ "${i}" -ge ${max} ]; then
347 hash="$
(echo "$line" | cut
-d\' -f2)"
348 pass="$
(echo "$line" | cut
-d' ' -f3)"
350 if [ -z "${hash}" ]; then
356 if [ "${file_only}" -eq 1 ]; then
358 temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt
"
359 echo ${hash} | base64 -d > ${temp_file}
364 CMD="echo -n "${pass}" | ./${BIN} ${OPTS} -a 0 -m ${hash_type} '${hash}'"
366 echo -n "[ len $((i + 1)) ] " &>> ${OUTD}/logfull.txt
368 output
=$
(echo -n "${pass}" | ./${BIN} ${OPTS} -a 0 -m ${hash_type} "${hash}" 2>&1)
372 echo "${output}" >> ${OUTD}/logfull.txt
374 if [ "${ret}" -eq 0 ]; then
376 if [ ${pass_only} -eq 1 ]; then
379 search
="${hash}:${pass}"
382 echo "${output}" |
grep -F "${search}" &> /dev
/null
384 if [ "${?}" -ne 0 ]; then
396 done 9< ${OUTD}/${hash_type}.sh
400 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
404 elif [ "${e_to}" -ne 0 ]; then
410 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 0, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout"
415 if [ ${MODE} -ne 0 ]; then
422 echo "> Testing hash type $hash_type with attack mode 0, markov ${MARKOV}, multi hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
424 hash_file=${OUTD}/${hash_type}_hashes.txt
426 # if file_only -> decode all base64 "hashes
" and put them in the temporary file
428 if [ "${file_only}" -eq 1 ]; then
430 temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt
"
433 hash_file=${temp_file}
435 while read base64_hash; do
437 echo -n ${base64_hash} | base64 -d >> ${temp_file}
439 done < ${OUTD}/${hash_type}_hashes.txt
443 CMD="cat ${OUTD}/${hash_type}_passwords.txt | ./${BIN} ${OPTS} -a 0 -m ${hash_type} ${hash_file}"
445 output=$(cat ${OUTD}/${hash_type}_passwords.txt | ./${BIN} ${OPTS} -a 0 -m ${hash_type} ${hash_file} 2>&1)
449 echo "${output}" >> ${OUTD}/logfull.txt
451 if [ "${ret}" -eq 0 ]; then
455 while read -u 9 hash; do
457 pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt)
459 if [ ${pass_only} -eq 1 ]; then
462 search="${hash}:${pass}"
465 echo "${output}" | grep -F "${search}" &> /dev/null
467 if [ "${?}" -ne 0 ]; then
477 done 9< ${OUTD}/${hash_type}_hashes.txt
485 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
489 elif [ "${e_to}" -ne 0 ]; then
495 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 0, Mode multi, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout
"
504 if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then
511 if [ ${MODE} -ne 1 ]; then
518 echo "> Testing
hash type $hash_type with attack mode
1, markov
${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
520 while read -u 9 hash; do
522 if [ $i -gt 1 ]; then
524 if [ "${file_only}" -eq 1 ]; then
526 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
527 echo ${hash} | base64
-d > ${temp_file}
532 CMD
="./${BIN} ${OPTS} -a 1 -m ${hash_type} '${hash}' ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2"
534 echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt
536 output
=$
(.
/${BIN} ${OPTS} -a 1 -m ${hash_type} "${hash}" ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2
2>&1)
540 echo "${output}" >> ${OUTD}/logfull.txt
542 if [ "${ret}" -eq 0 ]; then
546 line_dict1
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1
)
547 line_dict2
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2
)
549 if [ ${pass_only} -eq 1 ]; then
550 search
=":${line_dict1}${line_dict2}"
552 search
="${hash}:${line_dict1}${line_dict2}"
555 echo "${output}" |
grep -F "${search}" &> /dev
/null
557 if [ "${?}" -ne 0 ]; then
571 done 9< ${OUTD}/${hash_type}_hashes.txt
575 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
579 elif [ "${e_to}" -ne 0 ]; then
585 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 1, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout"
590 if [ ${MODE} -ne 0 ]; then
599 if [ ${hash_type} -eq 2500 ]; then
601 elif [ ${hash_type} -eq 5800 ]; then
603 elif [ ${hash_type} -eq 3000 ]; then
605 elif [ ${hash_type} -eq 2100 ]; then
607 elif [ ${hash_type} -eq 1500 ]; then
609 elif [ ${hash_type} -eq 7700 ]; then
611 elif [ ${hash_type} -eq 8500 ]; then
615 hash_file
=${OUTD}/${hash_type}_multihash_combi.txt
617 tail -n ${offset} ${OUTD}/${hash_type}_hashes.txt > ${hash_file}
619 # if file_only -> decode all base64 "hashes" and put them in the temporary file
621 if [ "${file_only}" -eq 1 ]; then
623 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
626 hash_file
=${temp_file}
628 while read base64_hash
; do
630 echo -n ${base64_hash} | base64
-d >> ${temp_file}
632 done < ${OUTD}/${hash_type}_multihash_combi.txt
636 CMD
="./${BIN} ${OPTS} -a 1 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2"
638 echo "> Testing hash type $hash_type with attack mode 1, markov ${MARKOV}, multi hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
640 output=$(./${BIN} ${OPTS} -a 1 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2 2>&1)
644 echo "${output}" >> ${OUTD}/logfull.txt
646 if [ "${ret}" -eq 0 ]; then
650 while read -u 9 hash; do
652 line_nr=$((offset - i))
654 line_dict1=$(tail -n ${line_nr} ${OUTD}/${hash_type}_dict1 | head -1)
655 line_dict2=$(tail -n ${line_nr} ${OUTD}/${hash_type}_dict2 | head -1)
657 if [ ${pass_only} -eq 1 ]; then
658 search=":${line_dict1}${line_dict2}"
660 search="${hash}:${line_dict1}${line_dict2}"
663 echo "${output}" | grep -F "${search}" &> /dev/null
665 if [ "${?}" -ne 0 ]; then
675 done 9< ${OUTD}/${hash_type}_multihash_combi.txt
683 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
687 elif [ "${e_to}" -ne 0 ]; then
693 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 1, Mode multi, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout
"
702 if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then
709 if [ ${MODE} -ne 1 ]; then
716 echo "> Testing
hash type $hash_type with attack mode
3, markov
${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
721 # some algos have a minimum password length
723 if [ "${hash_type}" -eq 2500 ];then
732 while read -u 9 hash; do
734 if [ "${i}" -gt 6 ]; then
736 if ! contains
${hash_type} ${TIMEOUT_ALGOS}; then
744 if [ "${file_only}" -eq 1 ]; then
746 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
747 echo ${hash} | base64
-d > ${temp_file}
752 mask
=${mask_3[$((i + ${mask_offset}))]}
754 # modify "default" mask if needed (and set custom charset to reduce keyspace)
756 if [ "${hash_type}" -eq 2500 ]; then
758 pass
=$
(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt
)
762 # replace the first x positions in the mask with ?d's
764 # first: remove first i (== amount) chars
766 mask
=$
(echo ${mask} | cut
-b $
((i
+ 1))-)
770 for i
in $
(seq 1 ${i}); do
778 CMD
="./${BIN} ${OPTS} -a 3 -m ${hash_type} '${hash}' ${mask}"
780 echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt
782 output
=$
(.
/${BIN} ${OPTS} -a 3 -m ${hash_type} "${hash}" ${mask} 2>&1)
786 echo "${output}" >> ${OUTD}/logfull.txt
788 if [ "${ret}" -eq 0 ]; then
790 line_dict
=$
(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt
)
792 if [ ${pass_only} -eq 1 ]; then
793 search
=":${line_dict}"
795 search
="${hash}:${line_dict}"
798 echo "${output}" |
grep -F "${search}" &> /dev
/null
800 if [ "${?}" -ne 0 ]; then
810 if [ $i -eq ${max} ]; then break; fi
814 done 9< ${OUTD}/${hash_type}_hashes.txt
818 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
822 elif [ "${e_to}" -ne 0 ]; then
828 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 3, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout"
833 if [ ${MODE} -ne 0 ]; then
842 if ! contains
${hash_type} ${TIMEOUT_ALGOS}; then
850 if [ "${hash_type}" -eq 2500 ]; then
857 hash_file
=${OUTD}/${hash_type}_multihash_bruteforce.txt
859 head -n $
((increment_max
- ${increment_min} + 1)) ${OUTD}/${hash_type}_hashes.txt > ${hash_file}
861 # if file_only -> decode all base64 "hashes" and put them in the temporary file
863 if [ "${file_only}" -eq 1 ]; then
865 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
868 hash_file
=${temp_file}
870 while read base64_hash
; do
872 echo -n ${base64_hash} | base64
-d >> ${temp_file}
874 done < ${OUTD}/${hash_type}_multihash_bruteforce.txt
881 # modify "default" mask if needed (and set custom charset to reduce keyspace)
883 if [ "${hash_type}" -eq 2500 ]; then
885 mask
="?d?d?d?d?d?1?2?3?4"
892 # check positions (here we assume that mask is always composed of non literal chars
893 # i.e. something like ?d?l?u?s?1 is possible, but ?d?dsuffix not
894 charset_1_pos
=$
(expr index
"${mask}" 1)
895 charset_2_pos
=$
(expr index
"${mask}" 2)
896 charset_3_pos
=$
(expr index
"${mask}" 3)
897 charset_4_pos
=$
(expr index
"${mask}" 4)
899 # divide each charset position by 2 since each of them occupies 2 positions in the mask
901 charset_1_pos
=$
((charset_1_pos
/ 2))
902 charset_2_pos
=$
((charset_2_pos
/ 2))
903 charset_3_pos
=$
((charset_3_pos
/ 2))
904 charset_4_pos
=$
((charset_4_pos
/ 2))
908 while read -u 9 hash; do
910 pass
=$
(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt
)
913 char
=$
(echo "${pass}" | cut
-b ${charset_1_pos})
914 charset_1
=$
(echo -e "${charset_1}\n${char}")
917 char
=$
(echo "${pass}" | cut
-b ${charset_2_pos})
918 charset_2
=$
(echo -e "${charset_2}\n${char}")
921 char
=$
(echo "${pass}" | cut
-b ${charset_3_pos})
922 charset_3
=$
(echo -e "${charset_3}\n${char}")
925 char
=$
(echo "${pass}" | cut
-b ${charset_4_pos})
926 charset_4
=$
(echo -e "${charset_4}\n${char}")
930 done 9< ${OUTD}/${hash_type}_multihash_bruteforce.txt
932 # just make sure that all custom charset fields are initialized
934 if [ -z "${charset_1}" ]; then
940 if [ -z "${charset_2}" ]; then
946 if [ -z "${charset_3}" ]; then
952 if [ -z "${charset_4}" ]; then
958 # unique and remove new lines
960 charset_1
=$
(echo "${charset_1}" |
sort -u |
tr -d '\n')
961 charset_2
=$
(echo "${charset_2}" |
sort -u |
tr -d '\n')
962 charset_3
=$
(echo "${charset_3}" |
sort -u |
tr -d '\n')
963 charset_4
=$
(echo "${charset_4}" |
sort -u |
tr -d '\n')
965 custom_charsets
="-1 ${charset_1} -2 ${charset_2} -3 ${charset_3} -4 ${charset_4}"
968 CMD
="./${BIN} ${OPTS} -a 3 -m ${hash_type} --increment --increment-min ${increment_min} --increment-max ${increment_max} ${custom_charsets} ${hash_file} ${mask} "
970 echo "> Testing hash type $hash_type with attack mode 3, markov ${MARKOV}, multi hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
972 output=$(./${BIN} ${OPTS} -a 3 -m ${hash_type} --increment --increment-min ${increment_min} --increment-max ${increment_max} ${custom_charsets} ${hash_file} ${mask} 2>&1)
976 echo "${output}" >> ${OUTD}/logfull.txt
978 if [ "${ret}" -eq 0 ]; then
982 while read -u 9 hash; do
984 pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt)
986 if [ ${pass_only} -eq 1 ]; then
989 search="${hash}:${pass}"
992 echo "${output}" | grep -F "${search}" &> /dev/null
994 if [ "${?}" -ne 0 ]; then
1004 done 9< ${OUTD}/${hash_type}_multihash_bruteforce.txt
1012 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
1016 elif [ "${e_to}" -ne 0 ]; then
1022 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 3, Mode multi, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout
"
1031 if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then
1038 if [ ${MODE} -ne 1 ]; then
1045 echo "> Testing
hash type $hash_type with attack mode
6, markov
${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
1051 if [ "${hash_type}" -eq 2500 ]; then
1057 while read -u 9 hash; do
1059 if [ "${i}" -gt 6 ]; then
1061 if ! contains
${hash_type} ${TIMEOUT_ALGOS}; then
1069 if [ $i -gt 1 ]; then
1071 if [ "${file_only}" -eq 1 ]; then
1073 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
1074 echo ${hash} | base64
-d > ${temp_file}
1079 CMD
="./${BIN} ${OPTS} -a 6 -m ${hash_type} '${hash}' ${OUTD}/${hash_type}_dict1 ${mask_6[$i]}"
1081 echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt
1083 output
=$
(.
/${BIN} ${OPTS} -a 6 -m ${hash_type} "${hash}" ${OUTD}/${hash_type}_dict1 ${mask_6[$i]} 2>&1)
1087 echo "${output}" >> ${OUTD}/logfull.txt
1089 if [ "${ret}" -eq 0 ]; then
1093 line_dict1
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1
)
1094 line_dict2
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2
)
1096 if [ ${pass_only} -eq 1 ]; then
1097 search
=":${line_dict1}${line_dict2}"
1099 search
="${hash}:${line_dict1}${line_dict2}"
1102 echo "${output}" |
grep -F "${search}" &> /dev
/null
1104 if [ "${?}" -ne 0 ]; then
1116 if [ "${i}" -eq ${max} ]; then break; fi
1120 done 9< ${OUTD}/${hash_type}_hashes.txt
1124 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
1128 elif [ "${e_to}" -ne 0 ]; then
1134 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 6, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout"
1139 if [ ${MODE} -ne 0 ]; then
1148 if [ ${hash_type} -eq 2500 ]; then
1150 elif [ ${hash_type} -eq 3000 ]; then
1152 elif [ ${hash_type} -eq 7700 ]; then
1154 elif [ ${hash_type} -eq 8500 ]; then
1158 if ! contains
${hash_type} ${TIMEOUT_ALGOS}; then
1162 if [ "${hash_type}" -eq 3200 ]; then
1170 for ((i
= 2; i
< ${max}; i
++)); do
1172 hash_file
=${OUTD}/${hash_type}_hashes_multi_${i}.txt
1174 # if file_only -> decode all base64 "hashes" and put them in the temporary file
1176 if [ "${file_only}" -eq 1 ]; then
1178 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
1181 hash_file
=${temp_file}
1183 while read base64_hash
; do
1185 echo -n ${base64_hash} | base64
-d >> ${temp_file}
1187 done < ${OUTD}/${hash_type}_hashes_multi_${i}.txt
1191 CMD
="./${BIN} ${OPTS} -a 6 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1_multi_${i} ${mask_6[$i]}"
1193 echo "> Testing hash type $hash_type with attack mode 6, markov ${MARKOV}, multi hash with word len ${i}." &>> ${OUTD}/logfull.txt
1195 output=$(./${BIN} ${OPTS} -a 6 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1_multi_${i} ${mask_6[$i]} 2>&1)
1199 echo "${output}" >> ${OUTD}/logfull.txt
1201 if [ "${ret}" -eq 0 ]; then
1205 while read -u 9 hash; do
1207 line_dict1=$(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i})
1208 line_dict2=$(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i})
1210 if [ ${pass_only} -eq 1 ]; then
1211 search=":${line_dict1}${line_dict2}"
1213 search="${hash}:${line_dict1}${line_dict2}"
1216 echo "${output}" | grep -F "${search}" &> /dev/null
1218 if [ "${?}" -ne 0 ]; then
1228 done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt
1238 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
1242 elif [ "${e_to}" -ne 0 ]; then
1248 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 6, Mode multi, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout
"
1257 if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then
1264 if [ ${MODE} -ne 1 ]; then
1271 echo "> Testing
hash type $hash_type with attack mode
7, markov
${MARKOV}, single hash, Device-Type ${TYPE}, vector-width ${VECTOR}." &>> ${OUTD}/logfull.txt
1275 if [ "${hash_type}" -eq 2500 ]; then
1283 while read -u 9 hash; do
1285 if [ $i -gt 1 ]; then
1287 if [ "${file_only}" -eq 1 ]; then
1289 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
1290 echo ${hash} | base64
-d > ${temp_file}
1297 # adjust mask if needed
1299 if [ "${hash_type}" -eq 2500 ]; then
1303 pass_part_1
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1
)
1304 pass_part_2
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2
)
1306 pass_part_2_len
=${#pass_part_2}
1308 pass
=${pass_part_1}${pass_part_2}
1311 # add first x chars of password to mask and append the (old) mask
1314 mask_len
=$
((mask_len
/ 2))
1316 mask_prefix
=$
(echo ${pass} | cut -b -$((pass_len - ${mask_len} - ${pass_part_2_len})))
1317 mask
=${mask_prefix}${mask}
1321 CMD
="./${BIN} ${OPTS} -a 7 -m ${hash_type} '${hash}' ${mask} ${OUTD}/${hash_type}_dict2"
1323 echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt
1325 output
=$
(.
/${BIN} ${OPTS} -a 7 -m ${hash_type} "${hash}" ${mask} ${OUTD}/${hash_type}_dict2
2>&1)
1329 echo "${output}" >> ${OUTD}/logfull.txt
1331 if [ "${ret}" -eq 0 ]; then
1335 line_dict1
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1
)
1336 line_dict2
=$
(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2
)
1338 if [ ${pass_only} -eq 1 ]; then
1339 search
=":${line_dict1}${line_dict2}"
1341 search
="${hash}:${line_dict1}${line_dict2}"
1344 echo "${output}" |
grep -F "${search}" &> /dev
/null
1346 if [ "${?}" -ne 0 ]; then
1358 if [ $i -eq ${max} ]; then break; fi
1362 done 9< ${OUTD}/${hash_type}_hashes.txt
1366 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
1370 elif [ "${e_to}" -ne 0 ]; then
1376 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 7, Mode single, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout"
1381 if [ ${MODE} -ne 0 ]; then
1390 if [ ${hash_type} -eq 2500 ]; then
1392 elif [ ${hash_type} -eq 3000 ]; then
1394 elif [ ${hash_type} -eq 7700 ]; then
1396 elif [ ${hash_type} -eq 8500 ]; then
1400 if ! contains
${hash_type} ${TIMEOUT_ALGOS}; then
1404 if [ "${hash_type}" -eq 3200 ]; then
1412 for ((i
= 2; i
< ${max}; i
++)); do
1414 hash_file
=${OUTD}/${hash_type}_hashes_multi_${i}.txt
1415 dict_file
=${OUTD}/${hash_type}_dict2_multi_${i}
1419 # if file_only -> decode all base64 "hashes" and put them in the temporary file
1421 if [ "${file_only}" -eq 1 ]; then
1423 temp_file
="${OUTD}/${hash_type}_filebased_only_temp.txt"
1426 hash_file
=${temp_file}
1428 while read base64_hash
; do
1430 echo -n ${base64_hash} | base64
-d >> ${temp_file}
1432 done < ${OUTD}/${hash_type}_hashes_multi_${i}.txt
1434 # a little hack: since we don't want to have a very large mask (and wpa has minimum length of 8),
1435 # we need to create a temporary dict file on-the-fly and use it like this: [small mask] [long(er) words in dict]
1437 dict_file
=${OUTD}/${hash_type}_dict2_multi_${i}_longer
1441 mask_len
=$
((mask_len
/ 2))
1445 while read -u 9 hash; do
1447 pass_part_1
=$
(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i})
1448 pass_part_2
=$
(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i})
1450 pass
="${pass_part_1}${pass_part_2}"
1452 pass_suffix
=$
(echo "${pass}" | cut
-b $
((mask_len
+ 1))-)
1454 echo "${pass_suffix}" >> ${dict_file}
1458 done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt
1462 CMD
="./${BIN} ${OPTS} -a 7 -m ${hash_type} ${hash_file} ${mask} ${dict_file}"
1464 echo "> Testing hash type $hash_type with attack mode 7, markov ${MARKOV}, multi hash with word len ${i}." &>> ${OUTD}/logfull.txt
1466 output=$(./${BIN} ${OPTS} -a 7 -m ${hash_type} ${hash_file} ${mask} ${dict_file} 2>&1)
1470 echo "${output}" >> ${OUTD}/logfull.txt
1472 if [ "${ret}" -eq 0 ]; then
1476 while read -u 9 hash; do
1478 line_dict1=$(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i})
1479 line_dict2=$(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i})
1481 if [ ${pass_only} -eq 1 ]; then
1482 search=":${line_dict1}${line_dict2}"
1484 search="${hash}:${line_dict1}${line_dict2}"
1487 echo "${output}" | grep -F "${search}" &> /dev/null
1489 if [ "${?}" -ne 0 ]; then
1499 done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt
1509 if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then
1513 elif [ "${e_to}" -ne 0 ]; then
1519 echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 7, Mode multi, Device-Type ${TYPE}, Vector-Width ${VECTOR} ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout
"
1527 > Usage : ${0} <options>
1531 -V OpenCL vector-width (either 1, 2, 4 or 8), overrides value from device query :
1532 '1' => vector-width 1
1533 '2' => vector-width 2 (default)
1534 '4' => vector-width 4
1535 '8' => vector-width 8
1537 -T OpenCL device-types to use :
1538 'gpu' => gpu devices (default)
1539 'cpu' => cpu devices
1540 'all' => gpu and cpu devices
1542 -t Select test mode :
1543 'single' => single hash (default)
1544 'multi' => multi hash
1545 'all' => single and multi hash
1547 -m Select hash type :
1548 'all' => all hash type supported
1549 (int) => hash type integer code (default : 0)
1551 -a Select attack mode :
1552 'all' => all attack modes
1553 (int) => attack mode integer code (default : 0)
1555 -x Select cpu architecture :
1556 '32' => 32 bit architecture
1557 '64' => 64 bit architecture (default)
1559 -o Select operating system :
1560 'win' => windows operating system (use .exe file extension etc)
1561 'linux' => *nix based operating systems (.bin for binaries)
1562 'osx' => mac osx operating systems (.app for binaries)
1564 -c Disables markov-chains
1566 -p Package the tests into a .7z file
1568 -d Use this folder as input/output folder for packaged tests
1569 (string) => path to folder
1587 while getopts "V
:T
:t
:m
:a
:b
:hcpd
:x
:o
:" opt; do
1591 if [ ${OPTARG} == "1" ]; then
1592 OPTS="${OPTS} --opencl-vector-width 1"
1594 elif [ ${OPTARG} == "2" ]; then
1595 OPTS="${OPTS} --opencl-vector-width 2"
1597 elif [ ${OPTARG} == "4" ]; then
1598 OPTS="${OPTS} --opencl-vector-width 4"
1600 elif [ ${OPTARG} == "8" ]; then
1601 OPTS="${OPTS} --opencl-vector-width 8"
1603 elif [ ${OPTARG} == "all
" ]; then
1611 if [ ${OPTARG} == "gpu
" ]; then
1612 OPTS="${OPTS} --opencl-device-types 2"
1614 elif [ ${OPTARG} == "cpu
" ]; then
1615 OPTS="${OPTS} --opencl-device-types 1"
1617 elif [ ${OPTARG} == "all
" ]; then
1618 OPTS="${OPTS} --opencl-device-types 1,2"
1626 if [ ${OPTARG} == "single
" ]; then
1628 elif [ ${OPTARG} == "multi
" ]; then
1630 elif [ ${OPTARG} == "all
" ]; then
1638 if [ ${OPTARG} == "all
" ]; then
1646 if [ ${OPTARG} == "all
" ]; then
1648 elif [ ${OPTARG} == "0" ]; then
1650 elif [ ${OPTARG} == "1" ]; then
1652 elif [ ${OPTARG} == "3" ]; then
1654 elif [ ${OPTARG} == "6" ]; then
1656 elif [ ${OPTARG} == "7" ]; then
1664 OPTS="${OPTS} --markov-disable"
1669 PACKAGE_FOLDER=$( echo ${OPTARG} | sed 's!/$!!g' )
1677 if [ ${OPTARG} == "32" ]; then
1679 elif [ ${OPTARG} == "64" ]; then
1687 if [ ${OPTARG} == "win
" ]; then
1689 elif [ ${OPTARG} == "linux
" ]; then
1691 elif [ ${OPTARG} == "osx
" ]; then
1709 if [ "${VECTOR}" == "0" ]; then
1711 OPTS="${OPTS} --opencl-vector-width 2"
1714 if [ "${TYPE}" == "null
" ]; then
1716 OPTS="${OPTS} --opencl-device-types 2"
1719 if [ -n "${ARCHITECTURE}" ]; then
1721 BIN="${BIN}${ARCHITECTURE}"
1725 if [ -n "${EXTENSION}" ]; then
1727 BIN="${BIN}.
${EXTENSION}"
1731 if [ -n "${PACKAGE_FOLDER}" ]; then
1733 if [ ! -e "${PACKAGE_FOLDER}" ]; then
1734 echo "! folder
'${PACKAGE_FOLDER}' does not exist
"
1740 if [ "${PACKAGE}" -eq 0 -o -z "${PACKAGE_FOLDER}" ]; then
1742 # check existence of binary
1743 if [ ! -e "${BIN}" ]; then
1744 echo "! ${BIN} not found
, please build binary before run
test.
"
1748 # filter by hash_type
1749 if [ ${HT} -ne 65535 ]; then
1753 for hash_type in $(echo ${HASH_TYPES}); do
1755 if [ ${HT} -ne ${hash_type} ]; then continue; fi
1763 if [ ${check} -ne 1 ]; then
1764 echo "! invalid
hash type selected ...
"
1770 if [ -z "${PACKAGE_FOLDER}" ]; then
1775 # generate random test entry
1776 if [ ${HT} -eq 65535 ]; then
1777 perl tools/test.pl single > ${OUTD}/all.sh
1779 perl tools/test.pl single ${HT} > ${OUTD}/all.sh
1784 OUTD=${PACKAGE_FOLDER}
1788 rm -rf ${OUTD}/logfull.txt && touch ${OUTD}/logfull.txt
1790 # populate array of hash types where we only should check if pass is in output (not both hash:pass)
1791 IFS=';' read -ra PASS_ONLY <<< "${MATCH_PASS_ONLY}"
1792 IFS=';' read -ra TIMEOUT_ALGOS <<< "${SLOW_ALGOS}"
1794 IFS=';' read -ra NEVER_CRACK_ALGOS <<< "${NEVER_CRACK}"
1796 # for these particular algos we need to save the output to a temporary file
1797 IFS=';' read -ra FILE_BASED_ALGOS <<< "${HASHFILE_ONLY}"
1799 for hash_type in $(echo $HASH_TYPES); do
1801 if [[ ${HT} -ne 65535 ]] && [[ ${HT} -ne ${hash_type} ]]; then continue; fi
1803 if [ -z "${PACKAGE_FOLDER}" ]; then
1810 echo "[ ${OUTD} ] > Run packaged
test for hash type $hash_type.
"
1814 if [ "${PACKAGE}" -eq 0 ]; then
1816 # should we check only the pass?
1817 contains ${hash_type} ${PASS_ONLY}
1820 contains ${hash_type} ${SLOW_ALGOS}
1823 if [[ ${hash_type} -eq 400 ]]; then
1824 # we use phpass as slow hash for testing the AMP kernel
1829 VECTOR_OLD=${VECTOR}
1830 for CUR_WIDTH in $(echo $VECTOR_WIDTHS); do
1832 if [ "${VECTOR_OLD}" == "all" ] || [ "${VECTOR_OLD}" == "${CUR_WIDTH}" ]; then
1835 OPTS="${OPTS_OLD} --opencl-vector-width ${VECTOR}"
1837 if [[ ${IS_SLOW} -eq 1 ]]; then
1839 # run attack mode 0 (stdin)
1840 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 0 ]]; then attack_0; fi
1844 # run attack mode 0 (stdin)
1845 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 0 ]]; then attack_0; fi
1847 # run attack mode 1 (combinator)
1848 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 1 ]]; then attack_1; fi
1850 # run attack mode 3 (bruteforce)
1851 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 3 ]]; then attack_3; fi
1853 # run attack mode 6 (dict+mask)
1854 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 6 ]]; then attack_6; fi
1856 # run attack mode 7 (mask+dict)
1857 if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 7 ]]; then attack_7; fi
1867 OUTD=${PACKAGE_FOLDER}
1872 if [ "${PACKAGE}" -eq 0 ]; then
1874 cat -A ${OUTD}/logfull.txt | sed -e 's/\^M \^M//g' | sed -e 's/\$$//g' > ${OUTD}/test_report.log
1878 rm -rf ${OUTD}/logfull.txt
1880 if [ "${PACKAGE}" -eq 1 ]; then
1882 echo "[ ${OUTD} ] > Generate package ${OUTD}/${OUTD}.7z
"
1884 cp "${BASH_SOURCE[0]}" ${OUTD}/test.sh
1886 # if we package from a given folder, we need to check if e.g. the files needed for multi mode are there
1888 if [ -n "${PACKAGE_FOLDER}" ]; then
1892 ls "${PACKAGE_FOLDER}"/*multi* &> /dev/null
1901 HT=$(grep -o -- "-m *[0-9]*" ${PACKAGE_FOLDER}/all.sh | sort -u | sed 's/-m //' 2> /dev/null)
1903 if [ -n "${HT}" ]; then
1905 HT_COUNT=$(echo "${HT}" | wc -l)
1907 if [ "${HT_COUNT}" -gt 1 ]; then
1915 #ATTACK=65535 # more appropriate ?
1918 # for convenience: 'run package' is default action for packaged test.sh ( + add other defaults too )
1920 sed -i -e 's/^\(PACKAGE_FOLDER\)=""/\1="$
( echo "${BASH_SOURCE[0]}" |
sed \"s
!test.sh
\\$
!!\" )"/' \
1921 -e "s
/^\
(HT\
)=0/\
1=${HT}/" \
1922 -e "s
/^\
(MODE\
)=0/\
1=${MODE}/" \
1923 -e "s
/^\
(ATTACK\
)=0/\
1=${ATTACK}/" \
1926 ${PACKAGE_CMD} ${OUTD}/${OUTD}.7z ${OUTD}/ &> /dev/null