Makefile: Add security compiling option (RELRO, SC, and FORTIFY)
[platform/upstream/cryptsetup.git] / tests / loopaes-test
index b475adb..fdb4cd3 100755 (executable)
@@ -1,6 +1,10 @@
 #!/bin/bash
 
-CRYPTSETUP=../src/cryptsetup
+[ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
+CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
+
+CRYPTSETUP_VALGRIND=../.libs/cryptsetup
+CRYPTSETUP_LIB_VALGRIND=../.libs
 
 # try to validate using loop-AES losetup/kernel if available
 LOSETUP_AES=/losetup-aes.old
@@ -15,7 +19,7 @@ LOOPDEV=$(losetup -f 2>/dev/null)
 
 function dmremove() { # device
        udevadm settle >/dev/null 2>&1
-       dmsetup remove $1 >/dev/null 2>&1
+       dmsetup remove --retry $1 >/dev/null 2>&1
 }
 
 function remove_mapping()
@@ -28,15 +32,29 @@ function remove_mapping()
 
 function fail()
 {
+       echo "FAILED backtrace:"
+       while caller $frame; do ((frame++)); done
        remove_mapping
-       echo "FAILED"
        exit 2
 }
 
 function skip()
 {
+       remove_mapping
        [ -n "$1" ] && echo "$1"
-       exit 0
+       exit 77
+}
+
+function valgrind_setup()
+{
+       command -v valgrind >/dev/null || fail "Cannot find valgrind."
+       [ ! -f $CRYPTSETUP_VALGRIND ] && fail "Unable to get location of cryptsetup executable."
+       export LD_LIBRARY_PATH="$CRYPTSETUP_LIB_VALGRIND:$LD_LIBRARY_PATH"
+}
+
+function valgrind_run()
+{
+       INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${CRYPTSETUP_VALGRIND} "$@"
 }
 
 function prepare()
@@ -87,22 +105,23 @@ function get_expsum() # $offset
        esac
 }
 
-function check_sum() # $key $keysize $offset
+function check_sum() # $key $keysize $offset [stdin|keyfile]
 {
-       # Fill device with zeroes and reopen it
-       dd if=/dev/zero of=/dev/mapper/$DEV_NAME bs=1k $LOOP_DD_PARAM >/dev/null 2>&1
-       sync
-       dmremove $DEV_NAME
+       $CRYPTSETUP close $DEV_NAME || fail
 
        EXPSUM=$(get_expsum $3)
-       $CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME -s $2 --key-file $1 $(get_offset_params $3) >/dev/null 2>&1
+       if [ "$4" == "stdin" ] ; then
+               cat $1 | $CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME -s $2 --key-file - $(get_offset_params $3) >/dev/null 2>&1
+       else
+               $CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME -s $2 --key-file $1 $(get_offset_params $3) >/dev/null 2>&1
+       fi
        ret=$?
        VSUM=$(sha256sum /dev/mapper/$DEV_NAME | cut -d' ' -f 1)
        if [ $ret -eq 0 -a "$VSUM" = "$EXPSUM" ] ; then
-               echo -n "[OK]"
+               echo -n "[$4:OK]"
        else
-               echo "[FAIL]"
-               echo " Expecting $EXPSUM got $VSUM."
+               echo "[$4:FAIL]"
+               [ "$VSUM" != "$EXPSUM" ] && echo " Expecting $EXPSUM got $VSUM."
                fail
        fi
 }
@@ -121,7 +140,7 @@ function check_sum_losetup() # $key $alg
                echo "[OK]"
        else
                echo "[FAIL]"
-               echo " Expecting $EXPSUM got $VSUM (loop-AES)."
+               [ "$VSUM" != "$EXPSUM" ] && echo " Expecting $EXPSUM got $VSUM (loop-AES)."
                fail
        fi
        losetup -d $LOOPDEV >/dev/null 2>&1
@@ -140,7 +159,9 @@ function check_version()
 
 [ $(id -u) != 0 ] && skip "WARNING: You must be root to run this test, test skipped."
 [ -z "$LOOPDEV" ] && skip "Cannot find free loop device, test skipped."
-which uuencode >/dev/null || skip "WARNING: test require uuencode binary, test skipped."
+[ ! -x "$CRYPTSETUP" ] && skip "Cannot find $CRYPTSETUP, test skipped."
+[ -n "$VALG" ] && valgrind_setup && CRYPTSETUP=valgrind_run
+command -v uuencode >/dev/null || skip "WARNING: test require uuencode binary, test skipped."
 check_version || skip "Probably old kernel, test skipped."
 
 # loop-AES tests
@@ -152,9 +173,15 @@ for key_size in $KEY_SIZES ; do
     for key in $KEY_FILES ; do
         for offset in $DEV_OFFSET ; do
                prepare "Open loop-AES $key / AES-$key_size / offset $offset"
-               $CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME -s $key_size --key-file $key $(get_offset_params $offset) || fail
+               $CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME \
+                       -s $key_size --key-file $key $(get_offset_params $offset) \
+                       2>/dev/null
+               [ $? -ne 0 ] && echo "[SKIPPED]" && continue
                check_exists
-               check_sum $key $key_size $offset
+               # Fill device with zeroes and reopen it
+               dd if=/dev/zero of=/dev/mapper/$DEV_NAME $LOOP_DD_PARAM >/dev/null 2>&1
+               check_sum $key $key_size $offset keyfile
+               check_sum $key $key_size $offset stdin
                $CRYPTSETUP loopaesClose $DEV_NAME || fail
                check_sum_losetup $key AES$key_size $offset
         done