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