tfixes to check_swap and new --force flag - tomb - the crypto undertaker HTML git clone git://parazyd.org/tomb.git DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 58decda7fecbd02e7e9bf98d218239c88ffb2668 DIR parent 28d81f10049dd3df3ceb1c4184edcde0ae64fb39 HTML Author: Jaromil <jaromil@dyne.org> Date: Tue, 17 Jan 2012 14:00:20 +0100 fixes to check_swap and new --force flag Tenamed --ignore-swap flag to --force which is more generic and used also by other commands. There are also some minor fixes to CMD parsing. All changes are documented in manual and help. Diffstat: M doc/tomb.1 | 25 +++++++++++++------------ M src/tomb | 87 +++++++++++++------------------ 2 files changed, 48 insertions(+), 64 deletions(-) --- DIR diff --git a/doc/tomb.1 b/doc/tomb.1 t@@ -188,22 +188,23 @@ executes desktop applications as processes owned by the user. .SH SWAP -During "create" and "open" operation, swap will complain and \fIabort\fR if -your system has swap activated. This can be annoying, and you can disable this -behaviour using \fI--ignore-swap\fR. Before doing that, however, you may be -interested in knowing the risks of doing so: +During "create", "open" and "passwd" operations, swap will complain +and \fIabort if your system has swap activated\fR. You can disable +this behaviour using the \fI--force\fR. Before doing that, however, +you may be interested in knowing the risks of doing so: .IP \(bu -During both creation and opening it could write your secret key on the disk +During such operations a lack of available memory could cause the swap +to write your secret key on the disk. .IP \(bu -After having opened the tomb, an application you're using could swap file -contents. So you'll put file contents in clear on your disk +Even while using an opened tomb, another application could occupy too +much memory so that the swap needs to be used, this way it is possible +that some contents of files contained into the tomb are physically +written on your disk, not encrypted. .P -If you don't need swap, execute \fI swapoff -a\fR. If you really need it, you -could encrypt it. Tomb doesn't detect if your swap is encrypted, and will -complain anyway. In that case, using --ignore-swap is safe. Otherwise, use ---ignore-swap at your own risk - +If you don't need swap, execute \fI swapoff -a\fR. If you really need +it, you could make an encrypted swap it. Tomb doesn't detect if your +swap is encrypted, and will complain anyway. .SH BUGS DIR diff --git a/src/tomb b/src/tomb t@@ -206,21 +206,13 @@ check_swap() { # Return 2 if swap(s) is(are) used, but ALL encrypted local swaps=$(awk '/partition/ { print $1 }' /proc/swaps 2>/dev/null) [[ -z "$swaps" ]] && return 0 # No swap partition is active - - local -i count - xxx "check_swap $swaps" - for dev in ${=swaps} - do - xxx "check_swap testing device $dev (count = $count)" - sudo cryptsetup status ${dev} | grep 'active' &>/dev/null && count+=1 - done - xxx "$count encrypted swap(s) [${(%w)#swaps} total]" - (( ${count} == ${(%w)#swaps} )) && return 2 # All swap partitions are encrypted - xxx "check_swap detected some unencrypted swap" - (( ${#{=swaps}} )) && return 1 # Some unencrypted swap partition(s) - xxx "check_swap should never reach here" - return 0 # No swap partition is active + no "An active swap partition is detected, this poses security risks." + no "You can deactivate all swap partitions using the command:" + no " swapoff -a" + no "But if you want to proceed like this, use the --force flag." + die "Operation aborted." } + # }}} # {{{ - Ask user for a password # we use pinentry now t@@ -320,6 +312,7 @@ Options: -k path to the key to use for opening a tomb -n don't process the hooks found in tomb -o mount options used to open (default: rw,noatime,nodev) + -f force operation (i.e. even if swap is active) -h print this help -v version information for this tool t@@ -568,14 +561,9 @@ exec_safe_post_hooks() { # {{{ - Create create_tomb() { - if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then - _warning "You have swap activated; use --ignore-swap if you want to skip this check" - _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk." - _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check" - _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:" - tail -n +2 /proc/swaps - exit 1 - fi + _message "Commanded to create tomb $CMD2" + if ! option_is_set --force; then check_swap; fi + if ! [ ${CMD2} ]; then _warning "no tomb name specified for creation" return 1 t@@ -588,10 +576,9 @@ create_tomb() { tombfile=${tombname}.tomb tombsize=$opts[-s] - if [[ $tombsize != <-> ]]; then - _warning "Size is not an integer" - return 1 - fi + [ $tombsize ] || die "Size argument missing, use --size" + + [[ $tombsize != <-> ]] && die "Size argument is not an integer" if [ -e ${tombdir}/${tombfile} ]; then _warning "tomb exists already. I'm not digging here:" t@@ -749,14 +736,8 @@ create_tomb() { mount_tomb() { _message "Commanded to open tomb $CMD2" - if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then - _warning "You have swap activated; use --ignore-swap if you want to skip this check" - _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk." - _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check" - _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:" - tail -n +2 /proc/swaps - die "I'm stopping now." - fi + if ! option_is_set --force; then check_swap; fi + if ! [ ${CMD2} ]; then _warning "no tomb name specified for creation" return 1 t@@ -1058,15 +1039,10 @@ umount_tomb() { # change tomb key password change_passwd() { - if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then - _warning "You have swap activated; use --ignore-swap if you want to skip this check" - _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk." - _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check" - _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:" - tail -n +2 /proc/swaps - return 1 - fi - local keyfile="${1}" + _message "Commanded to change password for tomb key $CMD2" + if ! option_is_set --force; then check_swap; fi + + local keyfile="$CMD2" # check the keyfile if ! [ -r $keyfile ]; then t@@ -1164,7 +1140,7 @@ change_passwd() { # {{{ - List # list all tombs mounted in a readable format list_tombs() { - if [ $1 ]; then + if [ $CMD2 ]; then # list a specific tomb mounted_tombs=`mount -l | awk -vtomb="[$1]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'` t@@ -1181,7 +1157,7 @@ list_tombs() { if ! [ $mounted_tombs ]; then if [ $1 ]; then - die "There seems to be no open tomb engraved as [${1}]" + die "There seems to be no open tomb engraved as [$CMD2]" else die "I can't see any open tomb, may they all rest in peace." fi t@@ -1420,22 +1396,29 @@ option_value() { main() { local -A subcommands_opts ### Options configuration - #Hi, dear developer! Are you trying to add a new subcommand, or to add some options? - #Well, keep in mind that: - # 1. An option CAN'T have differente meanings/behaviour in different subcommands. + + # Hi, dear developer! Are you trying to add a new subcommand, or + # to add some options? Well, keep in mind that an option CAN'T + # have differente meanings/behaviour in different subcommands. + # For example, "-s" means "size" and accept an argument. If you are tempted to add # an option "-s" (that means, for example "silent", and doesn't accept an argument) # DON'T DO IT! + # There are two reasons for that: - # I. usability; user expect that "-s" is "size + # I. usability; user expect that "-s" is "size" # II. Option parsing WILL EXPLODE if you do this kind of bad things # (it will say "option defined more than once, and he's right") + # + # If you want to use the same option in multiple commands then + # you can only use the non-abbreviated long-option version like: + # -force and NOT -f main_opts=(q -quiet=q D -debug=D h -help=h v -version=v -no-color) subcommands_opts[__default]="" - subcommands_opts[open]="n -nohook=n k: -key=k o: -mount-options=o -ignore-swap" + subcommands_opts[open]="n -nohook=n k: -key=k o: -mount-options=o -force" subcommands_opts[mount]=${subcommands_opts[open]} - subcommands_opts[create]="s: -size=s -ignore-swap k: -key=k" - subcommands_opts[passwd]="-ignore-swap" + subcommands_opts[create]="s: -size=s -force k: -key=k" + subcommands_opts[passwd]="-force" subcommands_opts[close]="" subcommands_opts[help]="" subcommands_opts[slam]=""