inz

totp.bash (raw)

  1. #!/bin/bash
  2.  
  3. DIGITS=6
  4. ALGORITHM=SHA1
  5. PERIOD=30
  6. SECRET=
  7.  
  8. test -n "$1" || exit 1
  9. SEARCH="$(echo "$1" | sed -e '
  10. s:%:%25:g
  11. s: :%20:g
  12. s:<:%3C:g
  13. s:>:%3E:g
  14. s:#:%23:g
  15. s:{:%7B:g
  16. s:}:%7D:g
  17. s:|:%7C:g
  18. s:\\:%5C:g
  19. s:\^:%5E:g
  20. s:~:%7E:g
  21. s:\[:%5B:g
  22. s:\]:%5D:g
  23. s:`:%60:g
  24. s:;:%3B:g
  25. s:/:%2F:g
  26. s:?:%3F:g
  27. s^:^%3A^g
  28. s:@:%40:g
  29. s:=:%3D:g
  30. s:&:%26:g
  31. s:\$:%24:g
  32. s:\!:%21:g
  33. s:\*:%2A:g
  34.  
  35. s:\.:\\.:g
  36. ')"
  37. while IFS="=" read key value; do
  38. case "$key" in
  39. digits)
  40. DIGITS="$value"
  41. ;;
  42. algorithm)
  43. ALGORITHM="$value"
  44. ;;
  45. period)
  46. PERIOD="$value"
  47. ;;
  48. secret)
  49. SECRET="$value"
  50. ;;
  51. esac
  52. done < <(openssl aes256 -kfile <(dmenu -p 'Enter passphrase: ' -sb '#000000' -sf '#c6f24b' -nb '#000000' -nf '#000000' </dev/null) -in "$HOME/.local/share/totp/keys.txt.encrypt" -d | grep "$SEARCH" | head -1 | cut -d'?' -f2 | tr '&' '\n')
  53.  
  54. if test -z "$SECRET"; then
  55. notify-send "No key found for \"$1\" or decryption failed"
  56. else
  57. oathtool --base32 --totp="$ALGORITHM" -d "$DIGITS" -s "$PERIOD"s - <<FOO | tr -d '\n' | xclip -selection clipboard
  58. $SECRET
  59. FOO
  60. fi
  61.