#!/bin/bash
DIGITS=6
ALGORITHM=SHA1
PERIOD=30
SECRET=
test -n "$1" || exit 1
SEARCH="$(echo "$1" | sed -e '
s:%:%25:g
s: :%20:g
s:<:%3C:g
s:>:%3E:g
s:#:%23:g
s:{:%7B:g
s:}:%7D:g
s:|:%7C:g
s:\\:%5C:g
s:\^:%5E:g
s:~:%7E:g
s:\[:%5B:g
s:\]:%5D:g
s:`:%60:g
s:;:%3B:g
s:/:%2F:g
s:?:%3F:g
s^:^%3A^g
s:@:%40:g
s:=:%3D:g
s:&:%26:g
s:\$:%24:g
s:\!:%21:g
s:\*:%2A:g
s:\.:\\.:g
')"
while IFS="=" read key value; do
case "$key" in
digits)
DIGITS="$value"
;;
algorithm)
ALGORITHM="$value"
;;
period)
PERIOD="$value"
;;
secret)
SECRET="$value"
;;
esac
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')
if test -z "$SECRET"; then
notify-send "No key found for \"$1\" or decryption failed"
else
oathtool --base32 --totp="$ALGORITHM" -d "$DIGITS" -s "$PERIOD"s - <<FOO | tr -d '\n' | xclip -selection clipboard
$SECRET
FOO
fi