pasta_scripts

some useful scripts
git clone https://git.pastanoggin.com/pasta_scripts.git
Log | Files | Refs | README | LICENSE

badphrase (2002B)


      1 #!/bin/sh
      2 # badphrase: generate passphrases or something lol
      3 # diceware example: ./badphrase -dvl /tmp/diceware.wordlist.asc -w 10
      4 # yay!
      5 set -e
      6 
      7 charmin=0
      8 charmax=0
      9 copy=0
     10 diceware=0
     11 entropymin=128
     12 includenames=0
     13 verbose=0
     14 wordlist=/usr/share/dict/words
     15 wordnum=8
     16 
     17 usage() {
     18 	echo "usage: ${0##*/} [-cdhiv] [-e entropymin] [-l wordlist] [-m charmax] \
     19 [-n charmin] [-w wordnum]" 1>&2
     20 }
     21 
     22 while getopts cde:hil:m:n:vw: arg; do
     23 	case $arg in
     24 	c)	copy=1;;
     25 	d)	diceware=1;;
     26 	e)	entropymin=${OPTARG};;
     27 	h)	usage; exit;;
     28 	i)	includenames=1;;
     29 	l)	wordlist=${OPTARG};;
     30 	m)	charmax=${OPTARG};;
     31 	n)	charmin=${OPTARG};;
     32 	v)	verbose=1;;
     33 	w)	wordnum=${OPTARG};;
     34 	?)	usage; exit 1;;
     35 	esac
     36 done
     37 shift $((OPTIND - 1))
     38 
     39 # setup regex
     40 if [ "$includenames" -eq 1 ]; then
     41 	re_class='.'
     42 else
     43 	re_class='^[^A-Z]'
     44 fi
     45 [ "$charmin" -lt 0 ] && charmin=0
     46 [ "$charmax" -le 0 ] && charmax=''
     47 
     48 # password generation pipeline
     49 
     50 # extract 2nd column if we're on a diceware list
     51 awk -v diceware="$diceware" 'BEGIN {
     52 	if (diceware)
     53 		rec = 2
     54 	else
     55 		rec = 1
     56 }
     57 { print $rec }' "$wordlist" | \
     58 # filter and shuffle the wordlist
     59 grep -x "${re_class}\{${charmin},${charmax}\}" | sort -R | \
     60 # test entropy against $entropymin and if that worked print first $wordnum lines
     61 { awk -v prog="${0##*/}" -v entropymin="$entropymin" -v wordnum="$wordnum" -v \
     62 verbose="$verbose" 'NR <= wordnum { line[NR] = $0 }
     63 END {
     64 	perms = NR
     65 	# show entropy
     66 	entropy = log(perms^wordnum) / log(2)
     67 	if (verbose)
     68 		printf("log2(%d^%d) = %.2f bits of entropy\n", perms, wordnum, \
     69 			entropy) >"/dev/stderr"
     70 	# stop if we dont satisfy entropy requirements
     71 	lengthmin = log(2^entropymin) / log(perms)
     72 	if (wordnum < lengthmin) {
     73 		printf("%s: wordnum needs to be >= %.2f so that entropy would be \
     74 			>= %d\n",  prog, lengthmin, entropymin) >"/dev/stderr"
     75 		exit 1
     76 	} else {
     77 		for (i = 1; i < wordnum; i++)
     78 			print line[i]
     79 	}
     80 }' || exit 1; }  | \
     81 # output passphrase
     82 if [ "$copy" -eq 1 ]; then
     83 	paste -sd '' - | xclip -selection clipboard
     84 else
     85 	paste -sd ' ' -
     86 fi