tomb

the crypto undertaker
git clone git://parazyd.org/tomb.git
Log | Files | Refs | README | LICENSE

commit b425f82f99160200f7141c981dd5cc916011b7a2
parent 4a04d9dd84a7e49774543db4aedee30a6fa788ef
Author: Jaromil <jaromil@dyne.org>
Date:   Mon, 21 Jul 2014 20:06:07 +0200

Merge pull request #114 from gdrooid/master

Indent everything with spaces
Diffstat:
Mtomb | 1699+++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 849 insertions(+), 850 deletions(-)

diff --git a/tomb b/tomb @@ -99,22 +99,22 @@ safe_dir() { # every 5 seconds (e.g., ext3) local -i tries while (( $tries < 3 )) ; do - tries+=1 - if _have_shm; then - _verbose "safe_dir creating $1 dir in RAM." - if (( $MKTEMP )); then - mktemp -d /dev/shm/tomb.$1.$$.XXXXXXX - else - dir="/dev/shm/tomb.$1.$$.$RANDOM$RANDOM" - mkdir -m 0700 -p "$dir" - print "$dir" - fi - return 0 - else - _warning "WARNING: we cannot ensure we're running in RAM." + tries+=1 + if _have_shm; then + _verbose "safe_dir creating $1 dir in RAM." + if (( $MKTEMP )); then + mktemp -d /dev/shm/tomb.$1.$$.XXXXXXX + else + dir="/dev/shm/tomb.$1.$$.$RANDOM$RANDOM" + mkdir -m 0700 -p "$dir" + print "$dir" + fi + return 0 + else + _warning "WARNING: we cannot ensure we're running in RAM." _verbose "Wait a bit before retrying... (attempt $tries)." - sync && sleep 0.5 - fi + sync && sleep 0.5 + fi done _warning "WARNING: no RAM available for me to run safely." return 1 @@ -124,8 +124,8 @@ safe_dir() { safe_filename() { _have_shm || _failure "No access to shared memory on this system, sorry." (( $MKTEMP )) && \ - mktemp -u /dev/shm/tomb.$1.$$.XXXXXXX || \ - print "/dev/shm/tomb.$1.$$.$RANDOM$RANDOM" + mktemp -u /dev/shm/tomb.$1.$$.XXXXXXX || \ + print "/dev/shm/tomb.$1.$$.$RANDOM$RANDOM" } # Check if swap is activated @@ -138,41 +138,41 @@ check_swap() { # If any of the swaps is not encrypted, we bail out and return 1. ret=1 for s in $=swaps; do - bone=`sudo file $s` - if `echo "$bone" | grep 'swap file' &>/dev/null`; then - # It's a regular (unencrypted) swap file - ret=1 - break + bone=`sudo file $s` + if `echo "$bone" | grep 'swap file' &>/dev/null`; then + # It's a regular (unencrypted) swap file + ret=1 + break elif `echo "$bone" | grep 'symbolic link' &>/dev/null`; then - # Might link to a block - ret=1 - if [ "/dev/mapper" = "${s%/*}" ]; then - is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'` - if [ "crypt" = "$is_crypt" ]; then - ret=2 - fi - else - break - fi - elif `echo "$bone" | grep 'block special' &>/dev/null`; then - # Is a block - ret=1 + # Might link to a block + ret=1 + if [ "/dev/mapper" = "${s%/*}" ]; then + is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'` + if [ "crypt" = "$is_crypt" ]; then + ret=2 + fi + else + break + fi + elif `echo "$bone" | grep 'block special' &>/dev/null`; then + # Is a block + ret=1 is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'` - if [ "crypt" = "$is_crypt" ]; then - ret=2 - else - break - fi - fi + if [ "crypt" = "$is_crypt" ]; then + ret=2 + else + break + fi + fi done _warning "An active swap partition is detected, this poses security risks." if [[ $ret -eq 2 ]]; then - _success "All your swaps are belong to crypt. Good." + _success "All your swaps are belong to crypt. Good." else - _warning "You can deactivate all swap partitions using the command:" - _warning " swapoff -a" - _warning "But if you want to proceed like this, use the -f (force) flag." - _failure "Operation aborted." + _warning "You can deactivate all swap partitions using the command:" + _warning " swapoff -a" + _warning "But if you want to proceed like this, use the -f (force) flag." + _failure "Operation aborted." fi return $ret } @@ -181,15 +181,15 @@ check_swap() { # possible data leaks to disk if swap is on, and not to be ignored _check_swap() { if ! option_is_set -f && ! option_is_set --ignore-swap; then - check_swap - case $? in - 0|2) # No, or encrypted swap - return 0 - ;; - *) # Unencrypted swap - return 1 - ;; - esac + check_swap + case $? in + 0|2) # No, or encrypted swap + return 0 + ;; + *) # Unencrypted swap + return 1 + ;; + esac fi } @@ -202,9 +202,9 @@ ask_password() { # pinentry has no custom icon setting # so we need to temporary modify the gtk theme if [ -r /usr/local/share/themes/tomb/gtk-2.0-key/gtkrc ]; then - GTK2_RC=/usr/local/share/themes/tomb/gtk-2.0-key/gtkrc + GTK2_RC=/usr/local/share/themes/tomb/gtk-2.0-key/gtkrc elif [ -r /usr/share/themes/tomb/gtk-2.0-key/gtkrc ]; then - GTK2_RC=/usr/share/themes/tomb/gtk-2.0-key/gtkrc + GTK2_RC=/usr/share/themes/tomb/gtk-2.0-key/gtkrc fi title="Insert tomb password." @@ -219,7 +219,7 @@ SETPROMPT Password: GETPIN EOF` if [[ `tail -n1 <<<$output` =~ ERR ]]; then - return 1 + return 1 fi head -n1 <<<$output | awk '/^D / { sub(/^D /, ""); print }' return 0 @@ -228,8 +228,8 @@ EOF` # Drop privileges exec_as_user() { if ! [ $SUDO_USER ]; then - exec $@[@] - return $? + exec $@[@] + return $? fi _verbose "exec_as_user '$SUDO_USER': ${(f)@}" sudo -u $SUDO_USER "${@[@]}" @@ -241,13 +241,13 @@ check_priv() { # save original user username=$USER if [ $UID != 0 ]; then - _verbose "Using sudo for root execution of '${TOMBEXEC} ${(f)OLDARGS}'." - # check if sudo has a timestamp active - sudok=false + _verbose "Using sudo for root execution of '${TOMBEXEC} ${(f)OLDARGS}'." + # check if sudo has a timestamp active + sudok=false - if ! option_is_set --sudo-pwd; then - if [ $? != 0 ]; then # if not then ask a password - cat <<EOF | pinentry 2>/dev/null | awk '/^D / { sub(/^D /, ""); print }' | sudo -S -v + if ! option_is_set --sudo-pwd; then + if [ $? != 0 ]; then # if not then ask a password + cat <<EOF | pinentry 2>/dev/null | awk '/^D / { sub(/^D /, ""); print }' | sudo -S -v OPTION ttyname=$TTY OPTION lc-ctype=$LANG SETTITLE Super user privileges required @@ -255,22 +255,22 @@ SETDESC Sudo execution of Tomb ${OLDARGS[@]} SETPROMPT Insert your USER password: GETPIN EOF - fi - else - _verbose "Escalating privileges using sudo-pwd." - sudo -S -v <<<`option_value --sudo-pwd` - fi - sudo "${TOMBEXEC}" -U ${UID} -G ${GID} -T ${TTY} "${(@)OLDARGS}" - exit $? + fi + else + _verbose "Escalating privileges using sudo-pwd." + sudo -S -v <<<`option_value --sudo-pwd` + fi + sudo "${TOMBEXEC}" -U ${UID} -G ${GID} -T ${TTY} "${(@)OLDARGS}" + exit $? fi # are we root already # check if we have support for loop mounting losetup -f > /dev/null { test "$?" = "0" } || { - _warning "Loop mount of volumes is not supported on this machine, this error" - _warning "often occurs on VPS and kernels that don't provide the loop module." - _warning "It is impossible to use Tomb on this machine at this conditions." - _failure "Operation aborted." + _warning "Loop mount of volumes is not supported on this machine, this error" + _warning "often occurs on VPS and kernels that don't provide the loop module." + _warning "It is impossible to use Tomb on this machine at this conditions." + _failure "Operation aborted." } # make sure necessary kernel modules are loaded @@ -285,22 +285,22 @@ is_valid_tomb() { _verbose "is_valid_tomb $1" # argument check { test "$1" = "" } && { - _warning "Tomb file is missing from arguments."; return 1 } + _warning "Tomb file is missing from arguments."; return 1 } # file checks { test -r "$1" } || { - _warning "Tomb file not found: $1"; return 1 } + _warning "Tomb file not found: $1"; return 1 } { test -f "$1" } || { - _warning "Tomb file is not a regular file: $1"; return 1 } + _warning "Tomb file is not a regular file: $1"; return 1 } # check file type (if its a Luks fs) file "$1" | grep -i 'luks encrypted file' >/dev/null { test $? = 0 } || { - _warning "File is not a valid tomb: $1"; return 1 } + _warning "File is not a valid tomb: $1"; return 1 } # check if its already open tombfile=`basename $1` tombname=${tombfile%%\.*} mount -l | grep "${tombfile}.*\[$tombname\]$" > /dev/null { test $? = 0 } && { - _warning "Tomb is currently in use: $tombname"; return 1 } + _warning "Tomb is currently in use: $tombname"; return 1 } _message "Valid tomb file found: $1" return 0 } @@ -330,7 +330,7 @@ Commands: slam slam a TOMB killing all programs using it EOF if [ "$RESIZER" = 1 ]; then - cat <<EOF + cat <<EOF resize resize a TOMB to a new size -s (can only grow) EOF fi @@ -342,13 +342,13 @@ cat <<EOF EOF { test "$QRENCODE" = "1" } && { - cat <<EOF + cat <<EOF engrave makes a QR code of a KEY to be saved on paper EOF } if [ "$STEGHIDE" = 1 ]; then - cat <<EOF + cat <<EOF bury hide a KEY inside a JPEG image exhume extract a KEY from a JPEG image EOF @@ -364,7 +364,7 @@ Options: -f force operation (i.e. even if swap is active) EOF { test "$KDF" = 1 } && { - cat <<EOF + cat <<EOF --kdf generate passwords armored against dictionary attacks EOF } @@ -391,11 +391,11 @@ option_is_set() { [[ -n ${(k)opts[$1]} ]]; r=$? if [[ $2 == out ]]; then - if [[ $r == 0 ]]; then - echo 'set' - else - echo 'unset' - fi + if [[ $r == 0 ]]; then + echo 'set' + else + echo 'unset' + fi fi return $r; } @@ -414,30 +414,30 @@ function _msg() { local -i returncode case "$1" in - inline) - command+=" -n"; pchars=" > "; pcolor="yellow" - ;; - message) - pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]${2}$reset_color" - ;; - verbose) - pchars="[D]"; pcolor="blue" - ;; - success) - pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]${2}$reset_color" - ;; - warning) - pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]${2}$reset_color" - ;; - failure) - pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]${2}$reset_color" - returncode=1 - ;; - *) - pchars="[F]"; pcolor="red" - message="Developer oops! Usage: _msg MESSAGE_TYPE \"MESSAGE_CONTENT\"" - returncode=127 - ;; + inline) + command+=" -n"; pchars=" > "; pcolor="yellow" + ;; + message) + pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]${2}$reset_color" + ;; + verbose) + pchars="[D]"; pcolor="blue" + ;; + success) + pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]${2}$reset_color" + ;; + warning) + pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]${2}$reset_color" + ;; + failure) + pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]${2}$reset_color" + returncode=1 + ;; + *) + pchars="[F]"; pcolor="red" + message="Developer oops! Usage: _msg MESSAGE_TYPE \"MESSAGE_CONTENT\"" + returncode=127 + ;; esac ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >&2 return $returncode @@ -488,7 +488,7 @@ progress() { # progress create 90 formatting the tomb # progress create 100 tomb created successfully if ! option_is_set --batch; then - return + return fi print "[m][P][$1][$2][$3]" >&2 @@ -498,7 +498,7 @@ progress() { check_bin() { # check for required programs for req in cryptsetup pinentry sudo gpg; do - command -v $req >/dev/null || _failure "Cannot find $req. It's a requirement to use Tomb, please install it." 1 + command -v $req >/dev/null || _failure "Cannot find $req. It's a requirement to use Tomb, please install it." 1 done export PATH=/sbin:/usr/sbin:$PATH @@ -512,8 +512,8 @@ check_bin() { # check for filesystem creation progs command -v mkfs.ext4 > /dev/null && \ - MKFS="mkfs.ext4 -q -F -j -L" || \ - MKFS="mkfs.ext3 -q -F -j -L" + MKFS="mkfs.ext4 -q -F -j -L" || \ + MKFS="mkfs.ext3 -q -F -j -L" # check for mktemp command -v mktemp > /dev/null || MKTEMP=0 @@ -541,43 +541,43 @@ check_bin() { load_key() { # take the name of a tomb file as argument if option_is_set -k ; then - if [[ "`option_value -k`" == "-" ]]; then - _verbose "load_key reading from stdin." - # take key from stdin - tombkeydir=`safe_dir load_key_stdin` # global used to check if key from stdin - _verbose "tempdir is $tombkeydir" - act "Waiting for the key to be piped from stdin... " - cat > ${tombkeydir}/stdin.tmp.key - print ok >&2 - tombdir=${tombkeydir} - tombfile=stdin.tmp.key - tombname="stdin" - elif [[ "`option_value -k`" != "" ]]; then - _verbose "load_key argument: `option_value -k`" - # take key from a file - tombkey=`option_value -k` - tombdir=`dirname $tombkey` - tombfile=`basename $tombkey` - fi + if [[ "`option_value -k`" == "-" ]]; then + _verbose "load_key reading from stdin." + # take key from stdin + tombkeydir=`safe_dir load_key_stdin` # global used to check if key from stdin + _verbose "tempdir is $tombkeydir" + act "Waiting for the key to be piped from stdin... " + cat > ${tombkeydir}/stdin.tmp.key + print ok >&2 + tombdir=${tombkeydir} + tombfile=stdin.tmp.key + tombname="stdin" + elif [[ "`option_value -k`" != "" ]]; then + _verbose "load_key argument: `option_value -k`" + # take key from a file + tombkey=`option_value -k` + tombdir=`dirname $tombkey` + tombfile=`basename $tombkey` + fi else # no -k specified - _failure "This operation requires a key file to be specified using the -k option." - return 1 + _failure "This operation requires a key file to be specified using the -k option." + return 1 fi tombkey=${tombdir}/${tombfile} _verbose "load_key: ${tombkey}" { test -r "${tombkey}" } || { - _warning "Key not found, specify one using -k." - drop_key - return 1 } + _warning "Key not found, specify one using -k." + drop_key + return 1 } # this does a check on the file header if ! is_valid_key ${tombkey}; then - _warning "The key seems invalid, the application/pgp header is missing." - drop_key - return 1 + _warning "The key seems invalid, the application/pgp header is missing." + drop_key + return 1 fi print "$tombkey" return 0 @@ -593,35 +593,35 @@ ask_key_password() { local passok=0 local tombpass="" if [ "$2" = "" ]; then - for c in 1 2 3; do - if [ $c = 1 ]; then - tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to use key: $keyname"` - else - tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to use key: $keyname (retry $c)"` - fi - if [[ $? != 0 ]]; then - _warning "User aborted password dialog." - return 1 - fi - - get_lukskey "$tombpass" "$tombkey" >/dev/null - - if [ $? = 0 ]; then - passok=1; _message "Password OK." - break; - fi - done + for c in 1 2 3; do + if [ $c = 1 ]; then + tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to use key: $keyname"` + else + tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to use key: $keyname (retry $c)"` + fi + if [[ $? != 0 ]]; then + _warning "User aborted password dialog." + return 1 + fi + + get_lukskey "$tombpass" "$tombkey" >/dev/null + + if [ $? = 0 ]; then + passok=1; _message "Password OK." + break; + fi + done else - # if a second argument is present then the password is already known - tombpass="$2" - _verbose "ask_key_password with tombpass: $tombpass" - - get_lukskey "$tombpass" "$tombkey" >/dev/null - - if [ $? = 0 ]; then - passok=1; _message "Password OK."; fi - + # if a second argument is present then the password is already known + tombpass="$2" + _verbose "ask_key_password with tombpass: $tombpass" + + get_lukskey "$tombpass" "$tombkey" >/dev/null + + if [ $? = 0 ]; then + passok=1; _message "Password OK."; fi + fi { test "$passok" = "1" } || { return 1 } @@ -644,40 +644,40 @@ change_passwd() { _success "Changing password for $keyfile" - + if option_is_set --tomb-old-pwd; then - tomb_old_pwd="`option_value --tomb-old-pwd`" - _verbose "--tomb-old-pwd = $tomb_old_pwd" - tombpass=`ask_key_password "$keyfile" "$tomb_old_pwd"` + tomb_old_pwd="`option_value --tomb-old-pwd`" + _verbose "--tomb-old-pwd = $tomb_old_pwd" + tombpass=`ask_key_password "$keyfile" "$tomb_old_pwd"` else - tombpass=`ask_key_password "$keyfile"` + tombpass=`ask_key_password "$keyfile"` fi { test $? = 0 } || { - _failure "No valid password supplied." } + _failure "No valid password supplied." } # danger zone in which the key is written in clear - + get_lukskey "$tombpass" "$keyfile" > "$lukskey" - + drop_key - + if option_is_set --tomb-pwd; then - tomb_new_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_new_pwd" - gen_key "$lukskey" "$tomb_new_pwd" > "$tmpnewkey" + tomb_new_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_new_pwd" + gen_key "$lukskey" "$tomb_new_pwd" > "$tmpnewkey" else - gen_key "$lukskey" > "$tmpnewkey" + gen_key "$lukskey" > "$tmpnewkey" fi - - ${=WIPE} "$lukskey" - + + ${=WIPE} "$lukskey" + if ! is_valid_key "$tmpnewkey"; then - _failure "Error: the newly generated keyfile does not seem valid." + _failure "Error: the newly generated keyfile does not seem valid." else - # copy the new key as the original keyfile name - cp -f "${tmpnewkey}" "${keyfile}" - _success "Your passphrase was successfully updated." + # copy the new key as the original keyfile name + cp -f "${tmpnewkey}" "${keyfile}" + _success "Your passphrase was successfully updated." fi @@ -692,9 +692,9 @@ drop_key() { _verbose "drop_key $tombkey" # delete key if temp stored from stdin if [[ "$tombkey" =~ "/dev/shm/tomb.load_key_stdin" ]]; then - { test -r ${tombkey} } && { - _message "Removing key temporarily stored from stdin" - ${=WIPE} ${tombkey}; rmdir `dirname ${tombkey}` } + { test -r ${tombkey} } && { + _message "Removing key temporarily stored from stdin" + ${=WIPE} ${tombkey}; rmdir `dirname ${tombkey}` } fi } @@ -703,26 +703,26 @@ is_valid_key() { _verbose "is_valid_key $1" # argument check { test "$1" = "" } && { - _warning "Key file is missing from arguments."; return 1 } + _warning "Key file is missing from arguments."; return 1 } # file checks { test -r "$1" } || { - _warning "Key file not found: $1"; return 1 } + _warning "Key file not found: $1"; return 1 } { test -f "$1" } || { - _warning "Key file is not a regular file: $1"; return 1 } + _warning "Key file is not a regular file: $1"; return 1 } # this header validity check is a virtuosism by Hellekin [[ `file =(awk '/^-+BEGIN/,0' $1)` =~ PGP ]] && { - if [ "$tombkeydir" = "" ]; then _message "Valid key file found: $1" + if [ "$tombkeydir" = "" ]; then _message "Valid key file found: $1" else _message "Valid key file passed from stdin"; fi - return 0 } + return 0 } # if no BEGIN header found then we try to recover it [[ `file $1 -bi` =~ text/plain ]] && { - _warning "Key data found with missing headers, attempting recovery." - local tmp_keyfix=`safe_filename keyfix` - touch $tmp_keyfix - # make sure KDF header comes first - local header=`grep '^_KDF_' $1` - print "$header" >> $tmp_keyfix - cat $1 | awk ' + _warning "Key data found with missing headers, attempting recovery." + local tmp_keyfix=`safe_filename keyfix` + touch $tmp_keyfix + # make sure KDF header comes first + local header=`grep '^_KDF_' $1` + print "$header" >> $tmp_keyfix + cat $1 | awk ' BEGIN { print "-----BEGIN PGP MESSAGE-----" print @@ -732,10 +732,10 @@ print END { print "-----END PGP MESSAGE-----" }' >> ${tmp_keyfix} - mv $tmp_keyfix $1 - chown ${_uid}:${_gid} ${1} - chmod 0600 ${1} - return 0 + mv $tmp_keyfix $1 + chown ${_uid}:${_gid} ${1} + chmod 0600 ${1} + return 0 } _warning "Invalid key format: $1" return 1 @@ -752,43 +752,43 @@ get_lukskey() { firstline=`head -n1 $keyfile` _verbose "get_lukskey XXX $keyfile" if [[ $firstline =~ '^_KDF_' ]]; then - _verbose "KDF: `cut -d_ -f 3 <<<$firstline`" - case `cut -d_ -f 3 <<<$firstline` in - pbkdf2sha1) - pbkdf2_param=`cut -d_ -f 4- <<<$firstline | tr '_' ' '` - tombpass=$(tomb-kdb-pbkdf2 ${=pbkdf2_param} 2> /dev/null <<<$tombpass) - ;; - *) - _failure "No suitable program for KDF `cut -f 3 <<<$firstline`." - unset tombpass - return 1 - ;; - esac + _verbose "KDF: `cut -d_ -f 3 <<<$firstline`" + case `cut -d_ -f 3 <<<$firstline` in + pbkdf2sha1) + pbkdf2_param=`cut -d_ -f 4- <<<$firstline | tr '_' ' '` + tombpass=$(tomb-kdb-pbkdf2 ${=pbkdf2_param} 2> /dev/null <<<$tombpass) + ;; + *) + _failure "No suitable program for KDF `cut -f 3 <<<$firstline`." + unset tombpass + return 1 + ;; + esac fi # fix for gpg 1.4.11 where the --status-* options don't work ;^/ gpgver=`gpg --version | awk '/^gpg/ {print $3}'` if [ "$gpgver" = "1.4.11" ]; then - _verbose "GnuPG is version 1.4.11 - adopting status fix." + _verbose "GnuPG is version 1.4.11 - adopting status fix." - print ${tombpass} | \ - gpg --batch --passphrase-fd 0 --no-tty --no-options -d "${keyfile}" - ret=$? - unset tombpass + print ${tombpass} | \ + gpg --batch --passphrase-fd 0 --no-tty --no-options -d "${keyfile}" + ret=$? + unset tombpass else # using status-file in gpg != 1.4.11 - res=`safe_filename lukskey` - { test $? = 0 } || { unset tombpass; _failure "Fatal error creating temp file." } + res=`safe_filename lukskey` + { test $? = 0 } || { unset tombpass; _failure "Fatal error creating temp file." } - print ${tombpass} | \ - gpg --batch --passphrase-fd 0 --no-tty --no-options --status-fd 2 \ - --no-mdc-warning --no-permission-warning --no-secmem-warning \ - -d "${keyfile}" 2> $res + print ${tombpass} | \ + gpg --batch --passphrase-fd 0 --no-tty --no-options --status-fd 2 \ + --no-mdc-warning --no-permission-warning --no-secmem-warning \ + -d "${keyfile}" 2> $res - unset tombpass - grep 'DECRYPTION_OKAY' $res > /dev/null - ret=$?; rm -f $res + unset tombpass + grep 'DECRYPTION_OKAY' $res > /dev/null + ret=$?; rm -f $res fi _verbose "get_lukskey returns $ret" @@ -809,64 +809,64 @@ gen_key() { local tombpasstmp="" local tombpassarg="$2" if [ "$tombpassarg" = "" ]; then - while true; do - # 3 tries to write two times a matching password - tombpass=`exec_as_user ${TOMBEXEC} askpass "Type the new password to secure your key"` - if [[ $? != 0 ]]; then - _failure "User aborted." - fi - if [ -z $tombpass ]; then - _warning "You set empty password, which is not possible." - continue - fi - tombpasstmp=$tombpass - tombpass=`exec_as_user ${TOMBEXEC} askpass "Type the new password to secure your key (again)"` - if [[ $? != 0 ]]; then - _failure "User aborted." - fi - if [ "$tombpasstmp" = "$tombpass" ]; then - break; - fi - unset tombpasstmp - unset tombpass - done + while true; do + # 3 tries to write two times a matching password + tombpass=`exec_as_user ${TOMBEXEC} askpass "Type the new password to secure your key"` + if [[ $? != 0 ]]; then + _failure "User aborted." + fi + if [ -z $tombpass ]; then + _warning "You set empty password, which is not possible." + continue + fi + tombpasstmp=$tombpass + tombpass=`exec_as_user ${TOMBEXEC} askpass "Type the new password to secure your key (again)"` + if [[ $? != 0 ]]; then + _failure "User aborted." + fi + if [ "$tombpasstmp" = "$tombpass" ]; then + break; + fi + unset tombpasstmp + unset tombpass + done else - tombpass="$tombpassarg" - _verbose "gen_key takes tombpass from CLI argument: $tombpass" + tombpass="$tombpassarg" + _verbose "gen_key takes tombpass from CLI argument: $tombpass" fi header="" { test "$KDF" = 1 } && { - { option_is_set --kdf } && { + { option_is_set --kdf } && { # KDF is a new key strenghtening technique against brute forcing # see: https://github.com/dyne/Tomb/issues/82 - itertime="`option_value --kdf`" - # removing support of floating points because they can't be type checked well - if [[ "$itertime" != <-> ]]; then - unset tombpass - unset tombpasstmp - _failure "Wrong argument for --kdf: must be an integer number (iteration seconds)." - fi - # --kdf takes one parameter: iter time (on present machine) in seconds - local -i microseconds - microseconds=$((itertime*10000)) - _success "Using KDF, iterations: $microseconds" - pbkdf2_salt=`tomb-kdb-pbkdf2-gensalt` - pbkdf2_iter=`tomb-kdb-pbkdf2-getiter $microseconds` - # We use a length of 64bytes = 512bits (more than needed!?) - tombpass=`tomb-kdb-pbkdf2 $pbkdf2_salt $pbkdf2_iter 64 <<<"${tombpass}"` - - header="_KDF_pbkdf2sha1_${pbkdf2_salt}_${pbkdf2_iter}_64\n" - } + itertime="`option_value --kdf`" + # removing support of floating points because they can't be type checked well + if [[ "$itertime" != <-> ]]; then + unset tombpass + unset tombpasstmp + _failure "Wrong argument for --kdf: must be an integer number (iteration seconds)." + fi + # --kdf takes one parameter: iter time (on present machine) in seconds + local -i microseconds + microseconds=$((itertime*10000)) + _success "Using KDF, iterations: $microseconds" + pbkdf2_salt=`tomb-kdb-pbkdf2-gensalt` + pbkdf2_iter=`tomb-kdb-pbkdf2-getiter $microseconds` + # We use a length of 64bytes = 512bits (more than needed!?) + tombpass=`tomb-kdb-pbkdf2 $pbkdf2_salt $pbkdf2_iter 64 <<<"${tombpass}"` + + header="_KDF_pbkdf2sha1_${pbkdf2_salt}_${pbkdf2_iter}_64\n" + } } print -n $header print "${tombpass}" \ - | gpg --openpgp --force-mdc --cipher-algo ${algo} \ - --batch --no-options --no-tty --passphrase-fd 0 --status-fd 2 \ - -o - -c -a ${lukskey} + | gpg --openpgp --force-mdc --cipher-algo ${algo} \ + --batch --no-options --no-tty --passphrase-fd 0 --status-fd 2 \ + -o - -c -a ${lukskey} unset tombpass unset tombpasstmp @@ -901,21 +901,21 @@ bury_key() { _warning "Encode failed: $imagefile is not a jpeg image." return 1 fi - + _success "Encoding key $tombkey inside image $imagefile" _message "Please confirm the key password for the encoding" if option_is_set --tomb-pwd; then - tomb_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_pwd" - tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` + tomb_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_pwd" + tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` else - tombpass=`ask_key_password "$tombkey"` + tombpass=`ask_key_password "$tombkey"` fi { test $? = 0 } || { - drop_key - _warning "Wrong password supplied." - _failure "You shall not bury a key whose password is unknown to you." + drop_key + _warning "Wrong password supplied." + _failure "You shall not bury a key whose password is unknown to you." } # we omit armor strings since having them as constants can give @@ -949,28 +949,28 @@ exhume_key() { file $imagefile | grep -i JPEG > /dev/null if [ $? != 0 ]; then - _failure "Encode failed: $imagefile is not a jpeg image." + _failure "Encode failed: $imagefile is not a jpeg image." fi if [[ -e "$tombkey" ]]; then - _warning "File exists: $tombkey" - { option_is_set -f } || { - _warning "Make explicit use of --force to overwrite." - _failure "Refusing to overwrite file. Operation aborted." } - _warning "Use of --force selected: overwriting." - rm -f ${tombkey} + _warning "File exists: $tombkey" + { option_is_set -f } || { + _warning "Make explicit use of --force to overwrite." + _failure "Refusing to overwrite file. Operation aborted." } + _warning "Use of --force selected: overwriting." + rm -f ${tombkey} fi _message "Trying to exhume a key out of image $imagefile" if option_is_set --tomb-pwd; then - tombpass="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tombpass" + tombpass="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tombpass" else - tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to exhume key from $imagefile"` - if [[ $? != 0 ]]; then - _warning "User aborted password dialog." - return 1 - fi + tombpass=`exec_as_user ${TOMBEXEC} askpass "Insert password to exhume key from $imagefile"` + if [[ $? != 0 ]]; then + _warning "User aborted password dialog." + return 1 + fi fi # always steghide required @@ -980,9 +980,9 @@ exhume_key() { unset tombpass if [ $res = 0 ]; then - _success "${tombkey} succesfully decoded." + _success "${tombkey} succesfully decoded." else - _warning "Nothing found in $imagefile" + _warning "Nothing found in $imagefile" fi return $res @@ -1030,8 +1030,8 @@ forge_key() { { option_is_set -k } && { destkey="`option_value -k`" } { test "$destkey" = "" } && { - _warning "A filename needs to be specified using -k to forge a new key." - return 1 } + _warning "A filename needs to be specified using -k to forge a new key." + return 1 } _message "Commanded to forge key $destkey" _check_swap @@ -1039,12 +1039,12 @@ forge_key() { # make sure that gnupg doesn't quits with an error before first run { test -r $HOME/.gnupg/pubring.gpg } || { - mkdir $HOME/.gnupg - touch $HOME/.gnupg/pubring.gpg } + mkdir $HOME/.gnupg + touch $HOME/.gnupg/pubring.gpg } { test -r "$destkey" } && { - _warning "Forging this key would overwrite an existing file. Operation aborted." - _failure "`ls -lh $destkey`" } + _warning "Forging this key would overwrite an existing file. Operation aborted." + _failure "`ls -lh $destkey`" } # create the keyfile in tmpfs so that we leave less traces in RAM local keytmp=`safe_dir forge` @@ -1053,9 +1053,9 @@ forge_key() { mount tmpfs "${keytmp}" -t tmpfs -o size=1m if [ $? != 0 ]; then - _warning "Cannot mount tmpfs filesystem in volatile memory." - rm -r "${keytmp}" - _failure "Operation aborted." + _warning "Cannot mount tmpfs filesystem in volatile memory." + rm -r "${keytmp}" + _failure "Operation aborted." fi local algo @@ -1075,17 +1075,17 @@ forge_key() { chmod 0600 ${keytmp}/tomb.tmp local random_source=/dev/random if option_is_set --use-urandom; then - random_source=/dev/urandom + random_source=/dev/urandom fi _verbose "Data dump using ${DD[1]} from $random_source" ${=DD} bs=1 count=256 if=$random_source of=${keytmp}/tomb.tmp if ! [ -r ${keytmp}/tomb.tmp ]; then - _warning "Cannot generate encryption key." - umount ${keytmp} - rm -r $keytmp - _failure "Operation aborted." + _warning "Cannot generate encryption key." + umount ${keytmp} + rm -r $keytmp + _failure "Operation aborted." fi _success "Choose the password of your key: ${tombkey}" @@ -1097,22 +1097,22 @@ forge_key() { tombname="$tombkey" # the gen_key() function takes care of the new key's encryption if option_is_set --tomb-pwd; then - tomb_new_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_new_pwd" - gen_key "${keytmp}/tomb.tmp" "$tomb_new_pwd" > "$tombkey" + tomb_new_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_new_pwd" + gen_key "${keytmp}/tomb.tmp" "$tomb_new_pwd" > "$tombkey" else - gen_key "${keytmp}/tomb.tmp" > "$tombkey" + gen_key "${keytmp}/tomb.tmp" > "$tombkey" fi # this does a check on the file header if ! is_valid_key ${tombkey}; then - _warning "The key does not seem to be valid." - _warning "Dumping contents to screen:" - cat ${tombkey} - _warning "--" - umount ${keytmp} - rm -r $keytmp - _failure "Operation aborted." + _warning "The key does not seem to be valid." + _warning "Dumping contents to screen:" + cat ${tombkey} + _warning "--" + umount ${keytmp} + rm -r $keytmp + _failure "Operation aborted." fi ${=WIPE} ${keytmp}/tomb.tmp # no need really, but anyway @@ -1132,8 +1132,8 @@ forge_key() { dig_tomb() { _message "Commanded to dig tomb $1" if [ "$1" = "" ]; then - _warning "No tomb name specified for creation." - return 1 + _warning "No tomb name specified for creation." + return 1 fi _check_swap @@ -1154,9 +1154,9 @@ dig_tomb() { [[ $tombsize -lt 10 ]] && _failure "Tombs can't be smaller than 10 megabytes." if [ -e ${tombdir}/${tombfile} ]; then - _warning "A tomb exists already. I'm not digging here:" - _warning " `ls -lh ${tombdir}/${tombfile}`" - return 1 + _warning "A tomb exists already. I'm not digging here:" + _warning " `ls -lh ${tombdir}/${tombfile}`" + return 1 fi _success "Creating a new tomb in ${tombdir}/${tombfile}" @@ -1171,9 +1171,9 @@ dig_tomb() { ${=DD} if=/dev/urandom bs=1048576 count=${tombsize} of=${tombdir}/${tombfile} if [ $? = 0 -a -e ${tombdir}/${tombfile} ]; then - _message " `ls -lh ${tombdir}/${tombfile}`" + _message " `ls -lh ${tombdir}/${tombfile}`" else - _failure "Error creating the tomb ${tombdir}/${tombfile}, operation aborted." + _failure "Error creating the tomb ${tombdir}/${tombfile}, operation aborted." fi _success "Done digging $tombname" @@ -1188,9 +1188,9 @@ dig_tomb() { # it take arguments as the LUKS cipher to be used lock_tomb_with_key() { if ! [ $1 ]; then - _warning "No tomb specified for locking." - _warning "Usage: tomb lock file.tomb file.tomb.key" - return 1 + _warning "No tomb specified for locking." + _warning "Usage: tomb lock file.tomb file.tomb.key" + return 1 fi tombpath="$1" @@ -1201,8 +1201,8 @@ lock_tomb_with_key() { tombname="${tombfile%%\.*}" { test -f ${tombdir}/${tombfile} } || { - _failure "There is no tomb here. You have to it dig first." - return 1 } + _failure "There is no tomb here. You have to it dig first." + return 1 } _verbose "Tomb found: ${tombdir}/${tombfile}" @@ -1214,65 +1214,65 @@ lock_tomb_with_key() { _message "Checking if the tomb is empty (we never step on somebody else's bones)." cryptsetup isLuks ${nstloop} if [ $? = 0 ]; then - # is it a LUKS encrypted nest? then bail out and avoid reformatting it - _warning "The tomb was already locked with another key." - losetup -d ${nstloop} - _failure "Operation aborted. I cannot lock an already locked tomb. Go dig a new one." + # is it a LUKS encrypted nest? then bail out and avoid reformatting it + _warning "The tomb was already locked with another key." + losetup -d ${nstloop} + _failure "Operation aborted. I cannot lock an already locked tomb. Go dig a new one." else - _message "Fine, this tomb seems empty." + _message "Fine, this tomb seems empty." fi # load key from options or file tombkey=`load_key` { test $? = 0 } || { - losetup -d $nstloop - _failure "Aborting operations: error loading key." } - # make sure to call drop_key later + losetup -d $nstloop + _failure "Aborting operations: error loading key." } + # make sure to call drop_key later # the encryption cipher for a tomb can be set when locking using -o if option_is_set -o; then - cipher="`option_value -o`" + cipher="`option_value -o`" else - cipher="aes-xts-plain64:sha256" - # old default was aes-cbc-essiv:sha256 - # for more alternatives refer to cryptsetup(8) + cipher="aes-xts-plain64:sha256" + # old default was aes-cbc-essiv:sha256 + # for more alternatives refer to cryptsetup(8) fi _message "Locking using cipher: $cipher" # get the pass from the user and check it if option_is_set --tomb-pwd; then - tomb_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_pwd" - tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` + tomb_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_pwd" + tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` else - tombpass=`ask_key_password "$tombkey"` + tombpass=`ask_key_password "$tombkey"` fi { test $? = 0 } || { - losetup -d ${nstloop} - _failure "No valid password supplied." } + losetup -d ${nstloop} + _failure "No valid password supplied." } _success "Locking ${tombfile} with ${tombkey}" _message "Formatting Luks mapped device." get_lukskey "${tombpass}" ${tombkey} | \ - cryptsetup --key-file - --batch-mode \ - --cipher ${cipher} --key-size 256 --key-slot 0 \ - luksFormat ${nstloop} + cryptsetup --key-file - --batch-mode \ + --cipher ${cipher} --key-size 256 --key-slot 0 \ + luksFormat ${nstloop} if ! [ $? = 0 ]; then - _warning "cryptsetup luksFormat returned an error." - unset tombpass - losetup -d $nstloop - _failure "Operation aborted." + _warning "cryptsetup luksFormat returned an error." + unset tombpass + losetup -d $nstloop + _failure "Operation aborted." fi get_lukskey "${tombpass}" ${tombkey} | \ - cryptsetup --key-file - \ - --cipher ${cipher} luksOpen ${nstloop} tomb.tmp + cryptsetup --key-file - \ + --cipher ${cipher} luksOpen ${nstloop} tomb.tmp if ! [ $? = 0 ]; then - _warning "cryptsetup luksOpen returned an error." - unset tombpass - losetup -d $nstloop - _failure "Operation aborted." + _warning "cryptsetup luksOpen returned an error." + unset tombpass + losetup -d $nstloop + _failure "Operation aborted." fi # cleanup tombs @@ -1283,8 +1283,8 @@ lock_tomb_with_key() { ${=MKFS} ${tombname} /dev/mapper/tomb.tmp if [ $? != 0 ]; then - _warning "Tomb format returned an error." - _warning "Your tomb ${tombfile} may be corrupted." + _warning "Tomb format returned an error." + _warning "Your tomb ${tombfile} may be corrupted." fi sync @@ -1305,24 +1305,24 @@ change_tomb_key() { newkey="`load_key`" { test $? = 0 } || { - _failure "Aborting operations: error loading new key from -k" } + _failure "Aborting operations: error loading new key from -k" } oldkey="$1" { is_valid_key "$oldkey" } || { - _failure "Old key invalid. 1st argument of setkey must be a valid key file." } + _failure "Old key invalid. 1st argument of setkey must be a valid key file." } { is_valid_tomb "$2" } || { - _failure "Tomb invalid. 2nd argument of setkey must be a valid tomb file." } + _failure "Tomb invalid. 2nd argument of setkey must be a valid tomb file." } nstloop=`losetup -f` { test $? = 255 } && { - _failure "Too many tombs are open. Please close any of them to proceed." } + _failure "Too many tombs are open. Please close any of them to proceed." } losetup -f "$2" cryptsetup isLuks ${nstloop} # is it a LUKS encrypted nest? we check one more timesee cryptsetup(1) { test $? = 0 } || { - losetup -d "$nstloop" - _failure "Not a valid LUKS encrypted volume: $2" } + losetup -d "$nstloop" + _failure "Not a valid LUKS encrypted volume: $2" } # we have everything, prepare to mount _success "Changing lock on tomb $tombname" @@ -1335,48 +1335,48 @@ change_tomb_key() { mapper="tomb.${tombname}.${mapdate}.`basename $nstloop`" if option_is_set --tomb-pwd; then - tomb_new_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_new_pwd" - newkeypass=`ask_key_password "$newkey" "$tomb_new_pwd"` + tomb_new_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_new_pwd" + newkeypass=`ask_key_password "$newkey" "$tomb_new_pwd"` else - newkeypass=`ask_key_password "$newkey"` + newkeypass=`ask_key_password "$newkey"` fi { test $? = 0 } || { - _failure "No valid password supplied for the new key." } + _failure "No valid password supplied for the new key." } newkeyfile="`safe_filename newkey`" get_lukskey "$newkeypass" "$newkey" > $newkeyfile # load the old key if option_is_set --tomb-old-pwd; then - tomb_old_pwd="`option_value --tomb-old-pwd`" - _verbose "--tomb-old-pwd = $tomb_old_pwd" - oldkeypass=`ask_key_password "$oldkey" "$tomb_old_pwd"` + tomb_old_pwd="`option_value --tomb-old-pwd`" + _verbose "--tomb-old-pwd = $tomb_old_pwd" + oldkeypass=`ask_key_password "$oldkey" "$tomb_old_pwd"` else - oldkeypass=`ask_key_password "$oldkey"` + oldkeypass=`ask_key_password "$oldkey"` fi { test $? = 0 } || { - _failure "No valid password supplied for the old key." } + _failure "No valid password supplied for the old key." } # luksOpen the tomb (not really mounting, just on the loopback) get_lukskey "$oldkeypass" "$oldkey" | \ - cryptsetup --key-file - luksOpen ${nstloop} ${mapper} + cryptsetup --key-file - luksOpen ${nstloop} ${mapper} { test $? = 0 } || { - losetup -d "$nstloop" - _failure "Unexpected error in luksOpen." } + losetup -d "$nstloop" + _failure "Unexpected error in luksOpen." } get_lukskey "$oldkeypass" "$oldkey" | \ - cryptsetup --key-file - luksChangeKey "$nstloop" "$newkeyfile" + cryptsetup --key-file - luksChangeKey "$nstloop" "$newkeyfile" { test $? = 0 } || { - losetup -d "$nstloop" - _failure "Unexpected error in luksChangeKey." } + losetup -d "$nstloop" + _failure "Unexpected error in luksChangeKey." } ${=WIPE} "$newkeyfile" cryptsetup luksClose "${mapper}" { test $? = 0 } || { - losetup -d "$nstloop" - _failure "Unexpected error in luksClose." } + losetup -d "$nstloop" + _failure "Unexpected error in luksClose." } drop_key unset oldkeypass @@ -1393,14 +1393,14 @@ change_tomb_key() { create_tomb() { _verbose "create_tomb(): ${=@} ${=OLDARGS}" if ! [ $1 ]; then - _warning "No tomb name specified for creation." - return 1 + _warning "No tomb name specified for creation." + return 1 fi { test -r "$1" } && { - _warning "Creating this tomb would overwrite an existing file. Operation aborted." - _failure "`ls -lh $1`" } + _warning "Creating this tomb would overwrite an existing file. Operation aborted." + _failure "`ls -lh $1`" } { test $? = 0 } || { _failure "Failed to dig tomb, operation aborted." } @@ -1430,8 +1430,8 @@ create_tomb() { mount_tomb() { _message "Commanded to open tomb $1" if [ "$1" = "" ]; then - _warning "No tomb name specified for creation." - return 1 + _warning "No tomb name specified for creation." + return 1 fi _check_swap @@ -1448,8 +1448,8 @@ mount_tomb() { # check file type (if its a Luks fs) file ${tombdir}/${tombfile} | grep -i 'luks encrypted file' 2>&1 >/dev/null if [ $? != 0 ]; then - _warning "$1 is not a valid tomb file, operation aborted." - return 1 + _warning "$1 is not a valid tomb file, operation aborted." + return 1 fi tombname=${tombfile%%\.*} _verbose "Tomb found: ${tombdir}/${tombfile}" @@ -1457,23 +1457,22 @@ mount_tomb() { # load_key called here tombkey=`load_key ${tombdir}/${tombfile}` { test $? = 0 } || { - _failure "Aborting operations: error loading key $tombkey" } - + _failure "Aborting operations: error loading key $tombkey" } if [ "$2" = "" ]; then - tombmount=/media/${tombfile} - _message "Mountpoint not specified, using default: $tombmount" + tombmount=/media/${tombfile} + _message "Mountpoint not specified, using default: $tombmount" else - tombmount=$2 + tombmount=$2 fi # check if its already open mount -l | grep "${tombfile}.*\[$tombname\]$" 2>&1 > /dev/null if [ $? = 0 ]; then - _warning "$tombname is already open." - _message "Here below its status is reported:" - list_tombs ${tombname} - return 0 + _warning "$tombname is already open." + _message "Here below its status is reported:" + list_tombs ${tombname} + return 0 fi _success "Opening $tombfile on $tombmount" @@ -1481,33 +1480,33 @@ mount_tomb() { nstloop=`losetup -f` if [ $? = 255 ]; then - _failure "Too many tombs open. Please close any of them to open another tomb." + _failure "Too many tombs open. Please close any of them to open another tomb." fi _verbose "Next free loop device: $nstloop" losetup -f ${tombdir}/${tombfile} cryptsetup isLuks ${nstloop} if [ $? != 0 ]; then - # is it a LUKS encrypted nest? see cryptsetup(1) - _warning "$tombfile is not a valid Luks encrypted storage file." - losetup -d ${nstloop} - return 1 + # is it a LUKS encrypted nest? see cryptsetup(1) + _warning "$tombfile is not a valid Luks encrypted storage file." + losetup -d ${nstloop} + return 1 fi _message "This tomb is a valid LUKS encrypted device." luksdump="`cryptsetup luksDump ${nstloop}`" tombdump=(`print $luksdump | awk ' - /^Cipher name/ {print $3} - /^Cipher mode/ {print $3} - /^Hash spec/ {print $3}'`) + /^Cipher name/ {print $3} + /^Cipher mode/ {print $3} + /^Hash spec/ {print $3}'`) _message "Cipher is \"$tombdump[1]\" mode \"$tombdump[2]\" hash \"$tombdump[3]\"" slotwarn=`print $luksdump | awk ' - BEGIN { zero=0 } - /^Key slot 0/ { zero=1 } - /^Key slot.*ENABLED/ { if(zero==1) print "WARN" }'` + BEGIN { zero=0 } + /^Key slot 0/ { zero=1 } + /^Key slot.*ENABLED/ { if(zero==1) print "WARN" }'` { test "$slotwarn" = "WARN" } && { - _warning "Multiple key slots are enabled on this tomb. Beware: there can be a backdoor." } + _warning "Multiple key slots are enabled on this tomb. Beware: there can be a backdoor." } # save date of mount in minutes since 1970 mapdate=`date +%s` @@ -1518,18 +1517,18 @@ mount_tomb() { keyname=`basename $tombkey | cut -d. -f1` if option_is_set --tomb-pwd; then - tomb_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_pwd" - tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` + tomb_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_pwd" + tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` else - tombpass=`ask_key_password "$tombkey"` + tombpass=`ask_key_password "$tombkey"` fi { test $? = 0 } || { - losetup -d ${nstloop} - _failure "No valid password supplied." } + losetup -d ${nstloop} + _failure "No valid password supplied." } get_lukskey "${tombpass}" ${tombkey} | \ - cryptsetup --key-file - luksOpen ${nstloop} ${mapper} + cryptsetup --key-file - luksOpen ${nstloop} ${mapper} # key dropped here @@ -1537,8 +1536,8 @@ mount_tomb() { unset tombpass if ! [ -r /dev/mapper/${mapper} ]; then - losetup -d ${nstloop} - _failure "Failure mounting the encrypted file." + losetup -d ${nstloop} + _failure "Failure mounting the encrypted file." fi # array: [ cipher, keysize, loopdevice ] @@ -1566,13 +1565,13 @@ mount_tomb() { # print out when was opened the last time, by whom and where { test -r ${tombmount}/.last } && { - tombtty="`cat ${tombmount}/.tty`" - tombhost="`cat ${tombmount}/.host`" - tombuid="`cat ${tombmount}/.uid`" - tomblast="`cat ${tombmount}/.last`" - tombuser=`awk -F: '/:'"$tombuid"':/ {print $1}' /etc/passwd` - _message "Last visit by $fg_bold[white]$tombuser($tombuid)$fg_no_bold[white] from $fg_bold[white]$tombtty$fg_no_bold[white] on $fg_bold[white]$tombhost$fg_no_bold[white]" - _message "on date $fg_bold[white]`date --date @${tomblast} +%c`$fg_no_bold[white]" + tombtty="`cat ${tombmount}/.tty`" + tombhost="`cat ${tombmount}/.host`" + tombuid="`cat ${tombmount}/.uid`" + tomblast="`cat ${tombmount}/.last`" + tombuser=`awk -F: '/:'"$tombuid"':/ {print $1}' /etc/passwd` + _message "Last visit by $fg_bold[white]$tombuser($tombuid)$fg_no_bold[white] from $fg_bold[white]$tombtty$fg_no_bold[white] on $fg_bold[white]$tombhost$fg_no_bold[white]" + _message "on date $fg_bold[white]`date --date @${tomblast} +%c`$fg_no_bold[white]" } # write down the UID and TTY that opened the tomb rm -f ${tombmount}/.uid @@ -1592,8 +1591,8 @@ mount_tomb() { # process bind-hooks (mount -o bind of directories) # and post-hooks (execute on open) if ! option_is_set -n ; then - exec_safe_bind_hooks ${tombmount} - exec_safe_post_hooks ${tombmount} open + exec_safe_bind_hooks ${tombmount} + exec_safe_post_hooks ${tombmount} open fi return 0 } @@ -1601,44 +1600,44 @@ mount_tomb() { # ## Hooks execution exec_safe_bind_hooks() { if [[ -n ${(k)opts[-o]} ]]; then - MOUNTOPTS=${opts[-o]} + MOUNTOPTS=${opts[-o]} fi local MOUNTPOINT="${1}" local ME=${SUDO_USER:-$(whoami)} local HOME=$(awk -v a="$ME" -F ':' '{if ($1 == a) print $6}' /etc/passwd 2>/dev/null) if [ $? -ne 0 ]; then - _warning "How pitiful! A tomb, and no HOME." - return 1 + _warning "How pitiful! A tomb, and no HOME." + return 1 fi if [ -z "$MOUNTPOINT" -o ! -d "$MOUNTPOINT" ]; then - _warning "Cannot exec bind hooks without a mounted tomb." - return 1 + _warning "Cannot exec bind hooks without a mounted tomb." + return 1 fi if ! [ -r "$MOUNTPOINT/bind-hooks" ]; then - _verbose "bind-hooks not found in $MOUNTPOINT" - return 1 + _verbose "bind-hooks not found in $MOUNTPOINT" + return 1 fi typeset -al mounted typeset -Al maps maps=($(<"$MOUNTPOINT/bind-hooks")) for dir in ${(k)maps}; do - if [ "${dir[1]}" = "/" -o "${dir[1,2]}" = ".." ]; then - _warning "bind-hooks map format: local/to/tomb local/to/\$HOME" - continue - fi - if [ "${${maps[$dir]}[1]}" = "/" -o "${${maps[$dir]}[1,2]}" = ".." ]; then - _warning "bind-hooks map format: local/to/tomb local/to/\$HOME. Rolling back" - for dir in ${mounted}; do umount $dir; done - return 1 - fi - if [ ! -r "$HOME/${maps[$dir]}" ]; then - _warning "bind-hook target not existent, skipping $HOME/${maps[$dir]}" - elif [ ! -r "$MOUNTPOINT/$dir" ]; then - _warning "bind-hook source not found in tomb, skipping ${MOUNTPOINT}/${dir}" - else - mount -o bind,$MOUNTOPTS $MOUNTPOINT/$dir $HOME/${maps[$dir]} - mounted+=("$HOME/${maps[$dir]}") - fi + if [ "${dir[1]}" = "/" -o "${dir[1,2]}" = ".." ]; then + _warning "bind-hooks map format: local/to/tomb local/to/\$HOME" + continue + fi + if [ "${${maps[$dir]}[1]}" = "/" -o "${${maps[$dir]}[1,2]}" = ".." ]; then + _warning "bind-hooks map format: local/to/tomb local/to/\$HOME. Rolling back" + for dir in ${mounted}; do umount $dir; done + return 1 + fi + if [ ! -r "$HOME/${maps[$dir]}" ]; then + _warning "bind-hook target not existent, skipping $HOME/${maps[$dir]}" + elif [ ! -r "$MOUNTPOINT/$dir" ]; then + _warning "bind-hook source not found in tomb, skipping ${MOUNTPOINT}/${dir}" + else + mount -o bind,$MOUNTOPTS $MOUNTPOINT/$dir $HOME/${maps[$dir]} + mounted+=("$HOME/${maps[$dir]}") + fi done } @@ -1654,8 +1653,8 @@ exec_safe_post_hooks() { # make encrypted executables. cat ${mnt}/post-hooks | head -n1 | grep '^#!/' if [ $? = 0 ]; then - _success "Post hooks found, executing as user $SUDO_USER." - exec_as_user ${mnt}/post-hooks "$2" "$1" + _success "Post hooks found, executing as user $SUDO_USER." + exec_as_user ${mnt}/post-hooks "$2" "$1" fi } @@ -1670,84 +1669,84 @@ list_tombs() { # list all open tombs mounted_tombs=(`list_tomb_mounts $1`) { test ${#mounted_tombs} = 0 } && { - _failure "I can't see any ${1:-open} tomb, may they all rest in peace." } + _failure "I can't see any ${1:-open} tomb, may they all rest in peace." } for t in ${mounted_tombs}; do - mapper=`basename ${t[(ws:;:)1]}` - tombname=${t[(ws:;:)5]} - tombmount=${t[(ws:;:)2]} - tombfs=${t[(ws:;:)3]} - tombfsopts=${t[(ws:;:)4]} - tombloop=${mapper[(ws:.:)4]} - - # calculate tomb size - ts=`df -hP /dev/mapper/$mapper | + mapper=`basename ${t[(ws:;:)1]}` + tombname=${t[(ws:;:)5]} + tombmount=${t[(ws:;:)2]} + tombfs=${t[(ws:;:)3]} + tombfsopts=${t[(ws:;:)4]} + tombloop=${mapper[(ws:.:)4]} + + # calculate tomb size + ts=`df -hP /dev/mapper/$mapper | awk "/mapper/"' { print $2 ";" $3 ";" $4 ";" $5 }'` - tombtot=${ts[(ws:;:)1]} - tombused=${ts[(ws:;:)2]} - tombavail=${ts[(ws:;:)3]} - tombpercent=${ts[(ws:;:)4]} - tombp=${tombpercent%%%} - tombsince=`date --date=@${mapper[(ws:.:)3]} +%c` - - # find out who opens it from where - { test -r ${tombmount}/.tty } && { - tombtty="`cat ${tombmount}/.tty`" - tombhost="`cat ${tombmount}/.host`" - tombuid="`cat ${tombmount}/.uid`" - tombuser=`awk -F: '/:'"$tombuid"':/ {print $1}' /etc/passwd` - } + tombtot=${ts[(ws:;:)1]} + tombused=${ts[(ws:;:)2]} + tombavail=${ts[(ws:;:)3]} + tombpercent=${ts[(ws:;:)4]} + tombp=${tombpercent%%%} + tombsince=`date --date=@${mapper[(ws:.:)3]} +%c` + + # find out who opens it from where + { test -r ${tombmount}/.tty } && { + tombtty="`cat ${tombmount}/.tty`" + tombhost="`cat ${tombmount}/.host`" + tombuid="`cat ${tombmount}/.uid`" + tombuser=`awk -F: '/:'"$tombuid"':/ {print $1}' /etc/passwd` + } if option_is_set --get-mountpoint; then - echo $tombmount - continue - fi - # breaking up such strings is good for translation - print -n "$fg[green]$tombname" - print -n "$fg[white] open on " - print -n "$fg_bold[white]$tombmount" - print -n "$fg_no_bold[white] using " - print "$fg_bold[white]$tombfs $tombfsopts" - - print -n "$fg_no_bold[green]$tombname" - print -n "$fg_no_bold[white] open since " - print "$fg_bold[white]$tombsince$fg_no_bold[white]" - - { test "$tombtty" = "" } || { - print -n "$fg_no_bold[green]$tombname" - print -n "$fg_no_bold[white] open by " - print -n "$fg_bold[white]$tombuser" - print -n "$fg_no_bold[white] from " - print -n "$fg_bold[white]$tombtty" - print -n "$fg_no_bold[white] on " - print "$fg_bold[white]$tombhost" - } - - print -n "$fg_no_bold[green]$tombname" - print -n "$fg[white] size " - print -n "$fg_bold[white]$tombtot" - print -n "$fg_no_bold[white] of which " - print -n "$fg_bold[white]$tombused" - print -n "$fg_no_bold[white] used: " - print -n "$fg_bold[white]$tombavail" - print -n "$fg_no_bold[white] free (" - print -n "$fg_bold[white]$tombpercent" - print "$fg_no_bold[white] full)" - - if [[ ${tombp} -ge 90 ]]; then - print -n "$fg_no_bold[green]$tombname" - print "$fg_bold[red] Your tomb is almost full!" - fi - - # now check hooks - mounted_hooks=(`list_tomb_binds $tombname`) - for h in ${mounted_hooks}; do - print -n "$fg_no_bold[green]$tombname" - print -n "$fg_no_bold[white] hooks " + echo $tombmount + continue + fi + # breaking up such strings is good for translation + print -n "$fg[green]$tombname" + print -n "$fg[white] open on " + print -n "$fg_bold[white]$tombmount" + print -n "$fg_no_bold[white] using " + print "$fg_bold[white]$tombfs $tombfsopts" + + print -n "$fg_no_bold[green]$tombname" + print -n "$fg_no_bold[white] open since " + print "$fg_bold[white]$tombsince$fg_no_bold[white]" + + { test "$tombtty" = "" } || { + print -n "$fg_no_bold[green]$tombname" + print -n "$fg_no_bold[white] open by " + print -n "$fg_bold[white]$tombuser" + print -n "$fg_no_bold[white] from " + print -n "$fg_bold[white]$tombtty" + print -n "$fg_no_bold[white] on " + print "$fg_bold[white]$tombhost" + } + + print -n "$fg_no_bold[green]$tombname" + print -n "$fg[white] size " + print -n "$fg_bold[white]$tombtot" + print -n "$fg_no_bold[white] of which " + print -n "$fg_bold[white]$tombused" + print -n "$fg_no_bold[white] used: " + print -n "$fg_bold[white]$tombavail" + print -n "$fg_no_bold[white] free (" + print -n "$fg_bold[white]$tombpercent" + print "$fg_no_bold[white] full)" + + if [[ ${tombp} -ge 90 ]]; then + print -n "$fg_no_bold[green]$tombname" + print "$fg_bold[red] Your tomb is almost full!" + fi + + # now check hooks + mounted_hooks=(`list_tomb_binds $tombname`) + for h in ${mounted_hooks}; do + print -n "$fg_no_bold[green]$tombname" + print -n "$fg_no_bold[white] hooks " # print -n "$fg_bold[white]`basename ${h[(ws:;:)1]}`" # print -n "$fg_no_bold[white] on " - print "$fg_bold[white]${h[(ws:;:)2]}$fg_no_bold[white]" - done + print "$fg_bold[white]${h[(ws:;:)2]}$fg_no_bold[white]" + done done } @@ -1769,9 +1768,9 @@ list_tombs() { # 5. tomb name list_tomb_mounts() { if [ "$1" = "" ]; then - # list all open tombs - mount -l \ - | awk ' + # list all open tombs + mount -l \ + | awk ' BEGIN { main="" } /^\/dev\/mapper\/tomb/ { if(main==$1) next; @@ -1780,9 +1779,9 @@ BEGIN { main="" } } ' else - # list a specific tomb - mount -l \ - | awk -vtomb="[$1]" ' + # list a specific tomb + mount -l \ + | awk -vtomb="[$1]" ' BEGIN { main="" } /^\/dev\/mapper\/tomb/ { if($7!=tomb) next; @@ -1800,11 +1799,11 @@ BEGIN { main="" } # needs an argument: name of tomb whose hooks belong list_tomb_binds() { if [ "$1" = "" ]; then - _failure "Internal error: list_tomb_binds called without argument."; fi + _failure "Internal error: list_tomb_binds called without argument."; fi # list bind hooks on util-linux 2.20 (Debian 7) mount -l \ - | awk -vtomb="$1" ' + | awk -vtomb="$1" ' BEGIN { main="" } /^\/dev\/mapper\/tomb/ { if($7!=tomb) next; @@ -1820,8 +1819,8 @@ BEGIN { main="" } /^\/dev\/mapper\/tomb/ { if($7!=tomb) next; print $3; exit; }'` mount -l | grep "^$tombmount" \ - | awk -vtomb="$1" ' - /bind/ { print $1 ";" $3 ";" $5 ";" $6 ";" $7 }' + | awk -vtomb="$1" ' + /bind/ { print $1 ";" $3 ";" $5 ";" $6 ";" $7 }' } # }}} - Tomb list @@ -1832,21 +1831,21 @@ BEGIN { main="" } # $1 is optional, to specify a tomb index_tombs() { { command -v updatedb > /dev/null } || { - _failure "Cannot index tombs on this system: updatedb (mlocate) not installed." } + _failure "Cannot index tombs on this system: updatedb (mlocate) not installed." } updatedbver=`updatedb --version | grep '^updatedb'` [[ "$updatedbver" =~ "GNU findutils" ]] && { - _warning "Cannot use GNU findutils for index/search commands." } + _warning "Cannot use GNU findutils for index/search commands." } [[ "$updatedbver" =~ "mlocate" ]] || { - _failure "Index command needs 'mlocate' to be installed." } + _failure "Index command needs 'mlocate' to be installed." } _verbose "$updatedbver" mounted_tombs=(`list_tomb_mounts $1`) { test ${#mounted_tombs} = 0 } && { - if [ $1 ]; then _failure "There seems to be no open tomb engraved as [$1]" - else _failure "I can't see any open tomb, may they all rest in peace." - fi + if [ $1 ]; then _failure "There seems to be no open tomb engraved as [$1]" + else _failure "I can't see any open tomb, may they all rest in peace." + fi } @@ -1854,26 +1853,26 @@ index_tombs() { # start the LibreOffice document converter if installed { command -v unoconv >/dev/null } && { - unoconv -l 2>/dev/null & - _verbose "unoconv listener launched." - sleep 1 } + unoconv -l 2>/dev/null & + _verbose "unoconv listener launched." + sleep 1 } for t in ${mounted_tombs}; do - mapper=`basename ${t[(ws:;:)1]}` - tombname=${t[(ws:;:)5]} - tombmount=${t[(ws:;:)2]} - { test -r ${tombmount}/.noindex } && { - _message "Skipping $tombname (.noindex found)." - continue } - _message "Indexing $tombname filenames..." - updatedb -l 0 -o ${tombmount}/.updatedb -U ${tombmount} - - # here we use swish to index file contents - { test $SWISH = 1 } && { - _message "Indexing $tombname contents..." - swishrc=`safe_filename swish` - - cat <<EOF > $swishrc + mapper=`basename ${t[(ws:;:)1]}` + tombname=${t[(ws:;:)5]} + tombmount=${t[(ws:;:)2]} + { test -r ${tombmount}/.noindex } && { + _message "Skipping $tombname (.noindex found)." + continue } + _message "Indexing $tombname filenames..." + updatedb -l 0 -o ${tombmount}/.updatedb -U ${tombmount} + + # here we use swish to index file contents + { test $SWISH = 1 } && { + _message "Indexing $tombname contents..." + swishrc=`safe_filename swish` + + cat <<EOF > $swishrc # index directives DefaultContents TXT* IndexDir $tombmount @@ -1939,53 +1938,53 @@ IndexContents HTML* .htm .html .shtml IndexContents XML* .xml EOF - _verbose "Using swish-e to create index." - swish-e -c $swishrc -S fs -v3 - rm -f $swishrc - } + _verbose "Using swish-e to create index." + swish-e -c $swishrc -S fs -v3 + rm -f $swishrc + } - _message "Search index updated." + _message "Search index updated." done } search_tombs() { { command -v locate > /dev/null } || { - _failure "Cannot index tombs on this system: updatedb (mlocate) not installed." } + _failure "Cannot index tombs on this system: updatedb (mlocate) not installed." } updatedbver=`updatedb --version | grep '^updatedb'` [[ "$updatedbver" =~ "GNU findutils" ]] && { - _warning "Cannot use GNU findutils for index/search commands." } + _warning "Cannot use GNU findutils for index/search commands." } [[ "$updatedbver" =~ "mlocate" ]] || { - _failure "Index command needs 'mlocate' to be installed." } + _failure "Index command needs 'mlocate' to be installed." } _verbose "$updatedbver" # list all open tombs mounted_tombs=(`list_tomb_mounts`) if [ ${#mounted_tombs} = 0 ]; then - _failure "I can't see any open tomb, may they all rest in peace."; fi + _failure "I can't see any open tomb, may they all rest in peace."; fi _success "Searching for: $fg_bold[white]${(f)@}$fg_no_bold[white]" for t in ${mounted_tombs}; do - _verbose "Checking for index: ${t}" - mapper=`basename ${t[(ws:;:)1]}` - tombname=${t[(ws:;:)5]} - tombmount=${t[(ws:;:)2]} - if [ -r ${tombmount}/.updatedb ]; then - - # use mlocate to search hits on filenames - _message "Searching filenames in tomb $tombname" - locate -d ${tombmount}/.updatedb -e -i "${(f)@}" - _message "Matches found: `locate -d ${tombmount}/.updatedb -e -i -c ${(f)@}`" - - # use swish-e to search over contents - { test $SWISH = 1 } && { test -r $tombmount/.swish } && { - _message "Searching contents in tomb $tombname" - swish-search -w ${=@} -f $tombmount/.swish -H0 } - - else - _warning "Skipping tomb $tombname: not indexed." - _warning "Run 'tomb index' to create indexes." - fi + _verbose "Checking for index: ${t}" + mapper=`basename ${t[(ws:;:)1]}` + tombname=${t[(ws:;:)5]} + tombmount=${t[(ws:;:)2]} + if [ -r ${tombmount}/.updatedb ]; then + + # use mlocate to search hits on filenames + _message "Searching filenames in tomb $tombname" + locate -d ${tombmount}/.updatedb -e -i "${(f)@}" + _message "Matches found: `locate -d ${tombmount}/.updatedb -e -i -c ${(f)@}`" + + # use swish-e to search over contents + { test $SWISH = 1 } && { test -r $tombmount/.swish } && { + _message "Searching contents in tomb $tombname" + swish-search -w ${=@} -f $tombmount/.swish -H0 } + + else + _warning "Skipping tomb $tombname: not indexed." + _warning "Run 'tomb index' to create indexes." + fi done _message "Search completed." } @@ -1998,15 +1997,15 @@ search_tombs() { resize_tomb() { _message "Commanded to resize tomb $1 to $opts[-s] megabytes." if ! [ $1 ]; then - _failure "No tomb name specified for resizing." + _failure "No tomb name specified for resizing." elif ! [ -r "$1" ]; then - _failure "Cannot find $1" + _failure "Cannot find $1" fi # $1 is the tomb file path local newtombsize="`option_value -s`" { test "$newtombsize" = "" } && { - _failure "Aborting operations: new size was not specified, use -s" } + _failure "Aborting operations: new size was not specified, use -s" } local c tombpass tombkey @@ -2018,22 +2017,22 @@ resize_tomb() { local tombkey="`load_key ${tombdir}/${tombfile}`" # make sure to call drop_key later { test -r "$tombkey" } || { - _failure "Aborting operations: key not found, use -k" } + _failure "Aborting operations: key not found, use -k" } local oldtombsize=$(( `stat -c %s "$1" 2>/dev/null` / 1048576 )) local mounted_tomb=`mount -l | - awk -vtomb="[$tombname]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 }'` + awk -vtomb="[$tombname]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 }'` if [ "$mounted_tomb" ]; then - _failure "The tomb $tombname is open, to resize it it needs to be closed." + _failure "The tomb $tombname is open, to resize it it needs to be closed." fi if ! [ "$newtombsize" ] ; then - _failure "You must specify the new size of $tombname" + _failure "You must specify the new size of $tombname" elif [[ $newtombsize != <-> ]]; then - _failure "Size is not an integer." + _failure "Size is not an integer." elif [ "$newtombsize" -le "$oldtombsize" ]; then - _failure "The new size must be greater then old tomb size." + _failure "The new size must be greater then old tomb size." fi delta="$(( $newtombsize - $oldtombsize ))" @@ -2044,21 +2043,21 @@ resize_tomb() { ${=DD} if=/dev/urandom bs=1048576 count=${delta} >> ${tombdir}/${tombfile} { test $? = 0 } || { - _failure "Error creating the extra resize $tmp_resize, operation aborted." } + _failure "Error creating the extra resize $tmp_resize, operation aborted." } if option_is_set --tomb-pwd; then - tomb_pwd="`option_value --tomb-pwd`" - _verbose "--tomb-pwd = $tomb_pwd" - tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` + tomb_pwd="`option_value --tomb-pwd`" + _verbose "--tomb-pwd = $tomb_pwd" + tombpass=`ask_key_password "$tombkey" "$tomb_pwd"` else - tombpass=`ask_key_password "$tombkey"` + tombpass=`ask_key_password "$tombkey"` fi { test $? = 0 } || { - _failure "No valid password supplied." } + _failure "No valid password supplied." } local nstloop=`losetup -f` if [ $? = 255 ]; then - _failure "Too many tombs opened. Please close any of them to open another tomb." + _failure "Too many tombs opened. Please close any of them to open another tomb." fi losetup -f ${tombdir}/${tombfile} @@ -2067,32 +2066,32 @@ resize_tomb() { local mapper="tomb.${tombname}.${mapdate}.`basename $nstloop`" get_lukskey "${tombpass}" ${tombkey} | \ - cryptsetup --key-file - luksOpen ${nstloop} ${mapper} + cryptsetup --key-file - luksOpen ${nstloop} ${mapper} drop_key # cleanup after load_key unset tombpass if ! [ -r /dev/mapper/${mapper} ]; then - losetup -d ${nstloop} - _failure "Failure mounting the encrypted file." + losetup -d ${nstloop} + _failure "Failure mounting the encrypted file." fi cryptsetup resize "${mapper}" if [ $? != 0 ]; then - losetup -d ${nstloop} - _failure "cryptsetup failed to resize $mapper" + losetup -d ${nstloop} + _failure "cryptsetup failed to resize $mapper" fi e2fsck -p -f /dev/mapper/${mapper} if [ $? != 0 ]; then - losetup -d ${nstloop} - _failure "e2fsck failed to check $mapper" + losetup -d ${nstloop} + _failure "e2fsck failed to check $mapper" fi resize2fs /dev/mapper/${mapper} if [ $? != 0 ]; then - losetup -d ${nstloop} - _failure "resize2fs failed to resize $mapper" + losetup -d ${nstloop} + _failure "resize2fs failed to resize $mapper" fi sleep 1 # needs to settle a bit @@ -2114,94 +2113,94 @@ umount_tomb() { local ans pidk pname if [ "$1" = "all" ]; then - mounted_tombs=(`list_tomb_mounts`) + mounted_tombs=(`list_tomb_mounts`) else - mounted_tombs=(`list_tomb_mounts $1`) + mounted_tombs=(`list_tomb_mounts $1`) fi { test ${#mounted_tombs} = 0 } && { - _warning "There is no open tomb to be closed." - return 1 } + _warning "There is no open tomb to be closed." + return 1 } { test ${#mounted_tombs} -gt 1 } && { test "$1" = "" } && { - _warning "Too many tombs mounted, please specify one (see tomb list)" - _warning "or issue the command 'tomb close all' to close them all." - return 1 } + _warning "Too many tombs mounted, please specify one (see tomb list)" + _warning "or issue the command 'tomb close all' to close them all." + return 1 } _message "Tomb close $1" for t in ${mounted_tombs}; do - mapper=`basename ${t[(ws:;:)1]}` - tombname=${t[(ws:;:)5]} - tombmount=${t[(ws:;:)2]} - tombfs=${t[(ws:;:)3]} - tombfsopts=${t[(ws:;:)4]} - tombloop=${mapper[(ws:.:)4]} - - _verbose "Name: $tombname" - _verbose "Mount: $tombmount" - _verbose "Mapper: $mapper" - - { test -e "$mapper" } && { - _warning "Tomb not found: $1" - _warning "Please specify an existing tomb." - return 0 } - - if [ $SLAM ]; then - _success "Slamming tomb $tombname mounted on $tombmount" - _message "Kill all processes busy inside the tomb." - if ! slam_tomb "$tombmount"; then - _warning "Cannot slam the tomb $tombname" - return 1 - fi - else - _message "Closing tomb $tombname mounted on $tombmount" - fi + mapper=`basename ${t[(ws:;:)1]}` + tombname=${t[(ws:;:)5]} + tombmount=${t[(ws:;:)2]} + tombfs=${t[(ws:;:)3]} + tombfsopts=${t[(ws:;:)4]} + tombloop=${mapper[(ws:.:)4]} + + _verbose "Name: $tombname" + _verbose "Mount: $tombmount" + _verbose "Mapper: $mapper" + + { test -e "$mapper" } && { + _warning "Tomb not found: $1" + _warning "Please specify an existing tomb." + return 0 } + + if [ $SLAM ]; then + _success "Slamming tomb $tombname mounted on $tombmount" + _message "Kill all processes busy inside the tomb." + if ! slam_tomb "$tombmount"; then + _warning "Cannot slam the tomb $tombname" + return 1 + fi + else + _message "Closing tomb $tombname mounted on $tombmount" + fi # check if there are binded dirs and close them - bind_tombs=(`list_tomb_binds $tombname`) - for b in ${bind_tombs}; do - bind_mapper="${b[(ws:;:)1]}" - bind_mount="${b[(ws:;:)2]}" - _message "Closing tomb bind hook: $bind_mount" - umount $bind_mount - if [[ $? != 0 ]]; then - if [ $SLAM ]; then - _success "Slamming tomb: killing all processes using this hook." - slam_tomb "$bind_mount" - if [[ $? == 1 ]]; then - _warning "Cannot slam the bind hook $bind_mount" - return 1 - fi - umount $bind_mount - else - _warning "Tomb bind hook $bind_mount is busy, cannot close tomb." - fi - fi - done + bind_tombs=(`list_tomb_binds $tombname`) + for b in ${bind_tombs}; do + bind_mapper="${b[(ws:;:)1]}" + bind_mount="${b[(ws:;:)2]}" + _message "Closing tomb bind hook: $bind_mount" + umount $bind_mount + if [[ $? != 0 ]]; then + if [ $SLAM ]; then + _success "Slamming tomb: killing all processes using this hook." + slam_tomb "$bind_mount" + if [[ $? == 1 ]]; then + _warning "Cannot slam the bind hook $bind_mount" + return 1 + fi + umount $bind_mount + else + _warning "Tomb bind hook $bind_mount is busy, cannot close tomb." + fi + fi + done # Execute post-hooks for eventual cleanup - if ! option_is_set -n ; then - exec_safe_post_hooks ${tombmount%%/} close - fi + if ! option_is_set -n ; then + exec_safe_post_hooks ${tombmount%%/} close + fi - _verbose "Performing umount of $tombmount" - umount ${tombmount} - if ! [ $? = 0 ]; then _warning "Tomb is busy, cannot umount!" - else - # this means we used a "default" mount point - { test "${tombmount}" = "/media/${tombname}.tomb" } && { - rmdir ${tombmount} } - fi + _verbose "Performing umount of $tombmount" + umount ${tombmount} + if ! [ $? = 0 ]; then _warning "Tomb is busy, cannot umount!" + else + # this means we used a "default" mount point + { test "${tombmount}" = "/media/${tombname}.tomb" } && { + rmdir ${tombmount} } + fi - cryptsetup luksClose $mapper - { test $? = 0 } || { - _warning "Error occurred in cryptsetup luksClose ${mapper}" - return 1 } + cryptsetup luksClose $mapper + { test $? = 0 } || { + _warning "Error occurred in cryptsetup luksClose ${mapper}" + return 1 } - losetup -d "/dev/$tombloop" + losetup -d "/dev/$tombloop" - _success "Tomb $tombname closed: your bones will rest in peace." + _success "Tomb $tombname closed: your bones will rest in peace." done # loop across mounted tombs @@ -2212,24 +2211,24 @@ umount_tomb() { slam_tomb() { # $1 = tomb mount point if [[ -z `fuser -m "$1" 2> /dev/null` ]]; then - return 0 + return 0 fi #Note: shells are NOT killed by INT or TERM, but they are killed by HUP for s in TERM HUP KILL; do - _verbose "Sending $s to processes inside the tomb:" - if option_is_set -D; then - ps -fp `fuser -m /media/a.tomb 2> /dev/null`| - while read line; do - _verbose $line - done - fi - fuser -s -m "$1" -k -M -$s - if [[ -z `fuser -m "$1" 2> /dev/null` ]]; then - return 0 - fi - if ! option_is_set -f; then - sleep 3 - fi + _verbose "Sending $s to processes inside the tomb:" + if option_is_set -D; then + ps -fp `fuser -m /media/a.tomb 2> /dev/null`| + while read line; do + _verbose $line + done + fi + fuser -s -m "$1" -k -M -$s + if [[ -z `fuser -m "$1" 2> /dev/null` ]]; then + return 0 + fi + if ! option_is_set -f; then + sleep 3 + fi done return 1 } @@ -2296,35 +2295,35 @@ main() { ### Detect subcommand local -aU every_opts #every_opts behave like a set; that is, an array with unique elements for optspec in $subcommands_opts$main_opts; do - for opt in ${=optspec}; do - every_opts+=${opt} - done + for opt in ${=optspec}; do + every_opts+=${opt} + done done local -a oldstar oldstar=($argv) - #### detect early: useful for --optiion-parsing + #### detect early: useful for --optiion-parsing zparseopts -M -D -Adiscardme ${every_opts} - if [[ -n ${(k)discardme[--option-parsing]} ]]; then - echo $1 - if [[ -n "$1" ]]; then - return 1 - fi - return 0 - fi - unset discardme + if [[ -n ${(k)discardme[--option-parsing]} ]]; then + echo $1 + if [[ -n "$1" ]]; then + return 1 + fi + return 0 + fi + unset discardme if ! zparseopts -M -E -D -Adiscardme ${every_opts}; then - _failure "Error parsing." - return 127 - fi + _failure "Error parsing." + return 127 + fi unset discardme subcommand=$1 if [[ -z $subcommand ]]; then - subcommand="__default" + subcommand="__default" fi if [[ -z ${(k)subcommands_opts[$subcommand]} ]]; then - _warning "There's no such command \"$subcommand\"." - _failure "Please try -h for help." 127 + _warning "There's no such command \"$subcommand\"." + _failure "Please try -h for help." 127 # _failure "Subcommand '$subcommand' doesn't exist" 127 fi argv=(${oldstar}) @@ -2335,41 +2334,41 @@ main() { set -A cmd_opts ${main_opts} ${=subcommands_opts[$subcommand]} # if there is no option, we don't need parsing if [[ -n $cmd_opts ]]; then - zparseopts -M -E -D -Aopts ${cmd_opts} - if [[ $? != 0 ]]; then - _warning "Some error occurred during option processing." - _failure "See \"tomb help\" for more info." 127 - fi + zparseopts -M -E -D -Aopts ${cmd_opts} + if [[ $? != 0 ]]; then + _warning "Some error occurred during option processing." + _failure "See \"tomb help\" for more info." 127 + fi fi #build PARAM (array of arguments) and check if there are unrecognized options ok=0 PARAM=() for arg in $*; do - if [[ $arg == '--' || $arg == '-' ]]; then - ok=1 - continue #it shouldnt be appended to PARAM - elif [[ $arg[1] == '-' ]]; then - if [[ $ok == 0 ]]; then - _failure "Unrecognized option $arg for subcommand $subcommand" 127 - fi - fi - PARAM+=$arg + if [[ $arg == '--' || $arg == '-' ]]; then + ok=1 + continue #it shouldnt be appended to PARAM + elif [[ $arg[1] == '-' ]]; then + if [[ $ok == 0 ]]; then + _failure "Unrecognized option $arg for subcommand $subcommand" 127 + fi + fi + PARAM+=$arg done #first parameter actually is the subcommand: delete it and shift if [[ $subcommand != '__default' ]]; then - PARAM[1]=() - shift + PARAM[1]=() + shift fi ### End parsing command-specific options if ! option_is_set --no-color; then - autoload colors; colors + autoload colors; colors fi if ! option_is_set --unsecure-dev-mode; then - for opt in --sudo-pwd --tomb-pwd --use-urandom --tomb-old-pwd; do - if option_is_set $opt; then - _failure "You specified option $opt, which is DANGEROUS and should only be used for testing\nIf you really want so, add --unsecure-dev-mode" 127 - fi - done + for opt in --sudo-pwd --tomb-pwd --use-urandom --tomb-old-pwd; do + if option_is_set $opt; then + _failure "You specified option $opt, which is DANGEROUS and should only be used for testing\nIf you really want so, add --unsecure-dev-mode" 127 + fi + done fi # when we run as root, we remember the original uid:gid @@ -2383,96 +2382,96 @@ main() { case "$subcommand" in - # new creation in three steps - forge) - check_priv - forge_key ${=PARAM} - ;; - dig) - dig_tomb ${=PARAM} - ;; - lock) - check_priv - lock_tomb_with_key ${=PARAM} - ;; - - setkey) - check_priv - change_tomb_key ${=PARAM} - ;; - - engrave) - { test "$QRENCODE" = 0 } && { - _failure "QREncode not installed: cannot engrave keys on paper." } - engrave_key ${=PARAM} - ;; - - # backward compat - create) - _warning "The create command is deprecated, please use dig, forge and lock instead." - _warning "For more informations see Tomb's manual page (man tomb)." - ;; - - mount|open) - check_priv - mount_tomb $PARAM[1] $PARAM[2] - ;; - umount|close|slam) - check_priv - [ "$subcommand" = "slam" ] && SLAM=1 - umount_tomb $PARAM[1] - ;; - passwd) - change_passwd $PARAM[1] - ;; - list) - list_tombs $PARAM[1] - ;; - - index) - index_tombs $PARAM[1] - ;; - search) - search_tombs ${=PARAM} - ;; - - help) - usage - ;; - bury) - { test "$STEGHIDE" = 0 } && { - _failure "Steghide not installed: cannot bury keys into images." } - bury_key $PARAM[1] - ;; - exhume) - { test "$STEGHIDE" = 0 } && { - _failure "Steghide not installed: cannot exhume keys from images." } - exhume_key $PARAM[1] - ;; - resize) - { test "$RESIZER" = 0 } && { - _failure "Resize2fs not installed: cannot resize tombs." } - check_priv - resize_tomb $PARAM[1] - ;; - - # internal commands useful to developers - 'source') return 0 ;; - install) check_priv ; install_tomb ;; - askpass) ask_password $PARAM[1] $PARAM[2] ;; - mktemp) safe_dir $PARAM[1] ;; - translate) generate_translatable_strings ;; - - __default) - cat <<EOF + # new creation in three steps + forge) + check_priv + forge_key ${=PARAM} + ;; + dig) + dig_tomb ${=PARAM} + ;; + lock) + check_priv + lock_tomb_with_key ${=PARAM} + ;; + + setkey) + check_priv + change_tomb_key ${=PARAM} + ;; + + engrave) + { test "$QRENCODE" = 0 } && { + _failure "QREncode not installed: cannot engrave keys on paper." } + engrave_key ${=PARAM} + ;; + + # backward compat + create) + _warning "The create command is deprecated, please use dig, forge and lock instead." + _warning "For more informations see Tomb's manual page (man tomb)." + ;; + + mount|open) + check_priv + mount_tomb $PARAM[1] $PARAM[2] + ;; + umount|close|slam) + check_priv + [ "$subcommand" = "slam" ] && SLAM=1 + umount_tomb $PARAM[1] + ;; + passwd) + change_passwd $PARAM[1] + ;; + list) + list_tombs $PARAM[1] + ;; + + index) + index_tombs $PARAM[1] + ;; + search) + search_tombs ${=PARAM} + ;; + + help) + usage + ;; + bury) + { test "$STEGHIDE" = 0 } && { + _failure "Steghide not installed: cannot bury keys into images." } + bury_key $PARAM[1] + ;; + exhume) + { test "$STEGHIDE" = 0 } && { + _failure "Steghide not installed: cannot exhume keys from images." } + exhume_key $PARAM[1] + ;; + resize) + { test "$RESIZER" = 0 } && { + _failure "Resize2fs not installed: cannot resize tombs." } + check_priv + resize_tomb $PARAM[1] + ;; + + # internal commands useful to developers + 'source') return 0 ;; + install) check_priv ; install_tomb ;; + askpass) ask_password $PARAM[1] $PARAM[2] ;; + mktemp) safe_dir $PARAM[1] ;; + translate) generate_translatable_strings ;; + + __default) + cat <<EOF Tomb $VERSION - a strong and gentle undertaker for your secrets Copyright (C) 2007-2014 Dyne.org Foundation, License GNU GPL v3+ This is free software: you are free to change and redistribute it The latest Tomb sourcecode is published on <http://tomb.dyne.org> EOF - option_is_set -v && { - cat <<EOF + option_is_set -v && { + cat <<EOF This source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -2486,15 +2485,15 @@ System utils: `gpg --version | head -n1` - key forging algorithms (GnuPG symmetric ciphers): `list_gnupg_ciphers` EOF - return 0 - } - usage - ;; - *) - _warning "Command \"$subcommand\" not recognized." - _message "Try -h for help." - return 1 - ;; + return 0 + } + usage + ;; + *) + _warning "Command \"$subcommand\" not recognized." + _message "Try -h for help." + return 1 + ;; esac return $? }